@productbrain/mcp 0.0.1-beta.4 → 0.0.1-beta.6

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/tools/knowledge.ts","../src/analytics.ts","../src/client.ts","../src/tools/labels.ts","../src/tools/health.ts","../src/tools/verify.ts","../src/tools/smart-capture.ts","../src/tools/architecture.ts","../src/tools/workflows.ts","../src/workflows/definitions.ts","../src/tools/gitchain.ts","../src/resources/index.ts","../src/prompts/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { registerKnowledgeTools } from \"./tools/knowledge.js\";\nimport { registerLabelTools } from \"./tools/labels.js\";\nimport { registerHealthTools } from \"./tools/health.js\";\nimport { registerVerifyTools } from \"./tools/verify.js\";\nimport { registerSmartCaptureTools } from \"./tools/smart-capture.js\";\nimport { registerArchitectureTools } from \"./tools/architecture.js\";\nimport { registerWorkflowTools } from \"./tools/workflows.js\";\nimport { registerGitChainTools } from \"./tools/gitchain.js\";\nimport { registerResources } from \"./resources/index.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\nimport { getWorkspaceId, bootstrapCloudMode } from \"./client.js\";\nimport { initAnalytics, trackSessionStarted, shutdownAnalytics } from \"./analytics.js\";\n\nif (!process.env.CONVEX_SITE_URL && !process.env.PRODUCTBRAIN_API_KEY) {\n try {\n const envPath = resolve(process.cwd(), \".env.mcp\");\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n process.env[trimmed.slice(0, eqIdx)] ??= trimmed.slice(eqIdx + 1);\n }\n } catch {\n // .env.mcp not found — rely on env vars being set by the launcher\n }\n}\n\nbootstrapCloudMode();\n\nconst SERVER_VERSION = \"1.0.0\";\n\ninitAnalytics();\n\nlet workspaceId: string;\ntry {\n workspaceId = await getWorkspaceId();\n} catch (err: any) {\n const hint =\n !process.env.PRODUCTBRAIN_API_KEY && !process.env.CONVEX_SITE_URL\n ? \"\\n[MCP] Hint: Set PRODUCTBRAIN_API_KEY in your MCP config env block, or run `npx productbrain setup`.\"\n : \"\";\n process.stderr.write(`[MCP] Startup failed: ${err.message}${hint}\\n`);\n process.exit(1);\n}\n\ntrackSessionStarted(\n process.env.WORKSPACE_SLUG ?? \"unknown\",\n workspaceId,\n SERVER_VERSION,\n);\n\nconst server = new McpServer(\n {\n name: \"Product Brain\",\n version: SERVER_VERSION,\n },\n {\n capabilities: { logging: {} },\n instructions: [\n \"Product Brain — the single source of truth for product knowledge.\",\n \"Terminology, standards, and core data all live here — no need to check external docs.\",\n \"\",\n \"Terminology & naming: For 'what is X?' or naming questions, fetch `productbrain://terminology`\",\n \"or use the `name-check` prompt to validate names against the glossary.\",\n \"\",\n \"Workflow:\",\n \" 1. Verify: call `health` to confirm connectivity.\",\n \" 2. Terminology: fetch `productbrain://terminology` or use `name-check` prompt for naming questions.\",\n \" 3. Discover: use `kb-search` to find entries by text, or `list-entries` to browse a collection.\",\n \" 4. Drill in: use `get-entry` for full details — data, labels, relations, history.\",\n \" 5. Capture: use `smart-capture` to create entries — it auto-links related entries and\",\n \" returns a quality scorecard in one call. Use `create-entry` only when you need\",\n \" full control over every field.\",\n \" 6. Connect: use `suggest-links` then `relate-entries` to build the graph.\",\n \" 7. Quality: use `quality-check` to assess entry completeness.\",\n \" 8. Debug: use `mcp-audit` to see what backend calls happened this session.\",\n \"\",\n \"Always prefer `smart-capture` over `create-entry` or `quick-capture` for new entries.\",\n \"Always prefer kb-search or list-entries before get-entry — discover, then drill in.\",\n \"\",\n \"Orientation:\",\n \" When you need to understand the system — architecture, data model, rules,\",\n \" or analytics — fetch the `productbrain://orientation` resource first.\",\n \" It gives you the map. Then use the appropriate tool to drill in.\",\n ].join(\"\\n\"),\n },\n);\n\nregisterKnowledgeTools(server);\nregisterLabelTools(server);\nregisterHealthTools(server);\nregisterVerifyTools(server);\nregisterSmartCaptureTools(server);\nregisterArchitectureTools(server);\nregisterWorkflowTools(server);\nregisterGitChainTools(server);\nregisterResources(server);\nregisterPrompts(server);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\nasync function gracefulShutdown() {\n await shutdownAnalytics();\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", gracefulShutdown);\nprocess.on(\"SIGTERM\", gracefulShutdown);\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nfunction extractPreview(data: any, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const raw = data.description ?? data.canonical ?? data.detail ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\n}\n\nexport function registerKnowledgeTools(server: McpServer) {\n\n server.registerTool(\n \"list-collections\",\n {\n title: \"Browse Collections\",\n description:\n \"List every knowledge collection in the workspace — glossary, business rules, tracking events, standards, etc. \" +\n \"Returns each collection's slug, name, description, and field schema. \" +\n \"Start here before create-entry so you know which collections exist and what fields they expect.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n\n if (collections.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No collections found in this workspace.\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = c.fields\n .map((f: any) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n return `## ${c.name} (\\`${c.slug}\\`)\\n${c.description || \"_No description_\"}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"list-entries\",\n {\n title: \"Browse Entries\",\n description:\n \"List entries in a collection, with optional filters for status, tag, or label. \" +\n \"Returns entry IDs, names, status, and a data preview. \" +\n \"Use list-collections first to discover available collection slugs.\",\n inputSchema: {\n collection: z.string().optional().describe(\"Collection slug, e.g. 'glossary', 'tracking-events', 'business-rules'\"),\n status: z.string().optional().describe(\"Filter: draft | active | verified | deprecated\"),\n tag: z.string().optional().describe(\"Filter by internal tag, e.g. 'health:ambiguous'\"),\n label: z.string().optional().describe(\"Filter by label slug — matches entries across all collections\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ collection, status, tag, label }) => {\n let entries: any[];\n\n if (label) {\n entries = await mcpQuery<any[]>(\"kb.listEntriesByLabel\", { labelSlug: label });\n if (status) entries = entries.filter((e: any) => e.status === status);\n } else {\n entries = await mcpQuery<any[]>(\"kb.listEntries\", {\n collectionSlug: collection,\n status,\n tag,\n });\n }\n\n if (entries.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No entries match the given filters.\" }] };\n }\n\n const formatted = entries\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const dataPreview = e.data\n ? Object.entries(e.data)\n .slice(0, 4)\n .map(([k, v]) => ` ${k}: ${typeof v === \"string\" ? v.substring(0, 120) : JSON.stringify(v)}`)\n .join(\"\\n\")\n : \"\";\n return `- ${id}${e.name} \\`${e.status}\\`${dataPreview ? `\\n${dataPreview}` : \"\"}`;\n })\n .join(\"\\n\\n\");\n\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n return {\n content: [{ type: \"text\" as const, text: `# Entries${scope} (${entries.length})\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"get-entry\",\n {\n title: \"Look Up Entry\",\n description:\n \"Retrieve a single knowledge entry by its human-readable ID (e.g. 'T-SUPPLIER', 'BR-001', 'EVT-workspace_created'). \" +\n \"Returns the full record: all data fields, labels, relations, and change history. \" +\n \"Use kb-search or list-entries first to discover entry IDs.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'BR-001', 'EVT-workspace_created'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const entry = await mcpQuery<any>(\"kb.getEntry\", { entryId });\n\n if (!entry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try kb-search to find the right ID.` }] };\n }\n\n const lines: string[] = [\n `# ${entry.entryId ? `${entry.entryId}: ` : \"\"}${entry.name}`,\n \"\",\n `**Status:** ${entry.status}`,\n ];\n\n if (entry.data && typeof entry.data === \"object\") {\n lines.push(\"\");\n for (const [key, val] of Object.entries(entry.data)) {\n const display = typeof val === \"string\" ? val : JSON.stringify(val);\n lines.push(`**${key}:** ${display}`);\n }\n }\n\n if (entry.tags?.length > 0) {\n lines.push(\"\", `**Tags:** ${entry.tags.join(\", \")}`);\n }\n\n if (entry.labels?.length > 0) {\n lines.push(\"\", `**Labels:** ${entry.labels.map((l: any) => `\\`${l.slug ?? l.name}\\``).join(\", \")}`);\n }\n\n if (entry.relations?.length > 0) {\n lines.push(\"\", \"## Relations\");\n for (const r of entry.relations) {\n const arrow = r.direction === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const other = r.otherEntryId ? `${r.otherEntryId}: ${r.otherName}` : (r.otherName ?? \"unknown\");\n lines.push(`- ${arrow} **${r.type}** ${other}`);\n }\n }\n\n if (entry.history?.length > 0) {\n lines.push(\"\", \"## History (last 10)\");\n for (const h of entry.history.slice(-10)) {\n const date = new Date(h.timestamp).toISOString().split(\"T\")[0];\n lines.push(`- ${date}: ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n const governedCollections = new Set([\n \"glossary\", \"business-rules\", \"principles\", \"standards\", \"strategy\",\n ]);\n\n server.registerTool(\n \"create-entry\",\n {\n title: \"Create Entry\",\n description:\n \"Create a new knowledge entry. Provide the collection slug, a display name, status, and data matching the collection's field schema. \" +\n \"Call list-collections first to see available collections and their field definitions. \" +\n \"Governed collections (glossary, business-rules, principles, standards, strategy) require status 'draft' — \" +\n \"to promote to 'active' or 'verified', raise a tension or use update-entry after approval.\",\n inputSchema: {\n collection: z.string().describe(\"Collection slug, e.g. 'tracking-events', 'standards', 'glossary'\"),\n entryId: z.string().optional().describe(\"Human-readable ID, e.g. 'EVT-workspace_created', 'STD-posthog-events'\"),\n name: z.string().describe(\"Display name\"),\n status: z.string().default(\"draft\").describe(\"Lifecycle status: draft | active | verified | deprecated\"),\n data: z.record(z.unknown()).describe(\"Data object — keys must match the collection's field definitions\"),\n order: z.number().optional().describe(\"Manual sort order within the collection\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ collection, entryId, name, status, data, order }) => {\n if (governedCollections.has(collection) && status !== \"draft\" && status !== \"deprecated\") {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Governance Required\\n\\n` +\n `The \\`${collection}\\` collection is governed. New entries must be created with status \\`draft\\`.\\n\\n` +\n `**How to proceed:**\\n` +\n `1. Create the entry with status \\`draft\\` (treated as a proposal)\\n` +\n `2. Raise a tension in the \\`tensions\\` collection to request promotion\\n` +\n `3. After approval, use \\`update-entry\\` to change status to \\`active\\` or \\`verified\\``,\n }],\n };\n }\n\n try {\n const id = await mcpMutation<string>(\"kb.createEntry\", {\n collectionSlug: collection,\n entryId,\n name,\n status,\n data,\n order,\n });\n\n return {\n content: [{ type: \"text\" as const, text: `# Entry Created\\n\\n**${entryId ?? name}** added to \\`${collection}\\` as \\`${status}\\`.\\n\\nInternal ID: ${id}` }],\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"Duplicate entry\") || msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Cannot Create — Duplicate Detected\\n\\n${msg}\\n\\n` +\n `**What to do:**\\n` +\n `- Use \\`get-entry\\` to inspect the existing entry\\n` +\n `- Use \\`update-entry\\` to modify it\\n` +\n `- If a genuinely new entry is needed, raise a tension to propose it`,\n }],\n };\n }\n throw error;\n }\n }\n );\n\n server.registerTool(\n \"update-entry\",\n {\n title: \"Update Entry\",\n description:\n \"Update an existing entry by its human-readable ID. Only provide the fields you want to change — data fields are merged with existing values. \" +\n \"Creates a draft version by default. Set autoPublish=true to publish immediately. \" +\n \"Use get-entry first to see current values. SOS-020: Cannot update tension status via MCP — process decides (use Product Brain UI after approval).\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to update, e.g. 'T-SUPPLIER', 'BR-001'\"),\n name: z.string().optional().describe(\"New display name\"),\n status: z.string().optional().describe(\"New status: draft | active | verified | deprecated\"),\n data: z.record(z.unknown()).optional().describe(\"Fields to update (merged with existing data)\"),\n order: z.number().optional().describe(\"New sort order\"),\n autoPublish: z.boolean().optional().default(false).describe(\"If true, publishes the change immediately. If false (default), creates a draft version.\"),\n },\n annotations: { idempotentHint: true, destructiveHint: false },\n },\n async ({ entryId, name, status, data, order, autoPublish }) => {\n try {\n const id = await mcpMutation<string>(\"kb.updateEntry\", {\n entryId,\n name,\n status,\n data,\n order,\n autoPublish,\n });\n\n const mode = autoPublish ? 'published' : 'saved as draft';\n return {\n content: [{ type: \"text\" as const, text: `# Entry Updated\\n\\n**${entryId}** has been ${mode}.\\n\\nInternal ID: ${id}` }],\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"SOS-020\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# SOS-020: Tension Status Cannot Be Changed via MCP\\n\\n` +\n `Tension status (open, in-progress, closed) must be changed through the defined process, not via MCP.\\n\\n` +\n `**What you can do:**\\n` +\n `- Create tensions: \\`create-entry collection=tensions name=\"...\" status=open\\`\\n` +\n `- List tensions: \\`list-entries collection=tensions\\`\\n` +\n `- Update non-status fields (raised, date, priority, description) via \\`update-entry\\`\\n` +\n `- After process approval, a human uses the Product Brain UI to change status\\n\\n` +\n `Process criteria (TBD): e.g. 3+ users approved, or 7 days without valid concerns.`,\n }],\n };\n }\n throw error;\n }\n }\n );\n\n server.registerTool(\n \"kb-search\",\n {\n title: \"Search Knowledge Base\",\n description:\n \"Full-text search across all knowledge entries. Returns entry names, collection, status, and a description preview. \" +\n \"Scope results to a specific collection (e.g. collection='business-rules') or filter by status (e.g. status='active'). \" +\n \"Use this to discover entries before calling get-entry for full details.\",\n inputSchema: {\n query: z.string().describe(\"Search text (min 2 characters)\"),\n collection: z.string().optional().describe(\"Scope to a collection slug, e.g. 'business-rules', 'glossary', 'tracking-events'\"),\n status: z.string().optional().describe(\"Filter by status: draft | active | verified | deprecated\"),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async ({ query, collection, status }) => {\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n await server.sendLoggingMessage({ level: \"info\", data: `Searching${scope} for \"${query}\"...`, logger: \"product-os\" });\n\n const [results, collections] = await Promise.all([\n mcpQuery<any[]>(\"kb.searchEntries\", { query, collectionSlug: collection, status }),\n mcpQuery<any[]>(\"kb.listCollections\"),\n ]);\n\n if (results.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No results for \"${query}\"${scope}. Try a broader search or check list-collections for available data.` }] };\n }\n\n const collMap = new Map<string, { name: string; slug: string }>();\n for (const c of collections) {\n collMap.set(c._id, { name: c.name, slug: c.slug });\n }\n\n const countsBySlug = new Map<string, number>();\n for (const e of results) {\n const col = collMap.get(e.collectionId);\n const slug = col?.slug ?? \"unknown\";\n countsBySlug.set(slug, (countsBySlug.get(slug) ?? 0) + 1);\n }\n const collSummary = [...countsBySlug.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([slug, count]) => `${count} ${slug}`)\n .join(\", \");\n\n const formatted = results\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const col = collMap.get(e.collectionId);\n const colTag = col ? ` [${col.slug}]` : \"\";\n const desc = extractPreview(e.data, 150);\n const preview = desc ? `\\n ${desc}` : \"\";\n return `- ${id}${e.name} \\`${e.status}\\`${colTag}${preview}`;\n })\n .join(\"\\n\");\n\n const header = `# Search Results for \"${query}\"${scope} (${results.length} match${results.length === 1 ? \"\" : \"es\"})\\n\\n**By collection:** ${collSummary}`;\n const footer = `_Tip: Use \\`collection\\` param to scope search. Use get-entry with an entry ID for full details._`;\n\n return {\n content: [{ type: \"text\" as const, text: `${header}\\n\\n${formatted}\\n\\n${footer}` }],\n };\n }\n );\n\n server.registerTool(\n \"get-history\",\n {\n title: \"Entry Change History\",\n description:\n \"Get the audit trail for an entry — when it was created, updated, status-changed, etc. \" +\n \"Returns timestamped events with change details.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'BR-001'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const history = await mcpQuery<any[]>(\"kb.listEntryHistory\", { entryId });\n\n if (history.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No history found for \\`${entryId}\\`.` }] };\n }\n\n const formatted = history\n .map((h) => {\n const date = new Date(h.timestamp).toISOString();\n const changes = h.changes ? ` — ${JSON.stringify(h.changes)}` : \"\";\n return `- **${date}** ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}${changes}`;\n })\n .join(\"\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# History for \\`${entryId}\\` (${history.length} events)\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"relate-entries\",\n {\n title: \"Link Two Entries\",\n description:\n \"Create a typed relation between two entries, building the knowledge graph. \" +\n \"Use get-entry to see existing relations before adding new ones.\\n\\n\" +\n \"Recommended relation types (extensible — any string is accepted):\\n\" +\n \"- related_to, depends_on, replaces, conflicts_with, references, confused_with\\n\" +\n \"- governs — a rule constrains behavior of a feature\\n\" +\n \"- defines_term_for — a glossary term is canonical vocabulary for a feature/area\\n\" +\n \"- belongs_to — a feature belongs to a product area or parent concept\\n\" +\n \"- informs — a decision or insight informs a feature\\n\" +\n \"- surfaces_tension_in — a tension exists within a feature area\\n\\n\" +\n \"Check glossary for relation type definitions if unsure which to use.\",\n inputSchema: {\n from: z.string().describe(\"Source entry ID, e.g. 'T-SUPPLIER'\"),\n to: z.string().describe(\"Target entry ID, e.g. 'BR-001'\"),\n type: z.string().describe(\"Relation type — use a recommended type or any descriptive string\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ from, to, type }) => {\n await mcpMutation(\"kb.createEntryRelation\", {\n fromEntryId: from,\n toEntryId: to,\n type,\n });\n\n return {\n content: [{ type: \"text\" as const, text: `# Relation Created\\n\\n**${from}** \\u2014[${type}]\\u2192 **${to}**` }],\n };\n }\n );\n\n server.registerTool(\n \"find-related\",\n {\n title: \"Find Related Entries\",\n description:\n \"Navigate the knowledge graph — find all entries related to a given entry. \" +\n \"Shows incoming references (what points to this entry), outgoing references (what this entry points to), or both. \" +\n \"Use after get-entry to explore connections, or to answer 'what depends on X?' or 'what references Y?'\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'GT-019', 'SOS-006'\"),\n direction: z.enum([\"incoming\", \"outgoing\", \"both\"]).default(\"both\")\n .describe(\"Filter: 'incoming' = what references this entry, 'outgoing' = what this entry references\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, direction }) => {\n const relations = await mcpQuery<any[]>(\"kb.listEntryRelations\", { entryId });\n\n if (relations.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No relations found for \\`${entryId}\\`. Use relate-entries to create connections.` }] };\n }\n\n const sourceEntry = await mcpQuery<any>(\"kb.getEntry\", { entryId });\n if (!sourceEntry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try kb-search to find the right ID.` }] };\n }\n const sourceInternalId = sourceEntry._id;\n\n const MAX_RELATIONS = 25;\n const truncated = relations.length > MAX_RELATIONS;\n const capped = relations.slice(0, MAX_RELATIONS);\n\n const otherIds = new Set<string>();\n for (const r of capped) {\n const otherId = r.fromId === sourceInternalId ? r.toId : r.fromId;\n otherIds.add(otherId);\n }\n\n const otherEntries = new Map<string, { entryId?: string; name: string; collectionId: string }>();\n for (const id of otherIds) {\n const entry = await mcpQuery<any>(\"kb.getEntry\", { id });\n if (entry) {\n otherEntries.set(entry._id, { entryId: entry.entryId, name: entry.name, collectionId: entry.collectionId });\n }\n }\n\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n\n const lines: string[] = [`# Relations for ${entryId}: ${sourceEntry.name}`, \"\"];\n\n const enriched = capped.map((r) => {\n const isOutgoing = r.fromId === sourceInternalId;\n const otherId = isOutgoing ? r.toId : r.fromId;\n const other = otherEntries.get(otherId);\n const otherLabel = other?.entryId ? `${other.entryId}: ${other.name}` : (other?.name ?? \"(deleted)\");\n const colSlug = other ? (collMap.get(other.collectionId) ?? \"unknown\") : \"unknown\";\n return { isOutgoing, type: r.type, otherLabel, colSlug };\n });\n\n const outgoing = enriched.filter((r) => r.isOutgoing);\n const incoming = enriched.filter((r) => !r.isOutgoing);\n\n if ((direction === \"outgoing\" || direction === \"both\") && outgoing.length > 0) {\n lines.push(`## Outgoing (${outgoing.length})`);\n for (const r of outgoing) {\n lines.push(`- \\u2192 **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n if ((direction === \"incoming\" || direction === \"both\") && incoming.length > 0) {\n lines.push(`## Incoming (${incoming.length})`);\n for (const r of incoming) {\n lines.push(`- \\u2190 **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n const shown = direction === \"outgoing\" ? outgoing : direction === \"incoming\" ? incoming : enriched;\n if (shown.length === 0) {\n lines.push(`No ${direction} relations found for \\`${entryId}\\`.`);\n }\n\n if (truncated) {\n lines.push(`_Showing first ${MAX_RELATIONS} of ${relations.length} relations. Use get-entry for the full picture._`);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"gather-context\",\n {\n title: \"Gather Full Context\",\n description:\n \"Assemble the full knowledge context around an entry by traversing the knowledge graph. \" +\n \"Returns all related entries grouped by collection — glossary terms, business rules, tensions, decisions, features, etc. \" +\n \"Use this when starting work on a feature or investigating an area to get the complete picture in one call.\\n\\n\" +\n \"Example: gather-context entryId='FEAT-001' returns all glossary terms, business rules, and tensions linked to that feature.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'FEAT-001', 'GT-019', 'BR-007'\"),\n maxHops: z.number().min(1).max(3).default(2)\n .describe(\"How many relation hops to traverse (1=direct only, 2=default, 3=wide net)\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, maxHops }) => {\n const result = await mcpQuery<any>(\"kb.gatherContext\", { entryId, maxHops });\n\n if (!result?.root) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try kb-search to find the right ID.` }] };\n }\n\n if (result.related.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context for ${result.root.entryId}: ${result.root.name}\\n\\n` +\n `_No relations found._ This entry is not yet connected to the knowledge graph.\\n\\n` +\n `Use \\`suggest-links\\` to discover potential connections, or \\`relate-entries\\` to link manually.`,\n }],\n };\n }\n\n const byCollection = new Map<string, typeof result.related>();\n for (const entry of result.related) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context for ${result.root.entryId}: ${result.root.name}`,\n `_${result.totalRelations} related entries across ${byCollection.size} collections (${result.hopsTraversed} hops traversed)_`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"suggest-links\",\n {\n title: \"Suggest Links\",\n description:\n \"Discover potential connections for an entry by scanning the knowledge base for related content. \" +\n \"Returns ranked suggestions based on text similarity — review them and use relate-entries to create the ones that make sense.\\n\\n\" +\n \"This is a discovery tool, not auto-linking. Always review suggestions before linking.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to find suggestions for, e.g. 'FEAT-001'\"),\n limit: z.number().min(1).max(20).default(10)\n .describe(\"Max number of suggestions to return\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, limit }) => {\n const entry = await mcpQuery<any>(\"kb.getEntry\", { entryId });\n if (!entry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try kb-search to find the right ID.` }] };\n }\n\n const searchTerms = [entry.name];\n if (entry.data?.description) searchTerms.push(entry.data.description);\n if (entry.data?.canonical) searchTerms.push(entry.data.canonical);\n if (entry.data?.rationale) searchTerms.push(entry.data.rationale);\n if (entry.data?.rule) searchTerms.push(entry.data.rule);\n\n const queryText = searchTerms\n .join(\" \")\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 8)\n .join(\" \");\n\n if (!queryText) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` has too little text content to generate suggestions.` }] };\n }\n\n const results = await mcpQuery<any[]>(\"kb.searchEntries\", { query: queryText });\n if (!results || results.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No suggestions found for \\`${entryId}\\`. The knowledge base may need more entries.` }] };\n }\n\n const existingRelations = await mcpQuery<any[]>(\"kb.listEntryRelations\", { entryId });\n const relatedIds = new Set(\n existingRelations.flatMap((r) => [r.fromId, r.toId])\n );\n\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n\n const suggestions = results\n .filter((r) => r._id !== entry._id && !relatedIds.has(r._id))\n .slice(0, limit)\n .map((r) => ({\n entryId: r.entryId,\n name: r.name,\n collection: collMap.get(r.collectionId) ?? \"unknown\",\n preview: extractPreview(r.data, 80),\n }));\n\n if (suggestions.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No new link suggestions for \\`${entryId}\\` — it may already be well-connected, or no similar entries exist.` }] };\n }\n\n const lines = [\n `# Link Suggestions for ${entryId}: ${entry.name}`,\n `_${suggestions.length} potential connections found. Review and use \\`relate-entries\\` to create the ones that make sense._`,\n \"\",\n ];\n\n for (let i = 0; i < suggestions.length; i++) {\n const s = suggestions[i];\n const preview = s.preview ? ` — ${s.preview}` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collection}]${preview}`);\n }\n\n lines.push(\"\");\n lines.push(\"**To link:** `relate-entries from='FEAT-001' to='GT-019' type='defines_term_for'`\");\n lines.push(\"\");\n lines.push(\"_Recommended relation types: governs, defines_term_for, belongs_to, informs, surfaces_tension_in, related_to, depends_on_\");\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"quick-capture\",\n {\n title: \"Quick Capture\",\n description:\n \"Quickly capture a knowledge entry with just a name and description — no need to look up the full field schema first. \" +\n \"Always creates as 'draft' status with sensible defaults for remaining fields. \" +\n \"Use update-entry later to fill in details. Embodies 'Capture Now, Curate Later' (PRI-81cbdq).\",\n inputSchema: {\n collection: z.string().describe(\"Collection slug, e.g. 'business-rules', 'glossary', 'tensions', 'decisions'\"),\n name: z.string().describe(\"Display name for the entry\"),\n description: z.string().describe(\"Short description — the essential context to capture now\"),\n entryId: z.string().optional().describe(\"Optional human-readable ID (e.g. 'SOS-020', 'GT-031')\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ collection, name, description, entryId }) => {\n const col = await mcpQuery<any>(\"kb.getCollection\", { slug: collection });\n if (!col) {\n return { content: [{ type: \"text\" as const, text: `Collection \\`${collection}\\` not found. Use list-collections to see available collections.` }] };\n }\n\n const data: Record<string, unknown> = {};\n const emptyFields: string[] = [];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === \"description\" || key === \"canonical\" || key === \"detail\") {\n data[key] = description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n emptyFields.push(key);\n } else if (field.type === \"select\") {\n data[key] = field.options?.[0] ?? \"\";\n emptyFields.push(key);\n } else {\n data[key] = \"\";\n emptyFields.push(key);\n }\n }\n\n if (!data.description && !data.canonical && !data.detail) {\n data.description = description;\n }\n\n try {\n const id = await mcpMutation<string>(\"kb.createEntry\", {\n collectionSlug: collection,\n entryId,\n name,\n status: \"draft\",\n data,\n });\n\n const emptyNote = emptyFields.length > 0\n ? `\\n\\n**Fields to fill later** (via \\`update-entry\\`):\\n${emptyFields.map((f) => `- \\`${f}\\``).join(\"\\n\")}`\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Quick Capture — Done\\n\\n**${entryId ?? name}** added to \\`${collection}\\` as \\`draft\\`.\\n\\nInternal ID: ${id}${emptyNote}\\n\\n_Use \\`update-entry\\` to fill in details when ready. Use \\`get-entry\\` to review._`,\n }],\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"Duplicate\") || msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Cannot Capture — Duplicate Detected\\n\\n${msg}\\n\\nUse \\`get-entry\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\n }],\n };\n }\n throw error;\n }\n }\n );\n\n server.registerTool(\n \"load-context-for-task\",\n {\n title: \"Load Context for Task\",\n description:\n \"Auto-load relevant domain knowledge for a task in a single call. \" +\n \"Pass a natural-language task description; the tool searches the KB, traverses the knowledge graph, \" +\n \"and returns a ranked set of entries (business rules, glossary terms, decisions, features, etc.) \" +\n \"grouped by collection with a confidence score.\\n\\n\" +\n \"Use this at the start of a conversation to ground the agent in domain context before writing code or making recommendations.\\n\\n\" +\n \"Confidence levels:\\n\" +\n \"- high: 3+ direct KB matches — strong domain coverage\\n\" +\n \"- medium: 1-2 direct matches — partial coverage, may want to drill deeper\\n\" +\n \"- low: no direct matches but related entries found via graph traversal\\n\" +\n \"- none: no relevant entries found — KB may not cover this area yet\",\n inputSchema: {\n taskDescription: z.string().describe(\"Natural-language description of the task or user message\"),\n maxResults: z.number().min(1).max(25).default(10).optional()\n .describe(\"Max entries to return (default 10)\"),\n maxHops: z.number().min(1).max(3).default(2).optional()\n .describe(\"Graph traversal depth from each search hit (default 2)\"),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async ({ taskDescription, maxResults, maxHops }) => {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Loading context for task: \"${taskDescription.substring(0, 80)}...\"`,\n logger: \"product-brain\",\n });\n\n const result = await mcpQuery<{\n entries: Array<{\n entryId?: string;\n name: string;\n collectionSlug: string;\n collectionName: string;\n descriptionPreview: string;\n codePaths: string[];\n hop: number;\n relationType?: string;\n }>;\n confidence: string;\n searchTerms: string;\n totalFound: number;\n }>(\"kb.loadContextForTask\", {\n taskDescription,\n maxResults: maxResults ?? 10,\n maxHops: maxHops ?? 2,\n });\n\n if (result.confidence === \"none\" || result.entries.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context Loaded\\n\\n**Confidence:** None\\n\\n` +\n `No KB context found for this task. The knowledge base may not cover this area yet.\\n\\n` +\n `_Consider capturing domain knowledge discovered during this task via \\`smart-capture\\`._`,\n }],\n };\n }\n\n const byCollection = new Map<string, typeof result.entries>();\n for (const entry of result.entries) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context Loaded`,\n `**Confidence:** ${result.confidence.charAt(0).toUpperCase() + result.confidence.slice(1)}`,\n `**Matched:** ${result.entries.length} entries across ${byCollection.size} collection${byCollection.size === 1 ? \"\" : \"s\"}`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`### ${collName} (${entries.length})`);\n for (const e of entries) {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const hopLabel = e.hop > 0 ? ` _(hop ${e.hop}${e.relationType ? `, ${e.relationType}` : \"\"})_` : \"\";\n const preview = e.descriptionPreview ? `\\n ${e.descriptionPreview}` : \"\";\n const codePaths = e.codePaths.length > 0 ? `\\n Code: ${e.codePaths.join(\", \")}` : \"\";\n lines.push(`- ${id}${e.name}${hopLabel}${preview}${codePaths}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`_Use \\`get-entry\\` for full details on any entry._`);\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n }\n );\n\n server.registerTool(\n \"review-rules\",\n {\n title: \"Review Business Rules\",\n description:\n \"Surface all active business rules for a domain, formatted for compliance review. \" +\n \"Use when reviewing code, designs, or decisions against Product Brain governance. \" +\n \"Optionally provide context (what you're building or reviewing) to help focus the review. \" +\n \"This is the tool form of the review-against-rules prompt.\",\n inputSchema: {\n domain: z.string().describe(\"Business rule domain, e.g. 'AI & MCP Integration', 'Governance & Decision-Making'\"),\n context: z.string().optional().describe(\"What you're reviewing — code change, design decision, file path, etc.\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ domain, context }) => {\n const entries = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"business-rules\" });\n\n const domainLower = domain.toLowerCase();\n const rules = entries.filter((e) => {\n const ruleDomain = (e.data?.domain ?? \"\") as string;\n return ruleDomain.toLowerCase() === domainLower || ruleDomain.toLowerCase().includes(domainLower);\n });\n\n if (rules.length === 0) {\n const allDomains = [...new Set(entries.map((e) => e.data?.domain).filter(Boolean))];\n return {\n content: [{\n type: \"text\" as const,\n text: `# No Rules Found for \"${domain}\"\\n\\nAvailable domains:\\n${allDomains.map((d) => `- ${d}`).join(\"\\n\")}\\n\\n_Try one of the domains above, or use kb-search to find rules by keyword._`,\n }],\n };\n }\n\n const header = context\n ? `# Business Rules: ${domain}\\n\\n**Review context:** ${context}\\n\\nFor each rule, assess: compliant, at risk, violation, or not applicable.\\n`\n : `# Business Rules: ${domain}\\n`;\n\n const formatted = rules\n .map((r) => {\n const id = r.entryId ? `**${r.entryId}:** ` : \"\";\n const severity = r.data?.severity ? ` | Severity: ${r.data.severity}` : \"\";\n const desc = r.data?.description ?? \"\";\n const impact = r.data?.dataImpact ? `\\n Data impact: ${r.data.dataImpact}` : \"\";\n const related = (r.data?.relatedRules as string[] ?? []).length > 0\n ? `\\n Related: ${(r.data.relatedRules as string[]).join(\", \")}`\n : \"\";\n return `### ${id}${r.name} \\`${r.status}\\`${severity}\\n\\n${desc}${impact}${related}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n const footer = `\\n_${rules.length} rule${rules.length === 1 ? \"\" : \"s\"} in this domain. Use \\`get-entry\\` for full details. Use the \\`draft-rule-from-context\\` prompt to propose new rules._`;\n\n return {\n content: [{ type: \"text\" as const, text: `${header}\\n${formatted}\\n${footer}` }],\n };\n }\n );\n}\n","/**\n * PostHog analytics for SynergyOS maintainers — tracks MCP usage (sessions, tool calls).\n * Not user-facing. Key is injected at build time via SYNERGYOS_POSTHOG_KEY.\n * Override with POSTHOG_MCP_KEY for self-hosted deployments.\n */\n\nimport { userInfo } from \"node:os\";\nimport { PostHog } from \"posthog-node\";\n\nlet client: PostHog | null = null;\nlet distinctId = \"anonymous\";\n\nconst POSTHOG_HOST = \"https://eu.i.posthog.com\";\n\n/** Injected at build time: SYNERGYOS_POSTHOG_KEY env when running `npm run build`/publish. */\ndeclare const __SYNERGYOS_POSTHOG_KEY__: string;\n\n/** Only write to stderr when MCP_DEBUG=1 for quieter default DX. */\nfunction log(msg: string): void {\n if (process.env.MCP_DEBUG === \"1\") {\n process.stderr.write(msg);\n }\n}\n\nexport function initAnalytics(): void {\n const apiKey = process.env.POSTHOG_MCP_KEY || __SYNERGYOS_POSTHOG_KEY__;\n if (!apiKey) {\n log(\"[MCP-ANALYTICS] No PostHog key — tracking disabled (set SYNERGYOS_POSTHOG_KEY at build time for publish)\\n\");\n return;\n }\n\n client = new PostHog(apiKey, {\n host: POSTHOG_HOST,\n flushAt: 1,\n flushInterval: 5000,\n });\n distinctId = process.env.MCP_USER_ID || fallbackDistinctId();\n\n log(`[MCP-ANALYTICS] Initialized — host=${POSTHOG_HOST} distinctId=${distinctId}\\n`);\n}\n\nfunction fallbackDistinctId(): string {\n try {\n return userInfo().username;\n } catch {\n return `os-${process.pid}`;\n }\n}\n\nexport function trackSessionStarted(\n workspaceSlug: string,\n workspaceId: string,\n serverVersion: string,\n): void {\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_session_started\",\n properties: {\n workspace_slug: workspaceSlug,\n workspace_id: workspaceId,\n server_version: serverVersion,\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n },\n });\n}\n\nexport function trackToolCall(\n fn: string,\n status: \"ok\" | \"error\",\n durationMs: number,\n workspaceId: string,\n errorMsg?: string,\n): void {\n const properties: Record<string, unknown> = {\n tool: fn,\n status,\n duration_ms: durationMs,\n workspace_slug: process.env.WORKSPACE_SLUG ?? \"unknown\",\n source: \"mcp-server\",\n $groups: { workspace: workspaceId },\n };\n if (errorMsg) properties.error = errorMsg;\n\n if (!client) return;\n client.capture({\n distinctId,\n event: \"mcp_tool_called\",\n properties,\n });\n}\n\nexport async function shutdownAnalytics(): Promise<void> {\n await client?.shutdown();\n}\n","/**\n * MCP client — communicates with the Convex HTTP Action gateway.\n *\n * Two configuration modes:\n *\n * 1. **Cloud mode** (single key):\n * PRODUCTBRAIN_API_KEY=pb_sk_...\n * The cloud URL is resolved automatically. Workspace is inferred from the key.\n *\n * 2. **Self-hosted mode** (three vars):\n * CONVEX_SITE_URL — base URL of the Convex deployment (*.convex.site)\n * MCP_API_KEY — secret key matching MCP_API_KEY set in the Convex dashboard env vars\n * WORKSPACE_SLUG — slug of the workspace to operate on\n */\n\nimport { trackToolCall } from \"./analytics.js\";\n\nconst DEFAULT_CLOUD_URL = \"https://trustworthy-kangaroo-277.convex.site\";\n\nlet cachedWorkspaceId: string | null = null;\nlet cloudMode = false;\n\nexport interface AuditEntry {\n ts: string;\n fn: string;\n workspace: string;\n status: 'ok' | 'error';\n durationMs: number;\n error?: string;\n}\n\nconst AUDIT_BUFFER_SIZE = 50;\nconst auditBuffer: AuditEntry[] = [];\n\n/**\n * Bootstrap cloud mode: if PRODUCTBRAIN_API_KEY is set, map it to the\n * internal env vars so the rest of the client works transparently.\n */\nexport function bootstrapCloudMode(): void {\n const pbKey = process.env.PRODUCTBRAIN_API_KEY;\n if (pbKey?.startsWith(\"pb_sk_\")) {\n const cloudUrl = process.env.PRODUCTBRAIN_URL ?? DEFAULT_CLOUD_URL;\n process.env.CONVEX_SITE_URL ??= cloudUrl;\n process.env.MCP_API_KEY ??= pbKey;\n cloudMode = true;\n }\n}\n\nfunction getEnv(key: string): string {\n const value = process.env[key];\n if (!value) throw new Error(`${key} environment variable is required`);\n return value;\n}\n\n/** Only write audit to stderr on errors, or when MCP_DEBUG=1. Keeps default DX quiet. */\nfunction shouldLogAudit(status: 'ok' | 'error'): boolean {\n return status === 'error' || process.env.MCP_DEBUG === '1';\n}\n\nfunction audit(fn: string, status: 'ok' | 'error', durationMs: number, errorMsg?: string): void {\n const ts = new Date().toISOString();\n const workspace = cachedWorkspaceId ?? 'unresolved';\n\n const entry: AuditEntry = { ts, fn, workspace, status, durationMs };\n if (errorMsg) entry.error = errorMsg;\n auditBuffer.push(entry);\n if (auditBuffer.length > AUDIT_BUFFER_SIZE) auditBuffer.shift();\n\n trackToolCall(fn, status, durationMs, workspace, errorMsg);\n\n if (!shouldLogAudit(status)) return;\n\n const base = `[MCP-AUDIT] ${ts} fn=${fn} workspace=${workspace} status=${status} duration=${durationMs}ms`;\n if (status === 'error' && errorMsg) {\n process.stderr.write(`${base} error=${JSON.stringify(errorMsg)}\\n`);\n } else {\n process.stderr.write(`${base}\\n`);\n }\n}\n\n/** Returns a snapshot of the audit ring buffer (most recent last). */\nexport function getAuditLog(): readonly AuditEntry[] {\n return auditBuffer;\n}\n\n/**\n * Low-level call to the HTTP Action gateway. Does NOT inject workspaceId.\n * Use mcpQuery / mcpMutation for workspace-scoped calls.\n */\nexport async function mcpCall<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const siteUrl = getEnv('CONVEX_SITE_URL').replace(/\\/$/, '');\n const apiKey = getEnv('MCP_API_KEY');\n\n const start = Date.now();\n\n let res: Response;\n try {\n res = await fetch(`${siteUrl}/api/mcp`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ fn, args }),\n });\n } catch (err: any) {\n audit(fn, 'error', Date.now() - start, err.message);\n throw new Error(`MCP call \"${fn}\" network error: ${err.message}`);\n }\n\n const json = await res.json() as { data?: T; error?: string };\n\n if (!res.ok || json.error) {\n audit(fn, 'error', Date.now() - start, json.error);\n throw new Error(`MCP call \"${fn}\" failed (${res.status}): ${json.error ?? 'unknown error'}`);\n }\n\n audit(fn, 'ok', Date.now() - start);\n return json.data as T;\n}\n\n/** Resolve and cache the workspace ID. Cloud mode resolves from the API key; self-hosted uses WORKSPACE_SLUG. */\nexport async function getWorkspaceId(): Promise<string> {\n if (cachedWorkspaceId) return cachedWorkspaceId;\n\n if (cloudMode) {\n // Cloud keys: the backend resolves workspace from the key itself\n const workspace = await mcpCall<{ _id: string; name: string; slug: string } | null>(\n 'resolveWorkspace',\n { slug: \"__cloud__\" },\n );\n if (!workspace) {\n throw new Error(\"Cloud key is valid but no workspace is associated. Run `npx productbrain setup` again.\");\n }\n cachedWorkspaceId = workspace._id;\n return cachedWorkspaceId;\n }\n\n const slug = getEnv('WORKSPACE_SLUG');\n const workspace = await mcpCall<{ _id: string; name: string; slug: string } | null>(\n 'resolveWorkspace',\n { slug },\n );\n\n if (!workspace) {\n throw new Error(`Workspace with slug \"${slug}\" not found`);\n }\n\n cachedWorkspaceId = workspace._id;\n return cachedWorkspaceId;\n}\n\n/** Call a query scoped to the current workspace. */\nexport async function mcpQuery<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n\n/** Call a mutation scoped to the current workspace. */\nexport async function mcpMutation<T>(fn: string, args: Record<string, unknown> = {}): Promise<T> {\n const workspaceId = await getWorkspaceId();\n return mcpCall<T>(fn, { ...args, workspaceId });\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nexport function registerLabelTools(server: McpServer) {\n\n server.registerTool(\n \"list-labels\",\n {\n title: \"Browse Labels\",\n description:\n \"List all workspace labels with their groups and hierarchy. \" +\n \"Labels can be applied to any entry across any collection for cross-domain filtering. \" +\n \"Similar to labels in Linear or GitHub.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const labels = await mcpQuery<any[]>(\"kb.listLabels\");\n\n if (labels.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No labels defined in this workspace yet.\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [\"# Workspace Labels\"];\n\n for (const group of groups) {\n lines.push(`\\n## ${group.name}`);\n if (group.description) lines.push(`_${group.description}_`);\n for (const child of children(group._id)) {\n const color = child.color ? ` ${child.color}` : \"\";\n lines.push(` - \\`${child.slug}\\` ${child.name}${color}`);\n }\n }\n\n if (ungrouped.length > 0) {\n lines.push(\"\\n## Ungrouped\");\n for (const label of ungrouped) {\n const color = label.color ? ` ${label.color}` : \"\";\n lines.push(`- \\`${label.slug}\\` ${label.name}${color}${label.description ? ` — _${label.description}_` : \"\"}`);\n }\n }\n\n return {\n content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }],\n };\n }\n );\n\n server.registerTool(\n \"manage-labels\",\n {\n title: \"Manage Labels\",\n description:\n \"Create, update, or delete a workspace label. Labels support hierarchy (groups with children). \" +\n \"Use list-labels first to see what exists.\",\n inputSchema: {\n action: z.enum([\"create\", \"update\", \"delete\"]).describe(\"What to do\"),\n slug: z.string().describe(\"Label slug (machine name), e.g. 'p1-critical', 'needs-review'\"),\n name: z.string().optional().describe(\"Display name (required for create)\"),\n color: z.string().optional().describe(\"Hex color, e.g. '#ef4444'\"),\n description: z.string().optional().describe(\"What this label means\"),\n parentSlug: z.string().optional().describe(\"Parent group slug for label hierarchy\"),\n isGroup: z.boolean().optional().describe(\"True if this is a group container, not a taggable label\"),\n order: z.number().optional().describe(\"Sort order within its group\"),\n },\n },\n async ({ action, slug, name, color, description, parentSlug, isGroup, order }) => {\n if (action === \"create\") {\n if (!name) {\n return { content: [{ type: \"text\" as const, text: \"Cannot create a label without a name.\" }] };\n }\n\n let parentId: string | undefined;\n if (parentSlug) {\n const labels = await mcpQuery<any[]>(\"kb.listLabels\");\n const parent = labels.find((l: any) => l.slug === parentSlug);\n if (!parent) {\n return { content: [{ type: \"text\" as const, text: `Parent label \\`${parentSlug}\\` not found. Use list-labels to see available groups.` }] };\n }\n parentId = parent._id;\n }\n\n await mcpMutation(\"kb.createLabel\", { slug, name, color, description, parentId, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Created\\n\\n**${name}** (\\`${slug}\\`)` }] };\n }\n\n if (action === \"update\") {\n await mcpMutation(\"kb.updateLabel\", { slug, name, color, description, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Updated\\n\\n\\`${slug}\\` has been updated.` }] };\n }\n\n if (action === \"delete\") {\n await mcpMutation(\"kb.deleteLabel\", { slug });\n return { content: [{ type: \"text\" as const, text: `# Label Deleted\\n\\n\\`${slug}\\` removed from all entries and deleted.` }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n server.registerTool(\n \"label-entry\",\n {\n title: \"Tag Entry with Label\",\n description:\n \"Apply or remove a label from a knowledge entry. Labels work across all collections for cross-domain filtering. \" +\n \"Use list-labels to see available label slugs.\",\n inputSchema: {\n action: z.enum([\"apply\", \"remove\"]).describe(\"Apply or remove the label\"),\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'EVT-workspace_created'\"),\n label: z.string().describe(\"Label slug to apply/remove\"),\n },\n },\n async ({ action, entryId, label }) => {\n if (action === \"apply\") {\n await mcpMutation(\"kb.applyLabel\", { entryId, labelSlug: label });\n return { content: [{ type: \"text\" as const, text: `Label \\`${label}\\` applied to **${entryId}**.` }] };\n }\n\n await mcpMutation(\"kb.removeLabel\", { entryId, labelSlug: label });\n return { content: [{ type: \"text\" as const, text: `Label \\`${label}\\` removed from **${entryId}**.` }] };\n }\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, getWorkspaceId, getAuditLog, type AuditEntry } from \"../client.js\";\n\ntype CallCategory = \"read\" | \"search\" | \"write\" | \"label\" | \"meta\";\n\nconst CALL_CATEGORIES: Record<string, CallCategory> = {\n \"kb.getEntry\": \"read\",\n \"kb.listEntries\": \"read\",\n \"kb.listEntryHistory\": \"read\",\n \"kb.listEntryRelations\": \"read\",\n \"kb.listEntriesByLabel\": \"read\",\n \"kb.searchEntries\": \"search\",\n \"kb.createEntry\": \"write\",\n \"kb.updateEntry\": \"write\",\n \"kb.createEntryRelation\": \"write\",\n \"kb.applyLabel\": \"label\",\n \"kb.removeLabel\": \"label\",\n \"kb.createLabel\": \"label\",\n \"kb.updateLabel\": \"label\",\n \"kb.deleteLabel\": \"label\",\n \"kb.listCollections\": \"meta\",\n \"kb.getCollection\": \"meta\",\n \"kb.listLabels\": \"meta\",\n \"resolveWorkspace\": \"meta\",\n};\n\nfunction categorize(fn: string): CallCategory {\n return CALL_CATEGORIES[fn] ?? \"meta\";\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = Math.round((ms % 60_000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction buildSessionSummary(log: readonly AuditEntry[]): string {\n if (log.length === 0) return \"\";\n\n const byCategory = new Map<CallCategory, Map<string, number>>();\n let errorCount = 0;\n let writeCreates = 0;\n let writeUpdates = 0;\n\n for (const entry of log) {\n const cat = categorize(entry.fn);\n if (!byCategory.has(cat)) byCategory.set(cat, new Map());\n const fnCounts = byCategory.get(cat)!;\n fnCounts.set(entry.fn, (fnCounts.get(entry.fn) ?? 0) + 1);\n\n if (entry.status === \"error\") errorCount++;\n if (entry.fn === \"kb.createEntry\" && entry.status === \"ok\") writeCreates++;\n if (entry.fn === \"kb.updateEntry\" && entry.status === \"ok\") writeUpdates++;\n }\n\n const firstTs = new Date(log[0].ts).getTime();\n const lastTs = new Date(log[log.length - 1].ts).getTime();\n const duration = formatDuration(lastTs - firstTs);\n\n const lines: string[] = [`# Session Summary (${duration})\\n`];\n\n const categoryLabels: [CallCategory, string][] = [\n [\"read\", \"Reads\"],\n [\"search\", \"Searches\"],\n [\"write\", \"Writes\"],\n [\"label\", \"Labels\"],\n [\"meta\", \"Meta\"],\n ];\n\n for (const [cat, label] of categoryLabels) {\n const fnCounts = byCategory.get(cat);\n if (!fnCounts || fnCounts.size === 0) continue;\n const total = [...fnCounts.values()].reduce((a, b) => a + b, 0);\n const detail = [...fnCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([fn, count]) => `${fn.replace(\"kb.\", \"\")} x${count}`)\n .join(\", \");\n lines.push(`- **${label}:** ${total} call${total === 1 ? \"\" : \"s\"} (${detail})`);\n }\n\n lines.push(`- **Errors:** ${errorCount}`);\n\n if (writeCreates > 0 || writeUpdates > 0) {\n lines.push(\"\");\n lines.push(\"## Knowledge Contribution\");\n if (writeCreates > 0) lines.push(`- ${writeCreates} entr${writeCreates === 1 ? \"y\" : \"ies\"} created`);\n if (writeUpdates > 0) lines.push(`- ${writeUpdates} entr${writeUpdates === 1 ? \"y\" : \"ies\"} updated`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function registerHealthTools(server: McpServer) {\n\n server.registerTool(\n \"health\",\n {\n title: \"Health Check\",\n description:\n \"Verify that Product Brain is running and can reach its backend. \" +\n \"Returns workspace status, collection count, entry count, and latency. \" +\n \"Use this to confirm connectivity before doing real work.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const start = Date.now();\n const errors: string[] = [];\n\n let workspaceId: string | undefined;\n try {\n workspaceId = await getWorkspaceId();\n } catch (e: any) {\n errors.push(`Workspace resolution failed: ${e.message}`);\n }\n\n let collections: any[] = [];\n try {\n collections = await mcpQuery<any[]>(\"kb.listCollections\");\n } catch (e: any) {\n errors.push(`Collection fetch failed: ${e.message}`);\n }\n\n let totalEntries = 0;\n if (collections.length > 0) {\n try {\n const entries = await mcpQuery<any[]>(\"kb.listEntries\", {});\n totalEntries = entries.length;\n } catch (e: any) {\n errors.push(`Entry count failed: ${e.message}`);\n }\n }\n\n const durationMs = Date.now() - start;\n const healthy = errors.length === 0;\n\n const lines = [\n `# ${healthy ? \"Healthy\" : \"Degraded\"}`,\n \"\",\n `**Workspace:** ${workspaceId ?? \"unresolved\"}`,\n `**Collections:** ${collections.length}`,\n `**Entries:** ${totalEntries}`,\n `**Latency:** ${durationMs}ms`,\n ];\n\n if (errors.length > 0) {\n lines.push(\"\", \"## Errors\");\n for (const err of errors) {\n lines.push(`- ${err}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"mcp-audit\",\n {\n title: \"Session Audit Log\",\n description:\n \"Show a session summary (reads, writes, searches, contributions) and the last N backend calls. \" +\n \"Useful for debugging, tracing tool behavior, and seeing what you contributed to the knowledge base.\",\n inputSchema: {\n limit: z.number().min(1).max(50).default(20).describe(\"How many recent calls to show (max 50)\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ limit }) => {\n const log = getAuditLog();\n const recent = log.slice(-limit);\n\n if (recent.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No calls recorded yet this session.\" }] };\n }\n\n const summary = buildSessionSummary(log);\n\n const logLines = [`# Audit Log (last ${recent.length} of ${log.length} total)\\n`];\n for (const entry of recent) {\n const icon = entry.status === \"ok\" ? \"\\u2713\" : \"\\u2717\";\n const errPart = entry.error ? ` \\u2014 ${entry.error}` : \"\";\n logLines.push(`${icon} \\`${entry.fn}\\` ${entry.durationMs}ms ${entry.status}${errPart}`);\n }\n\n return {\n content: [{ type: \"text\" as const, text: `${summary}\\n\\n---\\n\\n${logLines.join(\"\\n\")}` }],\n };\n }\n );\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\ntype MappingKind = \"file\" | \"schema\" | \"conceptual\";\ntype CheckResult = \"verified\" | \"drifted\" | \"unverifiable\";\n\ninterface MappingCheck {\n entryId: string;\n entryName: string;\n field: string;\n kind: MappingKind;\n result: CheckResult;\n reason: string;\n currentStatus: string;\n}\n\ninterface RefCheck {\n entryId: string;\n entryName: string;\n refValue: string;\n found: boolean;\n}\n\n// ── Project Root Resolution ────────────────────────────────────────────\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\n// ── Schema Parser ──────────────────────────────────────────────────────\n\nfunction parseConvexSchema(schemaPath: string): Map<string, Set<string>> {\n const content = readFileSync(schemaPath, \"utf-8\");\n const tables = new Map<string, Set<string>>();\n let currentTable: string | null = null;\n\n for (const line of content.split(\"\\n\")) {\n const tableMatch = line.match(/^\\t(\\w+):\\s*defineTable\\(/);\n if (tableMatch) {\n currentTable = tableMatch[1];\n tables.set(currentTable, new Set());\n continue;\n }\n\n if (currentTable && /^\\t[}\\)]/.test(line) && !/^\\t\\t/.test(line)) {\n currentTable = null;\n continue;\n }\n\n if (currentTable) {\n const fieldMatch = line.match(/^\\t\\t(\\w+):\\s*v\\./);\n if (fieldMatch) tables.get(currentTable)!.add(fieldMatch[1]);\n }\n }\n\n return tables;\n}\n\n// ── Code Mapping Classifiers ───────────────────────────────────────────\n\nfunction cleanFieldRef(field: string): string {\n return field\n .replace(/\\s*\\(.*\\)\\s*$/, \"\")\n .replace(/\\s*=\\s*.*$/, \"\")\n .trim();\n}\n\nfunction splitMultiRefs(field: string): string[] {\n if (field.includes(\" + \")) return field.split(/\\s*\\+\\s*/);\n return [field];\n}\n\nconst FILE_EXT_RE = /\\.(ts|js|svelte|json|css|md|jsx|tsx|mjs|cjs)(?:\\s|$)/i;\n\nfunction classifyRef(cleaned: string): MappingKind {\n if (cleaned.includes(\"/\") || FILE_EXT_RE.test(cleaned) || /^\\.\\w+/.test(cleaned)) {\n return \"file\";\n }\n if (/^\\w+\\.\\w+$/.test(cleaned)) return \"schema\";\n if (/^\\w+\\s+table$/i.test(cleaned)) return \"schema\";\n return \"conceptual\";\n}\n\n// ── Verification Checkers ──────────────────────────────────────────────\n\nfunction checkFileRef(ref: string, root: string): { result: CheckResult; reason: string } {\n const filePart = ref.split(/\\s+/)[0];\n const fullPath = resolve(root, filePart);\n if (existsSync(fullPath)) return { result: \"verified\", reason: \"exists\" };\n return { result: \"drifted\", reason: `not found: ${filePart}` };\n}\n\nfunction checkSchemaRef(\n ref: string,\n schema: Map<string, Set<string>>,\n): { result: CheckResult; reason: string } {\n const tableOnlyMatch = ref.match(/^(\\w+)\\s+table$/i);\n if (tableOnlyMatch) {\n const table = tableOnlyMatch[1];\n if (schema.has(table)) return { result: \"verified\", reason: `table \"${table}\" exists` };\n return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n }\n\n const dotIdx = ref.indexOf(\".\");\n if (dotIdx > 0) {\n const table = ref.slice(0, dotIdx);\n const field = ref.slice(dotIdx + 1);\n if (!schema.has(table)) return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n if (!schema.get(table)!.has(field)) return { result: \"drifted\", reason: `field \"${field}\" not found in table \"${table}\"` };\n return { result: \"verified\", reason: `${table}.${field} exists` };\n }\n\n return { result: \"unverifiable\", reason: \"could not parse schema reference\" };\n}\n\n// ── Trust Report Formatter ─────────────────────────────────────────────\n\nfunction formatTrustReport(\n collection: string,\n entryCount: number,\n mappings: MappingCheck[],\n refs: RefCheck[],\n fixes: string[],\n mode: string,\n schemaTableCount: number,\n projectRoot: string,\n): string {\n const verified = mappings.filter((c) => c.result === \"verified\").length;\n const drifted = mappings.filter((c) => c.result === \"drifted\").length;\n const unverifiable = mappings.filter((c) => c.result === \"unverifiable\").length;\n\n const refsValid = refs.filter((c) => c.found).length;\n const refsBroken = refs.filter((c) => !c.found).length;\n\n const totalChecks = mappings.length + refs.length;\n const totalPassed = verified + refsValid;\n const trustScore = totalChecks > 0 ? Math.round((totalPassed / totalChecks) * 100) : 100;\n\n const lines: string[] = [\n `# Trust Report: ${collection} (${entryCount} entries scanned)`,\n \"\",\n ];\n\n if (mappings.length > 0) {\n lines.push(\n \"## Code Mapping Verification\",\n `- ${mappings.length} mappings checked`,\n `- ${verified} verified (${Math.round((verified / mappings.length) * 100)}%)`,\n `- ${drifted} drifted (file/schema not found)`,\n `- ${unverifiable} unverifiable (conceptual — skipped)`,\n \"\",\n );\n }\n\n if (drifted > 0) {\n lines.push(\"### Drifted Mappings\");\n for (const mc of mappings.filter((c) => c.result === \"drifted\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\` — ${mc.reason}`);\n }\n lines.push(\"\");\n }\n\n if (unverifiable > 0) {\n lines.push(\"### Unverifiable (Conceptual)\");\n for (const mc of mappings.filter((c) => c.result === \"unverifiable\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\``);\n }\n lines.push(\"\");\n }\n\n if (refs.length > 0) {\n lines.push(\n \"## Cross-Reference Verification\",\n `- ${refs.length} references checked`,\n `- ${refsValid} valid (${refs.length > 0 ? Math.round((refsValid / refs.length) * 100) : 0}%)`,\n `- ${refsBroken} broken`,\n \"\",\n );\n }\n\n if (refsBroken > 0) {\n lines.push(\"### Broken References\");\n for (const rc of refs.filter((c) => !c.found)) {\n lines.push(`- **${rc.entryId}** (${rc.entryName}): relatedRules \\`${rc.refValue}\\` — entry not found`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Trust Score: ${trustScore}% (${totalPassed} of ${totalChecks} checks passed)`);\n\n if (mode === \"fix\" && fixes.length > 0) {\n lines.push(\n \"\",\n \"## Applied Fixes\",\n `Updated codeMapping status from \\`aligned\\` → \\`drifted\\` on ${fixes.length} entr${fixes.length === 1 ? \"y\" : \"ies\"}:`,\n );\n for (const eid of fixes) lines.push(`- ${eid}`);\n } else if (mode === \"report\" && drifted > 0) {\n const fixable = mappings.filter((c) => c.result === \"drifted\" && c.currentStatus === \"aligned\").length;\n if (fixable > 0) {\n lines.push(\"\", `_${fixable} mapping(s) marked \"aligned\" but actually drifted. Run with mode=\"fix\" to update._`);\n }\n }\n\n lines.push(\"\", \"---\", `_Schema: ${schemaTableCount} tables parsed from convex/schema.ts. Project root: ${projectRoot}_`);\n\n return lines.join(\"\\n\");\n}\n\n// ── Tool Registration ──────────────────────────────────────────────────\n\nexport function registerVerifyTools(server: McpServer) {\n server.registerTool(\n \"verify\",\n {\n title: \"Verify Knowledge Base\",\n description:\n \"Verify knowledge entries against the actual codebase. Checks glossary code mappings \" +\n \"(do referenced files and schema fields still exist?) and validates cross-references \" +\n \"(do relatedRules point to real entries?). Produces a trust report with a trust score. \" +\n \"Use mode='fix' to auto-update drifted codeMapping statuses.\",\n inputSchema: {\n collection: z.string().default(\"glossary\")\n .describe(\"Collection slug to verify (default: glossary)\"),\n mode: z.enum([\"report\", \"fix\"]).default(\"report\")\n .describe(\"'report' = read-only trust report. 'fix' = also update drifted codeMapping statuses.\"),\n },\n annotations: { readOnlyHint: false },\n },\n async ({ collection, mode }) => {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Verification Failed\\n\\n\" +\n \"Cannot find project root (looked for `convex/schema.ts` in cwd and parent directory).\\n\\n\" +\n \"Set `WORKSPACE_PATH` in `.env.mcp` to the absolute path of the Product Brain project root.\",\n }],\n };\n }\n\n const schema = parseConvexSchema(resolve(projectRoot, \"convex/schema.ts\"));\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Verifying \"${collection}\" against ${schema.size} schema tables at ${projectRoot}`,\n logger: \"product-os\",\n });\n\n const scopedEntries = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: collection });\n\n if (scopedEntries.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: `No entries found in \\`${collection}\\`. Nothing to verify.` }],\n };\n }\n\n // Build cross-reference lookup: fetch all entries to check relatedRules\n let allEntryIds: Set<string>;\n try {\n const allEntries = await mcpQuery<any[]>(\"kb.listEntries\", {});\n allEntryIds = new Set(allEntries.map((e: any) => e.entryId).filter(Boolean));\n } catch {\n allEntryIds = new Set(scopedEntries.map((e: any) => e.entryId).filter(Boolean));\n }\n\n const mappingChecks: MappingCheck[] = [];\n const refChecks: RefCheck[] = [];\n\n for (const entry of scopedEntries) {\n const eid = entry.entryId ?? entry.name;\n const ename = entry.name;\n\n // ── Code mapping verification ──\n const codeMappings: any[] = entry.data?.codeMapping ?? [];\n for (const cm of codeMappings) {\n const rawField: string = cm.field ?? \"\";\n for (const rawRef of splitMultiRefs(rawField)) {\n const cleaned = cleanFieldRef(rawRef);\n if (!cleaned) continue;\n\n const kind = classifyRef(cleaned);\n let result: CheckResult;\n let reason: string;\n\n if (kind === \"file\") {\n ({ result, reason } = checkFileRef(cleaned, projectRoot));\n } else if (kind === \"schema\") {\n ({ result, reason } = checkSchemaRef(cleaned, schema));\n } else {\n result = \"unverifiable\";\n reason = \"conceptual reference\";\n }\n\n mappingChecks.push({\n entryId: eid, entryName: ename, field: rawRef.trim(),\n kind, result, reason, currentStatus: cm.status ?? \"unknown\",\n });\n }\n }\n\n // ── Cross-reference verification (relatedRules only) ──\n const MAX_CROSS_REFS = 50;\n const relatedRules: string[] = entry.data?.relatedRules ?? [];\n for (const ruleId of relatedRules) {\n if (refChecks.length >= MAX_CROSS_REFS) break;\n refChecks.push({\n entryId: eid, entryName: ename, refValue: ruleId,\n found: allEntryIds.has(ruleId),\n });\n }\n }\n\n // ── Fix mode: update aligned → drifted ──\n const fixes: string[] = [];\n if (mode === \"fix\") {\n const driftedByEntry = new Map<string, Set<string>>();\n for (const mc of mappingChecks) {\n if (mc.result === \"drifted\" && mc.currentStatus === \"aligned\") {\n if (!driftedByEntry.has(mc.entryId)) driftedByEntry.set(mc.entryId, new Set());\n driftedByEntry.get(mc.entryId)!.add(mc.field);\n }\n }\n\n for (const [eid, driftedFields] of driftedByEntry) {\n const entry = scopedEntries.find((e: any) => (e.entryId ?? e.name) === eid);\n if (!entry?.entryId) continue;\n\n const updated = (entry.data?.codeMapping ?? []).map((cm: any) =>\n cm.status === \"aligned\" && driftedFields.has(cm.field)\n ? { ...cm, status: \"drifted\" }\n : cm,\n );\n\n await mcpMutation(\"kb.updateEntry\", {\n entryId: entry.entryId,\n data: { codeMapping: updated },\n });\n fixes.push(entry.entryId);\n }\n }\n\n const report = formatTrustReport(\n collection, scopedEntries.length,\n mappingChecks, refChecks, fixes, mode,\n schema.size, projectRoot,\n );\n\n return { content: [{ type: \"text\" as const, text: report }] };\n },\n );\n}\n","/**\n * Smart capture — ARCH-node-mcp (Core layer)\n * KB: FEAT-MCP-001 (MCP Server), ARCH-flow-smart-capture\n * Rules: SOS-016 (governed draft-first), SOS-015 (unique IDs within scope)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\n// ── Collection Workflow Profiles ────────────────────────────────────────────\n\ninterface FieldDefault {\n key: string;\n value: unknown | \"today\" | \"infer\";\n}\n\ninterface QualityCheck {\n id: string;\n label: string;\n check: (ctx: CaptureContext) => boolean;\n suggestion?: (ctx: CaptureContext) => string;\n}\n\ninterface CollectionProfile {\n idPrefix: string;\n governedDraft: boolean;\n defaults: FieldDefault[];\n descriptionField: string;\n recommendedRelationTypes: string[];\n qualityChecks: QualityCheck[];\n inferField?: (ctx: CaptureContext) => Record<string, unknown>;\n}\n\ninterface CaptureContext {\n collection: string;\n name: string;\n description: string;\n context?: string;\n data: Record<string, unknown>;\n entryId: string;\n linksCreated: LinkResult[];\n linksSuggested: LinkSuggestion[];\n collectionFields: Array<{ key: string; type: string; required?: boolean }>;\n}\n\ninterface LinkResult {\n targetEntryId: string;\n targetName: string;\n targetCollection: string;\n relationType: string;\n}\n\ninterface LinkSuggestion {\n entryId?: string;\n name: string;\n collection: string;\n reason: string;\n preview: string;\n}\n\nconst AREA_KEYWORDS: Record<string, string[]> = {\n \"Architecture\": [\"convex\", \"schema\", \"database\", \"migration\", \"api\", \"backend\", \"infrastructure\", \"scaling\", \"performance\"],\n \"Knowledge Base\": [\"knowledge\", \"glossary\", \"entry\", \"collection\", \"terminology\", \"drift\", \"graph\"],\n \"AI & MCP Integration\": [\"mcp\", \"ai\", \"cursor\", \"agent\", \"tool\", \"llm\", \"prompt\", \"context\"],\n \"Developer Experience\": [\"dx\", \"developer\", \"ide\", \"workflow\", \"friction\", \"ceremony\"],\n \"Governance & Decision-Making\": [\"governance\", \"decision\", \"rule\", \"policy\", \"compliance\", \"approval\"],\n \"Analytics & Tracking\": [\"analytics\", \"posthog\", \"tracking\", \"event\", \"metric\", \"funnel\"],\n \"Security\": [\"security\", \"auth\", \"api key\", \"permission\", \"access\", \"token\"],\n};\n\nfunction inferArea(text: string): string {\n const lower = text.toLowerCase();\n let bestArea = \"\";\n let bestScore = 0;\n for (const [area, keywords] of Object.entries(AREA_KEYWORDS)) {\n const score = keywords.filter((kw) => lower.includes(kw)).length;\n if (score > bestScore) {\n bestScore = score;\n bestArea = area;\n }\n }\n return bestArea;\n}\n\nfunction inferDomain(text: string): string {\n return inferArea(text) || \"\";\n}\n\nconst COMMON_CHECKS: Record<string, QualityCheck> = {\n clearName: {\n id: \"clear-name\",\n label: \"Clear, specific name (not vague)\",\n check: (ctx) => ctx.name.length > 10 && ![\"new tension\", \"new entry\", \"untitled\", \"test\"].includes(ctx.name.toLowerCase()),\n suggestion: () => \"Rename to something specific — describe the actual problem or concept.\",\n },\n hasDescription: {\n id: \"has-description\",\n label: \"Description provided (>50 chars)\",\n check: (ctx) => ctx.description.length > 50,\n suggestion: () => \"Add a fuller description explaining context and impact.\",\n },\n hasRelations: {\n id: \"has-relations\",\n label: \"At least 1 relation created\",\n check: (ctx) => ctx.linksCreated.length >= 1,\n suggestion: () => \"Use `suggest-links` and `relate-entries` to connect this entry to related knowledge.\",\n },\n diverseRelations: {\n id: \"diverse-relations\",\n label: \"Relations span multiple collections\",\n check: (ctx) => {\n const colls = new Set(ctx.linksCreated.map((l) => l.targetCollection));\n return colls.size >= 2;\n },\n suggestion: () => \"Try linking to entries in different collections (glossary, business-rules, strategy).\",\n },\n};\n\nconst PROFILES: Map<string, CollectionProfile> = new Map([\n [\"tensions\", {\n idPrefix: \"TEN\",\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [\n { key: \"priority\", value: \"medium\" },\n { key: \"date\", value: \"today\" },\n { key: \"raised\", value: \"infer\" },\n { key: \"severity\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"surfaces_tension_in\", \"references\", \"belongs_to\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const text = `${ctx.name} ${ctx.description}`;\n const area = inferArea(text);\n if (area) fields.raised = area;\n if (text.toLowerCase().includes(\"critical\") || text.toLowerCase().includes(\"blocker\")) {\n fields.severity = \"critical\";\n } else if (text.toLowerCase().includes(\"bottleneck\") || text.toLowerCase().includes(\"scaling\") || text.toLowerCase().includes(\"breaking\")) {\n fields.severity = \"high\";\n } else {\n fields.severity = \"medium\";\n }\n if (area) fields.affectedArea = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-severity\",\n label: \"Severity specified\",\n check: (ctx) => !!ctx.data.severity && ctx.data.severity !== \"\",\n suggestion: (ctx) => {\n const text = `${ctx.name} ${ctx.description}`.toLowerCase();\n const inferred = text.includes(\"critical\") ? \"critical\" : text.includes(\"bottleneck\") ? \"high\" : \"medium\";\n return `Set severity — suggest: ${inferred} (based on description keywords).`;\n },\n },\n {\n id: \"has-affected-area\",\n label: \"Affected area identified\",\n check: (ctx) => !!ctx.data.affectedArea && ctx.data.affectedArea !== \"\",\n suggestion: (ctx) => {\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n return area\n ? `Set affectedArea — suggest: \"${area}\" (inferred from content).`\n : \"Specify which product area or domain this tension impacts.\";\n },\n },\n ],\n }],\n\n [\"business-rules\", {\n idPrefix: \"SOS\",\n governedDraft: true,\n descriptionField: \"description\",\n defaults: [\n { key: \"severity\", value: \"medium\" },\n { key: \"domain\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"governs\", \"references\", \"conflicts_with\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n if (domain) fields.domain = domain;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-rationale\",\n label: \"Rationale provided\",\n check: (ctx) => typeof ctx.data.rationale === \"string\" && ctx.data.rationale.length > 10,\n suggestion: () => \"Add a rationale explaining why this rule exists via `update-entry`.\",\n },\n {\n id: \"has-domain\",\n label: \"Domain specified\",\n check: (ctx) => !!ctx.data.domain && ctx.data.domain !== \"\",\n suggestion: (ctx) => {\n const domain = inferDomain(`${ctx.name} ${ctx.description}`);\n return domain\n ? `Set domain — suggest: \"${domain}\" (inferred from content).`\n : \"Specify the business domain this rule belongs to.\";\n },\n },\n ],\n }],\n\n [\"glossary\", {\n idPrefix: \"GT\",\n governedDraft: true,\n descriptionField: \"canonical\",\n defaults: [\n { key: \"category\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"defines_term_for\", \"confused_with\", \"related_to\", \"references\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) {\n const categoryMap: Record<string, string> = {\n \"Architecture\": \"Platform & Architecture\",\n \"Knowledge Base\": \"Knowledge Management\",\n \"AI & MCP Integration\": \"AI & Developer Tools\",\n \"Developer Experience\": \"AI & Developer Tools\",\n \"Governance & Decision-Making\": \"Governance & Process\",\n \"Analytics & Tracking\": \"Platform & Architecture\",\n \"Security\": \"Platform & Architecture\",\n };\n fields.category = categoryMap[area] ?? \"\";\n }\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n {\n id: \"has-canonical\",\n label: \"Canonical definition provided (>20 chars)\",\n check: (ctx) => {\n const canonical = ctx.data.canonical;\n return typeof canonical === \"string\" && canonical.length > 20;\n },\n suggestion: () => \"Add a clear canonical definition — this is the single source of truth for this term.\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-category\",\n label: \"Category assigned\",\n check: (ctx) => !!ctx.data.category && ctx.data.category !== \"\",\n suggestion: () => \"Assign a category (e.g., 'Platform & Architecture', 'Governance & Process').\",\n },\n ],\n }],\n\n [\"decisions\", {\n idPrefix: \"DEC\",\n governedDraft: false,\n descriptionField: \"rationale\",\n defaults: [\n { key: \"date\", value: \"today\" },\n { key: \"decidedBy\", value: \"infer\" },\n ],\n recommendedRelationTypes: [\"informs\", \"references\", \"replaces\", \"related_to\"],\n inferField: (ctx: CaptureContext) => {\n const fields: Record<string, unknown> = {};\n const area = inferArea(`${ctx.name} ${ctx.description}`);\n if (area) fields.decidedBy = area;\n return fields;\n },\n qualityChecks: [\n COMMON_CHECKS.clearName,\n {\n id: \"has-rationale\",\n label: \"Rationale provided (>30 chars)\",\n check: (ctx) => {\n const rationale = ctx.data.rationale;\n return typeof rationale === \"string\" && rationale.length > 30;\n },\n suggestion: () => \"Explain why this decision was made — what was considered and rejected?\",\n },\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-date\",\n label: \"Decision date recorded\",\n check: (ctx) => !!ctx.data.date && ctx.data.date !== \"\",\n suggestion: () => \"Record when this decision was made.\",\n },\n ],\n }],\n\n [\"features\", {\n idPrefix: \"FEAT\",\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [] as FieldDefault[],\n recommendedRelationTypes: [\"belongs_to\", \"depends_on\", \"surfaces_tension_in\", \"related_to\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n {\n id: \"has-owner\",\n label: \"Owner assigned\",\n check: (ctx: CaptureContext) => !!ctx.data.owner && ctx.data.owner !== \"\",\n suggestion: () => \"Assign an owner team or product area.\",\n },\n {\n id: \"has-rationale\",\n label: \"Rationale documented\",\n check: (ctx: CaptureContext) => !!ctx.data.rationale && String(ctx.data.rationale).length > 20,\n suggestion: () => \"Explain why this feature matters — what problem does it solve?\",\n },\n ],\n } satisfies CollectionProfile],\n]);\n\nconst FALLBACK_PROFILE: CollectionProfile = {\n idPrefix: \"\",\n governedDraft: false,\n descriptionField: \"description\",\n defaults: [],\n recommendedRelationTypes: [\"related_to\", \"references\"],\n qualityChecks: [\n COMMON_CHECKS.clearName,\n COMMON_CHECKS.hasDescription,\n COMMON_CHECKS.hasRelations,\n ],\n};\n\n// ── ID Generation ───────────────────────────────────────────────────────────\n\nfunction generateEntryId(prefix: string): string {\n if (!prefix) return \"\";\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 6; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `${prefix}-${suffix}`;\n}\n\n// ── Auto-Linking Logic ──────────────────────────────────────────────────────\n\nfunction extractSearchTerms(name: string, description: string): string {\n const text = `${name} ${description}`;\n return text\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 8)\n .join(\" \");\n}\n\nfunction computeLinkConfidence(\n candidate: { name: string; data?: any; entryId?: string },\n sourceName: string,\n sourceDescription: string,\n sourceCollection: string,\n candidateCollection: string,\n): number {\n const text = `${sourceName} ${sourceDescription}`.toLowerCase();\n const candidateName = candidate.name.toLowerCase();\n let score = 0;\n\n if (text.includes(candidateName) && candidateName.length > 3) {\n score += 40;\n }\n\n const candidateWords = candidateName.split(/\\s+/).filter((w) => w.length > 3);\n const matchingWords = candidateWords.filter((w) => text.includes(w));\n score += (matchingWords.length / Math.max(candidateWords.length, 1)) * 30;\n\n const HUB_COLLECTIONS = new Set([\"strategy\", \"features\"]);\n if (HUB_COLLECTIONS.has(candidateCollection)) {\n score += 15;\n }\n\n if (candidateCollection !== sourceCollection) {\n score += 10;\n }\n\n return Math.min(score, 100);\n}\n\nfunction inferRelationType(\n sourceCollection: string,\n targetCollection: string,\n profile: CollectionProfile,\n): string {\n const typeMap: Record<string, Record<string, string>> = {\n tensions: {\n glossary: \"surfaces_tension_in\",\n \"business-rules\": \"references\",\n strategy: \"belongs_to\",\n features: \"surfaces_tension_in\",\n decisions: \"references\",\n },\n \"business-rules\": {\n glossary: \"references\",\n features: \"governs\",\n strategy: \"belongs_to\",\n tensions: \"references\",\n },\n glossary: {\n features: \"defines_term_for\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n },\n decisions: {\n features: \"informs\",\n \"business-rules\": \"references\",\n strategy: \"references\",\n tensions: \"references\",\n },\n };\n\n return typeMap[sourceCollection]?.[targetCollection]\n ?? profile.recommendedRelationTypes[0]\n ?? \"related_to\";\n}\n\n// ── Quality Scoring ─────────────────────────────────────────────────────────\n\ninterface QualityResult {\n score: number;\n maxScore: number;\n checks: Array<{ id: string; label: string; passed: boolean; suggestion?: string }>;\n}\n\nfunction scoreQuality(ctx: CaptureContext, profile: CollectionProfile): QualityResult {\n const checks = profile.qualityChecks.map((qc) => {\n const passed = qc.check(ctx);\n return {\n id: qc.id,\n label: qc.label,\n passed,\n suggestion: passed ? undefined : qc.suggestion?.(ctx),\n };\n });\n\n const passed = checks.filter((c) => c.passed).length;\n const total = checks.length;\n const score = total > 0 ? Math.round((passed / total) * 10) : 10;\n\n return { score, maxScore: 10, checks };\n}\n\nexport function formatQualityReport(result: QualityResult): string {\n const lines: string[] = [`## Quality: ${result.score}/${result.maxScore}`];\n for (const check of result.checks) {\n const icon = check.passed ? \"[x]\" : \"[ ]\";\n const suggestion = check.passed ? \"\" : ` -- ${check.suggestion ?? \"\"}`;\n lines.push(`${icon} ${check.label}${suggestion}`);\n }\n return lines.join(\"\\n\");\n}\n\n// ── Exported: quality-check for existing entries ────────────────────────────\n\nexport async function checkEntryQuality(entryId: string): Promise<{ text: string; quality: QualityResult }> {\n const entry = await mcpQuery<any>(\"kb.getEntry\", { entryId });\n if (!entry) {\n return {\n text: `Entry \\`${entryId}\\` not found. Try kb-search to find the right ID.`,\n quality: { score: 0, maxScore: 10, checks: [] },\n };\n }\n\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n const collectionSlug = collMap.get(entry.collectionId) ?? \"unknown\";\n\n const profile = PROFILES.get(collectionSlug) ?? FALLBACK_PROFILE;\n\n const relations = await mcpQuery<any[]>(\"kb.listEntryRelations\", { entryId });\n const linksCreated: LinkResult[] = [];\n for (const r of relations) {\n const otherId = r.fromId === entry._id ? r.toId : r.fromId;\n linksCreated.push({\n targetEntryId: otherId,\n targetName: \"\",\n targetCollection: \"\",\n relationType: r.type,\n });\n }\n\n const descField = profile.descriptionField;\n const description = typeof entry.data?.[descField] === \"string\" ? entry.data[descField] : \"\";\n\n const ctx: CaptureContext = {\n collection: collectionSlug,\n name: entry.name,\n description,\n data: entry.data ?? {},\n entryId: entry.entryId ?? \"\",\n linksCreated,\n linksSuggested: [],\n collectionFields: [],\n };\n\n const quality = scoreQuality(ctx, profile);\n\n const lines: string[] = [\n `# Quality Check: ${entry.entryId ?? entry.name}`,\n `**${entry.name}** in \\`${collectionSlug}\\` [${entry.status}]`,\n \"\",\n formatQualityReport(quality),\n ];\n\n if (quality.score < 10) {\n const failedChecks = quality.checks.filter((c) => !c.passed && c.suggestion);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: use \\`update-entry\\` to fill missing fields, or \\`relate-entries\\` to add connections._`);\n }\n }\n\n return { text: lines.join(\"\\n\"), quality };\n}\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nconst GOVERNED_COLLECTIONS = new Set([\n \"glossary\", \"business-rules\", \"principles\", \"standards\", \"strategy\", \"features\",\n]);\n\nconst AUTO_LINK_CONFIDENCE_THRESHOLD = 35;\nconst MAX_AUTO_LINKS = 5;\nconst MAX_SUGGESTIONS = 5;\n\nexport function registerSmartCaptureTools(server: McpServer) {\n\n server.registerTool(\n \"smart-capture\",\n {\n title: \"Smart Capture\",\n description:\n \"One-call knowledge capture: creates an entry, auto-links related entries, and returns a quality scorecard. \" +\n \"Replaces the multi-step workflow of create-entry + suggest-links + relate-entries. \" +\n \"Provide a collection, name, and description — everything else is inferred or auto-filled.\\n\\n\" +\n \"Supported collections with smart profiles: tensions, business-rules, glossary, decisions.\\n\" +\n \"All other collections use sensible defaults (same as quick-capture + auto-linking).\\n\\n\" +\n \"Always creates as 'draft' for governed collections. Embodies 'Capture Now, Curate Later' (PRI-81cbdq).\",\n inputSchema: {\n collection: z.string().describe(\"Collection slug, e.g. 'tensions', 'business-rules', 'glossary', 'decisions'\"),\n name: z.string().describe(\"Display name — be specific (e.g. 'Convex adjacency list won't scale for graph traversal')\"),\n description: z.string().describe(\"Full context — what's happening, why it matters, what you observed\"),\n context: z.string().optional().describe(\"Optional additional context (e.g. 'Observed during gather-context calls taking 700ms+')\"),\n entryId: z.string().optional().describe(\"Optional custom entry ID (e.g. 'TEN-my-id'). Auto-generated if omitted.\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ collection, name, description, context, entryId }) => {\n const profile = PROFILES.get(collection) ?? FALLBACK_PROFILE;\n\n // 1. Resolve collection schema\n const col = await mcpQuery<any>(\"kb.getCollection\", { slug: collection });\n if (!col) {\n return {\n content: [{ type: \"text\" as const, text: `Collection \\`${collection}\\` not found. Use \\`list-collections\\` to see available collections.` }],\n };\n }\n\n // 2. Build data with profile defaults + inference\n const data: Record<string, unknown> = {};\n const today = new Date().toISOString().split(\"T\")[0];\n\n for (const field of col.fields ?? []) {\n const key = field.key as string;\n if (key === profile.descriptionField) {\n data[key] = description;\n } else if (field.type === \"array\" || field.type === \"multi-select\") {\n data[key] = [];\n } else {\n data[key] = \"\";\n }\n }\n\n for (const def of profile.defaults) {\n if (def.value === \"today\") {\n data[def.key] = today;\n } else if (def.value !== \"infer\") {\n data[def.key] = def.value;\n }\n }\n\n if (profile.inferField) {\n const inferred = profile.inferField({\n collection, name, description, context, data, entryId: \"\",\n linksCreated: [], linksSuggested: [], collectionFields: col.fields ?? [],\n });\n for (const [key, val] of Object.entries(inferred)) {\n if (val !== undefined && val !== \"\") {\n data[key] = val;\n }\n }\n }\n\n if (!data[profile.descriptionField] && !data.description && !data.canonical) {\n data[profile.descriptionField || \"description\"] = description;\n }\n\n // 3. Determine status\n const status = GOVERNED_COLLECTIONS.has(collection) ? \"draft\" : \"draft\";\n\n // 4. Generate entry ID\n const finalEntryId = entryId ?? generateEntryId(profile.idPrefix);\n\n // 5. Create entry\n let internalId: string;\n try {\n internalId = await mcpMutation<string>(\"kb.createEntry\", {\n collectionSlug: collection,\n entryId: finalEntryId || undefined,\n name,\n status,\n data,\n createdBy: \"smart-capture\",\n });\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"Duplicate\") || msg.includes(\"already exists\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Cannot Capture — Duplicate Detected\\n\\n${msg}\\n\\nUse \\`get-entry\\` to inspect the existing entry, or \\`update-entry\\` to modify it.`,\n }],\n };\n }\n throw error;\n }\n\n // 6. Discover and auto-link related entries\n const linksCreated: LinkResult[] = [];\n const linksSuggested: LinkSuggestion[] = [];\n\n const searchQuery = extractSearchTerms(name, description);\n if (searchQuery) {\n const [searchResults, allCollections] = await Promise.all([\n mcpQuery<any[]>(\"kb.searchEntries\", { query: searchQuery }),\n mcpQuery<any[]>(\"kb.listCollections\"),\n ]);\n\n const collMap = new Map<string, string>();\n for (const c of allCollections) collMap.set(c._id, c.slug);\n\n const candidates = (searchResults ?? [])\n .filter((r) => r.entryId !== finalEntryId && r._id !== internalId)\n .map((r) => ({\n ...r,\n collSlug: collMap.get(r.collectionId) ?? \"unknown\",\n confidence: computeLinkConfidence(r, name, description, collection, collMap.get(r.collectionId) ?? \"unknown\"),\n }))\n .sort((a, b) => b.confidence - a.confidence);\n\n // Auto-link high-confidence matches\n for (const c of candidates) {\n if (linksCreated.length >= MAX_AUTO_LINKS) break;\n if (c.confidence < AUTO_LINK_CONFIDENCE_THRESHOLD) break;\n if (!c.entryId || !finalEntryId) continue;\n\n const relationType = inferRelationType(collection, c.collSlug, profile);\n try {\n await mcpMutation(\"kb.createEntryRelation\", {\n fromEntryId: finalEntryId,\n toEntryId: c.entryId,\n type: relationType,\n });\n linksCreated.push({\n targetEntryId: c.entryId,\n targetName: c.name,\n targetCollection: c.collSlug,\n relationType,\n });\n } catch {\n // Relation creation failed (e.g. entry not found) — skip silently\n }\n }\n\n // Collect suggestions for remaining candidates\n const linkedIds = new Set(linksCreated.map((l) => l.targetEntryId));\n for (const c of candidates) {\n if (linksSuggested.length >= MAX_SUGGESTIONS) break;\n if (linkedIds.has(c.entryId)) continue;\n if (c.confidence < 10) continue;\n\n const preview = extractPreview(c.data, 80);\n const reason = c.confidence >= AUTO_LINK_CONFIDENCE_THRESHOLD\n ? \"high relevance (already linked)\"\n : `\"${c.name.toLowerCase().split(/\\s+/).filter((w: string) => `${name} ${description}`.toLowerCase().includes(w) && w.length > 3).slice(0, 2).join('\", \"')}\" appears in content`;\n\n linksSuggested.push({\n entryId: c.entryId,\n name: c.name,\n collection: c.collSlug,\n reason,\n preview,\n });\n }\n }\n\n // 7. Score quality\n const captureCtx: CaptureContext = {\n collection,\n name,\n description,\n context,\n data,\n entryId: finalEntryId,\n linksCreated,\n linksSuggested,\n collectionFields: col.fields ?? [],\n };\n const quality = scoreQuality(captureCtx, profile);\n\n // 8. Format response\n const lines: string[] = [\n `# Captured: ${finalEntryId || name}`,\n `**${name}** added to \\`${collection}\\` as \\`${status}\\``,\n ];\n\n if (linksCreated.length > 0) {\n lines.push(\"\");\n lines.push(`## Auto-linked (${linksCreated.length})`);\n for (const link of linksCreated) {\n lines.push(`- -> **${link.relationType}** ${link.targetEntryId}: ${link.targetName} [${link.targetCollection}]`);\n }\n }\n\n if (linksSuggested.length > 0) {\n lines.push(\"\");\n lines.push(\"## Suggested links (review and use relate-entries)\");\n for (let i = 0; i < linksSuggested.length; i++) {\n const s = linksSuggested[i];\n const preview = s.preview ? ` — ${s.preview}` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collection}]${preview}`);\n }\n }\n\n lines.push(\"\");\n lines.push(formatQualityReport(quality));\n\n const failedChecks = quality.checks.filter((c) => !c.passed);\n if (failedChecks.length > 0) {\n lines.push(\"\");\n lines.push(`_To improve: \\`update-entry entryId=\"${finalEntryId}\"\\` to fill missing fields._`);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n // ── Quality Check Tool ──────────────────────────────────────────────────\n\n server.registerTool(\n \"quality-check\",\n {\n title: \"Quality Check\",\n description:\n \"Score an existing knowledge entry against collection-specific quality criteria. \" +\n \"Returns a scorecard (X/10) with specific, actionable suggestions for improvement. \" +\n \"Checks: name clarity, description completeness, relation connectedness, and collection-specific fields.\\n\\n\" +\n \"Use after creating entries to assess their quality, or to audit existing entries.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to check, e.g. 'TEN-graph-db', 'GT-019', 'SOS-006'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const result = await checkEntryQuality(entryId);\n return { content: [{ type: \"text\" as const, text: result.text }] };\n }\n );\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nfunction extractPreview(data: any, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const raw = data.description ?? data.canonical ?? data.detail ?? data.rule ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\n}\n","/**\n * Architecture tools — ARCH-node-mcp (Core layer)\n *\n * Tools: show-architecture, explore-layer, show-flow, seed-architecture, check-architecture\n * KB refs: FEAT-ARCH-001 (Architecture Explorer), FEAT-dep-health (Dep Health Scanner),\n * SOS-dbl1n9 (dependency direction rule), GT-wk426u (Fitness Function)\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { resolve, relative, dirname, normalize } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nconst COLLECTION_SLUG = \"architecture\";\n\nconst COLLECTION_FIELDS = [\n { key: \"archType\", label: \"Architecture Type\", type: \"select\", required: true, options: [\"template\", \"layer\", \"node\", \"flow\"], searchable: true },\n { key: \"templateRef\", label: \"Template Entry ID\", type: \"text\", searchable: false },\n { key: \"layerRef\", label: \"Layer Entry ID\", type: \"text\", searchable: false },\n { key: \"description\", label: \"Description\", type: \"text\", searchable: true },\n { key: \"color\", label: \"Color\", type: \"text\" },\n { key: \"icon\", label: \"Icon\", type: \"text\" },\n { key: \"sourceNode\", label: \"Source Node (flows)\", type: \"text\" },\n { key: \"targetNode\", label: \"Target Node (flows)\", type: \"text\" },\n { key: \"filePaths\", label: \"File Paths\", type: \"text\", searchable: true },\n { key: \"owner\", label: \"Owner (circle/role)\", type: \"text\", searchable: true },\n { key: \"layerOrder\", label: \"Layer Order (for templates)\", type: \"text\" },\n { key: \"rationale\", label: \"Why Here? (placement rationale)\", type: \"text\", searchable: true },\n { key: \"dependsOn\", label: \"Allowed Dependencies (layers this can import from)\", type: \"text\" },\n];\n\ninterface ArchEntry {\n _id: string;\n entryId: string;\n name: string;\n status: string;\n order: number;\n data: Record<string, unknown>;\n tags?: string[];\n}\n\nasync function ensureCollection(): Promise<void> {\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n if (collections.some((c: any) => c.slug === COLLECTION_SLUG)) return;\n\n await mcpMutation(\"kb.createCollection\", {\n slug: COLLECTION_SLUG,\n name: \"Architecture\",\n icon: \"🏗️\",\n description:\n \"System architecture map — templates, layers, nodes, and flows. \" +\n \"Visualized in the Architecture Explorer and via MCP architecture tools.\",\n fields: COLLECTION_FIELDS,\n });\n}\n\nasync function listArchEntries(): Promise<ArchEntry[]> {\n return mcpQuery<ArchEntry[]>(\"kb.listEntries\", { collectionSlug: COLLECTION_SLUG });\n}\n\nfunction byTag(entries: ArchEntry[], archType: string): ArchEntry[] {\n return entries\n .filter((e) => e.tags?.includes(`archType:${archType}`) || e.data?.archType === archType)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n// ── HTML renderer for MCP Apps ──────────────────────────────────────────────\n\nfunction renderArchitectureHtml(\n layers: ArchEntry[],\n nodes: ArchEntry[],\n flows: ArchEntry[],\n templateName: string,\n): string {\n const layerHtml = layers.map((layer) => {\n const layerNodes = nodes.filter(\n (n) => n.data?.layerRef === layer.entryId\n );\n const nodeCards = layerNodes.map((n) => `\n <div class=\"node\" title=\"${escHtml(String(n.data?.description ?? ''))}\">\n <span class=\"node-icon\">${escHtml(String(n.data?.icon ?? '◻'))}</span>\n <span class=\"node-name\">${escHtml(n.name)}</span>\n </div>\n `).join(\"\");\n\n return `\n <div class=\"layer\" style=\"--layer-color: ${escHtml(String(layer.data?.color ?? '#666'))}\">\n <div class=\"layer-label\">\n <span class=\"layer-dot\"></span>\n <span class=\"layer-name\">${escHtml(layer.name)}</span>\n <span class=\"layer-count\">${layerNodes.length}</span>\n </div>\n <div class=\"layer-desc\">${escHtml(String(layer.data?.description ?? ''))}</div>\n <div class=\"nodes\">${nodeCards || '<span class=\"empty\">No components</span>'}</div>\n </div>\n `;\n }).join(\"\");\n\n return `<!DOCTYPE html>\n<html><head><meta charset=\"utf-8\"><style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,system-ui,sans-serif;background:#1a1a2e;color:#e0e0e0;padding:16px}\nh1{font-size:14px;font-weight:600;color:#a0a0c0;margin-bottom:12px;letter-spacing:.04em}\n.layer{border-left:3px solid var(--layer-color);padding:8px 12px;margin-bottom:8px;background:rgba(255,255,255,.03);border-radius:0 6px 6px 0}\n.layer-label{display:flex;align-items:center;gap:8px;margin-bottom:4px}\n.layer-dot{width:8px;height:8px;border-radius:50%;background:var(--layer-color)}\n.layer-name{font-size:12px;font-weight:600;color:#fff;letter-spacing:.03em}\n.layer-count{font-size:10px;color:var(--layer-color);background:rgba(255,255,255,.06);padding:1px 6px;border-radius:8px}\n.layer-desc{font-size:11px;color:#888;margin-bottom:6px}\n.nodes{display:flex;flex-wrap:wrap;gap:6px}\n.node{display:flex;align-items:center;gap:4px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);border-radius:4px;padding:4px 8px;font-size:11px;cursor:default;transition:border-color .15s}\n.node:hover{border-color:var(--layer-color)}\n.node-icon{font-size:12px}\n.node-name{color:#ddd}\n.empty{font-size:11px;color:#555;font-style:italic}\n.flows{margin-top:12px;border-top:1px solid rgba(255,255,255,.06);padding-top:8px}\n.flow{font-size:11px;color:#888;padding:2px 0}\n.flow-arrow{color:#6366f1;margin:0 4px}\n</style></head><body>\n<h1>${escHtml(templateName)}</h1>\n${layerHtml}\n${flows.length > 0 ? `<div class=\"flows\"><div style=\"font-size:10px;color:#666;margin-bottom:4px;letter-spacing:.06em\">DATA FLOWS</div>${flows.map((f) => `<div class=\"flow\">${escHtml(f.name)}<span class=\"flow-arrow\">→</span><span style=\"color:#aaa\">${escHtml(String(f.data?.description ?? ''))}</span></div>`).join(\"\")}</div>` : \"\"}\n</body></html>`;\n}\n\nfunction escHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction formatLayerText(layer: ArchEntry, nodes: ArchEntry[]): string {\n const layerNodes = nodes.filter((n) => n.data?.layerRef === layer.entryId);\n const nodeList = layerNodes.map((n) => {\n const desc = n.data?.description ? ` — ${n.data.description}` : \"\";\n const owner = n.data?.owner ? ` (${n.data.owner})` : \"\";\n return ` - ${n.data?.icon ?? \"◻\"} **${n.name}**${desc}${owner}`;\n }).join(\"\\n\");\n return `### ${layer.name}\\n${layer.data?.description ?? \"\"}\\n\\n${nodeList || \" _No components_\"}`;\n}\n\n// ── Seed data: Product OS default architecture ──────────────────────────────\n\nconst SEED_TEMPLATE = {\n entryId: \"ARCH-tpl-product-os\",\n name: \"Product OS Default\",\n data: {\n archType: \"template\",\n description: \"Default 4-layer architecture: Auth → Infrastructure → Core → Features, with an outward Integration layer\",\n layerOrder: JSON.stringify([\"auth\", \"infrastructure\", \"core\", \"features\", \"integration\"]),\n },\n};\n\nconst SEED_LAYERS = [\n { entryId: \"ARCH-layer-auth\", name: \"Auth\", order: 0, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#22c55e\", description: \"Authentication, user management, and workspace-scoped access control\", icon: \"🔐\", dependsOn: \"none\", rationale: \"Foundation layer. Auth depends on nothing — it is the first gate. No layer may bypass auth. All other layers depend on auth to know who the user is and which workspace they belong to.\" } },\n { entryId: \"ARCH-layer-infra\", name: \"Infrastructure\", order: 1, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#ec4899\", description: \"Real-time data, event tracking, and AI model infrastructure\", icon: \"⚙️\", dependsOn: \"Auth\", rationale: \"Infrastructure sits on top of Auth. It provides the database, analytics, and AI plumbing that Core and Features consume. Infra may import from Auth (needs workspace context) but never from Core or Features.\" } },\n { entryId: \"ARCH-layer-core\", name: \"Core\", order: 2, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#8b5cf6\", description: \"Business logic, knowledge graph, workflow engines, and MCP tooling\", icon: \"🧠\", dependsOn: \"Auth, Infrastructure\", rationale: \"Core contains business logic and engines that are UI-agnostic. It may import from Auth and Infra. Features depend on Core, but Core must never depend on Features — this is what keeps engines reusable across different UIs.\" } },\n { entryId: \"ARCH-layer-features\", name: \"Features\", order: 3, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#6366f1\", description: \"User-facing pages, components, and feature modules\", icon: \"✦\", dependsOn: \"Auth, Infrastructure, Core\", rationale: \"Features are the user-facing layer — SvelteKit routes, components, and page-level logic. Features may import from any lower layer but nothing above may import from Features. This is the outermost application layer.\" } },\n { entryId: \"ARCH-layer-integration\", name: \"Integration\", order: 4, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#f59e0b\", description: \"Outward connections to external tools, IDEs, and services\", icon: \"🔌\", dependsOn: \"Core\", rationale: \"Integration is a lateral/outward layer — it connects to external systems (IDE, GitHub, Linear). It depends on Core (to expose knowledge) but sits outside the main stack. External tools call into Core via Integration, never directly into Features.\" } },\n];\n\nconst SEED_NODES = [\n // Auth layer\n { entryId: \"ARCH-node-clerk\", name: \"Clerk\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🔑\", description: \"Authentication provider — sign-in/sign-up pages, session management, organization-level access control. UserSync.svelte is cross-cutting layout glue (not mapped here).\", filePaths: \"src/routes/sign-in/, src/routes/sign-up/\", owner: \"Platform\", rationale: \"Auth layer because Clerk is the identity gate. Every request flows through auth first. No other layer provides identity.\" } },\n { entryId: \"ARCH-node-workspace\", name: \"Workspace Scoping\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🏢\", description: \"Multi-tenancy anchor — all data is workspace-scoped via workspaceId\", filePaths: \"src/lib/stores/workspace.ts, convex/workspaces.ts\", owner: \"Platform\", rationale: \"Auth layer because workspace scoping is the second gate after identity. All queries require workspaceId, making this foundational.\" } },\n\n // Infrastructure layer\n { entryId: \"ARCH-node-convex\", name: \"Convex\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"⚡\", description: \"Reactive database with real-time sync, serverless functions, and type-safe API generation. Unified Collections + Entries model\", filePaths: \"convex/schema.ts, convex/entries.ts, convex/http.ts\", owner: \"Platform\", rationale: \"Infrastructure because Convex is raw persistence and reactivity plumbing. It stores data but has no business logic opinions. Core and Features consume it.\" } },\n { entryId: \"ARCH-node-posthog\", name: \"PostHog\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"📊\", description: \"Product analytics — workspace-scoped events, feature flags, session replay\", filePaths: \"src/lib/analytics.ts, src/lib/components/PostHogWorkspaceSync.svelte\", owner: \"Platform\", rationale: \"Infrastructure because PostHog is analytics plumbing — event collection and aggregation. It has no knowledge of business domains.\" } },\n { entryId: \"ARCH-node-openrouter\", name: \"OpenRouter\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"🤖\", description: \"AI model routing for ChainWork artifact generation — streaming responses with format-aware prompts\", filePaths: \"src/routes/api/chainwork/generate/+server.ts\", owner: \"ChainWork\", rationale: \"Infrastructure because OpenRouter is an AI model gateway — it routes prompts to models. The strategy logic lives in ChainWork Engine (Core); this is just the pipe.\" } },\n\n // Core layer\n { entryId: \"ARCH-node-mcp\", name: \"MCP Server\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🔧\", description: \"20+ tools exposing the knowledge graph as AI-consumable operations — smart-capture, context assembly, verification, quality checks\", filePaths: \"packages/mcp-server/src/index.ts, packages/mcp-server/src/tools/\", owner: \"AI DX\", rationale: \"Core layer because the MCP server encodes business operations — smart-capture with auto-linking, quality scoring, governance rules. It depends on Infra (Convex) but never touches UI routes. Why not Infrastructure? Because it has domain opinions. Why not Features? Because it has no UI — any client (Cursor, CLI, API) can call it.\" } },\n { entryId: \"ARCH-node-knowledge-graph\", name: \"Knowledge Graph\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🕸️\", description: \"20 collections, 170+ entries with typed cross-collection relations. Smart capture, auto-linking, quality scoring\", filePaths: \"convex/mcpKnowledge.ts, convex/entries.ts\", owner: \"Knowledge\", rationale: \"Core layer because the knowledge graph IS the domain model — collections, entries, relations, versioning, quality scoring. Glossary DATA, business rules DATA, tension DATA all live here. Why not Features? Because the data model exists independently of any page. The Glossary page in Features is just one way to visualize terms that Core owns. Think: Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-governance\", name: \"Governance Engine\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⚖️\", description: \"Circles, roles, consent-based decision-making, tension processing with IDM-inspired async workflows\", filePaths: \"convex/versioning.ts, src/lib/components/versioning/\", owner: \"Governance\", rationale: \"Core layer because governance logic (draft→publish workflows, consent-based decisions, tension status rules) is business process that multiple UIs consume. Why not Features? Because the versioning system and proposal flow are reusable engines — the Governance Pages in Features are just one rendering of these rules.\" } },\n { entryId: \"ARCH-node-chainwork-engine\", name: \"ChainWork Engine\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⛓\", description: \"Guided strategy creation through 5-step coherence chain — AI-generated artifacts with scoring and achievements\", filePaths: \"src/lib/components/chainwork/config.ts, src/lib/components/chainwork/scoring.ts\", owner: \"ChainWork\", rationale: \"Core layer because the coherence chain logic, scoring algorithm, and quality gates are business rules. config.ts defines chain steps, scoring.ts computes quality — these could power a CLI or API. Why not Features? Because the ChainWork UI wizard in Features is just one skin over this engine.\" } },\n\n // Features layer\n { entryId: \"ARCH-node-command-center\", name: \"Command Center\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⬡\", description: \"Calm home screen — daily orientation, triage mode, pulse metrics, momentum tracking\", filePaths: \"src/routes/+page.svelte, src/lib/components/command-center/\", owner: \"Command Center\", rationale: \"Features layer because the Command Center is a SvelteKit page — PulseMetrics, NeedsAttention, DailyBriefing are UI components that assemble data from Core queries. Why not Core? Because it has no reusable business logic or engines — it is pure layout and presentation. If you deleted this page, no business rule would break.\" } },\n { entryId: \"ARCH-node-chainwork-ui\", name: \"ChainWork UI\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⛓\", description: \"Multi-step wizard for strategy artifact creation — setup, chain steps, quality gates, output\", filePaths: \"src/routes/chainwork/, src/lib/components/chainwork/\", owner: \"ChainWork\", rationale: \"Features layer because the ChainWork UI is the wizard interface — step navigation, form inputs, output rendering. Why not Core? Because the scoring logic and chain config ARE in Core (ChainWork Engine). This is the presentation skin over that engine. Delete this page and the engine still works via MCP.\" } },\n { entryId: \"ARCH-node-glossary\", name: \"Glossary\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"Aa\", description: \"Canonical vocabulary management — term detail, code drift detection, inline term linking\", filePaths: \"src/routes/glossary/, src/lib/components/glossary/\", owner: \"Knowledge\", rationale: \"Features layer — NOT Core or Infrastructure — because this is the Glossary PAGE: the SvelteKit route for browsing, editing, and viewing terms. Why not Core? Because Core owns the glossary DATA (Knowledge Graph) and term-linking logic. The MCP server also accesses glossary terms without any page. Why not Infrastructure? Because glossary is domain-specific vocabulary, not generic plumbing. The page is one consumer of the data — Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-tensions\", name: \"Tensions\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⚡\", description: \"Tension capture and processing — raise, triage, resolve through governance workflow\", filePaths: \"src/routes/tensions/, src/lib/components/tensions/\", owner: \"Governance\", rationale: \"Features layer because this is the Tensions PAGE — the UI for raising, listing, and viewing tensions. Why not Core? Because tension data, status rules (SOS-020), and processing logic already live in Core (Governance Engine). This page is a form + list view that reads from and writes to Core. Delete it and the governance engine still processes tensions via MCP.\" } },\n { entryId: \"ARCH-node-strategy\", name: \"Strategy\", order: 4, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"▣\", description: \"Product strategy pages — vision, ecosystem, product areas, decision frameworks, sequencing\", filePaths: \"src/routes/strategy/, src/routes/bridge/, src/routes/topology/\", owner: \"Strategy\", rationale: \"Features layer because Strategy is a set of SvelteKit pages (strategy, bridge, topology) that visualize strategy entries. Why not Core? Because the strategy data (vision, principles, ecosystem layers) lives in the Knowledge Graph (Core). These pages render and allow inline editing — they consume Core downward.\" } },\n { entryId: \"ARCH-node-governance-ui\", name: \"Governance Pages\", order: 5, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"◈\", description: \"Roles, circles, principles, policies, decisions, proposals, business rules\", filePaths: \"src/routes/roles/, src/routes/circles/, src/routes/decisions/, src/routes/proposals/\", owner: \"Governance\", rationale: \"Features layer because these are governance PAGES — list views and detail views for roles, circles, decisions, proposals. Why not Core? Because the governance ENGINE (versioning, consent, IDM) IS in Core. These pages are the user-facing window into governance data. The logic doesn't live here, only the rendering.\" } },\n { entryId: \"ARCH-node-artifacts\", name: \"Artifacts\", order: 6, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"📄\", description: \"Strategy artifacts from ChainWork — pitches, briefs, one-pagers linked to the knowledge graph\", filePaths: \"src/routes/artifacts/\", owner: \"ChainWork\", rationale: \"Features layer because the Artifacts page is a list/detail view for strategy artifacts produced by ChainWork. Why not Core? Because artifact data and scoring live in Core (ChainWork Engine). This page just renders the output and links back to the knowledge graph.\" } },\n\n // Integration layer\n { entryId: \"ARCH-node-cursor\", name: \"Cursor IDE\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🖥️\", description: \"AI-assisted development with MCP-powered knowledge context — smart capture, verification, context assembly in the editor\", filePaths: \".cursor/mcp.json, .cursor/rules/\", owner: \"AI DX\", rationale: \"Integration layer because Cursor is an external tool that connects INTO our system via MCP. Why not Core or Features? Because Cursor itself is not our code — it's a consumer. The .cursor/ config files define how it talks to us, but Cursor lives outside our deployment boundary.\" } },\n { entryId: \"ARCH-node-github\", name: \"GitHub\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🐙\", description: \"Code repository, PR reviews with governance context, CI/CD\", owner: \"Platform\", rationale: \"Integration layer because GitHub is an external service. Why not Infrastructure? Because Infra is about plumbing we control (database, analytics). GitHub is a third-party that hooks into our Core (PR reviews checking governance rules) but is not part of our deployed application.\" } },\n { entryId: \"ARCH-node-linear\", name: \"Linear (planned)\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"📐\", description: \"Issue tracking, roadmap sync, tension-to-issue pipeline (planned integration)\", owner: \"Platform\", rationale: \"Integration layer because Linear is an external issue tracker. Why not Infrastructure? Because Infra is generic plumbing we run. Linear is a third-party tool we connect to. The planned pipeline bridges tensions (Core) to Linear issues — a classic outward integration pattern.\" } },\n];\n\nconst SEED_FLOWS = [\n { entryId: \"ARCH-flow-smart-capture\", name: \"Smart Capture Flow\", order: 0, data: { archType: \"flow\", sourceNode: \"ARCH-node-cursor\", targetNode: \"ARCH-node-knowledge-graph\", description: \"Developer/AI calls smart-capture via MCP → entry created with auto-linking and quality score → stored in Knowledge Graph\", color: \"#8b5cf6\" } },\n { entryId: \"ARCH-flow-governance\", name: \"Governance Flow\", order: 1, data: { archType: \"flow\", sourceNode: \"ARCH-node-tensions\", targetNode: \"ARCH-node-governance\", description: \"Tension raised → appears in Command Center → triaged → processed via IDM → decision logged\", color: \"#6366f1\" } },\n { entryId: \"ARCH-flow-chainwork\", name: \"ChainWork Strategy Flow\", order: 2, data: { archType: \"flow\", sourceNode: \"ARCH-node-chainwork-ui\", targetNode: \"ARCH-node-artifacts\", description: \"Leader opens ChainWork → walks coherence chain → AI generates artifact → scored and published to knowledge graph\", color: \"#f59e0b\" } },\n { entryId: \"ARCH-flow-knowledge-trust\", name: \"Knowledge Trust Flow\", order: 3, data: { archType: \"flow\", sourceNode: \"ARCH-node-mcp\", targetNode: \"ARCH-node-glossary\", description: \"MCP verify tool checks entries against codebase → file existence, schema references validated → trust scores updated\", color: \"#22c55e\" } },\n { entryId: \"ARCH-flow-analytics\", name: \"Analytics Flow\", order: 4, data: { archType: \"flow\", sourceNode: \"ARCH-node-command-center\", targetNode: \"ARCH-node-posthog\", description: \"Feature views and actions tracked → workspace-scoped events → PostHog group analytics → Command Center metrics\", color: \"#ec4899\" } },\n];\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nexport function registerArchitectureTools(server: McpServer) {\n\n server.registerTool(\n \"show-architecture\",\n {\n title: \"Show Architecture\",\n description:\n \"Render the system architecture map — layered visualization showing where every component lives. \" +\n \"Returns layers (Auth → Infrastructure → Core → Features → Integration) with component nodes and data flows. \" +\n \"Optionally filter by a specific template.\",\n inputSchema: {\n template: z.string().optional().describe(\"Template entry ID to filter by (default: first available template)\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ template }) => {\n await ensureCollection();\n const all = await listArchEntries();\n\n const templates = byTag(all, \"template\");\n const activeTemplate = template\n ? templates.find((t) => t.entryId === template)\n : templates[0];\n\n const templateName = activeTemplate?.name ?? \"System Architecture\";\n const templateId = activeTemplate?.entryId;\n\n const layers = byTag(all, \"layer\")\n .filter((l) => !templateId || l.data?.templateRef === templateId);\n const nodes = byTag(all, \"node\");\n const flows = byTag(all, \"flow\");\n\n if (layers.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Architecture Explorer\\n\\nNo architecture data found. Use `seed-architecture` to populate the default Product OS architecture.\",\n }],\n };\n }\n\n const textLayers = layers.map((l) => formatLayerText(l, nodes)).join(\"\\n\\n\");\n const textFlows = flows.length > 0\n ? \"\\n\\n---\\n\\n## Data Flows\\n\\n\" + flows.map((f) =>\n `- **${f.name}**: ${f.data?.description ?? \"\"}`\n ).join(\"\\n\")\n : \"\";\n\n const text = `# ${templateName}\\n\\n${textLayers}${textFlows}`;\n\n const html = renderArchitectureHtml(layers, nodes, flows, templateName);\n\n return {\n content: [\n { type: \"text\" as const, text },\n { type: \"resource\" as const, resource: { uri: `ui://product-os/architecture`, mimeType: \"text/html\", text: html } },\n ],\n };\n }\n );\n\n server.registerTool(\n \"explore-layer\",\n {\n title: \"Explore Architecture Layer\",\n description:\n \"Drill into a specific architecture layer to see all its component nodes with descriptions, \" +\n \"team ownership, file paths, and linked entry counts.\",\n inputSchema: {\n layer: z.string().describe(\"Layer name or entry ID, e.g. 'Core' or 'ARCH-layer-core'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ layer }) => {\n await ensureCollection();\n const all = await listArchEntries();\n\n const layers = byTag(all, \"layer\");\n const target = layers.find(\n (l) => l.name.toLowerCase() === layer.toLowerCase() || l.entryId === layer\n );\n\n if (!target) {\n const available = layers.map((l) => `\\`${l.name}\\``).join(\", \");\n return {\n content: [{\n type: \"text\" as const,\n text: `Layer \"${layer}\" not found. Available layers: ${available}`,\n }],\n };\n }\n\n const nodes = byTag(all, \"node\").filter((n) => n.data?.layerRef === target.entryId);\n const flows = byTag(all, \"flow\").filter(\n (f) => nodes.some((n) => n.entryId === f.data?.sourceNode || n.entryId === f.data?.targetNode)\n );\n\n const depRule = target.data?.dependsOn\n ? `\\n**Dependency rule:** May import from ${target.data.dependsOn === \"none\" ? \"nothing (foundation layer)\" : target.data.dependsOn}.\\n`\n : \"\";\n const layerRationale = target.data?.rationale\n ? `\\n> ${target.data.rationale}\\n`\n : \"\";\n\n const nodeDetail = nodes.map((n) => {\n const lines = [`#### ${n.data?.icon ?? \"◻\"} ${n.name}`];\n if (n.data?.description) lines.push(String(n.data.description));\n if (n.data?.owner) lines.push(`**Owner:** ${n.data.owner}`);\n if (n.data?.filePaths) lines.push(`**Files:** \\`${n.data.filePaths}\\``);\n if (n.data?.rationale) lines.push(`\\n**Why here?** ${n.data.rationale}`);\n return lines.join(\"\\n\");\n }).join(\"\\n\\n\");\n\n const flowLines = flows.length > 0\n ? \"\\n\\n### Connected Flows\\n\\n\" + flows.map((f) => `- ${f.name}: ${f.data?.description ?? \"\"}`).join(\"\\n\")\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# ${target.data?.icon ?? \"\"} ${target.name} Layer\\n\\n${target.data?.description ?? \"\"}${depRule}${layerRationale}\\n**${nodes.length} components**\\n\\n${nodeDetail}${flowLines}`,\n }],\n };\n }\n );\n\n server.registerTool(\n \"show-flow\",\n {\n title: \"Show Architecture Flow\",\n description:\n \"Visualize a specific data flow path between architecture nodes — shows source, target, and description.\",\n inputSchema: {\n flow: z.string().describe(\"Flow name or entry ID, e.g. 'Smart Capture Flow' or 'ARCH-flow-smart-capture'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ flow }) => {\n await ensureCollection();\n const all = await listArchEntries();\n\n const flows = byTag(all, \"flow\");\n const target = flows.find(\n (f) => f.name.toLowerCase() === flow.toLowerCase() || f.entryId === flow\n );\n\n if (!target) {\n const available = flows.map((f) => `\\`${f.name}\\``).join(\", \");\n return {\n content: [{\n type: \"text\" as const,\n text: `Flow \"${flow}\" not found. Available flows: ${available}`,\n }],\n };\n }\n\n const nodes = byTag(all, \"node\");\n const source = nodes.find((n) => n.entryId === target.data?.sourceNode);\n const dest = nodes.find((n) => n.entryId === target.data?.targetNode);\n\n const lines = [\n `# ${target.name}`,\n \"\",\n `**${source?.data?.icon ?? \"?\"} ${source?.name ?? \"Unknown\"}** → **${dest?.data?.icon ?? \"?\"} ${dest?.name ?? \"Unknown\"}**`,\n \"\",\n String(target.data?.description ?? \"\"),\n ];\n\n if (source) {\n lines.push(\"\", `### Source: ${source.name}`, String(source.data?.description ?? \"\"));\n if (source.data?.filePaths) lines.push(`Files: \\`${source.data.filePaths}\\``);\n }\n if (dest) {\n lines.push(\"\", `### Target: ${dest.name}`, String(dest.data?.description ?? \"\"));\n if (dest.data?.filePaths) lines.push(`Files: \\`${dest.data.filePaths}\\``);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"seed-architecture\",\n {\n title: \"Seed Architecture Data\",\n description:\n \"Populate the architecture collection with the default Product OS architecture map. \" +\n \"Creates the template, layers, nodes, and flows. Safe to re-run — skips existing entries.\",\n annotations: { readOnlyHint: false },\n },\n async () => {\n await ensureCollection();\n const existing = await listArchEntries();\n const existingIds = new Set(existing.map((e) => e.entryId));\n\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n\n const allSeeds = [\n { ...SEED_TEMPLATE, order: 0, status: \"active\" },\n ...SEED_LAYERS.map((l) => ({ ...l, status: \"active\" as const })),\n ...SEED_NODES.map((n) => ({ ...n, status: \"active\" as const })),\n ...SEED_FLOWS.map((f) => ({ ...f, status: \"active\" as const })),\n ];\n\n for (const seed of allSeeds) {\n if (existingIds.has(seed.entryId)) {\n const existingEntry = existing.find((e) => e.entryId === seed.entryId);\n const existingData = (existingEntry?.data ?? {}) as Record<string, unknown>;\n const seedData = seed.data as Record<string, unknown>;\n const hasChanges = Object.keys(seedData).some(\n (k) => seedData[k] !== undefined && existingData[k] !== seedData[k],\n );\n if (hasChanges) {\n const mergedData = { ...existingData, ...seedData };\n await mcpMutation(\"kb.updateEntry\", {\n entryId: seed.entryId,\n data: mergedData,\n });\n updated++;\n } else {\n unchanged++;\n }\n continue;\n }\n await mcpMutation(\"kb.createEntry\", {\n collectionSlug: COLLECTION_SLUG,\n entryId: seed.entryId,\n name: seed.name,\n status: seed.status,\n data: seed.data,\n order: seed.order ?? 0,\n });\n created++;\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Architecture Seeded\\n\\n**Created:** ${created} entries\\n**Updated:** ${updated} (merged new fields)\\n**Unchanged:** ${unchanged}\\n\\nUse \\`show-architecture\\` to view the map.`,\n }],\n };\n }\n );\n\n // ── check-architecture: Live Dependency Health Scanner ───────────────\n\n server.registerTool(\n \"check-architecture\",\n {\n title: \"Check Architecture Health\",\n description:\n \"Scan the codebase for dependency direction violations. Reads architecture layers, nodes, \" +\n \"and their file paths from the knowledge base, then parses TypeScript/Svelte imports and \" +\n \"checks them against the layer dependency rules (Auth ← Infra ← Core ← Features; \" +\n \"Integration → Core only). Returns a structured violation report.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Scan Failed\\n\\nCannot find project root (looked for `convex/schema.ts` in cwd and parent). \" +\n \"Set `WORKSPACE_PATH` env var to the absolute path of the Product OS project root.\",\n }],\n };\n }\n\n await ensureCollection();\n const all = await listArchEntries();\n const layers = byTag(all, \"layer\");\n const nodes = byTag(all, \"node\");\n\n const result = scanDependencies(projectRoot, layers, nodes);\n\n return {\n content: [{\n type: \"text\" as const,\n text: formatScanReport(result),\n }],\n };\n }\n );\n}\n\n// ── Scanner Engine — FEAT-dep-health, enforces SOS-dbl1n9 (dependency direction) ──\n\ninterface Violation {\n sourceNode: string;\n sourceLayer: string;\n sourceFile: string;\n importPath: string;\n targetNode: string;\n targetLayer: string;\n rule: string;\n}\n\ninterface ScanResult {\n violations: Violation[];\n filesScanned: number;\n importsChecked: number;\n unmappedImports: number;\n nodeResults: Map<string, { violations: Violation[]; filesScanned: number }>;\n}\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\nfunction scanDependencies(\n projectRoot: string,\n layers: ArchEntry[],\n nodes: ArchEntry[],\n): ScanResult {\n const layerMap = new Map<string, ArchEntry>();\n for (const l of layers) layerMap.set(l.entryId, l);\n\n const allowedDeps = buildAllowedDeps(layers);\n const nodePathPrefixes = buildNodePrefixes(nodes);\n\n const violations: Violation[] = [];\n const nodeResults = new Map<string, { violations: Violation[]; filesScanned: number }>();\n let totalFiles = 0;\n let totalImports = 0;\n let unmapped = 0;\n\n for (const node of nodes) {\n const layerRef = String(node.data?.layerRef ?? \"\");\n const layer = layerMap.get(layerRef);\n if (!layer) continue;\n\n const filePaths = parseFilePaths(node);\n const nodeViolations: Violation[] = [];\n let nodeFileCount = 0;\n\n for (const fp of filePaths) {\n const absPath = resolve(projectRoot, fp);\n const files = collectFiles(absPath);\n\n for (const file of files) {\n nodeFileCount++;\n totalFiles++;\n const relFile = relative(projectRoot, file);\n const imports = parseImports(file);\n\n for (const imp of imports) {\n totalImports++;\n const resolved = resolveImport(imp, file, projectRoot);\n if (!resolved) { unmapped++; continue; }\n\n const targetNode = findNodeByPath(resolved, nodePathPrefixes);\n if (!targetNode) { unmapped++; continue; }\n\n const targetLayerRef = String(targetNode.data?.layerRef ?? \"\");\n const targetLayer = layerMap.get(targetLayerRef);\n if (!targetLayer) continue;\n\n if (targetLayerRef === layerRef) continue;\n\n const allowed = allowedDeps.get(layerRef);\n if (allowed && !allowed.has(targetLayerRef)) {\n const v: Violation = {\n sourceNode: node.name,\n sourceLayer: layer.name,\n sourceFile: relFile,\n importPath: imp,\n targetNode: targetNode.name,\n targetLayer: targetLayer.name,\n rule: `${layer.name} cannot import from ${targetLayer.name}`,\n };\n violations.push(v);\n nodeViolations.push(v);\n }\n }\n }\n }\n\n nodeResults.set(node.entryId, { violations: nodeViolations, filesScanned: nodeFileCount });\n }\n\n return { violations, filesScanned: totalFiles, importsChecked: totalImports, unmappedImports: unmapped, nodeResults };\n}\n\nfunction buildAllowedDeps(layers: ArchEntry[]): Map<string, Set<string>> {\n const nameToId = new Map<string, string>();\n for (const l of layers) nameToId.set(l.name.toLowerCase(), l.entryId);\n\n const allowed = new Map<string, Set<string>>();\n for (const layer of layers) {\n const deps = String(layer.data?.dependsOn ?? \"none\");\n const set = new Set<string>();\n if (deps !== \"none\") {\n for (const dep of deps.split(\",\").map((d) => d.trim().toLowerCase())) {\n const id = nameToId.get(dep);\n if (id) set.add(id);\n }\n }\n allowed.set(layer.entryId, set);\n }\n return allowed;\n}\n\nfunction buildNodePrefixes(nodes: ArchEntry[]): { prefix: string; node: ArchEntry }[] {\n const entries: { prefix: string; node: ArchEntry }[] = [];\n for (const node of nodes) {\n for (const fp of parseFilePaths(node)) {\n entries.push({ prefix: normalize(fp), node });\n }\n }\n entries.sort((a, b) => b.prefix.length - a.prefix.length);\n return entries;\n}\n\nfunction parseFilePaths(node: ArchEntry): string[] {\n const raw = node.data?.filePaths;\n if (!raw || typeof raw !== \"string\") return [];\n return raw.split(\",\").map((p) => p.trim()).filter(Boolean);\n}\n\nfunction collectFiles(absPath: string): string[] {\n if (!existsSync(absPath)) return [];\n const stat = statSync(absPath);\n if (stat.isFile()) {\n return isScannableFile(absPath) ? [absPath] : [];\n }\n if (!stat.isDirectory()) return [];\n\n const results: string[] = [];\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const full = resolve(dir, entry.name);\n if (entry.isDirectory()) walk(full);\n else if (isScannableFile(full)) results.push(full);\n }\n };\n walk(absPath);\n return results;\n}\n\nfunction isScannableFile(p: string): boolean {\n return /\\.(ts|js|svelte)$/.test(p) && !p.endsWith(\".d.ts\");\n}\n\nfunction parseImports(filePath: string): string[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const re = /(?:^|\\n)\\s*import\\s+(?:[\\s\\S]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = re.exec(content)) !== null) {\n imports.push(match[1]);\n }\n return imports;\n } catch {\n return [];\n }\n}\n\nconst EXTENSIONS = [\".ts\", \".js\", \".svelte\", \"/index.ts\", \"/index.js\", \"/index.svelte\"];\n\nfunction tryResolveWithExtension(absPath: string): string | null {\n if (existsSync(absPath) && statSync(absPath).isFile()) return absPath;\n for (const ext of EXTENSIONS) {\n const withExt = absPath + ext;\n if (existsSync(withExt)) return withExt;\n }\n return null;\n}\n\nfunction resolveImport(imp: string, fromFile: string, root: string): string | null {\n let rel: string | null = null;\n if (imp.startsWith(\"$lib/\")) rel = imp.replace(\"$lib/\", \"src/lib/\");\n else if (imp.startsWith(\"$convex/\")) rel = imp.replace(\"$convex/\", \"convex/\");\n else if (imp.startsWith(\"$env/\") || imp.startsWith(\"$app/\")) return null;\n else if (imp.startsWith(\"./\") || imp.startsWith(\"../\")) {\n const fromDir = dirname(fromFile);\n const abs = resolve(fromDir, imp);\n rel = relative(root, abs);\n }\n if (!rel) return null;\n\n const abs = resolve(root, rel);\n const actual = tryResolveWithExtension(abs);\n return actual ? relative(root, actual) : rel;\n}\n\nfunction findNodeByPath(\n filePath: string,\n prefixes: { prefix: string; node: ArchEntry }[],\n): ArchEntry | null {\n const normalized = normalize(filePath);\n for (const { prefix, node } of prefixes) {\n if (normalized.startsWith(prefix)) return node;\n }\n return null;\n}\n\nfunction formatScanReport(result: ScanResult): string {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n lines.push(\n `# Architecture Health Check Passed`,\n \"\",\n `**0 violations** across ${result.filesScanned} files (${result.importsChecked} imports checked, ${result.unmappedImports} unmapped).`,\n \"\",\n \"All imports respect the layer dependency rules.\",\n );\n } else {\n lines.push(\n `# Architecture Health Check — ${result.violations.length} Violation${result.violations.length === 1 ? \"\" : \"s\"}`,\n \"\",\n `Scanned ${result.filesScanned} files, checked ${result.importsChecked} imports, found **${result.violations.length} violation${result.violations.length === 1 ? \"\" : \"s\"}** (${result.unmappedImports} unmapped).`,\n \"\",\n );\n\n const byNode = new Map<string, Violation[]>();\n for (const v of result.violations) {\n if (!byNode.has(v.sourceNode)) byNode.set(v.sourceNode, []);\n byNode.get(v.sourceNode)!.push(v);\n }\n\n for (const [nodeName, vs] of byNode) {\n lines.push(`## ${nodeName} (${vs[0].sourceLayer})`);\n for (const v of vs) {\n lines.push(`- \\`${v.sourceFile}\\` imports \\`${v.importPath}\\` → **${v.targetNode}** (${v.targetLayer}) — ${v.rule}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"---\", \"\");\n\n const nodeEntries = [...result.nodeResults.entries()];\n const cleanCount = nodeEntries.filter(([, r]) => r.violations.length === 0 && r.filesScanned > 0).length;\n const dirtyCount = nodeEntries.filter(([, r]) => r.violations.length > 0).length;\n const emptyCount = nodeEntries.filter(([, r]) => r.filesScanned === 0).length;\n\n lines.push(\n `**Summary:** ${cleanCount} clean nodes, ${dirtyCount} with violations, ${emptyCount} with no files.`,\n );\n\n return lines.join(\"\\n\");\n}\n","/**\n * Workflow tools — ARCH-node-mcp (Core layer)\n * KB: FEAT-MCP-001 (MCP Server)\n *\n * Tools for discovering and running Chainwork workflows via MCP.\n * The actual facilitation happens in the agent — these tools provide\n * the definitions, state tracking, and KB integration.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpMutation } from \"../client.js\";\nimport {\n getWorkflow,\n listWorkflows,\n type WorkflowDefinition,\n} from \"../workflows/definitions.js\";\n\nfunction formatWorkflowCard(wf: WorkflowDefinition): string {\n const roundList = wf.rounds\n .map((r) => ` ${r.num}. ${r.label} (${r.type}, ~${r.maxDurationHint ?? \"?\"})`)\n .join(\"\\n\");\n\n return (\n `## ${wf.icon} ${wf.name}\\n` +\n `**ID**: \\`${wf.id}\\`\\n` +\n `${wf.shortDescription}\\n\\n` +\n `**Rounds** (${wf.rounds.length}):\\n${roundList}\\n\\n` +\n `**Output**: Creates entries in \\`${wf.kbOutputCollection}\\` collection.\\n` +\n `_Use the \\`run-workflow\\` prompt with workflow=\"${wf.id}\" to start._`\n );\n}\n\nexport function registerWorkflowTools(server: McpServer) {\n\n server.registerTool(\n \"list-workflows\",\n {\n title: \"List Workflows\",\n description:\n \"List all available Chainwork workflows — retro, shape-a-bet, IDM, etc. \" +\n \"Each workflow is a structured multi-round facilitation ceremony that the agent runs in Facilitator Mode. \" +\n \"Use the `run-workflow` prompt to actually launch one.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const workflows = listWorkflows();\n\n if (workflows.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"No workflows registered yet. Check back after the workflow definitions are configured.\",\n }],\n };\n }\n\n const cards = workflows.map(formatWorkflowCard).join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Available Chainwork Workflows\\n\\n` +\n `${workflows.length} workflow(s) available. Use the \\`run-workflow\\` prompt to launch one.\\n\\n` +\n `---\\n\\n${cards}`,\n }],\n };\n },\n );\n\n server.registerTool(\n \"workflow-checkpoint\",\n {\n title: \"Workflow Checkpoint\",\n description:\n \"Record the output of a workflow round. Captures the round's data to the Knowledge Base \" +\n \"as a structured entry. Use this during Facilitator Mode after completing each round \" +\n \"to persist progress — so if the conversation is interrupted, work is not lost.\\n\\n\" +\n \"At workflow completion, this tool can also generate the final summary entry.\",\n inputSchema: {\n workflowId: z.string().describe(\"Workflow ID (e.g., 'retro')\"),\n roundId: z.string().describe(\"Round ID (e.g., 'what-went-well')\"),\n output: z.string().describe(\"The round's output — synthesized by the facilitator from the conversation\"),\n isFinal: z.boolean().optional().describe(\n \"If true, this is the final checkpoint and triggers the summary KB entry creation\",\n ),\n summaryName: z.string().optional().describe(\n \"Name for the final KB entry (required when isFinal=true)\",\n ),\n summaryDescription: z.string().optional().describe(\n \"Full description/rationale for the final KB entry (required when isFinal=true)\",\n ),\n },\n annotations: { destructiveHint: false },\n },\n async ({ workflowId, roundId, output, isFinal, summaryName, summaryDescription }) => {\n const wf = getWorkflow(workflowId);\n if (!wf) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found. ` +\n `Available: ${listWorkflows().map((w) => w.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. Continue the conversation — the facilitator has the context.`,\n }],\n };\n }\n\n const round = wf.rounds.find((r) => r.id === roundId);\n if (!round) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Round \"${roundId}\" not found in workflow \"${workflowId}\". ` +\n `Available rounds: ${wf.rounds.map((r) => r.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. The conversation context is preserved — continue facilitating.`,\n }],\n };\n }\n\n const lines: string[] = [\n `## Checkpoint: Round ${round.num} — ${round.label}`,\n `Workflow: ${wf.name} (\\`${wf.id}\\`)`,\n \"\",\n ];\n\n if (isFinal && summaryName && summaryDescription) {\n try {\n const entryId = await mcpMutation<string>(\"kb.createEntry\", {\n collectionSlug: wf.kbOutputCollection,\n name: summaryName,\n status: \"draft\",\n data: {\n [wf.kbOutputTemplate.descriptionField]: summaryDescription,\n workflowType: wf.id,\n completedRound: roundId,\n date: new Date().toISOString().split(\"T\")[0],\n },\n createdBy: `workflow:${wf.id}`,\n });\n\n lines.push(\n `**KB Entry Created**: \\`${entryId}\\``,\n `Collection: \\`${wf.kbOutputCollection}\\``,\n `Name: ${summaryName}`,\n \"\",\n `The retro is now captured in the Knowledge Base. `,\n `Use \\`suggest-links\\` on this entry to connect it to related knowledge.`,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n lines.push(\n `**KB capture failed**: ${msg}`,\n \"\",\n `The retro output is preserved in this conversation. `,\n `You can manually create the entry later using \\`smart-capture\\` with:`,\n `- Collection: \\`${wf.kbOutputCollection}\\``,\n `- Name: ${summaryName}`,\n `- Description: (copy from the conversation summary above)`,\n );\n }\n } else {\n lines.push(\n `Round ${round.num} output recorded.`,\n `Output: ${output.substring(0, 200)}${output.length > 200 ? \"...\" : \"\"}`,\n );\n\n const currentIdx = wf.rounds.findIndex((r) => r.id === roundId);\n if (currentIdx < wf.rounds.length - 1) {\n const next = wf.rounds[currentIdx + 1];\n lines.push(\n \"\",\n `**Next**: Round ${next.num} — ${next.label}`,\n `_${next.instruction}_`,\n );\n } else {\n lines.push(\n \"\",\n `**All rounds complete.** Call this tool again with \\`isFinal: true\\` to create the KB entry.`,\n );\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n },\n );\n}\n","/**\n * Chainwork Workflow Definitions — ARCH-node-mcp (Core layer)\n * KB: GT-006 (MCP), FEAT-MCP-001\n *\n * Each workflow is a typed chain of rounds with facilitation instructions.\n * The agent uses these to drive structured conversations in Facilitator Mode.\n */\n\nexport interface WorkflowRound {\n id: string;\n num: string;\n label: string;\n type: \"open\" | \"choice\" | \"synthesis\" | \"commit\" | \"close\";\n instruction: string;\n facilitatorGuidance: string;\n questions?: WorkflowQuestion[];\n outputSchema: {\n field: string;\n description: string;\n format: \"freetext\" | \"list\" | \"choice\" | \"structured\";\n };\n kbCollection?: string;\n maxDurationHint?: string;\n}\n\nexport interface WorkflowQuestion {\n id: string;\n prompt: string;\n options?: { id: string; label: string }[];\n allowMultiple?: boolean;\n required?: boolean;\n}\n\nexport interface WorkflowDefinition {\n id: string;\n name: string;\n shortDescription: string;\n icon: string;\n facilitatorPreamble: string;\n rounds: WorkflowRound[];\n kbOutputCollection: string;\n kbOutputTemplate: {\n nameTemplate: string;\n descriptionField: string;\n };\n errorRecovery: string;\n}\n\n// ── Retro Workflow ──────────────────────────────────────────────────────────\n\nconst RETRO_WORKFLOW: WorkflowDefinition = {\n id: \"retro\",\n name: \"Retrospective\",\n shortDescription:\n \"Structured team retrospective — reflect, surface patterns, commit to actions. Outputs a decision entry in the Knowledge Base.\",\n icon: \"◎\",\n facilitatorPreamble: `You are now in **Facilitator Mode**. You are not a coding assistant — you are a facilitator running a structured retrospective.\n\n## Your Behavior\n\n1. **Guide, don't solve.** Ask questions, reflect back, synthesize. Never jump to solutions.\n2. **One round at a time.** Complete each round fully before moving to the next. No skipping.\n3. **Use structured questions** (AskQuestion tool) for choices and multi-select. Use open conversation for reflection.\n4. **Create a Plan** at the start showing all rounds as tasks. Update it as you progress.\n5. **Synthesize between rounds.** After collecting input, reflect back what you heard before moving on.\n6. **Never go silent.** If something fails, say what happened and what to do next.\n7. **Capture to KB** at the end using the Product OS smart-capture tool.\n8. **Match the energy.** Be warm but structured. This is a ceremony, not a checklist.\n\n## Communication Style\n\n- Start each round with its number, name, and a brief instruction\n- Use quotes and emphasis to reflect back what the participant said\n- End each round with a brief synthesis before transitioning\n- When a round is complete, mark it as done in the Plan\n- If the participant seems stuck, offer prompts — never pressure\n- If a tool call fails, explain what happened and offer an alternative path\n\n## Error Recovery\n\nIf at any point a tool call or MCP operation fails:\n1. Tell the participant what you were trying to do\n2. Explain what went wrong (briefly, no stack traces)\n3. Offer a manual alternative (e.g., \"I'll capture this in the conversation instead\")\n4. Continue the workflow — never halt completely\n\n## Plan Structure\n\nCreate a Cursor Plan with these rounds as tasks. Mark each in_progress as you enter it, completed when done.`,\n\n rounds: [\n {\n id: \"set-stage\",\n num: \"01\",\n label: \"Set the Stage\",\n type: \"choice\",\n instruction:\n \"Before we dive in, let's frame what we're reflecting on. What's the scope of this retro?\",\n facilitatorGuidance:\n \"Start warm. Ask the participant to pick or describe what they're retro-ing. Confirm the scope before proceeding. If they gave context already in their initial message, use it — don't make them repeat.\",\n questions: [\n {\n id: \"scope\",\n prompt:\n \"What are we reflecting on? Pick one or describe your own.\",\n options: [\n { id: \"last-week\", label: \"Last week's work\" },\n { id: \"last-sprint\", label: \"Last sprint/cycle\" },\n { id: \"specific-project\", label: \"A specific project or feature\" },\n { id: \"process\", label: \"A process or workflow\" },\n { id: \"custom\", label: \"Something else — let me describe it\" },\n ],\n },\n ],\n outputSchema: {\n field: \"scope\",\n description: \"What timeframe or project is being retro'd\",\n format: \"freetext\",\n },\n maxDurationHint: \"2 min\",\n },\n {\n id: \"what-went-well\",\n num: \"02\",\n label: \"What Went Well\",\n type: \"open\",\n instruction:\n \"Let's start with the good. What went well? What are you proud of? What should we do more of?\",\n facilitatorGuidance:\n \"Celebrate. Reflect back each win with genuine emphasis. Ask follow-ups like 'What made that work?' or 'Who else contributed to that?' Collect at least 3 items before synthesizing. Don't rush past the positive — teams skip this too fast.\",\n outputSchema: {\n field: \"wentWell\",\n description: \"List of things that went well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"what-didnt-go-well\",\n num: \"03\",\n label: \"What Didn't Go Well\",\n type: \"open\",\n instruction:\n \"Now the harder part. What didn't go well? What frustrated you? Where did things break down?\",\n facilitatorGuidance:\n \"Create safety. Acknowledge that this is harder. Don't judge or immediately problem-solve — just listen and capture. Ask 'What was the impact of that?' and 'When did you first notice it?'. Reflect back without softening. Collect at least 3 items.\",\n outputSchema: {\n field: \"didntGoWell\",\n description: \"List of things that didn't go well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"patterns\",\n num: \"04\",\n label: \"Patterns & Insights\",\n type: \"synthesis\",\n instruction:\n \"Looking at what went well and what didn't — what patterns do you see? What's the deeper insight?\",\n facilitatorGuidance:\n \"This is YOUR moment as facilitator. Synthesize what you've heard across rounds 2 and 3. Surface themes, connections, and contradictions. Propose 2-3 patterns and ask the participant to react. This round transforms raw observations into actionable insights. Don't let the participant skip the 'why' — push for root causes.\",\n outputSchema: {\n field: \"patterns\",\n description: \"Synthesized patterns and insights\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"actions\",\n num: \"05\",\n label: \"Actions & Commitments\",\n type: \"commit\",\n instruction:\n \"Based on these patterns, what will we actually change? Be specific — who does what, by when?\",\n facilitatorGuidance:\n \"Push for specificity. 'Be better at X' is not an action. 'Randy will set up a 15-min weekly check-in by Friday' is. Each action needs an owner and a deadline. Aim for 2-4 concrete actions. Use AskQuestion to confirm the final list. These become the retro's output.\",\n questions: [\n {\n id: \"action-confirm\",\n prompt: \"Are these actions concrete enough to actually happen?\",\n options: [\n { id: \"yes\", label: \"Yes — these are clear and actionable\" },\n { id: \"refine\", label: \"Let me refine some of these\" },\n { id: \"add\", label: \"I want to add more\" },\n ],\n },\n ],\n outputSchema: {\n field: \"actions\",\n description: \"Committed actions with owners and deadlines\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"close\",\n num: \"06\",\n label: \"Close & Capture\",\n type: \"close\",\n instruction:\n \"One last thing — in one sentence, what's the single most important thing you're taking away from this retro?\",\n facilitatorGuidance:\n \"Keep it brief. One sentence reflection. Then summarize the entire retro: scope, key wins, key pain points, patterns identified, actions committed. Ask if they want to save this to the Knowledge Base. If yes, use smart-capture to create a decision/tension entry. Thank them for the retro.\",\n outputSchema: {\n field: \"takeaway\",\n description: \"Single-sentence takeaway\",\n format: \"freetext\",\n },\n kbCollection: \"decisions\",\n maxDurationHint: \"2 min\",\n },\n ],\n\n kbOutputCollection: \"decisions\",\n kbOutputTemplate: {\n nameTemplate: \"Retro: {scope} — {date}\",\n descriptionField: \"rationale\",\n },\n\n errorRecovery: `If anything goes wrong during the retro:\n\n1. **MCP tool failure**: Skip the KB capture step. Summarize everything in the conversation instead. Suggest the participant runs \\`smart-capture\\` manually later.\n2. **AskQuestion not available**: Fall back to numbered options in plain text. \"Reply with 1, 2, or 3.\"\n3. **Plan creation fails**: Continue without the Plan. The conversation IS the record.\n4. **Participant goes off-topic**: Gently redirect: \"That's valuable — let's capture it. For now, let's stay with [current round].\"\n5. **Participant wants to stop**: Respect it. Summarize what you have so far. Offer to save partial results to KB.\n\nThe retro must never fail silently. Always communicate state.`,\n};\n\n// ── Workflow Registry ───────────────────────────────────────────────────────\n\nconst WORKFLOWS = new Map<string, WorkflowDefinition>([\n [\"retro\", RETRO_WORKFLOW],\n]);\n\nexport function getWorkflow(id: string): WorkflowDefinition | undefined {\n return WORKFLOWS.get(id);\n}\n\nexport function listWorkflows(): WorkflowDefinition[] {\n return Array.from(WORKFLOWS.values());\n}\n\nexport function getWorkflowIds(): string[] {\n return Array.from(WORKFLOWS.keys());\n}\n","/**\n * GitChain MCP tools — chain lifecycle operations.\n *\n * These tools expose GitChain operations to AI agents and external consumers\n * via the MCP protocol. They call the Convex HTTP gateway routes registered\n * under the `gitchain.*` namespace.\n *\n * KB: GT-vaw0re (Git Chain), FEAT-CW-001 (ChainWork Engine)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nfunction linkSummary(links: Record<string, string>): string {\n return Object.entries(links)\n .map(([id, content]) => {\n const filled = typeof content === \"string\" && content.length > 0;\n const preview = filled\n ? content.substring(0, 80) + (content.length > 80 ? \"...\" : \"\")\n : \"(empty)\";\n return ` - **${id}**: ${preview}`;\n })\n .join(\"\\n\");\n}\n\nexport function registerGitChainTools(server: McpServer) {\n // ─── chain-create ────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-create\",\n {\n title: \"Create Chain\",\n description:\n \"Create a new strategic chain in the knowledge base. \" +\n \"Chains are versioned knowledge artifacts that follow a chain type definition \" +\n \"(e.g. Strategy Coherence: Problem → Insight → Choice → Action → Outcome). \" +\n \"Returns the chain's entry ID for subsequent operations.\",\n inputSchema: {\n title: z.string().describe(\"Title for the chain, e.g. 'Q1 Growth Strategy'\"),\n chainTypeId: z\n .string()\n .default(\"strategy-coherence\")\n .describe(\n \"Chain type ID. Use 'strategy-coherence' for 5-link strategy chains \" +\n \"(Problem → Insight → Choice → Action → Outcome) or 'idm-proposal' for \" +\n \"IDM governance chains (Tension → Proposal → Objections → Integration → Decision)\"\n ),\n description: z\n .string()\n .optional()\n .describe(\"Optional description of what this chain is about\"),\n author: z\n .string()\n .optional()\n .describe(\"Who is creating this chain (clerkUserId or person name). Defaults to 'mcp'.\"),\n },\n },\n async ({ title, chainTypeId, description, author }) => {\n const result = await mcpMutation<{ _id: string; entryId: string }>(\n \"gitchain.createChain\",\n { title, chainTypeId, description, author }\n );\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Chain Created\\n\\n` +\n `- **Entry ID:** \\`${result.entryId}\\`\\n` +\n `- **Title:** ${title}\\n` +\n `- **Type:** ${chainTypeId}\\n` +\n `- **Status:** draft\\n\\n` +\n `Use \\`chain-edit\\` with chainEntryId=\\`${result.entryId}\\` to start filling in links.`,\n },\n ],\n };\n }\n );\n\n // ─── chain-get ───────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-get\",\n {\n title: \"Get Chain\",\n description:\n \"Retrieve a chain by its entry ID. Returns the full chain content, \" +\n \"coherence scores, link fill status, and version info. \" +\n \"Use chain-list first to discover chain entry IDs.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId }) => {\n const chain = await mcpQuery<any>(\"gitchain.getChain\", { chainEntryId });\n\n if (!chain) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Chain \"${chainEntryId}\" not found.`,\n },\n ],\n };\n }\n\n const scoreSection = chain.scores\n ? `\\n## Coherence: ${chain.coherenceScore}%\\n\\n` +\n chain.scores.sections\n .map((s: any) => `- **${s.key}**: ${s.power}/100 (${\"★\".repeat(Math.min(s.stars ?? 0, 5))}${\"☆\".repeat(Math.max(0, 5 - (s.stars ?? 0)))})`)\n .join(\"\\n\")\n : \"\";\n\n const text =\n `# ${chain.name}\\n\\n` +\n `- **Entry ID:** \\`${chain.entryId}\\`\\n` +\n `- **Type:** ${chain.chainTypeName}\\n` +\n `- **Status:** ${chain.status}\\n` +\n `- **Links filled:** ${chain.filledCount}/${chain.totalCount}\\n` +\n `- **Version:** ${chain.currentVersion}\\n` +\n `- **Created by:** ${chain.createdBy ?? \"unknown\"}\\n` +\n `- **History events:** ${chain.historyCount}\\n` +\n scoreSection +\n `\\n\\n## Links\\n\\n` +\n linkSummary(chain.links);\n\n return { content: [{ type: \"text\" as const, text }] };\n }\n );\n\n // ─── chain-edit ──────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-edit\",\n {\n title: \"Edit Chain Link\",\n description:\n \"Edit a specific link in a chain. Each chain has named links \" +\n \"(e.g. for strategy-coherence: problem, insight, choice, action, outcome). \" +\n \"The link content is replaced entirely — pass the full new text.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n linkId: z\n .string()\n .describe(\n \"Which link to edit. For strategy-coherence: problem, insight, choice, action, outcome. \" +\n \"For idm-proposal: tension, proposal, objections, integration, decision.\"\n ),\n content: z.string().describe(\"The full new content for this link\"),\n author: z\n .string()\n .optional()\n .describe(\"Who is making this edit. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, linkId, content, author }) => {\n const result = await mcpMutation<{\n _id: string;\n entryId: string;\n linkId: string;\n status: string;\n }>(\"gitchain.editLink\", { chainEntryId, linkId, content, author });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Link Updated\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Link:** ${result.linkId}\\n` +\n `- **Chain status:** ${result.status}\\n` +\n `- **Content length:** ${content.length} chars\\n\\n` +\n `Use \\`chain-get\\` to see the full chain with updated scores.`,\n },\n ],\n };\n }\n );\n\n // ─── chain-list ──────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-list\",\n {\n title: \"List Chains\",\n description:\n \"List all chains in the workspace, optionally filtered by chain type or status. \" +\n \"Returns entry IDs, titles, link fill progress, and coherence scores.\",\n inputSchema: {\n chainTypeId: z\n .string()\n .optional()\n .describe(\"Filter by chain type: 'strategy-coherence' or 'idm-proposal'\"),\n status: z\n .string()\n .optional()\n .describe(\"Filter by status: 'draft' or 'active'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainTypeId, status }) => {\n const chains = await mcpQuery<any[]>(\"gitchain.listChains\", {\n chainTypeId,\n status,\n });\n\n if (chains.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No chains found. Use `chain-create` to create one.\",\n },\n ],\n };\n }\n\n const formatted = chains\n .map(\n (c) =>\n `- **\\`${c.entryId}\\`** ${c.name} — ${c.chainTypeId} · ` +\n `${c.filledCount}/${c.totalCount} links · ` +\n `coherence: ${c.coherenceScore}% · ` +\n `status: ${c.status}`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Chains (${chains.length})\\n\\n${formatted}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-history ───────────────────────────────────────────────\n\n server.registerTool(\n \"chain-history\",\n {\n title: \"Chain History\",\n description:\n \"View the edit history of a chain — all creation, update, and version events. \" +\n \"Shows who changed what and when.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId }) => {\n const history = await mcpQuery<any[]>(\"gitchain.getHistory\", {\n chainEntryId,\n });\n\n if (history.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No history found for chain \"${chainEntryId}\".`,\n },\n ],\n };\n }\n\n const formatted = history\n .sort((a: any, b: any) => b.timestamp - a.timestamp)\n .map((h: any) => {\n const date = new Date(h.timestamp).toISOString().replace(\"T\", \" \").substring(0, 19);\n return `- **${date}** [${h.event}] by ${h.changedBy ?? \"unknown\"} — ${h.note ?? \"\"}`;\n })\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# History for ${chainEntryId} (${history.length} events)\\n\\n${formatted}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-commit ──────────────────────────────────────────────\n\n server.registerTool(\n \"chain-commit\",\n {\n title: \"Commit Chain\",\n description:\n \"Create a version snapshot (commit) of the current chain state. \" +\n \"Records all link content, computes coherence score, and tracks which links changed. \" +\n \"Commit messages should follow: type(link): description. \" +\n \"Types: edit, refine, rewrite, integrate, revert.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n commitMessage: z\n .string()\n .describe(\n \"Commit message following convention: type(link): description. \" +\n \"Example: 'edit(outcome): Add Q1 revenue target'\"\n ),\n author: z\n .string()\n .optional()\n .describe(\"Who is committing. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, commitMessage, author }) => {\n const result = await mcpMutation<{\n entryId: string;\n version: number;\n coherenceScore: number;\n linksModified: string[];\n commitLintWarning: string | null;\n }>(\"gitchain.commitChain\", { chainEntryId, commitMessage, author });\n\n const warning = result.commitLintWarning\n ? `\\n\\n> **Lint warning:** ${result.commitLintWarning}`\n : \"\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Committed v${result.version}\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Version:** ${result.version}\\n` +\n `- **Message:** ${commitMessage}\\n` +\n `- **Coherence:** ${result.coherenceScore}%\\n` +\n `- **Links modified:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n` +\n warning,\n },\n ],\n };\n }\n );\n\n // ─── chain-commits ─────────────────────────────────────────────\n\n server.registerTool(\n \"chain-commits\",\n {\n title: \"List Chain Commits\",\n description:\n \"List all version snapshots (commits) for a chain, newest first. \" +\n \"Shows version number, commit message, author, which links were modified, and status.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId }) => {\n const commits = await mcpQuery<any[]>(\"gitchain.listCommits\", {\n chainEntryId,\n });\n\n if (commits.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No commits found for chain \"${chainEntryId}\". Use \\`chain-commit\\` to create the first snapshot.`,\n },\n ],\n };\n }\n\n const formatted = commits\n .map((c: any) => {\n const date = new Date(c.createdAt)\n .toISOString()\n .replace(\"T\", \" \")\n .substring(0, 19);\n const msg = c.commitMessage ?? c.changeNote ?? \"(no message)\";\n const links =\n c.linksModified && c.linksModified.length > 0\n ? ` [${c.linksModified.join(\", \")}]`\n : \"\";\n return `- **v${c.version}** ${date} by ${c.author} — ${msg}${links} (${c.versionStatus})`;\n })\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Commits for ${chainEntryId} (${commits.length})\\n\\n${formatted}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-diff ────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-diff\",\n {\n title: \"Diff Chain Versions\",\n description:\n \"Compare two versions of a chain. Shows which links changed, \" +\n \"word-level diffs for modified links, and the coherence score delta. \" +\n \"Use chain-commits first to see available version numbers.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n versionA: z.number().describe(\"The earlier version number\"),\n versionB: z.number().describe(\"The later version number\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId, versionA, versionB }) => {\n const diff = await mcpMutation<any>(\"gitchain.diffVersions\", {\n chainEntryId,\n versionA,\n versionB,\n });\n\n let text =\n `# Diff: v${versionA} → v${versionB}\\n\\n` +\n `- **Chain:** \\`${diff.chainEntryId}\\`\\n` +\n `- **Coherence:** ${diff.coherenceBefore}% → ${diff.coherenceAfter}% (${diff.coherenceDelta >= 0 ? \"+\" : \"\"}${diff.coherenceDelta})\\n` +\n `- **Links changed:** ${diff.linksChanged.length > 0 ? diff.linksChanged.join(\", \") : \"none\"}\\n`;\n\n for (const ld of diff.linkDiffs) {\n if (ld.status === \"unchanged\") continue;\n\n text += `\\n## ${ld.linkId} (${ld.status})\\n\\n`;\n\n const wordDiff = diff.wordDiffs[ld.linkId];\n if (wordDiff && wordDiff.length > 0) {\n for (const w of wordDiff) {\n if (w.type === \"delete\") {\n text += `~~${w.value.substring(0, 200)}~~`;\n } else if (w.type === \"insert\") {\n text += `**${w.value.substring(0, 200)}**`;\n } else {\n text += w.value.substring(0, 200);\n }\n }\n text += \"\\n\";\n }\n }\n\n return { content: [{ type: \"text\" as const, text }] };\n }\n );\n\n // ─── chain-gate ────────────────────────────────────────────────\n\n server.registerTool(\n \"chain-gate\",\n {\n title: \"Chain Coherence Gate\",\n description:\n \"Run the coherence gate on a chain. Checks: coherence score >= 70%, \" +\n \"all links filled, commit message follows convention. \" +\n \"Returns pass/fail with detailed check results. \" +\n \"This is the same gate that blocks publishing.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n commitMessage: z\n .string()\n .optional()\n .describe(\"Optional commit message to lint\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId, commitMessage }) => {\n const gate = await mcpQuery<any>(\"gitchain.runGate\", {\n chainEntryId,\n commitMessage,\n });\n\n const checkLines = gate.checks\n .map(\n (c: any) =>\n `- ${c.pass ? \"PASS\" : \"FAIL\"} **${c.name}**: ${c.detail}`\n )\n .join(\"\\n\");\n\n const icon = gate.pass ? \"PASS\" : \"BLOCKED\";\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Gate: ${icon}\\n\\n` +\n `- **Score:** ${gate.score}%\\n` +\n `- **Threshold:** ${gate.threshold}%\\n\\n` +\n `## Checks\\n\\n${checkLines}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-branch ──────────────────────────────────────────────\n\n server.registerTool(\n \"chain-branch\",\n {\n title: \"Create or List Chain Branches\",\n description:\n \"Create a new branch for isolated editing, or list all branches on a chain. \" +\n \"Branches fork from the current published version of main. \" +\n \"Use chain-merge to merge a branch back.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID, e.g. 'CH-A1B2C3'\"),\n action: z\n .enum([\"create\", \"list\"])\n .describe(\"'create' to make a new branch, 'list' to see all branches\"),\n name: z\n .string()\n .optional()\n .describe(\"Branch name for 'create' action. Auto-generated if not provided.\"),\n author: z\n .string()\n .optional()\n .describe(\"Who is creating the branch. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, action, name, author }) => {\n if (action === \"create\") {\n const result = await mcpMutation<{\n branchId: string;\n name: string;\n baseVersion: number;\n }>(\"gitchain.createBranch\", { chainEntryId, name, author });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Branch Created\\n\\n` +\n `- **Name:** ${result.name}\\n` +\n `- **Based on:** v${result.baseVersion}\\n` +\n `- **Chain:** \\`${chainEntryId}\\`\\n\\n` +\n `Edit links and commit on this branch, then use \\`chain-merge\\` to land changes.`,\n },\n ],\n };\n }\n\n const branches = await mcpMutation<any[]>(\"gitchain.listBranches\", {\n chainEntryId,\n });\n\n if (branches.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No branches found for chain \"${chainEntryId}\".`,\n },\n ],\n };\n }\n\n const formatted = branches\n .map(\n (b: any) =>\n `- **${b.name}** (${b.status}) — based on v${b.baseVersion}, by ${b.createdBy}`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Branches for ${chainEntryId} (${branches.length})\\n\\n${formatted}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-conflicts ──────────────────────────────────────────\n\n server.registerTool(\n \"chain-conflicts\",\n {\n title: \"Check Branch Conflicts\",\n description:\n \"Check if a branch has conflicts with other active branches. \" +\n \"Conflicts occur when two branches modify the same chain link. \" +\n \"Always check before merging.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID\"),\n branchName: z\n .string()\n .describe(\"The branch name to check for conflicts\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ chainEntryId, branchName }) => {\n const result = await mcpMutation<any>(\"gitchain.checkConflicts\", {\n chainEntryId,\n branchName,\n });\n\n if (!result.hasConflicts) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# No Conflicts\\n\\nBranch \"${branchName}\" on \\`${chainEntryId}\\` has no conflicts with other active branches. Safe to merge.`,\n },\n ],\n };\n }\n\n const conflictLines = result.conflicts\n .map(\n (c: any) =>\n `- **${c.linkId}** — modified by: ${c.branches.map((b: any) => `${b.branchName} (${b.author})`).join(\", \")}`\n )\n .join(\"\\n\");\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Conflicts Detected\\n\\n` +\n `Branch \"${branchName}\" conflicts with other branches on these links:\\n\\n` +\n conflictLines +\n `\\n\\nResolve conflicts before merging. One branch must update its link content to avoid overwriting.`,\n },\n ],\n };\n }\n );\n\n // ─── chain-merge ───────────────────────────────────────────────\n\n server.registerTool(\n \"chain-merge\",\n {\n title: \"Merge Branch\",\n description:\n \"Merge a branch back into main. Runs the coherence gate before merging. \" +\n \"The branch is closed after merge. \" +\n \"Check for conflicts with chain-conflicts first.\",\n inputSchema: {\n chainEntryId: z\n .string()\n .describe(\"The chain's entry ID\"),\n branchName: z\n .string()\n .describe(\"The branch to merge\"),\n strategy: z\n .enum([\"merge_commit\", \"squash\"])\n .optional()\n .describe(\"Merge strategy: 'merge_commit' (default) preserves history, 'squash' collapses into one version\"),\n author: z\n .string()\n .optional()\n .describe(\"Who is merging. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, branchName, strategy, author }) => {\n const result = await mcpMutation<{\n entryId: string;\n branchName: string;\n version: number;\n strategy: string;\n }>(\"gitchain.mergeBranch\", {\n chainEntryId,\n branchName,\n strategy,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Branch Merged\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Branch:** ${result.branchName} (now closed)\\n` +\n `- **Version:** v${result.version}\\n` +\n `- **Strategy:** ${result.strategy}\\n\\n` +\n `Main is now at v${result.version}. The branch has been closed.`,\n },\n ],\n };\n }\n );\n\n // ─── chain-comment ─────────────────────────────────────────────\n\n server.registerTool(\n \"chain-comment\",\n {\n title: \"Comment on Chain Version\",\n description:\n \"Add a threaded comment on a specific chain version, optionally targeting a specific link. \" +\n \"Comments support threading via parentId. Use chain-comments to see existing comments.\",\n inputSchema: {\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n action: z\n .enum([\"add\", \"resolve\", \"list\"])\n .describe(\"'add' a comment, 'resolve' a comment, or 'list' all comments\"),\n versionNumber: z\n .number()\n .optional()\n .describe(\"Version number to comment on (required for 'add')\"),\n linkId: z\n .string()\n .optional()\n .describe(\"Which link this comment targets (optional)\"),\n body: z\n .string()\n .optional()\n .describe(\"Comment text (required for 'add')\"),\n commentId: z\n .string()\n .optional()\n .describe(\"Comment ID to resolve (required for 'resolve')\"),\n author: z.string().optional().describe(\"Who is commenting. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, action, versionNumber, linkId, body, commentId, author }) => {\n if (action === \"add\") {\n if (!versionNumber) throw new Error(\"versionNumber is required for 'add'\");\n if (!body) throw new Error(\"body is required for 'add'\");\n\n const result = await mcpMutation<any>(\"gitchain.addComment\", {\n chainEntryId,\n versionNumber,\n linkId,\n body,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Comment Added\\n\\n` +\n `- **Chain:** \\`${result.chainEntryId}\\`\\n` +\n `- **Version:** v${result.versionNumber}\\n` +\n (result.linkId ? `- **Link:** ${result.linkId}\\n` : \"\") +\n `- **Body:** ${body?.substring(0, 200)}`,\n },\n ],\n };\n }\n\n if (action === \"resolve\") {\n if (!commentId) throw new Error(\"commentId is required for 'resolve'\");\n\n await mcpMutation(\"gitchain.resolveComment\", { commentId });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Comment resolved.`,\n },\n ],\n };\n }\n\n // list\n const comments = await mcpMutation<any[]>(\"gitchain.listComments\", {\n chainEntryId,\n versionNumber,\n });\n\n if (comments.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No comments found for chain \"${chainEntryId}\"${versionNumber ? ` v${versionNumber}` : \"\"}.`,\n },\n ],\n };\n }\n\n const formatted = comments\n .map((c: any) => {\n const date = new Date(c.createdAt).toISOString().replace(\"T\", \" \").substring(0, 19);\n const resolved = c.resolved ? \" (RESOLVED)\" : \"\";\n const link = c.linkId ? ` [${c.linkId}]` : \"\";\n return `- **v${c.version}${link}** ${date} by ${c.author}${resolved}: ${c.body.substring(0, 150)}`;\n })\n .join(\"\\n\");\n\n const unresolvedCount = comments.filter((c: any) => !c.resolved).length;\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Comments for ${chainEntryId} (${comments.length}, ${unresolvedCount} unresolved)\\n\\n${formatted}`,\n },\n ],\n };\n }\n );\n\n // ─── chain-revert ──────────────────────────────────────────────\n\n server.registerTool(\n \"chain-revert\",\n {\n title: \"Revert Chain\",\n description:\n \"Safely revert a chain to a previous version. Creates a NEW version \" +\n \"that restores the content of the target version — history is preserved, \" +\n \"nothing is destroyed. Use chain-commits to see available versions.\",\n inputSchema: {\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n toVersion: z.number().describe(\"The version number to revert to\"),\n author: z.string().optional().describe(\"Who is reverting. Defaults to 'mcp'.\"),\n },\n },\n async ({ chainEntryId, toVersion, author }) => {\n const result = await mcpMutation<{\n entryId: string;\n revertedTo: number;\n newVersion: number;\n linksModified: string[];\n }>(\"gitchain.revertChain\", { chainEntryId, toVersion, author });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Reverted\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Reverted to:** v${result.revertedTo}\\n` +\n `- **New version:** v${result.newVersion}\\n` +\n `- **Links affected:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n\\n` +\n `History is preserved — this created a new version, not a destructive reset.`,\n },\n ],\n };\n }\n );\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { mcpQuery } from \"../client.js\";\n\nfunction formatEntryMarkdown(entry: any): string {\n const id = entry.entryId ? `${entry.entryId}: ` : \"\";\n const lines = [`## ${id}${entry.name} [${entry.status}]`];\n if (entry.data && typeof entry.data === \"object\") {\n for (const [key, val] of Object.entries(entry.data)) {\n if (val && key !== \"rawData\") {\n lines.push(`**${key}**: ${typeof val === \"string\" ? val : JSON.stringify(val)}`);\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildOrientationMarkdown(\n collections: any[] | null,\n trackingEvents: any[] | null,\n standards: any[] | null,\n businessRules: any[] | null,\n): string {\n const sections: string[] = [\"# Product Brain — Orientation\"];\n\n // Architecture\n sections.push(\n \"## Architecture\\n\" +\n \"```\\n\" +\n \"Cursor (stdio) → MCP Server (mcp-server/src/index.ts)\\n\" +\n \" → POST /api/mcp with Bearer token\\n\" +\n \" → Convex HTTP Action (convex/http.ts)\\n\" +\n \" → internalQuery / internalMutation (convex/mcpKnowledge.ts)\\n\" +\n \" → Convex DB (workspace-scoped)\\n\" +\n \"```\\n\" +\n \"Security: API key auth on every request, workspace-scoped data, internal functions blocked from external clients.\\n\" +\n \"Key files: `packages/mcp-server/src/client.ts` (HTTP client + audit), `convex/schema.ts` (schema).\",\n );\n\n // Data model\n if (collections) {\n const collList = collections\n .map((c) => {\n const prefix = c.icon ? `${c.icon} ` : \"\";\n return `- ${prefix}**${c.name}** (\\`${c.slug}\\`) — ${c.description || \"no description\"}`;\n })\n .join(\"\\n\");\n sections.push(\n `## Data Model (${collections.length} collections)\\n` +\n \"Unified entries model: collections define field schemas, entries hold data in a flexible `data` field.\\n\" +\n \"Tags for filtering (e.g. `severity:high`), relations via `entryRelations`, history via `entryHistory`, labels via `labels` + `entryLabels`.\\n\\n\" +\n collList + \"\\n\\n\" +\n \"Use `list-collections` for field schemas, `get-entry` for full records.\",\n );\n } else {\n sections.push(\n \"## Data Model\\n\" +\n \"Could not load collections — use `list-collections` to browse manually.\",\n );\n }\n\n // Business rules\n const rulesCount = businessRules ? `${businessRules.length} entries` : \"not loaded — collection may not exist yet\";\n sections.push(\n \"## Business Rules\\n\" +\n `Collection: \\`business-rules\\` (${rulesCount}).\\n` +\n \"Find rules: `kb-search` for text search, `list-entries collection=business-rules` to browse.\\n\" +\n \"Check compliance: use the `review-against-rules` prompt (pass a domain).\\n\" +\n \"Draft a new rule: use the `draft-rule-from-context` prompt.\",\n );\n\n // Analytics / tracking\n const eventsCount = trackingEvents ? `${trackingEvents.length} events` : \"not loaded — collection may not exist yet\";\n const conventionNote = standards\n ? \"Naming convention: `object_action` in snake_case with past-tense verbs (from standards collection).\"\n : \"Naming convention: `object_action` in snake_case with past-tense verbs.\";\n sections.push(\n \"## Analytics & Tracking\\n\" +\n `Event catalog: \\`tracking-events\\` collection (${eventsCount}).\\n` +\n `${conventionNote}\\n` +\n \"Implementation: `src/lib/analytics.ts`. Workspace-scoped events MUST use `withWorkspaceGroup()`.\\n\" +\n \"Browse: `list-entries collection=tracking-events`. Full setup: `docs/posthog-setup.md`.\",\n );\n\n // Knowledge Graph\n sections.push(\n \"## Knowledge Graph\\n\" +\n \"Entries are connected via typed relations (`entryRelations` table). Relations are bidirectional and collection-agnostic — any entry can link to any other entry.\\n\\n\" +\n \"**Recommended relation types** (extensible — any string accepted):\\n\" +\n \"- `governs` — a rule constrains behavior of a feature\\n\" +\n \"- `defines_term_for` — a glossary term is canonical vocabulary for a feature/area\\n\" +\n \"- `belongs_to` — a feature belongs to a product area or parent concept\\n\" +\n \"- `informs` — a decision or insight informs a feature\\n\" +\n \"- `surfaces_tension_in` — a tension exists within a feature area\\n\" +\n \"- `related_to`, `depends_on`, `replaces`, `conflicts_with`, `references`, `confused_with`\\n\\n\" +\n \"Each relation type is defined as a glossary entry (prefix `GT-REL-*`) to prevent terminology drift.\\n\\n\" +\n \"**Tools:**\\n\" +\n \"- `gather-context` — get the full context around any entry (multi-hop graph traversal)\\n\" +\n \"- `suggest-links` — discover potential connections for an entry\\n\" +\n \"- `relate-entries` — create a typed link between two entries\\n\" +\n \"- `find-related` — list direct relations for an entry\\n\\n\" +\n \"**Convention:** When creating or updating entries in governed collections, always use `suggest-links` to discover and create relevant relations.\",\n );\n\n // Creating Knowledge\n sections.push(\n \"## Creating Knowledge\\n\" +\n \"Use `smart-capture` as the primary tool for creating new entries. It handles the full workflow in one call:\\n\" +\n \"1. Creates the entry with collection-aware defaults (auto-fills dates, infers domains, sets priority)\\n\" +\n \"2. Auto-links related entries from across the knowledge base (up to 5 confident matches)\\n\" +\n \"3. Returns a quality scorecard (X/10) with actionable improvement suggestions\\n\\n\" +\n \"**Smart profiles** exist for: `tensions`, `business-rules`, `glossary`, `decisions`.\\n\" +\n \"All other collections use sensible defaults.\\n\\n\" +\n \"Example: `smart-capture collection='tensions' name='...' description='...'`\\n\\n\" +\n \"Use `quality-check` to score existing entries retroactively.\\n\" +\n \"Use `create-entry` only when you need full control over every field.\\n\" +\n \"Use `quick-capture` for minimal ceremony without auto-linking.\",\n );\n\n // Where to go next\n sections.push(\n \"## Where to Go Next\\n\" +\n \"- **Create entry** → `smart-capture` tool (auto-links + quality score in one call)\\n\" +\n \"- **Full context** → `gather-context` tool (start here when working on a feature)\\n\" +\n \"- **Discover links** → `suggest-links` tool\\n\" +\n \"- **Quality audit** → `quality-check` tool\\n\" +\n \"- **Terminology** → `name-check` prompt or `productbrain://terminology` resource\\n\" +\n \"- **Schema details** → `productbrain://collections` resource or `list-collections` tool\\n\" +\n \"- **Labels** → `productbrain://labels` resource or `list-labels` tool\\n\" +\n \"- **Any collection** → `productbrain://{slug}/entries` resource\\n\" +\n \"- **Log a decision** → `draft-decision-record` prompt\\n\" +\n \"- **Architecture map** → `show-architecture` tool (layered system visualization)\\n\" +\n \"- **Explore a layer** → `explore-layer` tool (drill into Auth, Core, Features, etc.)\\n\" +\n \"- **Health check** → `health` tool\\n\" +\n \"- **Debug MCP calls** → `mcp-audit` tool\",\n );\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n\nexport function registerResources(server: McpServer) {\n // Orientation: single-call system map for AI developers\n server.resource(\n \"kb-orientation\",\n \"productbrain://orientation\",\n async (uri) => {\n const [collectionsResult, eventsResult, standardsResult, rulesResult] = await Promise.allSettled([\n mcpQuery<any[]>(\"kb.listCollections\"),\n mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"tracking-events\" }),\n mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"standards\" }),\n mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"business-rules\" }),\n ]);\n\n const collections = collectionsResult.status === \"fulfilled\" ? collectionsResult.value : null;\n const trackingEvents = eventsResult.status === \"fulfilled\" ? eventsResult.value : null;\n const standards = standardsResult.status === \"fulfilled\" ? standardsResult.value : null;\n const businessRules = rulesResult.status === \"fulfilled\" ? rulesResult.value : null;\n\n return {\n contents: [{\n uri: uri.href,\n text: buildOrientationMarkdown(collections, trackingEvents, standards, businessRules),\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n // Terminology: glossary + standards summary for deep-dives\n server.resource(\n \"kb-terminology\",\n \"productbrain://terminology\",\n async (uri) => {\n const [glossaryResult, standardsResult] = await Promise.allSettled([\n mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"glossary\" }),\n mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"standards\" }),\n ]);\n\n const lines: string[] = [\"# Product Brain — Terminology\"];\n\n if (glossaryResult.status === \"fulfilled\") {\n if (glossaryResult.value.length > 0) {\n const terms = glossaryResult.value\n .map((t) => `- **${t.name}** (${t.entryId ?? \"—\"}) [${t.status}]: ${t.data?.canonical ?? t.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Glossary (${glossaryResult.value.length} terms)\\n\\n${terms}`);\n } else {\n lines.push(\"## Glossary\\n\\nNo glossary terms yet. Use `create-entry` with collection `glossary` to add terms.\");\n }\n } else {\n lines.push(\"## Glossary\\n\\nCould not load glossary — use `list-entries collection=glossary` to browse manually.\");\n }\n\n if (standardsResult.status === \"fulfilled\") {\n if (standardsResult.value.length > 0) {\n const stds = standardsResult.value\n .map((s) => `- **${s.name}** (${s.entryId ?? \"—\"}) [${s.status}]: ${s.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Standards (${standardsResult.value.length} entries)\\n\\n${stds}`);\n } else {\n lines.push(\"## Standards\\n\\nNo standards yet. Use `create-entry` with collection `standards` to add standards.\");\n }\n } else {\n lines.push(\"## Standards\\n\\nCould not load standards — use `list-entries collection=standards` to browse manually.\");\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\\n---\\n\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"kb-collections\",\n \"productbrain://collections\",\n async (uri) => {\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n\n if (collections.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No collections in this workspace.\", mimeType: \"text/markdown\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = c.fields\n .map((f: any) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n return `## ${c.icon ?? \"\"} ${c.name} (\\`${c.slug}\\`)\\n${c.description || \"\"}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{ uri: uri.href, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"kb-collection-entries\",\n new ResourceTemplate(\"productbrain://{slug}/entries\", {\n list: async () => {\n const collections = await mcpQuery<any[]>(\"kb.listCollections\");\n return {\n resources: collections.map((c) => ({\n uri: `productbrain://${c.slug}/entries`,\n name: `${c.icon ?? \"\"} ${c.name}`.trim(),\n })),\n };\n },\n }),\n async (uri, { slug }) => {\n const entries = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: slug as string });\n const formatted = entries.map(formatEntryMarkdown).join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{\n uri: uri.href,\n text: formatted || \"No entries in this collection.\",\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n server.resource(\n \"kb-labels\",\n \"productbrain://labels\",\n async (uri) => {\n const labels = await mcpQuery<any[]>(\"kb.listLabels\");\n\n if (labels.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No labels in this workspace.\", mimeType: \"text/markdown\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [];\n for (const group of groups) {\n lines.push(`## ${group.name}`);\n for (const child of children(group._id)) {\n lines.push(`- \\`${child.slug}\\` ${child.name}${child.color ? ` (${child.color})` : \"\"}`);\n }\n }\n if (ungrouped.length > 0) {\n lines.push(\"## Ungrouped\");\n for (const l of ungrouped) {\n lines.push(`- \\`${l.slug}\\` ${l.name}${l.color ? ` (${l.color})` : \"\"}`);\n }\n }\n\n return {\n contents: [{ uri: uri.href, text: `# Workspace Labels (${labels.length})\\n\\n${lines.join(\"\\n\")}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery } from \"../client.js\";\nimport { getWorkflow, listWorkflows } from \"../workflows/definitions.js\";\n\nexport function registerPrompts(server: McpServer) {\n server.prompt(\n \"review-against-rules\",\n \"Review code or a design decision against all business rules for a given domain. Fetches the rules and asks you to do a structured compliance review.\",\n { domain: z.string().describe(\"Business rule domain (e.g. 'Identity & Access', 'Governance & Decision-Making')\") },\n async ({ domain }) => {\n const entries = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"business-rules\" });\n const rules = entries.filter((e) => e.data?.domain === domain);\n\n if (rules.length === 0) {\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `No business rules found for domain \"${domain}\". Use the list-entries tool with collection \"business-rules\" to see available domains.`,\n },\n },\n ],\n };\n }\n\n const rulesText = rules\n .map(\n (r) =>\n `### ${r.entryId ?? \"\"}: ${r.name}\\n` +\n `Status: ${r.status} | Severity: ${r.data?.severity ?? \"unknown\"}\\n` +\n `Description: ${r.data?.description ?? \"\"}\\n` +\n `Data Impact: ${r.data?.dataImpact ?? \"\"}\\n` +\n `Platforms: ${(r.data?.platforms ?? []).join(\", \")}\\n` +\n (r.data?.conflictWith ? `CONFLICT: ${r.data.conflictWith.rule} — ${r.data.conflictWith.nature}\\n` : \"\")\n )\n .join(\"\\n---\\n\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Review the current code or design against the following business rules for the \"${domain}\" domain.\\n\\n` +\n `For each rule, assess:\\n` +\n `1. Is the current implementation compliant?\\n` +\n `2. Are there potential violations or edge cases?\\n` +\n `3. What specific changes would be needed for compliance?\\n\\n` +\n `Business Rules:\\n\\n${rulesText}\\n\\n` +\n `Provide a structured review with a compliance status for each rule (COMPLIANT / AT RISK / VIOLATION / NOT APPLICABLE).`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"name-check\",\n \"Check variable names, field names, or API names against the glossary for terminology alignment. Flags drift from canonical terms.\",\n { names: z.string().describe(\"Comma-separated list of names to check (e.g. 'vendor_id, compliance_level, formulator_type')\") },\n async ({ names }) => {\n const terms = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"glossary\" });\n\n const glossaryContext = terms\n .map(\n (t) =>\n `${t.name} (${t.entryId ?? \"\"}) [${t.status}]: ${t.data?.canonical ?? \"\"}` +\n (t.data?.confusedWith?.length > 0 ? ` — Often confused with: ${t.data.confusedWith.join(\", \")}` : \"\") +\n (t.data?.codeMapping?.length > 0\n ? `\\n Code mappings: ${t.data.codeMapping.map((m: any) => `${m.platform}:${m.field}`).join(\", \")}`\n : \"\")\n )\n .join(\"\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Check the following names against the glossary for terminology alignment:\\n\\n` +\n `Names to check: ${names}\\n\\n` +\n `Glossary (canonical terms):\\n${glossaryContext}\\n\\n` +\n `For each name:\\n` +\n `1. Does it match a canonical term? If so, which one?\\n` +\n `2. Is there terminology drift? (e.g. using \"vendor\" instead of \"supplier\", \"compliance\" instead of \"conformance\")\\n` +\n `3. Suggest the canonical alternative if drift is detected.\\n` +\n `4. Flag any names that don't have a corresponding glossary term (might need one).\\n\\n` +\n `Format as a table: Name | Status | Canonical Form | Action Needed`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-decision-record\",\n \"Draft a structured decision record from a description of what was decided. Includes context from recent decisions and relevant rules.\",\n { context: z.string().describe(\"Description of the decision (e.g. 'We decided to use MRSL v3.1 as the conformance baseline because...')\") },\n async ({ context }) => {\n const recentDecisions = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"decisions\" });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n\n const recentContext = sorted.length > 0\n ? sorted.map((d) => `- [${d.status}] ${d.name} (${d.data?.date ?? \"no date\"})`).join(\"\\n\")\n : \"No previous decisions recorded.\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a structured decision record from the following context:\\n\\n` +\n `\"${context}\"\\n\\n` +\n `Recent decisions for reference:\\n${recentContext}\\n\\n` +\n `Structure the decision record with:\\n` +\n `1. **Title**: Concise decision statement\\n` +\n `2. **Decided by**: Who made or approved this decision\\n` +\n `3. **Date**: When it was decided\\n` +\n `4. **Status**: decided / proposed / revisited\\n` +\n `5. **Rationale**: Why this decision was made, including trade-offs considered\\n` +\n `6. **Alternatives considered**: What else was on the table\\n` +\n `7. **Related rules or tensions**: Any business rules or tensions this connects to\\n\\n` +\n `After drafting, I can log it using the create-entry tool with collection \"decisions\".`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-rule-from-context\",\n \"Draft a new business rule from an observation or discovery made while coding. Fetches existing rules for the domain to ensure consistency.\",\n {\n observation: z.string().describe(\"What you observed or discovered (e.g. 'Suppliers can have multiple org types in Gateway')\"),\n domain: z.string().describe(\"Which domain this rule belongs to (e.g. 'Governance & Decision-Making')\"),\n },\n async ({ observation, domain }) => {\n const allRules = await mcpQuery<any[]>(\"kb.listEntries\", { collectionSlug: \"business-rules\" });\n const existingRules = allRules.filter((r) => r.data?.domain === domain);\n\n const existingContext =\n existingRules.length > 0\n ? existingRules.map((r) => `${r.entryId ?? \"\"}: ${r.name} [${r.status}] — ${r.data?.description ?? \"\"}`).join(\"\\n\")\n : \"No existing rules for this domain.\";\n\n const highestRuleNum = allRules\n .map((r) => parseInt((r.entryId ?? \"\").replace(/^[A-Z]+-/, \"\"), 10))\n .filter((n) => !isNaN(n))\n .sort((a, b) => b - a)[0] || 0;\n const nextRuleId = `SOS-${String(highestRuleNum + 1).padStart(3, \"0\")}`;\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a business rule based on this observation:\\n\\n` +\n `\"${observation}\"\\n\\n` +\n `Domain: ${domain}\\n` +\n `Suggested rule ID: ${nextRuleId}\\n\\n` +\n `Existing rules in this domain:\\n${existingContext}\\n\\n` +\n `Draft the rule with these fields:\\n` +\n `1. **entryId**: ${nextRuleId}\\n` +\n `2. **name**: Concise rule title\\n` +\n `3. **data.description**: What the rule states\\n` +\n `4. **data.rationale**: Why this rule matters\\n` +\n `5. **data.dataImpact**: How this affects data models, APIs, or storage\\n` +\n `6. **data.severity**: high / medium / low\\n` +\n `7. **data.platforms**: Which platforms are affected\\n` +\n `8. **data.relatedRules**: Any related existing rules\\n\\n` +\n `Make sure the rule is consistent with existing rules and doesn't contradict them. ` +\n `After drafting, I can create it using the create-entry tool with collection \"business-rules\".`,\n },\n },\n ],\n };\n }\n );\n\n // ── Run Workflow Prompt ──────────────────────────────────────────────────\n\n server.prompt(\n \"run-workflow\",\n \"Launch a Chainwork workflow (retro, shape, IDM) in Facilitator Mode. \" +\n \"Returns the full workflow definition, facilitation instructions, and round structure. \" +\n \"The agent enters Facilitator Mode and guides the participant through each round.\",\n {\n workflow: z.string().describe(\n \"Workflow ID to run. Available: \" +\n listWorkflows().map((w) => `'${w.id}' (${w.name})`).join(\", \"),\n ),\n context: z.string().optional().describe(\n \"Optional context from the participant (e.g., 'retro on last sprint', 'shape the Chainwork API bet')\",\n ),\n },\n async ({ workflow: workflowId, context }) => {\n const wf = getWorkflow(workflowId);\n\n if (!wf) {\n const available = listWorkflows()\n .map((w) => `- **${w.id}**: ${w.name} — ${w.shortDescription}`)\n .join(\"\\n\");\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found.\\n\\n` +\n `Available workflows:\\n${available}\\n\\n` +\n `Use one of these IDs to run a workflow.`,\n },\n },\n ],\n };\n }\n\n // Fetch recent KB context for richer facilitation\n let kbContext = \"\";\n try {\n const recentDecisions = await mcpQuery<any[]>(\"kb.listEntries\", {\n collectionSlug: wf.kbOutputCollection,\n });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n if (sorted.length > 0) {\n kbContext =\n `\\n## Recent ${wf.kbOutputCollection} entries (for context)\\n` +\n sorted.map((d) => `- ${d.entryId ?? \"\"}: ${d.name} [${d.status}]`).join(\"\\n\");\n }\n } catch {\n kbContext = \"\\n_Could not load KB context — proceed without it._\";\n }\n\n const roundsPlan = wf.rounds\n .map((r) =>\n `### Round ${r.num}: ${r.label}\\n` +\n `**Type**: ${r.type} | **Duration**: ~${r.maxDurationHint ?? \"5 min\"}\\n` +\n `**Instruction**: ${r.instruction}\\n` +\n `**Facilitator guidance**: ${r.facilitatorGuidance}\\n` +\n (r.questions\n ? r.questions.map((q) =>\n `**Question**: ${q.prompt}\\n` +\n (q.options\n ? q.options.map((o) => ` - ${o.id}: ${o.label}`).join(\"\\n\")\n : \" _(open response)_\"),\n ).join(\"\\n\")\n : \"\") +\n `\\n**Output**: Capture to \\`${r.outputSchema.field}\\` (${r.outputSchema.format})`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n const contextLine = context\n ? `\\nThe participant provided this context: \"${context}\"\\nUse it — don't make them repeat themselves.\\n`\n : \"\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# ${wf.icon} ${wf.name} Workflow — Facilitator Mode\\n\\n` +\n `${wf.shortDescription}\\n` +\n contextLine +\n `\\n---\\n\\n` +\n `## Facilitator Instructions\\n\\n${wf.facilitatorPreamble}\\n\\n` +\n `---\\n\\n` +\n `## Rounds\\n\\n${roundsPlan}\\n\\n` +\n `---\\n\\n` +\n `## Error Recovery\\n\\n${wf.errorRecovery}\\n\\n` +\n `---\\n\\n` +\n `## KB Output\\n\\n` +\n `When complete, use \\`smart-capture\\` to create a \\`${wf.kbOutputCollection}\\` entry.\\n` +\n `Name template: ${wf.kbOutputTemplate.nameTemplate}\\n` +\n `Description field: ${wf.kbOutputTemplate.descriptionField}\\n` +\n kbContext +\n `\\n\\n---\\n\\n` +\n `**BEGIN THE WORKFLOW NOW.** Start with Round 01. Create a Plan first.`,\n },\n },\n ],\n };\n },\n );\n}\n"],"mappings":";AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AACxB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,4BAA4B;;;ACFrC,SAAS,SAAS;;;ACKlB,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAExB,IAAI,SAAyB;AAC7B,IAAI,aAAa;AAEjB,IAAM,eAAe;AAMrB,SAAS,IAAI,KAAmB;AAC9B,MAAI,QAAQ,IAAI,cAAc,KAAK;AACjC,YAAQ,OAAO,MAAM,GAAG;AAAA,EAC1B;AACF;AAEO,SAAS,gBAAsB;AACpC,QAAM,SAAS,QAAQ,IAAI,mBAAmB;AAC9C,MAAI,CAAC,QAAQ;AACX,QAAI,iHAA4G;AAChH;AAAA,EACF;AAEA,WAAS,IAAI,QAAQ,QAAQ;AAAA,IAC3B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,eAAe;AAAA,EACjB,CAAC;AACD,eAAa,QAAQ,IAAI,eAAe,mBAAmB;AAE3D,MAAI,2CAAsC,YAAY,eAAe,UAAU;AAAA,CAAI;AACrF;AAEA,SAAS,qBAA6B;AACpC,MAAI;AACF,WAAO,SAAS,EAAE;AAAA,EACpB,QAAQ;AACN,WAAO,MAAM,QAAQ,GAAG;AAAA,EAC1B;AACF;AAEO,SAAS,oBACd,eACAC,cACA,eACM;AACN,MAAI,CAAC,OAAQ;AACb,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,OAAO;AAAA,IACP,YAAY;AAAA,MACV,gBAAgB;AAAA,MAChB,cAAcA;AAAA,MACd,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,SAAS,EAAE,WAAWA,aAAY;AAAA,IACpC;AAAA,EACF,CAAC;AACH;AAEO,SAAS,cACd,IACA,QACA,YACAA,cACA,UACM;AACN,QAAM,aAAsC;AAAA,IAC1C,MAAM;AAAA,IACN;AAAA,IACA,aAAa;AAAA,IACb,gBAAgB,QAAQ,IAAI,kBAAkB;AAAA,IAC9C,QAAQ;AAAA,IACR,SAAS,EAAE,WAAWA,aAAY;AAAA,EACpC;AACA,MAAI,SAAU,YAAW,QAAQ;AAEjC,MAAI,CAAC,OAAQ;AACb,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,oBAAmC;AACvD,QAAM,QAAQ,SAAS;AACzB;;;AC9EA,IAAM,oBAAoB;AAE1B,IAAI,oBAAmC;AACvC,IAAI,YAAY;AAWhB,IAAM,oBAAoB;AAC1B,IAAM,cAA4B,CAAC;AAM5B,SAAS,qBAA2B;AACzC,QAAM,QAAQ,QAAQ,IAAI;AAC1B,MAAI,OAAO,WAAW,QAAQ,GAAG;AAC/B,UAAM,WAAW,QAAQ,IAAI,oBAAoB;AACjD,YAAQ,IAAI,oBAAoB;AAChC,YAAQ,IAAI,gBAAgB;AAC5B,gBAAY;AAAA,EACd;AACF;AAEA,SAAS,OAAO,KAAqB;AACnC,QAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,MAAI,CAAC,MAAO,OAAM,IAAI,MAAM,GAAG,GAAG,mCAAmC;AACrE,SAAO;AACT;AAGA,SAAS,eAAe,QAAiC;AACvD,SAAO,WAAW,WAAW,QAAQ,IAAI,cAAc;AACzD;AAEA,SAAS,MAAM,IAAY,QAAwB,YAAoB,UAAyB;AAC9F,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,YAAY,qBAAqB;AAEvC,QAAM,QAAoB,EAAE,IAAI,IAAI,WAAW,QAAQ,WAAW;AAClE,MAAI,SAAU,OAAM,QAAQ;AAC5B,cAAY,KAAK,KAAK;AACtB,MAAI,YAAY,SAAS,kBAAmB,aAAY,MAAM;AAE9D,gBAAc,IAAI,QAAQ,YAAY,WAAW,QAAQ;AAEzD,MAAI,CAAC,eAAe,MAAM,EAAG;AAE7B,QAAM,OAAO,eAAe,EAAE,OAAO,EAAE,cAAc,SAAS,WAAW,MAAM,aAAa,UAAU;AACtG,MAAI,WAAW,WAAW,UAAU;AAClC,YAAQ,OAAO,MAAM,GAAG,IAAI,UAAU,KAAK,UAAU,QAAQ,CAAC;AAAA,CAAI;AAAA,EACpE,OAAO;AACL,YAAQ,OAAO,MAAM,GAAG,IAAI;AAAA,CAAI;AAAA,EAClC;AACF;AAGO,SAAS,cAAqC;AACnD,SAAO;AACT;AAMA,eAAsB,QAAW,IAAY,OAAgC,CAAC,GAAe;AAC3F,QAAM,UAAU,OAAO,iBAAiB,EAAE,QAAQ,OAAO,EAAE;AAC3D,QAAM,SAAS,OAAO,aAAa;AAEnC,QAAM,QAAQ,KAAK,IAAI;AAEvB,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,OAAO,YAAY;AAAA,MACtC,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,MAAM;AAAA,MACjC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,IAAI,KAAK,CAAC;AAAA,IACnC,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,UAAM,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,IAAI,OAAO;AAClD,UAAM,IAAI,MAAM,aAAa,EAAE,oBAAoB,IAAI,OAAO,EAAE;AAAA,EAClE;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,MAAI,CAAC,IAAI,MAAM,KAAK,OAAO;AACzB,UAAM,IAAI,SAAS,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK;AACjD,UAAM,IAAI,MAAM,aAAa,EAAE,aAAa,IAAI,MAAM,MAAM,KAAK,SAAS,eAAe,EAAE;AAAA,EAC7F;AAEA,QAAM,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK;AAClC,SAAO,KAAK;AACd;AAGA,eAAsB,iBAAkC;AACtD,MAAI,kBAAmB,QAAO;AAE9B,MAAI,WAAW;AAEb,UAAMC,aAAY,MAAM;AAAA,MACtB;AAAA,MACA,EAAE,MAAM,YAAY;AAAA,IACtB;AACA,QAAI,CAACA,YAAW;AACd,YAAM,IAAI,MAAM,wFAAwF;AAAA,IAC1G;AACA,wBAAoBA,WAAU;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAO,gBAAgB;AACpC,QAAM,YAAY,MAAM;AAAA,IACtB;AAAA,IACA,EAAE,KAAK;AAAA,EACT;AAEA,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,wBAAwB,IAAI,aAAa;AAAA,EAC3D;AAEA,sBAAoB,UAAU;AAC9B,SAAO;AACT;AAGA,eAAsB,SAAY,IAAY,OAAgC,CAAC,GAAe;AAC5F,QAAMC,eAAc,MAAM,eAAe;AACzC,SAAO,QAAW,IAAI,EAAE,GAAG,MAAM,aAAAA,aAAY,CAAC;AAChD;AAGA,eAAsB,YAAe,IAAY,OAAgC,CAAC,GAAe;AAC/F,QAAMA,eAAc,MAAM,eAAe;AACzC,SAAO,QAAW,IAAI,EAAE,GAAG,MAAM,aAAAA,aAAY,CAAC;AAChD;;;AF9JA,SAAS,eAAe,MAAW,QAAwB;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM,KAAK,eAAe,KAAK,aAAa,KAAK,UAAU;AACjE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,UAAU,GAAG,MAAM,IAAI,QAAQ;AAClE;AAEO,SAAS,uBAAuBC,SAAmB;AAExD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,cAAc,MAAM,SAAgB,oBAAoB;AAE9D,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,0CAA0C,CAAC,EAAE;AAAA,MACjG;AAEA,YAAM,YAAY,YACf,IAAI,CAAC,MAAM;AACV,cAAM,YAAY,EAAE,OACjB,IAAI,CAAC,MAAW,SAAS,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,EAAE,WAAW,eAAe,EAAE,GAAG,EAAE,aAAa,iBAAiB,EAAE,GAAG,EACpH,KAAK,IAAI;AACZ,eAAO,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI;AAAA,EAAQ,EAAE,eAAe,kBAAkB;AAAA;AAAA;AAAA,EAAoB,SAAS;AAAA,MAC1G,CAAC,EACA,KAAK,aAAa;AAErB,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,4BAA4B,YAAY,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC;AAAA,MAC9G;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,QAClH,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QACvF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,QACrF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oEAA+D;AAAA,MACvG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,YAAY,QAAQ,KAAK,MAAM,MAAM;AAC5C,UAAI;AAEJ,UAAI,OAAO;AACT,kBAAU,MAAM,SAAgB,yBAAyB,EAAE,WAAW,MAAM,CAAC;AAC7E,YAAI,OAAQ,WAAU,QAAQ,OAAO,CAAC,MAAW,EAAE,WAAW,MAAM;AAAA,MACtE,OAAO;AACL,kBAAU,MAAM,SAAgB,kBAAkB;AAAA,UAChD,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,sCAAsC,CAAC,EAAE;AAAA,MAC7F;AAEA,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,cAAM,cAAc,EAAE,OAClB,OAAO,QAAQ,EAAE,IAAI,EAClB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,OAAO,MAAM,WAAW,EAAE,UAAU,GAAG,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,EAC5F,KAAK,IAAI,IACZ;AACJ,eAAO,KAAK,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,cAAc;AAAA,EAAK,WAAW,KAAK,EAAE;AAAA,MACjF,CAAC,EACA,KAAK,MAAM;AAEd,YAAM,QAAQ,aAAa,SAAS,UAAU,OAAO;AACrD,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,YAAY,KAAK,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,gEAAgE;AAAA,MAC/F;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,QAAQ,MAAM,SAAc,eAAe,EAAE,QAAQ,CAAC;AAE5D,UAAI,CAAC,OAAO;AACV,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,oDAAoD,CAAC,EAAE;AAAA,MAC7H;AAEA,YAAM,QAAkB;AAAA,QACtB,KAAK,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,EAAE,GAAG,MAAM,IAAI;AAAA,QAC3D;AAAA,QACA,eAAe,MAAM,MAAM;AAAA,MAC7B;AAEA,UAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,cAAM,KAAK,EAAE;AACb,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AACnD,gBAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG;AAClE,gBAAM,KAAK,KAAK,GAAG,OAAO,OAAO,EAAE;AAAA,QACrC;AAAA,MACF;AAEA,UAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,cAAM,KAAK,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MACrD;AAEA,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,cAAM,KAAK,IAAI,eAAe,MAAM,OAAO,IAAI,CAAC,MAAW,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACpG;AAEA,UAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,cAAM,KAAK,IAAI,cAAc;AAC7B,mBAAW,KAAK,MAAM,WAAW;AAC/B,gBAAM,QAAQ,EAAE,cAAc,aAAa,WAAW;AACtD,gBAAM,QAAQ,EAAE,eAAe,GAAG,EAAE,YAAY,KAAK,EAAE,SAAS,KAAM,EAAE,aAAa;AACrF,gBAAM,KAAK,KAAK,KAAK,MAAM,EAAE,IAAI,MAAM,KAAK,EAAE;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,cAAM,KAAK,IAAI,sBAAsB;AACrC,mBAAW,KAAK,MAAM,QAAQ,MAAM,GAAG,GAAG;AACxC,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7D,gBAAM,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE;AAAA,QAC/E;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,sBAAsB,oBAAI,IAAI;AAAA,IAClC;AAAA,IAAY;AAAA,IAAkB;AAAA,IAAc;AAAA,IAAa;AAAA,EAC3D,CAAC;AAED,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,SAAS,kEAAkE;AAAA,QAClG,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,QAC/G,MAAM,EAAE,OAAO,EAAE,SAAS,cAAc;AAAA,QACxC,QAAQ,EAAE,OAAO,EAAE,QAAQ,OAAO,EAAE,SAAS,0DAA0D;AAAA,QACvG,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,uEAAkE;AAAA,QACvG,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yCAAyC;AAAA,MACjF;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,YAAY,SAAS,MAAM,QAAQ,MAAM,MAAM,MAAM;AAC5D,UAAI,oBAAoB,IAAI,UAAU,KAAK,WAAW,WAAW,WAAW,cAAc;AACxF,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA;AAAA,QACK,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAKvB,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI;AACF,cAAM,KAAK,MAAM,YAAoB,kBAAkB;AAAA,UACrD,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,WAAW,IAAI,iBAAiB,UAAU,WAAW,MAAM;AAAA;AAAA,eAAuB,EAAE,GAAG,CAAC;AAAA,QAC3J;AAAA,MACF,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,gBAAgB,GAAG;AACrE,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,EAA2C,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAKtD,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,iDAAiD;AAAA,QAC9E,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,QACvD,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,QAC3F,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,QAC9F,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,QACtD,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,SAAS,yFAAyF;AAAA,MACvJ;AAAA,MACA,aAAa,EAAE,gBAAgB,MAAM,iBAAiB,MAAM;AAAA,IAC9D;AAAA,IACA,OAAO,EAAE,SAAS,MAAM,QAAQ,MAAM,OAAO,YAAY,MAAM;AAC7D,UAAI;AACF,cAAM,KAAK,MAAM,YAAoB,kBAAkB;AAAA,UACrD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,cAAM,OAAO,cAAc,cAAc;AACzC,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,OAAO,eAAe,IAAI;AAAA;AAAA,eAAqB,EAAE,GAAG,CAAC;AAAA,QACxH;AAAA,MACF,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQR,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,QAC3D,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kFAAkF;AAAA,QAC7H,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,MACnG;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,eAAe,KAAK;AAAA,IACzD;AAAA,IACA,OAAO,EAAE,OAAO,YAAY,OAAO,MAAM;AACvC,YAAM,QAAQ,aAAa,SAAS,UAAU,OAAO;AACrD,YAAMA,QAAO,mBAAmB,EAAE,OAAO,QAAQ,MAAM,YAAY,KAAK,SAAS,KAAK,QAAQ,QAAQ,aAAa,CAAC;AAEpH,YAAM,CAAC,SAAS,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/C,SAAgB,oBAAoB,EAAE,OAAO,gBAAgB,YAAY,OAAO,CAAC;AAAA,QACjF,SAAgB,oBAAoB;AAAA,MACtC,CAAC;AAED,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,KAAK,IAAI,KAAK,uEAAuE,CAAC,EAAE;AAAA,MAC/J;AAEA,YAAM,UAAU,oBAAI,IAA4C;AAChE,iBAAW,KAAK,aAAa;AAC3B,gBAAQ,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,MACnD;AAEA,YAAM,eAAe,oBAAI,IAAoB;AAC7C,iBAAW,KAAK,SAAS;AACvB,cAAM,MAAM,QAAQ,IAAI,EAAE,YAAY;AACtC,cAAM,OAAO,KAAK,QAAQ;AAC1B,qBAAa,IAAI,OAAO,aAAa,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,MAC1D;AACA,YAAM,cAAc,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC3C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,EACzC,KAAK,IAAI;AAEZ,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,cAAM,MAAM,QAAQ,IAAI,EAAE,YAAY;AACtC,cAAM,SAAS,MAAM,KAAK,IAAI,IAAI,MAAM;AACxC,cAAM,OAAO,eAAe,EAAE,MAAM,GAAG;AACvC,cAAM,UAAU,OAAO;AAAA,IAAO,IAAI,KAAK;AACvC,eAAO,KAAK,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO;AAAA,MAC5D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,SAAS,yBAAyB,KAAK,IAAI,KAAK,KAAK,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,IAAI;AAAA;AAAA,qBAA2B,WAAW;AACxJ,YAAM,SAAS;AAEf,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,GAAG,MAAM;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA,EAAO,MAAM,GAAG,CAAC;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,MACtE;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,UAAU,MAAM,SAAgB,uBAAuB,EAAE,QAAQ,CAAC;AAExE,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,0BAA0B,OAAO,MAAM,CAAC,EAAE;AAAA,MAC9F;AAEA,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY;AAC/C,cAAM,UAAU,EAAE,UAAU,WAAM,KAAK,UAAU,EAAE,OAAO,CAAC,KAAK;AAChE,eAAO,OAAO,IAAI,MAAM,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;AAAA,MACtF,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,OAAO,OAAO,QAAQ,MAAM;AAAA;AAAA,EAAe,SAAS,GAAG,CAAC;AAAA,MACtH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAUF,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,QAC9D,IAAI,EAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,QACxD,MAAM,EAAE,OAAO,EAAE,SAAS,uEAAkE;AAAA,MAC9F;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,MAAM,IAAI,KAAK,MAAM;AAC5B,YAAM,YAAY,0BAA0B;AAAA,QAC1C,aAAa;AAAA,QACb,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAA2B,IAAI,aAAa,IAAI,aAAa,EAAE,KAAK,CAAC;AAAA,MAChH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,QACjE,WAAW,EAAE,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,QAAQ,MAAM,EAC/D,SAAS,0FAA0F;AAAA,MACxG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,YAAY,MAAM,SAAgB,yBAAyB,EAAE,QAAQ,CAAC;AAE5E,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,4BAA4B,OAAO,gDAAgD,CAAC,EAAE;AAAA,MAC1I;AAEA,YAAM,cAAc,MAAM,SAAc,eAAe,EAAE,QAAQ,CAAC;AAClE,UAAI,CAAC,aAAa;AAChB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,oDAAoD,CAAC,EAAE;AAAA,MAC7H;AACA,YAAM,mBAAmB,YAAY;AAErC,YAAM,gBAAgB;AACtB,YAAM,YAAY,UAAU,SAAS;AACrC,YAAM,SAAS,UAAU,MAAM,GAAG,aAAa;AAE/C,YAAM,WAAW,oBAAI,IAAY;AACjC,iBAAW,KAAK,QAAQ;AACtB,cAAM,UAAU,EAAE,WAAW,mBAAmB,EAAE,OAAO,EAAE;AAC3D,iBAAS,IAAI,OAAO;AAAA,MACtB;AAEA,YAAM,eAAe,oBAAI,IAAsE;AAC/F,iBAAW,MAAM,UAAU;AACzB,cAAM,QAAQ,MAAM,SAAc,eAAe,EAAE,GAAG,CAAC;AACvD,YAAI,OAAO;AACT,uBAAa,IAAI,MAAM,KAAK,EAAE,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,cAAc,MAAM,aAAa,CAAC;AAAA,QAC5G;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,SAAgB,oBAAoB;AAC9D,YAAM,UAAU,oBAAI,IAAoB;AACxC,iBAAW,KAAK,YAAa,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AAEtD,YAAM,QAAkB,CAAC,mBAAmB,OAAO,KAAK,YAAY,IAAI,IAAI,EAAE;AAE9E,YAAM,WAAW,OAAO,IAAI,CAAC,MAAM;AACjC,cAAM,aAAa,EAAE,WAAW;AAChC,cAAM,UAAU,aAAa,EAAE,OAAO,EAAE;AACxC,cAAM,QAAQ,aAAa,IAAI,OAAO;AACtC,cAAM,aAAa,OAAO,UAAU,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,KAAM,OAAO,QAAQ;AACxF,cAAM,UAAU,QAAS,QAAQ,IAAI,MAAM,YAAY,KAAK,YAAa;AACzE,eAAO,EAAE,YAAY,MAAM,EAAE,MAAM,YAAY,QAAQ;AAAA,MACzD,CAAC;AAED,YAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU;AACpD,YAAM,WAAW,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAErD,WAAK,cAAc,cAAc,cAAc,WAAW,SAAS,SAAS,GAAG;AAC7E,cAAM,KAAK,gBAAgB,SAAS,MAAM,GAAG;AAC7C,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,UAAU,KAAK,EAAE,OAAO,GAAG;AAAA,QACpE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,WAAK,cAAc,cAAc,cAAc,WAAW,SAAS,SAAS,GAAG;AAC7E,cAAM,KAAK,gBAAgB,SAAS,MAAM,GAAG;AAC7C,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,UAAU,KAAK,EAAE,OAAO,GAAG;AAAA,QACpE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,YAAM,QAAQ,cAAc,aAAa,WAAW,cAAc,aAAa,WAAW;AAC1F,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,KAAK,MAAM,SAAS,0BAA0B,OAAO,KAAK;AAAA,MAClE;AAEA,UAAI,WAAW;AACb,cAAM,KAAK,kBAAkB,aAAa,OAAO,UAAU,MAAM,kDAAkD;AAAA,MACrH;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,+CAA+C;AAAA,QAC5E,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EACxC,SAAS,2EAA2E;AAAA,MACzF;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,QAAQ,MAAM;AAC9B,YAAM,SAAS,MAAM,SAAc,oBAAoB,EAAE,SAAS,QAAQ,CAAC;AAE3E,UAAI,CAAC,QAAQ,MAAM;AACjB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,oDAAoD,CAAC,EAAE;AAAA,MAC7H;AAEA,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,iBAAiB,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,UAGjE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,eAAe,oBAAI,IAAmC;AAC5D,iBAAW,SAAS,OAAO,SAAS;AAClC,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,qBAAa,IAAI,GAAG,EAAG,KAAK,KAAK;AAAA,MACnC;AAEA,YAAM,QAAkB;AAAA,QACtB,iBAAiB,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI;AAAA,QACzD,IAAI,OAAO,cAAc,2BAA2B,aAAa,IAAI,iBAAiB,OAAO,aAAa;AAAA,QAC1G;AAAA,MACF;AAEA,iBAAW,CAAC,UAAU,OAAO,KAAK,cAAc;AAC9C,cAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,MAAM,GAAG;AAC/C,mBAAW,KAAK,SAAS;AACvB,gBAAM,QAAQ,EAAE,sBAAsB,aAAa,WAAW;AAC9D,gBAAM,WAAW,EAAE,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM;AACjD,gBAAM,KAAK,EAAE,UAAU,GAAG,EAAE,OAAO,OAAO;AAC1C,gBAAM,KAAK,KAAK,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,QAAQ,EAAE;AAAA,QACzE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,mDAAmD;AAAA,QAChF,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EACxC,SAAS,qCAAqC;AAAA,MACnD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,MAAM,MAAM;AAC5B,YAAM,QAAQ,MAAM,SAAc,eAAe,EAAE,QAAQ,CAAC;AAC5D,UAAI,CAAC,OAAO;AACV,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,oDAAoD,CAAC,EAAE;AAAA,MAC7H;AAEA,YAAM,cAAc,CAAC,MAAM,IAAI;AAC/B,UAAI,MAAM,MAAM,YAAa,aAAY,KAAK,MAAM,KAAK,WAAW;AACpE,UAAI,MAAM,MAAM,UAAW,aAAY,KAAK,MAAM,KAAK,SAAS;AAChE,UAAI,MAAM,MAAM,UAAW,aAAY,KAAK,MAAM,KAAK,SAAS;AAChE,UAAI,MAAM,MAAM,KAAM,aAAY,KAAK,MAAM,KAAK,IAAI;AAEtD,YAAM,YAAY,YACf,KAAK,GAAG,EACR,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AAEX,UAAI,CAAC,WAAW;AACd,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,0DAA0D,CAAC,EAAE;AAAA,MACnI;AAEA,YAAM,UAAU,MAAM,SAAgB,oBAAoB,EAAE,OAAO,UAAU,CAAC;AAC9E,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,8BAA8B,OAAO,gDAAgD,CAAC,EAAE;AAAA,MAC5I;AAEA,YAAM,oBAAoB,MAAM,SAAgB,yBAAyB,EAAE,QAAQ,CAAC;AACpF,YAAM,aAAa,IAAI;AAAA,QACrB,kBAAkB,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC;AAAA,MACrD;AAEA,YAAM,cAAc,MAAM,SAAgB,oBAAoB;AAC9D,YAAM,UAAU,oBAAI,IAAoB;AACxC,iBAAW,KAAK,YAAa,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AAEtD,YAAM,cAAc,QACjB,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,OAAO,CAAC,WAAW,IAAI,EAAE,GAAG,CAAC,EAC3D,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,OAAO;AAAA,QACX,SAAS,EAAE;AAAA,QACX,MAAM,EAAE;AAAA,QACR,YAAY,QAAQ,IAAI,EAAE,YAAY,KAAK;AAAA,QAC3C,SAAS,eAAe,EAAE,MAAM,EAAE;AAAA,MACpC,EAAE;AAEJ,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iCAAiC,OAAO,2EAAsE,CAAC,EAAE;AAAA,MACrK;AAEA,YAAM,QAAQ;AAAA,QACZ,0BAA0B,OAAO,KAAK,MAAM,IAAI;AAAA,QAChD,IAAI,YAAY,MAAM;AAAA,QACtB;AAAA,MACF;AAEA,eAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,cAAM,IAAI,YAAY,CAAC;AACvB,cAAM,UAAU,EAAE,UAAU,WAAM,EAAE,OAAO,KAAK;AAChD,cAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE,UAAU,IAAI,OAAO,EAAE;AAAA,MAC7F;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,mFAAmF;AAC9F,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,2HAA2H;AAEtI,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,SAAS,6EAA6E;AAAA,QAC7G,MAAM,EAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,QACtD,aAAa,EAAE,OAAO,EAAE,SAAS,+DAA0D;AAAA,QAC3F,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uDAAuD;AAAA,MACjG;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,YAAY,MAAM,aAAa,QAAQ,MAAM;AACpD,YAAM,MAAM,MAAM,SAAc,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACxE,UAAI,CAAC,KAAK;AACR,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gBAAgB,UAAU,mEAAmE,CAAC,EAAE;AAAA,MACpJ;AAEA,YAAM,OAAgC,CAAC;AACvC,YAAM,cAAwB,CAAC;AAE/B,iBAAW,SAAS,IAAI,UAAU,CAAC,GAAG;AACpC,cAAM,MAAM,MAAM;AAClB,YAAI,QAAQ,iBAAiB,QAAQ,eAAe,QAAQ,UAAU;AACpE,eAAK,GAAG,IAAI;AAAA,QACd,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,gBAAgB;AAClE,eAAK,GAAG,IAAI,CAAC;AACb,sBAAY,KAAK,GAAG;AAAA,QACtB,WAAW,MAAM,SAAS,UAAU;AAClC,eAAK,GAAG,IAAI,MAAM,UAAU,CAAC,KAAK;AAClC,sBAAY,KAAK,GAAG;AAAA,QACtB,OAAO;AACL,eAAK,GAAG,IAAI;AACZ,sBAAY,KAAK,GAAG;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,eAAe,CAAC,KAAK,aAAa,CAAC,KAAK,QAAQ;AACxD,aAAK,cAAc;AAAA,MACrB;AAEA,UAAI;AACF,cAAM,KAAK,MAAM,YAAoB,kBAAkB;AAAA,UACrD,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAED,cAAM,YAAY,YAAY,SAAS,IACnC;AAAA;AAAA;AAAA,EAAyD,YAAY,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,KACxG;AAEJ,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA;AAAA,IAA+B,WAAW,IAAI,iBAAiB,UAAU;AAAA;AAAA,eAAoC,EAAE,GAAG,SAAS;AAAA;AAAA;AAAA,UACnI,CAAC;AAAA,QACH;AAAA,MACF,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,gBAAgB,GAAG;AAC/D,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,EAA4C,GAAG;AAAA;AAAA;AAAA,YACvD,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAUF,aAAa;AAAA,QACX,iBAAiB,EAAE,OAAO,EAAE,SAAS,0DAA0D;AAAA,QAC/F,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EACxD,SAAS,oCAAoC;AAAA,QAChD,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,SAAS,EACnD,SAAS,wDAAwD;AAAA,MACtE;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,eAAe,KAAK;AAAA,IACzD;AAAA,IACA,OAAO,EAAE,iBAAiB,YAAY,QAAQ,MAAM;AAClD,YAAMA,QAAO,mBAAmB;AAAA,QAC9B,OAAO;AAAA,QACP,MAAM,8BAA8B,gBAAgB,UAAU,GAAG,EAAE,CAAC;AAAA,QACpE,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,SAAS,MAAM,SAclB,yBAAyB;AAAA,QAC1B;AAAA,QACA,YAAY,cAAc;AAAA,QAC1B,SAAS,WAAW;AAAA,MACtB,CAAC;AAED,UAAI,OAAO,eAAe,UAAU,OAAO,QAAQ,WAAW,GAAG;AAC/D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAGR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,eAAe,oBAAI,IAAmC;AAC5D,iBAAW,SAAS,OAAO,SAAS;AAClC,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,qBAAa,IAAI,GAAG,EAAG,KAAK,KAAK;AAAA,MACnC;AAEA,YAAM,QAAkB;AAAA,QACtB;AAAA,QACA,mBAAmB,OAAO,WAAW,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,WAAW,MAAM,CAAC,CAAC;AAAA,QACzF,gBAAgB,OAAO,QAAQ,MAAM,mBAAmB,aAAa,IAAI,cAAc,aAAa,SAAS,IAAI,KAAK,GAAG;AAAA,QACzH;AAAA,MACF;AAEA,iBAAW,CAAC,UAAU,OAAO,KAAK,cAAc;AAC9C,cAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ,MAAM,GAAG;AAChD,mBAAW,KAAK,SAAS;AACvB,gBAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,gBAAM,WAAW,EAAE,MAAM,IAAI,UAAU,EAAE,GAAG,GAAG,EAAE,eAAe,KAAK,EAAE,YAAY,KAAK,EAAE,OAAO;AACjG,gBAAM,UAAU,EAAE,qBAAqB;AAAA,IAAO,EAAE,kBAAkB,KAAK;AACvE,gBAAM,YAAY,EAAE,UAAU,SAAS,IAAI;AAAA,UAAa,EAAE,UAAU,KAAK,IAAI,CAAC,KAAK;AACnF,gBAAM,KAAK,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,EAAE;AAAA,QAChE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,YAAM,KAAK,oDAAoD;AAE/D,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,QAAQ,EAAE,OAAO,EAAE,SAAS,mFAAmF;AAAA,QAC/G,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,4EAAuE;AAAA,MACjH;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,QAAQ,MAAM;AAC7B,YAAM,UAAU,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,iBAAiB,CAAC;AAE5F,YAAM,cAAc,OAAO,YAAY;AACvC,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM;AAClC,cAAM,aAAc,EAAE,MAAM,UAAU;AACtC,eAAO,WAAW,YAAY,MAAM,eAAe,WAAW,YAAY,EAAE,SAAS,WAAW;AAAA,MAClG,CAAC;AAED,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,aAAa,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,OAAO,CAAC,CAAC;AAClF,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,yBAAyB,MAAM;AAAA;AAAA;AAAA,EAA4B,WAAW,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAC7G,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,SAAS,UACX,qBAAqB,MAAM;AAAA;AAAA,sBAA2B,OAAO;AAAA;AAAA;AAAA,IAC7D,qBAAqB,MAAM;AAAA;AAE/B,YAAM,YAAY,MACf,IAAI,CAAC,MAAM;AACV,cAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,cAAM,WAAW,EAAE,MAAM,WAAW,gBAAgB,EAAE,KAAK,QAAQ,KAAK;AACxE,cAAM,OAAO,EAAE,MAAM,eAAe;AACpC,cAAM,SAAS,EAAE,MAAM,aAAa;AAAA,iBAAoB,EAAE,KAAK,UAAU,KAAK;AAC9E,cAAM,WAAW,EAAE,MAAM,gBAA4B,CAAC,GAAG,SAAS,IAC9D;AAAA,aAAiB,EAAE,KAAK,aAA0B,KAAK,IAAI,CAAC,KAC5D;AACJ,eAAO,OAAO,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,QAAQ;AAAA;AAAA,EAAO,IAAI,GAAG,MAAM,GAAG,OAAO;AAAA,MACpF,CAAC,EACA,KAAK,aAAa;AAErB,YAAM,SAAS;AAAA,GAAM,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,KAAK,GAAG;AAEtE,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,GAAG,MAAM;AAAA,EAAK,SAAS;AAAA,EAAK,MAAM,GAAG,CAAC;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACF;;;AG93BA,SAAS,KAAAC,UAAS;AAGX,SAAS,mBAAmBC,SAAmB;AAEpD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,SAAgB,eAAe;AAEpD,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,2CAA2C,CAAC,EAAE;AAAA,MAClG;AAEA,YAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC7C,YAAM,YAAY,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAChE,YAAM,WAAW,CAAC,aAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAEnF,YAAM,QAAkB,CAAC,oBAAoB;AAE7C,iBAAW,SAAS,QAAQ;AAC1B,cAAM,KAAK;AAAA,KAAQ,MAAM,IAAI,EAAE;AAC/B,YAAI,MAAM,YAAa,OAAM,KAAK,IAAI,MAAM,WAAW,GAAG;AAC1D,mBAAW,SAAS,SAAS,MAAM,GAAG,GAAG;AACvC,gBAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAChD,gBAAM,KAAK,SAAS,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,KAAK,EAAE;AAAA,QAC1D;AAAA,MACF;AAEA,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,gBAAgB;AAC3B,mBAAW,SAAS,WAAW;AAC7B,gBAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAChD,gBAAM,KAAK,OAAO,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,cAAc,YAAO,MAAM,WAAW,MAAM,EAAE,EAAE;AAAA,QAC/G;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,UAAU,UAAU,QAAQ,CAAC,EAAE,SAAS,YAAY;AAAA,QACpE,MAAMA,GAAE,OAAO,EAAE,SAAS,+DAA+D;AAAA,QACzF,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,QACzE,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,QACjE,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,QACnE,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAClF,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,QAClG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,MACrE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM,MAAM,OAAO,aAAa,YAAY,SAAS,MAAM,MAAM;AAChF,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,MAAM;AACT,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wCAAwC,CAAC,EAAE;AAAA,QAC/F;AAEA,YAAI;AACJ,YAAI,YAAY;AACd,gBAAM,SAAS,MAAM,SAAgB,eAAe;AACpD,gBAAM,SAAS,OAAO,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU;AAC5D,cAAI,CAAC,QAAQ;AACX,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,UAAU,yDAAyD,CAAC,EAAE;AAAA,UAC5I;AACA,qBAAW,OAAO;AAAA,QACpB;AAEA,cAAM,YAAY,kBAAkB,EAAE,MAAM,MAAM,OAAO,aAAa,UAAU,SAAS,MAAM,CAAC;AAChG,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,SAAS,IAAI,MAAM,CAAC,EAAE;AAAA,MACtG;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,YAAY,kBAAkB,EAAE,MAAM,MAAM,OAAO,aAAa,SAAS,MAAM,CAAC;AACtF,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,uBAAuB,CAAC,EAAE;AAAA,MAC1G;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,YAAY,kBAAkB,EAAE,KAAK,CAAC;AAC5C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,2CAA2C,CAAC,EAAE;AAAA,MAC9H;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,SAAS,QAAQ,CAAC,EAAE,SAAS,2BAA2B;AAAA,QACxE,SAASA,GAAE,OAAO,EAAE,SAAS,sDAAsD;AAAA,QACnF,OAAOA,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,MACzD;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,SAAS,MAAM,MAAM;AACpC,UAAI,WAAW,SAAS;AACtB,cAAM,YAAY,iBAAiB,EAAE,SAAS,WAAW,MAAM,CAAC;AAChE,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,KAAK,mBAAmB,OAAO,MAAM,CAAC,EAAE;AAAA,MACvG;AAEA,YAAM,YAAY,kBAAkB,EAAE,SAAS,WAAW,MAAM,CAAC;AACjE,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,KAAK,qBAAqB,OAAO,MAAM,CAAC,EAAE;AAAA,IACzG;AAAA,EACF;AACF;;;AC9HA,SAAS,KAAAC,UAAS;AAKlB,IAAM,kBAAgD;AAAA,EACpD,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,yBAAyB;AAAA,EACzB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,0BAA0B;AAAA,EAC1B,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,sBAAsB;AAAA,EACtB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,oBAAoB;AACtB;AAEA,SAAS,WAAW,IAA0B;AAC5C,SAAO,gBAAgB,EAAE,KAAK;AAChC;AAEA,SAAS,eAAe,IAAoB;AAC1C,MAAI,KAAK,IAAQ,QAAO,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC;AAChD,QAAM,OAAO,KAAK,MAAM,KAAK,GAAM;AACnC,QAAM,OAAO,KAAK,MAAO,KAAK,MAAU,GAAI;AAC5C,SAAO,GAAG,IAAI,KAAK,IAAI;AACzB;AAEA,SAAS,oBAAoBC,MAAoC;AAC/D,MAAIA,KAAI,WAAW,EAAG,QAAO;AAE7B,QAAM,aAAa,oBAAI,IAAuC;AAC9D,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,aAAW,SAASA,MAAK;AACvB,UAAM,MAAM,WAAW,MAAM,EAAE;AAC/B,QAAI,CAAC,WAAW,IAAI,GAAG,EAAG,YAAW,IAAI,KAAK,oBAAI,IAAI,CAAC;AACvD,UAAM,WAAW,WAAW,IAAI,GAAG;AACnC,aAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;AAExD,QAAI,MAAM,WAAW,QAAS;AAC9B,QAAI,MAAM,OAAO,oBAAoB,MAAM,WAAW,KAAM;AAC5D,QAAI,MAAM,OAAO,oBAAoB,MAAM,WAAW,KAAM;AAAA,EAC9D;AAEA,QAAM,UAAU,IAAI,KAAKA,KAAI,CAAC,EAAE,EAAE,EAAE,QAAQ;AAC5C,QAAM,SAAS,IAAI,KAAKA,KAAIA,KAAI,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ;AACxD,QAAM,WAAW,eAAe,SAAS,OAAO;AAEhD,QAAM,QAAkB,CAAC,sBAAsB,QAAQ;AAAA,CAAK;AAE5D,QAAM,iBAA2C;AAAA,IAC/C,CAAC,QAAQ,OAAO;AAAA,IAChB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,SAAS,QAAQ;AAAA,IAClB,CAAC,SAAS,QAAQ;AAAA,IAClB,CAAC,QAAQ,MAAM;AAAA,EACjB;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,UAAM,WAAW,WAAW,IAAI,GAAG;AACnC,QAAI,CAAC,YAAY,SAAS,SAAS,EAAG;AACtC,UAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC9D,UAAM,SAAS,CAAC,GAAG,SAAS,QAAQ,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,QAAQ,OAAO,EAAE,CAAC,KAAK,KAAK,EAAE,EACzD,KAAK,IAAI;AACZ,UAAM,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,UAAU,IAAI,KAAK,GAAG,KAAK,MAAM,GAAG;AAAA,EACjF;AAEA,QAAM,KAAK,iBAAiB,UAAU,EAAE;AAExC,MAAI,eAAe,KAAK,eAAe,GAAG;AACxC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,2BAA2B;AACtC,QAAI,eAAe,EAAG,OAAM,KAAK,KAAK,YAAY,QAAQ,iBAAiB,IAAI,MAAM,KAAK,UAAU;AACpG,QAAI,eAAe,EAAG,OAAM,KAAK,KAAK,YAAY,QAAQ,iBAAiB,IAAI,MAAM,KAAK,UAAU;AAAA,EACtG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,oBAAoBC,SAAmB;AAErD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,QAAQ,KAAK,IAAI;AACvB,YAAM,SAAmB,CAAC;AAE1B,UAAIC;AACJ,UAAI;AACF,QAAAA,eAAc,MAAM,eAAe;AAAA,MACrC,SAAS,GAAQ;AACf,eAAO,KAAK,gCAAgC,EAAE,OAAO,EAAE;AAAA,MACzD;AAEA,UAAI,cAAqB,CAAC;AAC1B,UAAI;AACF,sBAAc,MAAM,SAAgB,oBAAoB;AAAA,MAC1D,SAAS,GAAQ;AACf,eAAO,KAAK,4BAA4B,EAAE,OAAO,EAAE;AAAA,MACrD;AAEA,UAAI,eAAe;AACnB,UAAI,YAAY,SAAS,GAAG;AAC1B,YAAI;AACF,gBAAM,UAAU,MAAM,SAAgB,kBAAkB,CAAC,CAAC;AAC1D,yBAAe,QAAQ;AAAA,QACzB,SAAS,GAAQ;AACf,iBAAO,KAAK,uBAAuB,EAAE,OAAO,EAAE;AAAA,QAChD;AAAA,MACF;AAEA,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,UAAU,OAAO,WAAW;AAElC,YAAM,QAAQ;AAAA,QACZ,KAAK,UAAU,YAAY,UAAU;AAAA,QACrC;AAAA,QACA,kBAAkBA,gBAAe,YAAY;AAAA,QAC7C,oBAAoB,YAAY,MAAM;AAAA,QACtC,gBAAgB,YAAY;AAAA,QAC5B,gBAAgB,UAAU;AAAA,MAC5B;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,IAAI,WAAW;AAC1B,mBAAW,OAAO,QAAQ;AACxB,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,OAAOE,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,wCAAwC;AAAA,MAChG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAMH,OAAM,YAAY;AACxB,YAAM,SAASA,KAAI,MAAM,CAAC,KAAK;AAE/B,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,sCAAsC,CAAC,EAAE;AAAA,MAC7F;AAEA,YAAM,UAAU,oBAAoBA,IAAG;AAEvC,YAAM,WAAW,CAAC,qBAAqB,OAAO,MAAM,OAAOA,KAAI,MAAM;AAAA,CAAW;AAChF,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,MAAM,WAAW,OAAO,WAAW;AAChD,cAAM,UAAU,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK;AACzD,iBAAS,KAAK,GAAG,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM,GAAG,OAAO,EAAE;AAAA,MACzF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA,EAAc,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACF;;;AC/LA,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AAExB,SAAS,KAAAI,UAAS;AA2BlB,SAAS,qBAAoC;AAC3C,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,EAC7B,EAAE,OAAO,OAAO;AAEhB,aAAW,OAAO,YAAY;AAC5B,UAAM,WAAW,QAAQ,GAAG;AAC5B,QAAI,WAAW,QAAQ,UAAU,kBAAkB,CAAC,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAIA,SAAS,kBAAkB,YAA8C;AACvE,QAAM,UAAU,aAAa,YAAY,OAAO;AAChD,QAAM,SAAS,oBAAI,IAAyB;AAC5C,MAAI,eAA8B;AAElC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,aAAa,KAAK,MAAM,2BAA2B;AACzD,QAAI,YAAY;AACd,qBAAe,WAAW,CAAC;AAC3B,aAAO,IAAI,cAAc,oBAAI,IAAI,CAAC;AAClC;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,GAAG;AAChE,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,YAAM,aAAa,KAAK,MAAM,mBAAmB;AACjD,UAAI,WAAY,QAAO,IAAI,YAAY,EAAG,IAAI,WAAW,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,cAAc,EAAE,EACxB,KAAK;AACV;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,MAAM,SAAS,KAAK,EAAG,QAAO,MAAM,MAAM,UAAU;AACxD,SAAO,CAAC,KAAK;AACf;AAEA,IAAM,cAAc;AAEpB,SAAS,YAAY,SAA8B;AACjD,MAAI,QAAQ,SAAS,GAAG,KAAK,YAAY,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG;AAChF,WAAO;AAAA,EACT;AACA,MAAI,aAAa,KAAK,OAAO,EAAG,QAAO;AACvC,MAAI,iBAAiB,KAAK,OAAO,EAAG,QAAO;AAC3C,SAAO;AACT;AAIA,SAAS,aAAa,KAAa,MAAuD;AACxF,QAAM,WAAW,IAAI,MAAM,KAAK,EAAE,CAAC;AACnC,QAAM,WAAW,QAAQ,MAAM,QAAQ;AACvC,MAAI,WAAW,QAAQ,EAAG,QAAO,EAAE,QAAQ,YAAY,QAAQ,SAAS;AACxE,SAAO,EAAE,QAAQ,WAAW,QAAQ,cAAc,QAAQ,GAAG;AAC/D;AAEA,SAAS,eACP,KACA,QACyC;AACzC,QAAM,iBAAiB,IAAI,MAAM,kBAAkB;AACnD,MAAI,gBAAgB;AAClB,UAAM,QAAQ,eAAe,CAAC;AAC9B,QAAI,OAAO,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,YAAY,QAAQ,UAAU,KAAK,WAAW;AACtF,WAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,wBAAwB;AAAA,EAC7E;AAEA,QAAM,SAAS,IAAI,QAAQ,GAAG;AAC9B,MAAI,SAAS,GAAG;AACd,UAAM,QAAQ,IAAI,MAAM,GAAG,MAAM;AACjC,UAAM,QAAQ,IAAI,MAAM,SAAS,CAAC;AAClC,QAAI,CAAC,OAAO,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,wBAAwB;AACnG,QAAI,CAAC,OAAO,IAAI,KAAK,EAAG,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,yBAAyB,KAAK,IAAI;AACzH,WAAO,EAAE,QAAQ,YAAY,QAAQ,GAAG,KAAK,IAAI,KAAK,UAAU;AAAA,EAClE;AAEA,SAAO,EAAE,QAAQ,gBAAgB,QAAQ,mCAAmC;AAC9E;AAIA,SAAS,kBACP,YACA,YACA,UACA,MACA,OACA,MACA,kBACA,aACQ;AACR,QAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AACjE,QAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAC/D,QAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE;AAEzE,QAAM,YAAY,KAAK,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAC9C,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE;AAEhD,QAAM,cAAc,SAAS,SAAS,KAAK;AAC3C,QAAM,cAAc,WAAW;AAC/B,QAAM,aAAa,cAAc,IAAI,KAAK,MAAO,cAAc,cAAe,GAAG,IAAI;AAErF,QAAM,QAAkB;AAAA,IACtB,mBAAmB,UAAU,KAAK,UAAU;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,SAAS,MAAM;AAAA,MACpB,KAAK,QAAQ,cAAc,KAAK,MAAO,WAAW,SAAS,SAAU,GAAG,CAAC;AAAA,MACzE,KAAK,OAAO;AAAA,MACZ,KAAK,YAAY;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,UAAM,KAAK,sBAAsB;AACjC,eAAW,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,GAAG;AAC/D,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,QAAQ,GAAG,KAAK,aAAQ,GAAG,MAAM,EAAE;AAAA,IACpF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,eAAe,GAAG;AACpB,UAAM,KAAK,+BAA+B;AAC1C,eAAW,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,GAAG;AACpE,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,QAAQ,GAAG,KAAK,IAAI;AAAA,IACrE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,KAAK,MAAM;AAAA,MAChB,KAAK,SAAS,WAAW,KAAK,SAAS,IAAI,KAAK,MAAO,YAAY,KAAK,SAAU,GAAG,IAAI,CAAC;AAAA,MAC1F,KAAK,UAAU;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,GAAG;AAClB,UAAM,KAAK,uBAAuB;AAClC,eAAW,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG;AAC7C,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,qBAAqB,GAAG,QAAQ,2BAAsB;AAAA,IACvG;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,mBAAmB,UAAU,MAAM,WAAW,OAAO,WAAW,iBAAiB;AAE5F,MAAI,SAAS,SAAS,MAAM,SAAS,GAAG;AACtC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,qEAAgE,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,KAAK;AAAA,IACtH;AACA,eAAW,OAAO,MAAO,OAAM,KAAK,KAAK,GAAG,EAAE;AAAA,EAChD,WAAW,SAAS,YAAY,UAAU,GAAG;AAC3C,UAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,kBAAkB,SAAS,EAAE;AAChG,QAAI,UAAU,GAAG;AACf,YAAM,KAAK,IAAI,IAAI,OAAO,oFAAoF;AAAA,IAChH;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,OAAO,YAAY,gBAAgB,uDAAuD,WAAW,GAAG;AAEvH,SAAO,MAAM,KAAK,IAAI;AACxB;AAIO,SAAS,oBAAoBC,SAAmB;AACrD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,QAAQ,UAAU,EACtC,SAAS,+CAA+C;AAAA,QAC3D,MAAMA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,QAAQ,QAAQ,EAC7C,SAAS,sFAAsF;AAAA,MACpG;AAAA,MACA,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,YAAY,KAAK,MAAM;AAC9B,YAAM,cAAc,mBAAmB;AACvC,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UAGR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,SAAS,kBAAkB,QAAQ,aAAa,kBAAkB,CAAC;AAEzE,YAAMD,QAAO,mBAAmB;AAAA,QAC9B,OAAO;AAAA,QACP,MAAM,cAAc,UAAU,aAAa,OAAO,IAAI,qBAAqB,WAAW;AAAA,QACtF,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,gBAAgB,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,WAAW,CAAC;AAE5F,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,yBAAyB,UAAU,yBAAyB,CAAC;AAAA,QACxG;AAAA,MACF;AAGA,UAAI;AACJ,UAAI;AACF,cAAM,aAAa,MAAM,SAAgB,kBAAkB,CAAC,CAAC;AAC7D,sBAAc,IAAI,IAAI,WAAW,IAAI,CAAC,MAAW,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,MAC7E,QAAQ;AACN,sBAAc,IAAI,IAAI,cAAc,IAAI,CAAC,MAAW,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,MAChF;AAEA,YAAM,gBAAgC,CAAC;AACvC,YAAM,YAAwB,CAAC;AAE/B,iBAAW,SAAS,eAAe;AACjC,cAAM,MAAM,MAAM,WAAW,MAAM;AACnC,cAAM,QAAQ,MAAM;AAGpB,cAAM,eAAsB,MAAM,MAAM,eAAe,CAAC;AACxD,mBAAW,MAAM,cAAc;AAC7B,gBAAM,WAAmB,GAAG,SAAS;AACrC,qBAAW,UAAU,eAAe,QAAQ,GAAG;AAC7C,kBAAM,UAAU,cAAc,MAAM;AACpC,gBAAI,CAAC,QAAS;AAEd,kBAAM,OAAO,YAAY,OAAO;AAChC,gBAAI;AACJ,gBAAI;AAEJ,gBAAI,SAAS,QAAQ;AACnB,eAAC,EAAE,QAAQ,OAAO,IAAI,aAAa,SAAS,WAAW;AAAA,YACzD,WAAW,SAAS,UAAU;AAC5B,eAAC,EAAE,QAAQ,OAAO,IAAI,eAAe,SAAS,MAAM;AAAA,YACtD,OAAO;AACL,uBAAS;AACT,uBAAS;AAAA,YACX;AAEA,0BAAc,KAAK;AAAA,cACjB,SAAS;AAAA,cAAK,WAAW;AAAA,cAAO,OAAO,OAAO,KAAK;AAAA,cACnD;AAAA,cAAM;AAAA,cAAQ;AAAA,cAAQ,eAAe,GAAG,UAAU;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,iBAAiB;AACvB,cAAM,eAAyB,MAAM,MAAM,gBAAgB,CAAC;AAC5D,mBAAW,UAAU,cAAc;AACjC,cAAI,UAAU,UAAU,eAAgB;AACxC,oBAAU,KAAK;AAAA,YACb,SAAS;AAAA,YAAK,WAAW;AAAA,YAAO,UAAU;AAAA,YAC1C,OAAO,YAAY,IAAI,MAAM;AAAA,UAC/B,CAAC;AAAA,QACH;AAAA,MACF;AAGA,YAAM,QAAkB,CAAC;AACzB,UAAI,SAAS,OAAO;AAClB,cAAM,iBAAiB,oBAAI,IAAyB;AACpD,mBAAW,MAAM,eAAe;AAC9B,cAAI,GAAG,WAAW,aAAa,GAAG,kBAAkB,WAAW;AAC7D,gBAAI,CAAC,eAAe,IAAI,GAAG,OAAO,EAAG,gBAAe,IAAI,GAAG,SAAS,oBAAI,IAAI,CAAC;AAC7E,2BAAe,IAAI,GAAG,OAAO,EAAG,IAAI,GAAG,KAAK;AAAA,UAC9C;AAAA,QACF;AAEA,mBAAW,CAAC,KAAK,aAAa,KAAK,gBAAgB;AACjD,gBAAM,QAAQ,cAAc,KAAK,CAAC,OAAY,EAAE,WAAW,EAAE,UAAU,GAAG;AAC1E,cAAI,CAAC,OAAO,QAAS;AAErB,gBAAM,WAAW,MAAM,MAAM,eAAe,CAAC,GAAG;AAAA,YAAI,CAAC,OACnD,GAAG,WAAW,aAAa,cAAc,IAAI,GAAG,KAAK,IACjD,EAAE,GAAG,IAAI,QAAQ,UAAU,IAC3B;AAAA,UACN;AAEA,gBAAM,YAAY,kBAAkB;AAAA,YAClC,SAAS,MAAM;AAAA,YACf,MAAM,EAAE,aAAa,QAAQ;AAAA,UAC/B,CAAC;AACD,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,QAAY,cAAc;AAAA,QAC1B;AAAA,QAAe;AAAA,QAAW;AAAA,QAAO;AAAA,QACjC,OAAO;AAAA,QAAM;AAAA,MACf;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,CAAC,EAAE;AAAA,IAC9D;AAAA,EACF;AACF;;;ACxWA,SAAS,KAAAE,UAAS;AAsDlB,IAAM,gBAA0C;AAAA,EAC9C,gBAAgB,CAAC,UAAU,UAAU,YAAY,aAAa,OAAO,WAAW,kBAAkB,WAAW,aAAa;AAAA,EAC1H,kBAAkB,CAAC,aAAa,YAAY,SAAS,cAAc,eAAe,SAAS,OAAO;AAAA,EAClG,wBAAwB,CAAC,OAAO,MAAM,UAAU,SAAS,QAAQ,OAAO,UAAU,SAAS;AAAA,EAC3F,wBAAwB,CAAC,MAAM,aAAa,OAAO,YAAY,YAAY,UAAU;AAAA,EACrF,gCAAgC,CAAC,cAAc,YAAY,QAAQ,UAAU,cAAc,UAAU;AAAA,EACrG,wBAAwB,CAAC,aAAa,WAAW,YAAY,SAAS,UAAU,QAAQ;AAAA,EACxF,YAAY,CAAC,YAAY,QAAQ,WAAW,cAAc,UAAU,OAAO;AAC7E;AAEA,SAAS,UAAU,MAAsB;AACvC,QAAM,QAAQ,KAAK,YAAY;AAC/B,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,aAAW,CAAC,MAAM,QAAQ,KAAK,OAAO,QAAQ,aAAa,GAAG;AAC5D,UAAM,QAAQ,SAAS,OAAO,CAAC,OAAO,MAAM,SAAS,EAAE,CAAC,EAAE;AAC1D,QAAI,QAAQ,WAAW;AACrB,kBAAY;AACZ,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,UAAU,IAAI,KAAK;AAC5B;AAEA,IAAM,gBAA8C;AAAA,EAClD,WAAW;AAAA,IACT,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,KAAK,SAAS,MAAM,CAAC,CAAC,eAAe,aAAa,YAAY,MAAM,EAAE,SAAS,IAAI,KAAK,YAAY,CAAC;AAAA,IACzH,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,gBAAgB;AAAA,IACd,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,YAAY,SAAS;AAAA,IACzC,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,cAAc;AAAA,IACZ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ,IAAI,aAAa,UAAU;AAAA,IAC3C,YAAY,MAAM;AAAA,EACpB;AAAA,EACA,kBAAkB;AAAA,IAChB,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO,CAAC,QAAQ;AACd,YAAM,QAAQ,IAAI,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC;AACrE,aAAO,MAAM,QAAQ;AAAA,IACvB;AAAA,IACA,YAAY,MAAM;AAAA,EACpB;AACF;AAEA,IAAM,WAA2C,oBAAI,IAAI;AAAA,EACvD,CAAC,YAAY;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,SAAS;AAAA,MACnC,EAAE,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC9B,EAAE,KAAK,UAAU,OAAO,QAAQ;AAAA,MAChC,EAAE,KAAK,YAAY,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,0BAA0B,CAAC,uBAAuB,cAAc,cAAc,YAAY;AAAA,IAC1F,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW;AAC3C,YAAM,OAAO,UAAU,IAAI;AAC3B,UAAI,KAAM,QAAO,SAAS;AAC1B,UAAI,KAAK,YAAY,EAAE,SAAS,UAAU,KAAK,KAAK,YAAY,EAAE,SAAS,SAAS,GAAG;AACrF,eAAO,WAAW;AAAA,MACpB,WAAW,KAAK,YAAY,EAAE,SAAS,YAAY,KAAK,KAAK,YAAY,EAAE,SAAS,SAAS,KAAK,KAAK,YAAY,EAAE,SAAS,UAAU,GAAG;AACzI,eAAO,WAAW;AAAA,MACpB,OAAO;AACL,eAAO,WAAW;AAAA,MACpB;AACA,UAAI,KAAM,QAAO,eAAe;AAChC,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa;AAAA,QAC7D,YAAY,CAAC,QAAQ;AACnB,gBAAM,OAAO,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,GAAG,YAAY;AAC1D,gBAAM,WAAW,KAAK,SAAS,UAAU,IAAI,aAAa,KAAK,SAAS,YAAY,IAAI,SAAS;AACjG,iBAAO,gCAA2B,QAAQ;AAAA,QAC5C;AAAA,MACF;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,gBAAgB,IAAI,KAAK,iBAAiB;AAAA,QACrE,YAAY,CAAC,QAAQ;AACnB,gBAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,iBAAO,OACH,qCAAgC,IAAI,+BACpC;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,kBAAkB;AAAA,IACjB,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,SAAS;AAAA,MACnC,EAAE,KAAK,UAAU,OAAO,QAAQ;AAAA,IAClC;AAAA,IACA,0BAA0B,CAAC,WAAW,cAAc,kBAAkB,YAAY;AAAA,IAClF,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,SAAS,YAAY,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AAC3D,UAAI,OAAQ,QAAO,SAAS;AAC5B,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,OAAO,IAAI,KAAK,cAAc,YAAY,IAAI,KAAK,UAAU,SAAS;AAAA,QACtF,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,WAAW;AAAA,QACzD,YAAY,CAAC,QAAQ;AACnB,gBAAM,SAAS,YAAY,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AAC3D,iBAAO,SACH,+BAA0B,MAAM,+BAChC;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,YAAY,OAAO,QAAQ;AAAA,IACpC;AAAA,IACA,0BAA0B,CAAC,oBAAoB,iBAAiB,cAAc,YAAY;AAAA,IAC1F,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,UAAI,MAAM;AACR,cAAM,cAAsC;AAAA,UAC1C,gBAAgB;AAAA,UAChB,kBAAkB;AAAA,UAClB,wBAAwB;AAAA,UACxB,wBAAwB;AAAA,UACxB,gCAAgC;AAAA,UAChC,wBAAwB;AAAA,UACxB,YAAY;AAAA,QACd;AACA,eAAO,WAAW,YAAY,IAAI,KAAK;AAAA,MACzC;AACA,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ;AACd,gBAAM,YAAY,IAAI,KAAK;AAC3B,iBAAO,OAAO,cAAc,YAAY,UAAU,SAAS;AAAA,QAC7D;AAAA,QACA,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,aAAa;AAAA,QAC7D,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,aAAa;AAAA,IACZ,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU;AAAA,MACR,EAAE,KAAK,QAAQ,OAAO,QAAQ;AAAA,MAC9B,EAAE,KAAK,aAAa,OAAO,QAAQ;AAAA,IACrC;AAAA,IACA,0BAA0B,CAAC,WAAW,cAAc,YAAY,YAAY;AAAA,IAC5E,YAAY,CAAC,QAAwB;AACnC,YAAM,SAAkC,CAAC;AACzC,YAAM,OAAO,UAAU,GAAG,IAAI,IAAI,IAAI,IAAI,WAAW,EAAE;AACvD,UAAI,KAAM,QAAO,YAAY;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ;AACd,gBAAM,YAAY,IAAI,KAAK;AAC3B,iBAAO,OAAO,cAAc,YAAY,UAAU,SAAS;AAAA,QAC7D;AAAA,QACA,YAAY,MAAM;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,SAAS;AAAA,QACrD,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AAAA,EAED,CAAC,YAAY;AAAA,IACX,UAAU;AAAA,IACV,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,0BAA0B,CAAC,cAAc,cAAc,uBAAuB,YAAY;AAAA,IAC1F,eAAe;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,MACd,cAAc;AAAA,MACd;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAwB,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,UAAU;AAAA,QACvE,YAAY,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,OAAO,CAAC,QAAwB,CAAC,CAAC,IAAI,KAAK,aAAa,OAAO,IAAI,KAAK,SAAS,EAAE,SAAS;AAAA,QAC5F,YAAY,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAA6B;AAC/B,CAAC;AAED,IAAM,mBAAsC;AAAA,EAC1C,UAAU;AAAA,EACV,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,UAAU,CAAC;AAAA,EACX,0BAA0B,CAAC,cAAc,YAAY;AAAA,EACrD,eAAe;AAAA,IACb,cAAc;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACF;AAIA,SAAS,gBAAgB,QAAwB;AAC/C,MAAI,CAAC,OAAQ,QAAO;AACpB,QAAM,QAAQ;AACd,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,cAAU,MAAM,KAAK,MAAM,KAAK,OAAO,IAAI,MAAM,MAAM,CAAC;AAAA,EAC1D;AACA,SAAO,GAAG,MAAM,IAAI,MAAM;AAC5B;AAIA,SAAS,mBAAmB,MAAc,aAA6B;AACrE,QAAM,OAAO,GAAG,IAAI,IAAI,WAAW;AACnC,SAAO,KACJ,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,CAAC,EACV,KAAK,GAAG;AACb;AAEA,SAAS,sBACP,WACA,YACA,mBACA,kBACA,qBACQ;AACR,QAAM,OAAO,GAAG,UAAU,IAAI,iBAAiB,GAAG,YAAY;AAC9D,QAAM,gBAAgB,UAAU,KAAK,YAAY;AACjD,MAAI,QAAQ;AAEZ,MAAI,KAAK,SAAS,aAAa,KAAK,cAAc,SAAS,GAAG;AAC5D,aAAS;AAAA,EACX;AAEA,QAAM,iBAAiB,cAAc,MAAM,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC5E,QAAM,gBAAgB,eAAe,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AACnE,WAAU,cAAc,SAAS,KAAK,IAAI,eAAe,QAAQ,CAAC,IAAK;AAEvE,QAAM,kBAAkB,oBAAI,IAAI,CAAC,YAAY,UAAU,CAAC;AACxD,MAAI,gBAAgB,IAAI,mBAAmB,GAAG;AAC5C,aAAS;AAAA,EACX;AAEA,MAAI,wBAAwB,kBAAkB;AAC5C,aAAS;AAAA,EACX;AAEA,SAAO,KAAK,IAAI,OAAO,GAAG;AAC5B;AAEA,SAAS,kBACP,kBACA,kBACA,SACQ;AACR,QAAM,UAAkD;AAAA,IACtD,UAAU;AAAA,MACR,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,IACb;AAAA,IACA,kBAAkB;AAAA,MAChB,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,IACZ;AAAA,IACA,WAAW;AAAA,MACT,UAAU;AAAA,MACV,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO,QAAQ,gBAAgB,IAAI,gBAAgB,KAC9C,QAAQ,yBAAyB,CAAC,KAClC;AACP;AAUA,SAAS,aAAa,KAAqB,SAA2C;AACpF,QAAM,SAAS,QAAQ,cAAc,IAAI,CAAC,OAAO;AAC/C,UAAMC,UAAS,GAAG,MAAM,GAAG;AAC3B,WAAO;AAAA,MACL,IAAI,GAAG;AAAA,MACP,OAAO,GAAG;AAAA,MACV,QAAAA;AAAA,MACA,YAAYA,UAAS,SAAY,GAAG,aAAa,GAAG;AAAA,IACtD;AAAA,EACF,CAAC;AAED,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;AAC9C,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,QAAQ,IAAI,KAAK,MAAO,SAAS,QAAS,EAAE,IAAI;AAE9D,SAAO,EAAE,OAAO,UAAU,IAAI,OAAO;AACvC;AAEO,SAAS,oBAAoB,QAA+B;AACjE,QAAM,QAAkB,CAAC,eAAe,OAAO,KAAK,IAAI,OAAO,QAAQ,EAAE;AACzE,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OAAO,MAAM,SAAS,QAAQ;AACpC,UAAM,aAAa,MAAM,SAAS,KAAK,OAAO,MAAM,cAAc,EAAE;AACpE,UAAM,KAAK,GAAG,IAAI,IAAI,MAAM,KAAK,GAAG,UAAU,EAAE;AAAA,EAClD;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAIA,eAAsB,kBAAkB,SAAoE;AAC1G,QAAM,QAAQ,MAAM,SAAc,eAAe,EAAE,QAAQ,CAAC;AAC5D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,MACL,MAAM,WAAW,OAAO;AAAA,MACxB,SAAS,EAAE,OAAO,GAAG,UAAU,IAAI,QAAQ,CAAC,EAAE;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,SAAgB,oBAAoB;AAC9D,QAAM,UAAU,oBAAI,IAAoB;AACxC,aAAW,KAAK,YAAa,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AACtD,QAAM,iBAAiB,QAAQ,IAAI,MAAM,YAAY,KAAK;AAE1D,QAAM,UAAU,SAAS,IAAI,cAAc,KAAK;AAEhD,QAAM,YAAY,MAAM,SAAgB,yBAAyB,EAAE,QAAQ,CAAC;AAC5E,QAAM,eAA6B,CAAC;AACpC,aAAW,KAAK,WAAW;AACzB,UAAM,UAAU,EAAE,WAAW,MAAM,MAAM,EAAE,OAAO,EAAE;AACpD,iBAAa,KAAK;AAAA,MAChB,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,kBAAkB;AAAA,MAClB,cAAc,EAAE;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,QAAQ;AAC1B,QAAM,cAAc,OAAO,MAAM,OAAO,SAAS,MAAM,WAAW,MAAM,KAAK,SAAS,IAAI;AAE1F,QAAM,MAAsB;AAAA,IAC1B,YAAY;AAAA,IACZ,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,MAAM,MAAM,QAAQ,CAAC;AAAA,IACrB,SAAS,MAAM,WAAW;AAAA,IAC1B;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,kBAAkB,CAAC;AAAA,EACrB;AAEA,QAAM,UAAU,aAAa,KAAK,OAAO;AAEzC,QAAM,QAAkB;AAAA,IACtB,oBAAoB,MAAM,WAAW,MAAM,IAAI;AAAA,IAC/C,KAAK,MAAM,IAAI,WAAW,cAAc,OAAO,MAAM,MAAM;AAAA,IAC3D;AAAA,IACA,oBAAoB,OAAO;AAAA,EAC7B;AAEA,MAAI,QAAQ,QAAQ,IAAI;AACtB,UAAM,eAAe,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,UAAU;AAC3E,QAAI,aAAa,SAAS,GAAG;AAC3B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,sGAAsG;AAAA,IACnH;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,GAAG,QAAQ;AAC3C;AAIA,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EAAY;AAAA,EAAkB;AAAA,EAAc;AAAA,EAAa;AAAA,EAAY;AACvE,CAAC;AAED,IAAM,iCAAiC;AACvC,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAEjB,SAAS,0BAA0BC,SAAmB;AAE3D,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAMF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,SAAS,6EAA6E;AAAA,QAC7G,MAAMA,GAAE,OAAO,EAAE,SAAS,gGAA2F;AAAA,QACrH,aAAaA,GAAE,OAAO,EAAE,SAAS,yEAAoE;AAAA,QACrG,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yFAAyF;AAAA,QACjI,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yEAAyE;AAAA,MACnH;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,YAAY,MAAM,aAAa,SAAS,QAAQ,MAAM;AAC7D,YAAM,UAAU,SAAS,IAAI,UAAU,KAAK;AAG5C,YAAM,MAAM,MAAM,SAAc,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACxE,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gBAAgB,UAAU,uEAAuE,CAAC;AAAA,QAC7I;AAAA,MACF;AAGA,YAAM,OAAgC,CAAC;AACvC,YAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAEnD,iBAAW,SAAS,IAAI,UAAU,CAAC,GAAG;AACpC,cAAM,MAAM,MAAM;AAClB,YAAI,QAAQ,QAAQ,kBAAkB;AACpC,eAAK,GAAG,IAAI;AAAA,QACd,WAAW,MAAM,SAAS,WAAW,MAAM,SAAS,gBAAgB;AAClE,eAAK,GAAG,IAAI,CAAC;AAAA,QACf,OAAO;AACL,eAAK,GAAG,IAAI;AAAA,QACd;AAAA,MACF;AAEA,iBAAW,OAAO,QAAQ,UAAU;AAClC,YAAI,IAAI,UAAU,SAAS;AACzB,eAAK,IAAI,GAAG,IAAI;AAAA,QAClB,WAAW,IAAI,UAAU,SAAS;AAChC,eAAK,IAAI,GAAG,IAAI,IAAI;AAAA,QACtB;AAAA,MACF;AAEA,UAAI,QAAQ,YAAY;AACtB,cAAM,WAAW,QAAQ,WAAW;AAAA,UAClC;AAAA,UAAY;AAAA,UAAM;AAAA,UAAa;AAAA,UAAS;AAAA,UAAM,SAAS;AAAA,UACvD,cAAc,CAAC;AAAA,UAAG,gBAAgB,CAAC;AAAA,UAAG,kBAAkB,IAAI,UAAU,CAAC;AAAA,QACzE,CAAC;AACD,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,cAAI,QAAQ,UAAa,QAAQ,IAAI;AACnC,iBAAK,GAAG,IAAI;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,KAAK,QAAQ,gBAAgB,KAAK,CAAC,KAAK,eAAe,CAAC,KAAK,WAAW;AAC3E,aAAK,QAAQ,oBAAoB,aAAa,IAAI;AAAA,MACpD;AAGA,YAAM,SAAS,qBAAqB,IAAI,UAAU,IAAI,UAAU;AAGhE,YAAM,eAAe,WAAW,gBAAgB,QAAQ,QAAQ;AAGhE,UAAI;AACJ,UAAI;AACF,qBAAa,MAAM,YAAoB,kBAAkB;AAAA,UACvD,gBAAgB;AAAA,UAChB,SAAS,gBAAgB;AAAA,UACzB;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,QACb,CAAC;AAAA,MACH,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,gBAAgB,GAAG;AAC/D,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,EAA4C,GAAG;AAAA;AAAA;AAAA,YACvD,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAGA,YAAM,eAA6B,CAAC;AACpC,YAAM,iBAAmC,CAAC;AAE1C,YAAM,cAAc,mBAAmB,MAAM,WAAW;AACxD,UAAI,aAAa;AACf,cAAM,CAAC,eAAe,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,UACxD,SAAgB,oBAAoB,EAAE,OAAO,YAAY,CAAC;AAAA,UAC1D,SAAgB,oBAAoB;AAAA,QACtC,CAAC;AAED,cAAM,UAAU,oBAAI,IAAoB;AACxC,mBAAW,KAAK,eAAgB,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AAEzD,cAAM,cAAc,iBAAiB,CAAC,GACnC,OAAO,CAAC,MAAM,EAAE,YAAY,gBAAgB,EAAE,QAAQ,UAAU,EAChE,IAAI,CAAC,OAAO;AAAA,UACX,GAAG;AAAA,UACH,UAAU,QAAQ,IAAI,EAAE,YAAY,KAAK;AAAA,UACzC,YAAY,sBAAsB,GAAG,MAAM,aAAa,YAAY,QAAQ,IAAI,EAAE,YAAY,KAAK,SAAS;AAAA,QAC9G,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,aAAa,EAAE,UAAU;AAG7C,mBAAW,KAAK,YAAY;AAC1B,cAAI,aAAa,UAAU,eAAgB;AAC3C,cAAI,EAAE,aAAa,+BAAgC;AACnD,cAAI,CAAC,EAAE,WAAW,CAAC,aAAc;AAEjC,gBAAM,eAAe,kBAAkB,YAAY,EAAE,UAAU,OAAO;AACtE,cAAI;AACF,kBAAM,YAAY,0BAA0B;AAAA,cAC1C,aAAa;AAAA,cACb,WAAW,EAAE;AAAA,cACb,MAAM;AAAA,YACR,CAAC;AACD,yBAAa,KAAK;AAAA,cAChB,eAAe,EAAE;AAAA,cACjB,YAAY,EAAE;AAAA,cACd,kBAAkB,EAAE;AAAA,cACpB;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AAGA,cAAM,YAAY,IAAI,IAAI,aAAa,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC;AAClE,mBAAW,KAAK,YAAY;AAC1B,cAAI,eAAe,UAAU,gBAAiB;AAC9C,cAAI,UAAU,IAAI,EAAE,OAAO,EAAG;AAC9B,cAAI,EAAE,aAAa,GAAI;AAEvB,gBAAM,UAAUC,gBAAe,EAAE,MAAM,EAAE;AACzC,gBAAM,SAAS,EAAE,cAAc,iCAC3B,oCACA,IAAI,EAAE,KAAK,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,CAAC,MAAc,GAAG,IAAI,IAAI,WAAW,GAAG,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,MAAM,CAAC;AAE5J,yBAAe,KAAK;AAAA,YAClB,SAAS,EAAE;AAAA,YACX,MAAM,EAAE;AAAA,YACR,YAAY,EAAE;AAAA,YACd;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAGA,YAAM,aAA6B;AAAA,QACjC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,kBAAkB,IAAI,UAAU,CAAC;AAAA,MACnC;AACA,YAAM,UAAU,aAAa,YAAY,OAAO;AAGhD,YAAM,QAAkB;AAAA,QACtB,eAAe,gBAAgB,IAAI;AAAA,QACnC,KAAK,IAAI,iBAAiB,UAAU,WAAW,MAAM;AAAA,MACvD;AAEA,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,mBAAmB,aAAa,MAAM,GAAG;AACpD,mBAAW,QAAQ,cAAc;AAC/B,gBAAM,KAAK,UAAU,KAAK,YAAY,MAAM,KAAK,aAAa,KAAK,KAAK,UAAU,KAAK,KAAK,gBAAgB,GAAG;AAAA,QACjH;AAAA,MACF;AAEA,UAAI,eAAe,SAAS,GAAG;AAC7B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,oDAAoD;AAC/D,iBAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,gBAAM,IAAI,eAAe,CAAC;AAC1B,gBAAM,UAAU,EAAE,UAAU,WAAM,EAAE,OAAO,KAAK;AAChD,gBAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE,UAAU,IAAI,OAAO,EAAE;AAAA,QAC7F;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,oBAAoB,OAAO,CAAC;AAEvC,YAAM,eAAe,QAAQ,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM;AAC3D,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,wCAAwC,YAAY,8BAA8B;AAAA,MAC/F;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAIA,EAAAF,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,SAASC,GAAE,OAAO,EAAE,SAAS,6DAA6D;AAAA,MAC5F;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,SAAS,MAAM,kBAAkB,OAAO;AAC9C,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,KAAK,CAAC,EAAE;AAAA,IACnE;AAAA,EACF;AACF;AAIA,SAASC,gBAAe,MAAW,QAAwB;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM,KAAK,eAAe,KAAK,aAAa,KAAK,UAAU,KAAK,QAAQ;AAC9E,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,UAAU,GAAG,MAAM,IAAI,QAAQ;AAClE;;;AC5wBA,SAAS,cAAAC,aAAY,gBAAAC,eAAc,aAAa,gBAAgB;AAChE,SAAS,WAAAC,UAAS,UAAU,SAAS,iBAAiB;AAEtD,SAAS,KAAAC,UAAS;AAGlB,IAAM,kBAAkB;AAExB,IAAM,oBAAoB;AAAA,EACxB,EAAE,KAAK,YAAY,OAAO,qBAAqB,MAAM,UAAU,UAAU,MAAM,SAAS,CAAC,YAAY,SAAS,QAAQ,MAAM,GAAG,YAAY,KAAK;AAAA,EAChJ,EAAE,KAAK,eAAe,OAAO,qBAAqB,MAAM,QAAQ,YAAY,MAAM;AAAA,EAClF,EAAE,KAAK,YAAY,OAAO,kBAAkB,MAAM,QAAQ,YAAY,MAAM;AAAA,EAC5E,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC3E,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,OAAO;AAAA,EAC7C,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC3C,EAAE,KAAK,cAAc,OAAO,uBAAuB,MAAM,OAAO;AAAA,EAChE,EAAE,KAAK,cAAc,OAAO,uBAAuB,MAAM,OAAO;AAAA,EAChE,EAAE,KAAK,aAAa,OAAO,cAAc,MAAM,QAAQ,YAAY,KAAK;AAAA,EACxE,EAAE,KAAK,SAAS,OAAO,uBAAuB,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC7E,EAAE,KAAK,cAAc,OAAO,+BAA+B,MAAM,OAAO;AAAA,EACxE,EAAE,KAAK,aAAa,OAAO,mCAAmC,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC7F,EAAE,KAAK,aAAa,OAAO,sDAAsD,MAAM,OAAO;AAChG;AAYA,eAAe,mBAAkC;AAC/C,QAAM,cAAc,MAAM,SAAgB,oBAAoB;AAC9D,MAAI,YAAY,KAAK,CAAC,MAAW,EAAE,SAAS,eAAe,EAAG;AAE9D,QAAM,YAAY,uBAAuB;AAAA,IACvC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aACE;AAAA,IAEF,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAe,kBAAwC;AACrD,SAAO,SAAsB,kBAAkB,EAAE,gBAAgB,gBAAgB,CAAC;AACpF;AAEA,SAAS,MAAM,SAAsB,UAA+B;AAClE,SAAO,QACJ,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,YAAY,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,QAAQ,EACvF,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AACnD;AAIA,SAAS,uBACP,QACA,OACA,OACA,cACQ;AACR,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU;AACtC,UAAM,aAAa,MAAM;AAAA,MACvB,CAAC,MAAM,EAAE,MAAM,aAAa,MAAM;AAAA,IACpC;AACA,UAAM,YAAY,WAAW,IAAI,CAAC,MAAM;AAAA,iCACX,QAAQ,OAAO,EAAE,MAAM,eAAe,EAAE,CAAC,CAAC;AAAA,kCACzC,QAAQ,OAAO,EAAE,MAAM,QAAQ,QAAG,CAAC,CAAC;AAAA,kCACpC,QAAQ,EAAE,IAAI,CAAC;AAAA;AAAA,KAE5C,EAAE,KAAK,EAAE;AAEV,WAAO;AAAA,iDACsC,QAAQ,OAAO,MAAM,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,qCAGxD,QAAQ,MAAM,IAAI,CAAC;AAAA,sCAClB,WAAW,MAAM;AAAA;AAAA,kCAErB,QAAQ,OAAO,MAAM,MAAM,eAAe,EAAE,CAAC,CAAC;AAAA,6BACnD,aAAa,0CAA0C;AAAA;AAAA;AAAA,EAGlF,CAAC,EAAE,KAAK,EAAE;AAEV,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBH,QAAQ,YAAY,CAAC;AAAA,EACzB,SAAS;AAAA,EACT,MAAM,SAAS,IAAI,oHAAoH,MAAM,IAAI,CAAC,MAAM,qBAAqB,QAAQ,EAAE,IAAI,CAAC,kEAA6D,QAAQ,OAAO,EAAE,MAAM,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE;AAAA;AAE3U;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AACpG;AAEA,SAAS,gBAAgB,OAAkB,OAA4B;AACrE,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,MAAM,OAAO;AACzE,QAAM,WAAW,WAAW,IAAI,CAAC,MAAM;AACrC,UAAM,OAAO,EAAE,MAAM,cAAc,WAAM,EAAE,KAAK,WAAW,KAAK;AAChE,UAAM,QAAQ,EAAE,MAAM,QAAQ,KAAK,EAAE,KAAK,KAAK,MAAM;AACrD,WAAO,OAAO,EAAE,MAAM,QAAQ,QAAG,MAAM,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK;AAAA,EAChE,CAAC,EAAE,KAAK,IAAI;AACZ,SAAO,OAAO,MAAM,IAAI;AAAA,EAAK,MAAM,MAAM,eAAe,EAAE;AAAA;AAAA,EAAO,YAAY,mBAAmB;AAClG;AAIA,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,KAAK,UAAU,CAAC,QAAQ,kBAAkB,QAAQ,YAAY,aAAa,CAAC;AAAA,EAC1F;AACF;AAEA,IAAM,cAAc;AAAA,EAClB,EAAE,SAAS,mBAAmB,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,wEAAwE,MAAM,aAAM,WAAW,QAAQ,WAAW,+LAA0L,EAAE;AAAA,EAClc,EAAE,SAAS,oBAAoB,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,+DAA+D,MAAM,gBAAM,WAAW,QAAQ,WAAW,iNAAiN,EAAE;AAAA,EAC3d,EAAE,SAAS,mBAAmB,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,sEAAsE,MAAM,aAAM,WAAW,wBAAwB,WAAW,qOAAgO,EAAE;AAAA,EACtf,EAAE,SAAS,uBAAuB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,sDAAsD,MAAM,UAAK,WAAW,8BAA8B,WAAW,8NAAyN,EAAE;AAAA,EAC5e,EAAE,SAAS,0BAA0B,MAAM,eAAe,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,6DAA6D,MAAM,aAAM,WAAW,QAAQ,WAAW,8PAAyP,EAAE;AACtgB;AAEA,IAAM,aAAa;AAAA;AAAA,EAEjB,EAAE,SAAS,mBAAmB,MAAM,SAAS,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,gLAA2K,WAAW,4CAA4C,OAAO,YAAY,WAAW,2HAA2H,EAAE;AAAA,EACthB,EAAE,SAAS,uBAAuB,MAAM,qBAAqB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,4EAAuE,WAAW,qDAAqD,OAAO,YAAY,WAAW,qIAAqI,EAAE;AAAA;AAAA,EAGrd,EAAE,SAAS,oBAAoB,MAAM,UAAU,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,UAAK,aAAa,kIAAkI,WAAW,uDAAuD,OAAO,YAAY,WAAW,6JAA6J,EAAE;AAAA,EAC5hB,EAAE,SAAS,qBAAqB,MAAM,WAAW,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,aAAM,aAAa,mFAA8E,WAAW,wEAAwE,OAAO,YAAY,WAAW,yIAAoI,EAAE;AAAA,EACne,EAAE,SAAS,wBAAwB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,aAAM,aAAa,2GAAsG,WAAW,gDAAgD,OAAO,aAAa,WAAW,2KAAsK,EAAE;AAAA;AAAA,EAG5gB,EAAE,SAAS,iBAAiB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,2IAAsI,WAAW,oEAAoE,OAAO,SAAS,WAAW,sVAA4U,EAAE;AAAA,EAC1tB,EAAE,SAAS,6BAA6B,MAAM,mBAAmB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,mBAAO,aAAa,oHAAoH,WAAW,6CAA6C,OAAO,aAAa,WAAW,iaAA4Z,EAAE;AAAA,EACvxB,EAAE,SAAS,wBAAwB,MAAM,qBAAqB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,gBAAM,aAAa,uGAAuG,WAAW,wDAAwD,OAAO,cAAc,WAAW,yUAA+T,EAAE;AAAA,EACrrB,EAAE,SAAS,8BAA8B,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,UAAK,aAAa,uHAAkH,WAAW,mFAAmF,OAAO,aAAa,WAAW,4SAAuS,EAAE;AAAA;AAAA,EAGtsB,EAAE,SAAS,4BAA4B,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,4FAAuF,WAAW,+DAA+D,OAAO,kBAAkB,WAAW,iVAAuU,EAAE;AAAA,EAC5rB,EAAE,SAAS,0BAA0B,MAAM,gBAAgB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,qGAAgG,WAAW,wDAAwD,OAAO,aAAa,WAAW,uTAAkT,EAAE;AAAA,EAChqB,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,MAAM,aAAa,iGAA4F,WAAW,sDAAsD,OAAO,aAAa,WAAW,2fAA4e,EAAE;AAAA,EAC70B,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,4FAAuF,WAAW,sDAAsD,OAAO,cAAc,WAAW,kXAA6W,EAAE;AAAA,EACzsB,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,mGAA8F,WAAW,kEAAkE,OAAO,YAAY,WAAW,+TAA0T,EAAE;AAAA,EACvqB,EAAE,SAAS,2BAA2B,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,8EAA8E,WAAW,wFAAwF,OAAO,cAAc,WAAW,kUAA6T,EAAE;AAAA,EAC/rB,EAAE,SAAS,uBAAuB,MAAM,aAAa,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,aAAM,aAAa,sGAAiG,WAAW,yBAAyB,OAAO,aAAa,WAAW,0QAA0Q,EAAE;AAAA;AAAA,EAGrlB,EAAE,SAAS,oBAAoB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,mBAAO,aAAa,iIAA4H,WAAW,oCAAoC,OAAO,SAAS,WAAW,6RAAwR,EAAE;AAAA,EACvoB,EAAE,SAAS,oBAAoB,MAAM,UAAU,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,aAAM,aAAa,8DAA8D,OAAO,YAAY,WAAW,0RAA0R,EAAE;AAAA,EAC1hB,EAAE,SAAS,oBAAoB,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,aAAM,aAAa,iFAAiF,OAAO,YAAY,WAAW,2RAAsR,EAAE;AACrjB;AAEA,IAAM,aAAa;AAAA,EACjB,EAAE,SAAS,2BAA2B,MAAM,sBAAsB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,oBAAoB,YAAY,6BAA6B,aAAa,sIAA4H,OAAO,UAAU,EAAE;AAAA,EAC3U,EAAE,SAAS,wBAAwB,MAAM,mBAAmB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,sBAAsB,YAAY,wBAAwB,aAAa,kHAA8F,OAAO,UAAU,EAAE;AAAA,EACpS,EAAE,SAAS,uBAAuB,MAAM,2BAA2B,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,0BAA0B,YAAY,uBAAuB,aAAa,mIAAoH,OAAO,UAAU,EAAE;AAAA,EACpU,EAAE,SAAS,6BAA6B,MAAM,wBAAwB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,iBAAiB,YAAY,sBAAsB,aAAa,kIAAwH,OAAO,UAAU,EAAE;AAAA,EACjU,EAAE,SAAS,uBAAuB,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,4BAA4B,YAAY,qBAAqB,aAAa,iIAAkH,OAAO,UAAU,EAAE;AAC3T;AAIO,SAAS,0BAA0BC,SAAmB;AAE3D,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,UAAUC,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oEAAoE;AAAA,MAC/G;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,MAAM;AACtB,YAAM,iBAAiB;AACvB,YAAM,MAAM,MAAM,gBAAgB;AAElC,YAAM,YAAY,MAAM,KAAK,UAAU;AACvC,YAAM,iBAAiB,WACnB,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,IAC5C,UAAU,CAAC;AAEf,YAAM,eAAe,gBAAgB,QAAQ;AAC7C,YAAM,aAAa,gBAAgB;AAEnC,YAAM,SAAS,MAAM,KAAK,OAAO,EAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,gBAAgB,UAAU;AAClE,YAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,YAAM,QAAQ,MAAM,KAAK,MAAM;AAE/B,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,aAAa,OAAO,IAAI,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM;AAC3E,YAAM,YAAY,MAAM,SAAS,IAC7B,iCAAiC,MAAM;AAAA,QAAI,CAAC,MAC1C,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,eAAe,EAAE;AAAA,MAC/C,EAAE,KAAK,IAAI,IACX;AAEJ,YAAM,OAAO,KAAK,YAAY;AAAA;AAAA,EAAO,UAAU,GAAG,SAAS;AAE3D,YAAM,OAAO,uBAAuB,QAAQ,OAAO,OAAO,YAAY;AAEtE,aAAO;AAAA,QACL,SAAS;AAAA,UACP,EAAE,MAAM,QAAiB,KAAK;AAAA,UAC9B,EAAE,MAAM,YAAqB,UAAU,EAAE,KAAK,gCAAgC,UAAU,aAAa,MAAM,KAAK,EAAE;AAAA,QACpH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,OAAOC,GAAE,OAAO,EAAE,SAAS,0DAA0D;AAAA,MACvF;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,iBAAiB;AACvB,YAAM,MAAM,MAAM,gBAAgB;AAElC,YAAM,SAAS,MAAM,KAAK,OAAO;AACjC,YAAM,SAAS,OAAO;AAAA,QACpB,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,MAAM,YAAY,KAAK,EAAE,YAAY;AAAA,MACvE;AAEA,UAAI,CAAC,QAAQ;AACX,cAAM,YAAY,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI;AAC9D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,UAAU,KAAK,kCAAkC,SAAS;AAAA,UAClE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,OAAO,OAAO;AAClF,YAAM,QAAQ,MAAM,KAAK,MAAM,EAAE;AAAA,QAC/B,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU;AAAA,MAC/F;AAEA,YAAM,UAAU,OAAO,MAAM,YACzB;AAAA,uCAA0C,OAAO,KAAK,cAAc,SAAS,+BAA+B,OAAO,KAAK,SAAS;AAAA,IACjI;AACJ,YAAM,iBAAiB,OAAO,MAAM,YAChC;AAAA,IAAO,OAAO,KAAK,SAAS;AAAA,IAC5B;AAEJ,YAAM,aAAa,MAAM,IAAI,CAAC,MAAM;AAClC,cAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,QAAQ,QAAG,IAAI,EAAE,IAAI,EAAE;AACtD,YAAI,EAAE,MAAM,YAAa,OAAM,KAAK,OAAO,EAAE,KAAK,WAAW,CAAC;AAC9D,YAAI,EAAE,MAAM,MAAO,OAAM,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE;AAC1D,YAAI,EAAE,MAAM,UAAW,OAAM,KAAK,gBAAgB,EAAE,KAAK,SAAS,IAAI;AACtE,YAAI,EAAE,MAAM,UAAW,OAAM,KAAK;AAAA,gBAAmB,EAAE,KAAK,SAAS,EAAE;AACvE,eAAO,MAAM,KAAK,IAAI;AAAA,MACxB,CAAC,EAAE,KAAK,MAAM;AAEd,YAAM,YAAY,MAAM,SAAS,IAC7B,gCAAgC,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,EAAE,KAAK,IAAI,IACvG;AAEJ,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MAAM,KAAK,OAAO,MAAM,QAAQ,EAAE,IAAI,OAAO,IAAI;AAAA;AAAA,EAAa,OAAO,MAAM,eAAe,EAAE,GAAG,OAAO,GAAG,cAAc;AAAA,IAAO,MAAM,MAAM;AAAA;AAAA,EAAoB,UAAU,GAAG,SAAS;AAAA,QACtL,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,MAAMC,GAAE,OAAO,EAAE,SAAS,+EAA+E;AAAA,MAC3G;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,KAAK,MAAM;AAClB,YAAM,iBAAiB;AACvB,YAAM,MAAM,MAAM,gBAAgB;AAElC,YAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,YAAM,SAAS,MAAM;AAAA,QACnB,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK,YAAY,KAAK,EAAE,YAAY;AAAA,MACtE;AAEA,UAAI,CAAC,QAAQ;AACX,cAAM,YAAY,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI;AAC7D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,SAAS,IAAI,iCAAiC,SAAS;AAAA,UAC/D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,YAAM,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,MAAM,UAAU;AACtE,YAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,MAAM,UAAU;AAEpE,YAAM,QAAQ;AAAA,QACZ,KAAK,OAAO,IAAI;AAAA,QAChB;AAAA,QACA,KAAK,QAAQ,MAAM,QAAQ,GAAG,IAAI,QAAQ,QAAQ,SAAS,eAAU,MAAM,MAAM,QAAQ,GAAG,IAAI,MAAM,QAAQ,SAAS;AAAA,QACvH;AAAA,QACA,OAAO,OAAO,MAAM,eAAe,EAAE;AAAA,MACvC;AAEA,UAAI,QAAQ;AACV,cAAM,KAAK,IAAI,eAAe,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,eAAe,EAAE,CAAC;AACnF,YAAI,OAAO,MAAM,UAAW,OAAM,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,MAC9E;AACA,UAAI,MAAM;AACR,cAAM,KAAK,IAAI,eAAe,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,eAAe,EAAE,CAAC;AAC/E,YAAI,KAAK,MAAM,UAAW,OAAM,KAAK,YAAY,KAAK,KAAK,SAAS,IAAI;AAAA,MAC1E;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,YAAY;AACV,YAAM,iBAAiB;AACvB,YAAM,WAAW,MAAM,gBAAgB;AACvC,YAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAE1D,UAAI,UAAU;AACd,UAAI,UAAU;AACd,UAAI,YAAY;AAEhB,YAAM,WAAW;AAAA,QACf,EAAE,GAAG,eAAe,OAAO,GAAG,QAAQ,SAAS;AAAA,QAC/C,GAAG,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,QAC/D,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,QAC9D,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,MAChE;AAEA,iBAAW,QAAQ,UAAU;AAC3B,YAAI,YAAY,IAAI,KAAK,OAAO,GAAG;AACjC,gBAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO;AACrE,gBAAM,eAAgB,eAAe,QAAQ,CAAC;AAC9C,gBAAM,WAAW,KAAK;AACtB,gBAAM,aAAa,OAAO,KAAK,QAAQ,EAAE;AAAA,YACvC,CAAC,MAAM,SAAS,CAAC,MAAM,UAAa,aAAa,CAAC,MAAM,SAAS,CAAC;AAAA,UACpE;AACA,cAAI,YAAY;AACd,kBAAM,aAAa,EAAE,GAAG,cAAc,GAAG,SAAS;AAClD,kBAAM,YAAY,kBAAkB;AAAA,cAClC,SAAS,KAAK;AAAA,cACd,MAAM;AAAA,YACR,CAAC;AACD;AAAA,UACF,OAAO;AACL;AAAA,UACF;AACA;AAAA,QACF;AACA,cAAM,YAAY,kBAAkB;AAAA,UAClC,gBAAgB;AAAA,UAChB,SAAS,KAAK;AAAA,UACd,MAAM,KAAK;AAAA,UACX,QAAQ,KAAK;AAAA,UACb,MAAM,KAAK;AAAA,UACX,OAAO,KAAK,SAAS;AAAA,QACvB,CAAC;AACD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA;AAAA,eAAyC,OAAO;AAAA,eAA0B,OAAO;AAAA,iBAAwC,SAAS;AAAA;AAAA;AAAA,QAC1I,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAIA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,cAAcE,oBAAmB;AACvC,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UAER,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,iBAAiB;AACvB,YAAM,MAAM,MAAM,gBAAgB;AAClC,YAAM,SAAS,MAAM,KAAK,OAAO;AACjC,YAAM,QAAQ,MAAM,KAAK,MAAM;AAE/B,YAAM,SAAS,iBAAiB,aAAa,QAAQ,KAAK;AAE1D,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MAAM,iBAAiB,MAAM;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAsBA,SAASA,sBAAoC;AAC3C,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZC,SAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,EAC7B,EAAE,OAAO,OAAO;AAEhB,aAAW,OAAO,YAAY;AAC5B,UAAM,WAAWA,SAAQ,GAAG;AAC5B,QAAIC,YAAWD,SAAQ,UAAU,kBAAkB,CAAC,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,iBACP,aACA,QACA,OACY;AACZ,QAAM,WAAW,oBAAI,IAAuB;AAC5C,aAAW,KAAK,OAAQ,UAAS,IAAI,EAAE,SAAS,CAAC;AAEjD,QAAM,cAAc,iBAAiB,MAAM;AAC3C,QAAM,mBAAmB,kBAAkB,KAAK;AAEhD,QAAM,aAA0B,CAAC;AACjC,QAAM,cAAc,oBAAI,IAA+D;AACvF,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,WAAW;AAEf,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,KAAK,MAAM,YAAY,EAAE;AACjD,UAAM,QAAQ,SAAS,IAAI,QAAQ;AACnC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,eAAe,IAAI;AACrC,UAAM,iBAA8B,CAAC;AACrC,QAAI,gBAAgB;AAEpB,eAAW,MAAM,WAAW;AAC1B,YAAM,UAAUA,SAAQ,aAAa,EAAE;AACvC,YAAM,QAAQ,aAAa,OAAO;AAElC,iBAAW,QAAQ,OAAO;AACxB;AACA;AACA,cAAM,UAAU,SAAS,aAAa,IAAI;AAC1C,cAAM,UAAU,aAAa,IAAI;AAEjC,mBAAW,OAAO,SAAS;AACzB;AACA,gBAAM,WAAW,cAAc,KAAK,MAAM,WAAW;AACrD,cAAI,CAAC,UAAU;AAAE;AAAY;AAAA,UAAU;AAEvC,gBAAM,aAAa,eAAe,UAAU,gBAAgB;AAC5D,cAAI,CAAC,YAAY;AAAE;AAAY;AAAA,UAAU;AAEzC,gBAAM,iBAAiB,OAAO,WAAW,MAAM,YAAY,EAAE;AAC7D,gBAAM,cAAc,SAAS,IAAI,cAAc;AAC/C,cAAI,CAAC,YAAa;AAElB,cAAI,mBAAmB,SAAU;AAEjC,gBAAM,UAAU,YAAY,IAAI,QAAQ;AACxC,cAAI,WAAW,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC3C,kBAAM,IAAe;AAAA,cACnB,YAAY,KAAK;AAAA,cACjB,aAAa,MAAM;AAAA,cACnB,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,YAAY,WAAW;AAAA,cACvB,aAAa,YAAY;AAAA,cACzB,MAAM,GAAG,MAAM,IAAI,uBAAuB,YAAY,IAAI;AAAA,YAC5D;AACA,uBAAW,KAAK,CAAC;AACjB,2BAAe,KAAK,CAAC;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,gBAAY,IAAI,KAAK,SAAS,EAAE,YAAY,gBAAgB,cAAc,cAAc,CAAC;AAAA,EAC3F;AAEA,SAAO,EAAE,YAAY,cAAc,YAAY,gBAAgB,cAAc,iBAAiB,UAAU,YAAY;AACtH;AAEA,SAAS,iBAAiB,QAA+C;AACvE,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,KAAK,OAAQ,UAAS,IAAI,EAAE,KAAK,YAAY,GAAG,EAAE,OAAO;AAEpE,QAAM,UAAU,oBAAI,IAAyB;AAC7C,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,OAAO,MAAM,MAAM,aAAa,MAAM;AACnD,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,SAAS,QAAQ;AACnB,iBAAW,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG;AACpE,cAAM,KAAK,SAAS,IAAI,GAAG;AAC3B,YAAI,GAAI,KAAI,IAAI,EAAE;AAAA,MACpB;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,SAAS,GAAG;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA2D;AACpF,QAAM,UAAiD,CAAC;AACxD,aAAW,QAAQ,OAAO;AACxB,eAAW,MAAM,eAAe,IAAI,GAAG;AACrC,cAAQ,KAAK,EAAE,QAAQ,UAAU,EAAE,GAAG,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM;AACxD,SAAO;AACT;AAEA,SAAS,eAAe,MAA2B;AACjD,QAAM,MAAM,KAAK,MAAM;AACvB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO,CAAC;AAC7C,SAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC3D;AAEA,SAAS,aAAa,SAA2B;AAC/C,MAAI,CAACC,YAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,OAAO,SAAS,OAAO;AAC7B,MAAI,KAAK,OAAO,GAAG;AACjB,WAAO,gBAAgB,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC;AAAA,EACjD;AACA,MAAI,CAAC,KAAK,YAAY,EAAG,QAAO,CAAC;AAEjC,QAAM,UAAoB,CAAC;AAC3B,QAAM,OAAO,CAAC,QAAgB;AAC5B,eAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAI,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,eAAgB;AACjE,YAAM,OAAOD,SAAQ,KAAK,MAAM,IAAI;AACpC,UAAI,MAAM,YAAY,EAAG,MAAK,IAAI;AAAA,eACzB,gBAAgB,IAAI,EAAG,SAAQ,KAAK,IAAI;AAAA,IACnD;AAAA,EACF;AACA,OAAK,OAAO;AACZ,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAoB;AAC3C,SAAO,oBAAoB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO;AAC3D;AAEA,SAAS,aAAa,UAA4B;AAChD,MAAI;AACF,UAAM,UAAUE,cAAa,UAAU,OAAO;AAC9C,UAAM,KAAK;AACX,UAAM,UAAoB,CAAC;AAC3B,QAAI;AACJ,YAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAC1C,cAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAM,aAAa,CAAC,OAAO,OAAO,WAAW,aAAa,aAAa,eAAe;AAEtF,SAAS,wBAAwB,SAAgC;AAC/D,MAAID,YAAW,OAAO,KAAK,SAAS,OAAO,EAAE,OAAO,EAAG,QAAO;AAC9D,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,UAAU;AAC1B,QAAIA,YAAW,OAAO,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAa,UAAkB,MAA6B;AACjF,MAAI,MAAqB;AACzB,MAAI,IAAI,WAAW,OAAO,EAAG,OAAM,IAAI,QAAQ,SAAS,UAAU;AAAA,WACzD,IAAI,WAAW,UAAU,EAAG,OAAM,IAAI,QAAQ,YAAY,SAAS;AAAA,WACnE,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG,QAAO;AAAA,WAC3D,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,KAAK,GAAG;AACtD,UAAM,UAAU,QAAQ,QAAQ;AAChC,UAAME,OAAMH,SAAQ,SAAS,GAAG;AAChC,UAAM,SAAS,MAAMG,IAAG;AAAA,EAC1B;AACA,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,MAAMH,SAAQ,MAAM,GAAG;AAC7B,QAAM,SAAS,wBAAwB,GAAG;AAC1C,SAAO,SAAS,SAAS,MAAM,MAAM,IAAI;AAC3C;AAEA,SAAS,eACP,UACA,UACkB;AAClB,QAAM,aAAa,UAAU,QAAQ;AACrC,aAAW,EAAE,QAAQ,KAAK,KAAK,UAAU;AACvC,QAAI,WAAW,WAAW,MAAM,EAAG,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAA4B;AACpD,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,WAAW,WAAW,GAAG;AAClC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,2BAA2B,OAAO,YAAY,WAAW,OAAO,cAAc,qBAAqB,OAAO,eAAe;AAAA,MACzH;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ,sCAAiC,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG;AAAA,MAC/G;AAAA,MACA,WAAW,OAAO,YAAY,mBAAmB,OAAO,cAAc,qBAAqB,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG,OAAO,OAAO,eAAe;AAAA,MACtM;AAAA,IACF;AAEA,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,KAAK,OAAO,YAAY;AACjC,UAAI,CAAC,OAAO,IAAI,EAAE,UAAU,EAAG,QAAO,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,aAAO,IAAI,EAAE,UAAU,EAAG,KAAK,CAAC;AAAA,IAClC;AAEA,eAAW,CAAC,UAAU,EAAE,KAAK,QAAQ;AACnC,YAAM,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,EAAE,WAAW,GAAG;AAClD,iBAAW,KAAK,IAAI;AAClB,cAAM,KAAK,OAAO,EAAE,UAAU,gBAAgB,EAAE,UAAU,eAAU,EAAE,UAAU,OAAO,EAAE,WAAW,YAAO,EAAE,IAAI,EAAE;AAAA,MACrH;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,QAAM,KAAK,OAAO,EAAE;AAEpB,QAAM,cAAc,CAAC,GAAG,OAAO,YAAY,QAAQ,CAAC;AACpD,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,WAAW,KAAK,EAAE,eAAe,CAAC,EAAE;AAClG,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,SAAS,CAAC,EAAE;AAC1E,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE;AAEvE,QAAM;AAAA,IACJ,gBAAgB,UAAU,iBAAiB,UAAU,qBAAqB,UAAU;AAAA,EACtF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AC5uBA,SAAS,KAAAI,UAAS;;;ACwClB,IAAM,iBAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,kBACE;AAAA,EACF,MAAM;AAAA,EACN,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCrB,QAAQ;AAAA,IACN;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,QACE;AAAA,UACF,SAAS;AAAA,YACP,EAAE,IAAI,aAAa,OAAO,mBAAmB;AAAA,YAC7C,EAAE,IAAI,eAAe,OAAO,oBAAoB;AAAA,YAChD,EAAE,IAAI,oBAAoB,OAAO,gCAAgC;AAAA,YACjE,EAAE,IAAI,WAAW,OAAO,wBAAwB;AAAA,YAChD,EAAE,IAAI,UAAU,OAAO,2CAAsC;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,EAAE,IAAI,OAAO,OAAO,4CAAuC;AAAA,YAC3D,EAAE,IAAI,UAAU,OAAO,8BAA8B;AAAA,YACrD,EAAE,IAAI,OAAO,OAAO,qBAAqB;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,IAChB,cAAc;AAAA,IACd,kBAAkB;AAAA,EACpB;AAAA,EAEA,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASjB;AAIA,IAAM,YAAY,oBAAI,IAAgC;AAAA,EACpD,CAAC,SAAS,cAAc;AAC1B,CAAC;AAEM,SAAS,YAAY,IAA4C;AACtE,SAAO,UAAU,IAAI,EAAE;AACzB;AAEO,SAAS,gBAAsC;AACpD,SAAO,MAAM,KAAK,UAAU,OAAO,CAAC;AACtC;;;ADlOA,SAAS,mBAAmB,IAAgC;AAC1D,QAAM,YAAY,GAAG,OAClB,IAAI,CAAC,MAAM,KAAK,EAAE,GAAG,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,MAAM,EAAE,mBAAmB,GAAG,GAAG,EAC7E,KAAK,IAAI;AAEZ,SACE,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA,YACX,GAAG,EAAE;AAAA,EACf,GAAG,gBAAgB;AAAA;AAAA,cACP,GAAG,OAAO,MAAM;AAAA,EAAO,SAAS;AAAA;AAAA,mCACX,GAAG,kBAAkB;AAAA,kDACN,GAAG,EAAE;AAE5D;AAEO,SAAS,sBAAsBC,SAAmB;AAEvD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,YAAY,cAAc;AAEhC,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,UAAU,IAAI,kBAAkB,EAAE,KAAK,aAAa;AAElE,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MACE;AAAA;AAAA,EACG,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA,EACT,KAAK;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,QAC7D,SAASA,GAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,QAChE,QAAQA,GAAE,OAAO,EAAE,SAAS,gFAA2E;AAAA,QACvG,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,UAC9B;AAAA,QACF;AAAA,QACA,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,UACjC;AAAA,QACF;AAAA,QACA,oBAAoBA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,YAAY,SAAS,QAAQ,SAAS,aAAa,mBAAmB,MAAM;AACnF,YAAM,KAAK,YAAY,UAAU;AACjC,UAAI,CAAC,IAAI;AACP,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,aAAa,UAAU,2BACT,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAE7D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACpD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,UAAU,OAAO,4BAA4B,UAAU,wBAClC,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAE9D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAkB;AAAA,QACtB,wBAAwB,MAAM,GAAG,WAAM,MAAM,KAAK;AAAA,QAClD,aAAa,GAAG,IAAI,OAAO,GAAG,EAAE;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,WAAW,eAAe,oBAAoB;AAChD,YAAI;AACF,gBAAM,UAAU,MAAM,YAAoB,kBAAkB;AAAA,YAC1D,gBAAgB,GAAG;AAAA,YACnB,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,CAAC,GAAG,iBAAiB,gBAAgB,GAAG;AAAA,cACxC,cAAc,GAAG;AAAA,cACjB,gBAAgB;AAAA,cAChB,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,YAC7C;AAAA,YACA,WAAW,YAAY,GAAG,EAAE;AAAA,UAC9B,CAAC;AAED,gBAAM;AAAA,YACJ,2BAA2B,OAAO;AAAA,YAClC,iBAAiB,GAAG,kBAAkB;AAAA,YACtC,SAAS,WAAW;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,KAAc;AACrB,gBAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,gBAAM;AAAA,YACJ,0BAA0B,GAAG;AAAA,YAC7B;AAAA,YACA;AAAA,YACA;AAAA,YACA,mBAAmB,GAAG,kBAAkB;AAAA,YACxC,WAAW,WAAW;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM;AAAA,UACJ,SAAS,MAAM,GAAG;AAAA,UAClB,WAAW,OAAO,UAAU,GAAG,GAAG,CAAC,GAAG,OAAO,SAAS,MAAM,QAAQ,EAAE;AAAA,QACxE;AAEA,cAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO;AAC9D,YAAI,aAAa,GAAG,OAAO,SAAS,GAAG;AACrC,gBAAM,OAAO,GAAG,OAAO,aAAa,CAAC;AACrC,gBAAM;AAAA,YACJ;AAAA,YACA,mBAAmB,KAAK,GAAG,WAAM,KAAK,KAAK;AAAA,YAC3C,IAAI,KAAK,WAAW;AAAA,UACtB;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AACF;;;AElLA,SAAS,KAAAC,UAAS;AAGlB,SAAS,YAAY,OAAuC;AAC1D,SAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,IAAI,OAAO,MAAM;AACtB,UAAM,SAAS,OAAO,YAAY,YAAY,QAAQ,SAAS;AAC/D,UAAM,UAAU,SACZ,QAAQ,UAAU,GAAG,EAAE,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAC1D;AACJ,WAAO,SAAS,EAAE,OAAO,OAAO;AAAA,EAClC,CAAC,EACA,KAAK,IAAI;AACd;AAEO,SAAS,sBAAsBC,SAAmB;AAGvD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,OAAOC,GAAE,OAAO,EAAE,SAAS,gDAAgD;AAAA,QAC3E,aAAaA,GACV,OAAO,EACP,QAAQ,oBAAoB,EAC5B;AAAA,UACC;AAAA,QAGF;AAAA,QACF,aAAaA,GACV,OAAO,EACP,SAAS,EACT,SAAS,kDAAkD;AAAA,QAC9D,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,6EAA6E;AAAA,MAC3F;AAAA,IACF;AAAA,IACA,OAAO,EAAE,OAAO,aAAa,aAAa,OAAO,MAAM;AACrD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,EAAE,OAAO,aAAa,aAAa,OAAO;AAAA,MAC5C;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE;AAAA;AAAA,oBACqB,OAAO,OAAO;AAAA,eACnB,KAAK;AAAA,cACN,WAAW;AAAA;AAAA;AAAA,yCAEgB,OAAO,OAAO;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,MACtD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,aAAa,MAAM;AAC1B,YAAM,QAAQ,MAAM,SAAc,qBAAqB,EAAE,aAAa,CAAC;AAEvE,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,YAAY;AAAA,YAC9B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,eAAe,MAAM,SACvB;AAAA,gBAAmB,MAAM,cAAc;AAAA;AAAA,IACvC,MAAM,OAAO,SACV,IAAI,CAAC,MAAW,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,SAAS,SAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAI,OAAO,KAAK,IAAI,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EACzI,KAAK,IAAI,IACZ;AAEJ,YAAM,OACJ,KAAK,MAAM,IAAI;AAAA;AAAA,oBACM,MAAM,OAAO;AAAA,cACnB,MAAM,aAAa;AAAA,gBACjB,MAAM,MAAM;AAAA,sBACN,MAAM,WAAW,IAAI,MAAM,UAAU;AAAA,iBAC1C,MAAM,cAAc;AAAA,oBACjB,MAAM,aAAa,SAAS;AAAA,wBACxB,MAAM,YAAY;AAAA,IAC3C,eACA;AAAA;AAAA;AAAA;AAAA,IACA,YAAY,MAAM,KAAK;AAEzB,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,EAAE;AAAA,IACtD;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,QACpD,QAAQA,GACL,OAAO,EACP;AAAA,UACC;AAAA,QAEF;AAAA,QACF,SAASA,GAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,QACjE,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,6CAA6C;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,QAAQ,SAAS,OAAO,MAAM;AACnD,YAAM,SAAS,MAAM,YAKlB,qBAAqB,EAAE,cAAc,QAAQ,SAAS,OAAO,CAAC;AAEjE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,cACjB,OAAO,MAAM;AAAA,sBACL,OAAO,MAAM;AAAA,wBACX,QAAQ,MAAM;AAAA;AAAA;AAAA,UAE3C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,aAAaC,GACV,OAAO,EACP,SAAS,EACT,SAAS,8DAA8D;AAAA,QAC1E,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AAAA,MACrD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,aAAa,OAAO,MAAM;AACjC,YAAM,SAAS,MAAM,SAAgB,uBAAuB;AAAA,QAC1D;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,OACf;AAAA,QACC,CAAC,MACC,SAAS,EAAE,OAAO,QAAQ,EAAE,IAAI,WAAM,EAAE,WAAW,SAChD,EAAE,WAAW,IAAI,EAAE,UAAU,0BAClB,EAAE,cAAc,kBACnB,EAAE,MAAM;AAAA,MACvB,EACC,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,aAAa,OAAO,MAAM;AAAA;AAAA,EAAQ,SAAS;AAAA,UACnD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,MACtD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,aAAa,MAAM;AAC1B,YAAM,UAAU,MAAM,SAAgB,uBAAuB;AAAA,QAC3D;AAAA,MACF,CAAC;AAED,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,YAAY;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,QACf,KAAK,CAAC,GAAQ,MAAW,EAAE,YAAY,EAAE,SAAS,EAClD,IAAI,CAAC,MAAW;AACf,cAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE;AAClF,eAAO,OAAO,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,aAAa,SAAS,WAAM,EAAE,QAAQ,EAAE;AAAA,MACpF,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,iBAAiB,YAAY,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAe,SAAS;AAAA,UAChF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,QACpD,eAAeA,GACZ,OAAO,EACP;AAAA,UACC;AAAA,QAEF;AAAA,QACF,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AAAA,MACrD;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,eAAe,OAAO,MAAM;AACjD,YAAM,SAAS,MAAM,YAMlB,wBAAwB,EAAE,cAAc,eAAe,OAAO,CAAC;AAElE,YAAM,UAAU,OAAO,oBACnB;AAAA;AAAA,sBAA2B,OAAO,iBAAiB,KACnD;AAEJ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE,gBAAgB,OAAO,OAAO;AAAA;AAAA,iBACZ,OAAO,OAAO;AAAA,iBACd,OAAO,OAAO;AAAA,iBACd,aAAa;AAAA,mBACX,OAAO,cAAc;AAAA,wBAChB,OAAO,cAAc,SAAS,IAAI,OAAO,cAAc,KAAK,IAAI,IAAI,MAAM;AAAA,IACnG;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,MACtD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,aAAa,MAAM;AAC1B,YAAM,UAAU,MAAM,SAAgB,wBAAwB;AAAA,QAC5D;AAAA,MACF,CAAC;AAED,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,+BAA+B,YAAY;AAAA,YACnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,QACf,IAAI,CAAC,MAAW;AACf,cAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAC9B,YAAY,EACZ,QAAQ,KAAK,GAAG,EAChB,UAAU,GAAG,EAAE;AAClB,cAAM,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAC/C,cAAM,QACJ,EAAE,iBAAiB,EAAE,cAAc,SAAS,IACxC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,MAC/B;AACN,eAAO,QAAQ,EAAE,OAAO,MAAM,IAAI,OAAO,EAAE,MAAM,WAAM,GAAG,GAAG,KAAK,KAAK,EAAE,aAAa;AAAA,MACxF,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,iBAAiB,YAAY,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAQ,SAAS;AAAA,UACzE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,QACpD,UAAUA,GAAE,OAAO,EAAE,SAAS,4BAA4B;AAAA,QAC1D,UAAUA,GAAE,OAAO,EAAE,SAAS,0BAA0B;AAAA,MAC1D;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,cAAc,UAAU,SAAS,MAAM;AAC9C,YAAM,OAAO,MAAM,YAAiB,yBAAyB;AAAA,QAC3D;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,OACF,YAAY,QAAQ,YAAO,QAAQ;AAAA;AAAA,iBACjB,KAAK,YAAY;AAAA,mBACf,KAAK,eAAe,YAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,GAAG,KAAK,cAAc;AAAA,uBACzG,KAAK,aAAa,SAAS,IAAI,KAAK,aAAa,KAAK,IAAI,IAAI,MAAM;AAAA;AAE9F,iBAAW,MAAM,KAAK,WAAW;AAC/B,YAAI,GAAG,WAAW,YAAa;AAE/B,gBAAQ;AAAA,KAAQ,GAAG,MAAM,KAAK,GAAG,MAAM;AAAA;AAAA;AAEvC,cAAM,WAAW,KAAK,UAAU,GAAG,MAAM;AACzC,YAAI,YAAY,SAAS,SAAS,GAAG;AACnC,qBAAW,KAAK,UAAU;AACxB,gBAAI,EAAE,SAAS,UAAU;AACvB,sBAAQ,KAAK,EAAE,MAAM,UAAU,GAAG,GAAG,CAAC;AAAA,YACxC,WAAW,EAAE,SAAS,UAAU;AAC9B,sBAAQ,KAAK,EAAE,MAAM,UAAU,GAAG,GAAG,CAAC;AAAA,YACxC,OAAO;AACL,sBAAQ,EAAE,MAAM,UAAU,GAAG,GAAG;AAAA,YAClC;AAAA,UACF;AACA,kBAAQ;AAAA,QACV;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,EAAE;AAAA,IACtD;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,QACpD,eAAeA,GACZ,OAAO,EACP,SAAS,EACT,SAAS,iCAAiC;AAAA,MAC/C;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,cAAc,cAAc,MAAM;AACzC,YAAM,OAAO,MAAM,SAAc,oBAAoB;AAAA,QACnD;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM,aAAa,KAAK,OACrB;AAAA,QACC,CAAC,MACC,KAAK,EAAE,OAAO,SAAS,MAAM,MAAM,EAAE,IAAI,OAAO,EAAE,MAAM;AAAA,MAC5D,EACC,KAAK,IAAI;AAEZ,YAAM,OAAO,KAAK,OAAO,SAAS;AAElC,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE,WAAW,IAAI;AAAA;AAAA,eACC,KAAK,KAAK;AAAA,mBACN,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA,EAClB,UAAU;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,wCAAwC;AAAA,QACpD,QAAQA,GACL,KAAK,CAAC,UAAU,MAAM,CAAC,EACvB,SAAS,2DAA2D;AAAA,QACvE,MAAMA,GACH,OAAO,EACP,SAAS,EACT,SAAS,kEAAkE;AAAA,QAC9E,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,gDAAgD;AAAA,MAC9D;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,QAAQ,MAAM,OAAO,MAAM;AAChD,UAAI,WAAW,UAAU;AACvB,cAAM,SAAS,MAAM,YAIlB,yBAAyB,EAAE,cAAc,MAAM,OAAO,CAAC;AAE1D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE;AAAA;AAAA,cACe,OAAO,IAAI;AAAA,mBACN,OAAO,WAAW;AAAA,iBACpB,YAAY;AAAA;AAAA;AAAA,YAElC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,MAAM,YAAmB,yBAAyB;AAAA,QACjE;AAAA,MACF,CAAC;AAED,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,gCAAgC,YAAY;AAAA,YACpD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,SACf;AAAA,QACC,CAAC,MACC,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,sBAAiB,EAAE,WAAW,QAAQ,EAAE,SAAS;AAAA,MACjF,EACC,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM,kBAAkB,YAAY,KAAK,SAAS,MAAM;AAAA;AAAA,EAAQ,SAAS;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,sBAAsB;AAAA,QAClC,YAAYA,GACT,OAAO,EACP,SAAS,wCAAwC;AAAA,MACtD;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,cAAc,WAAW,MAAM;AACtC,YAAM,SAAS,MAAM,YAAiB,2BAA2B;AAAA,QAC/D;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,CAAC,OAAO,cAAc;AACxB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,UAA6B,UAAU,UAAU,YAAY;AAAA,YACrE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,gBAAgB,OAAO,UAC1B;AAAA,QACC,CAAC,MACC,OAAO,EAAE,MAAM,0BAAqB,EAAE,SAAS,IAAI,CAAC,MAAW,GAAG,EAAE,UAAU,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MAC9G,EACC,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE;AAAA;AAAA,UACW,UAAU;AAAA;AAAA,IACrB,gBACA;AAAA;AAAA;AAAA,UACJ;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GACX,OAAO,EACP,SAAS,sBAAsB;AAAA,QAClC,YAAYA,GACT,OAAO,EACP,SAAS,qBAAqB;AAAA,QACjC,UAAUA,GACP,KAAK,CAAC,gBAAgB,QAAQ,CAAC,EAC/B,SAAS,EACT,SAAS,iGAAiG;AAAA,QAC7G,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,oCAAoC;AAAA,MAClD;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,YAAY,UAAU,OAAO,MAAM;AACxD,YAAM,SAAS,MAAM,YAKlB,wBAAwB;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,gBACf,OAAO,UAAU;AAAA,kBACf,OAAO,OAAO;AAAA,kBACd,OAAO,QAAQ;AAAA;AAAA,kBACf,OAAO,OAAO;AAAA,UACrC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,cAAcC,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,QACxD,QAAQA,GACL,KAAK,CAAC,OAAO,WAAW,MAAM,CAAC,EAC/B,SAAS,8DAA8D;AAAA,QAC1E,eAAeA,GACZ,OAAO,EACP,SAAS,EACT,SAAS,mDAAmD;AAAA,QAC/D,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,4CAA4C;AAAA,QACxD,MAAMA,GACH,OAAO,EACP,SAAS,EACT,SAAS,mCAAmC;AAAA,QAC/C,WAAWA,GACR,OAAO,EACP,SAAS,EACT,SAAS,gDAAgD;AAAA,QAC5D,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,MAChF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,QAAQ,eAAe,QAAQ,MAAM,WAAW,OAAO,MAAM;AAClF,UAAI,WAAW,OAAO;AACpB,YAAI,CAAC,cAAe,OAAM,IAAI,MAAM,qCAAqC;AACzE,YAAI,CAAC,KAAM,OAAM,IAAI,MAAM,4BAA4B;AAEvD,cAAM,SAAS,MAAM,YAAiB,uBAAuB;AAAA,UAC3D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE;AAAA;AAAA,iBACkB,OAAO,YAAY;AAAA,kBAClB,OAAO,aAAa;AAAA,KACtC,OAAO,SAAS,eAAe,OAAO,MAAM;AAAA,IAAO,MACpD,eAAe,MAAM,UAAU,GAAG,GAAG,CAAC;AAAA,YAC1C;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,WAAW;AACxB,YAAI,CAAC,UAAW,OAAM,IAAI,MAAM,qCAAqC;AAErE,cAAM,YAAY,2BAA2B,EAAE,UAAU,CAAC;AAE1D,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,YAAM,WAAW,MAAM,YAAmB,yBAAyB;AAAA,QACjE;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,gCAAgC,YAAY,IAAI,gBAAgB,KAAK,aAAa,KAAK,EAAE;AAAA,YACjG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,SACf,IAAI,CAAC,MAAW;AACf,cAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE;AAClF,cAAM,WAAW,EAAE,WAAW,gBAAgB;AAC9C,cAAM,OAAO,EAAE,SAAS,KAAK,EAAE,MAAM,MAAM;AAC3C,eAAO,QAAQ,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,EAAE,MAAM,GAAG,QAAQ,KAAK,EAAE,KAAK,UAAU,GAAG,GAAG,CAAC;AAAA,MAClG,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,kBAAkB,SAAS,OAAO,CAAC,MAAW,CAAC,EAAE,QAAQ,EAAE;AAEjE,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE,kBAAkB,YAAY,KAAK,SAAS,MAAM,KAAK,eAAe;AAAA;AAAA,EAAmB,SAAS;AAAA,UACtG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,cAAcC,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,QACxD,WAAWA,GAAE,OAAO,EAAE,SAAS,iCAAiC;AAAA,QAChE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,sCAAsC;AAAA,MAC/E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,cAAc,WAAW,OAAO,MAAM;AAC7C,YAAM,SAAS,MAAM,YAKlB,wBAAwB,EAAE,cAAc,WAAW,OAAO,CAAC;AAE9D,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,sBACT,OAAO,UAAU;AAAA,sBACjB,OAAO,UAAU;AAAA,wBACf,OAAO,cAAc,SAAS,IAAI,OAAO,cAAc,KAAK,IAAI,IAAI,MAAM;AAAA;AAAA;AAAA,UAEvG;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC72BA,SAAoB,wBAAwB;AAG5C,SAAS,oBAAoB,OAAoB;AAC/C,QAAM,KAAK,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO;AAClD,QAAM,QAAQ,CAAC,MAAM,EAAE,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,GAAG;AACxD,MAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AACnD,UAAI,OAAO,QAAQ,WAAW;AAC5B,cAAM,KAAK,KAAK,GAAG,OAAO,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,yBACP,aACA,gBACA,WACA,eACQ;AACR,QAAM,WAAqB,CAAC,oCAA+B;AAG3D,WAAS;AAAA,IACP;AAAA,EAUF;AAGA,MAAI,aAAa;AACf,UAAM,WAAW,YACd,IAAI,CAAC,MAAM;AACV,YAAM,SAAS,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM;AACvC,aAAO,KAAK,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,IAAI,cAAS,EAAE,eAAe,gBAAgB;AAAA,IACxF,CAAC,EACA,KAAK,IAAI;AACZ,aAAS;AAAA,MACP,kBAAkB,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA,IAGpC,WAAW;AAAA,IAEb;AAAA,EACF,OAAO;AACL,aAAS;AAAA,MACP;AAAA,IAEF;AAAA,EACF;AAGA,QAAM,aAAa,gBAAgB,GAAG,cAAc,MAAM,aAAa;AACvE,WAAS;AAAA,IACP;AAAA,kCACmC,UAAU;AAAA;AAAA;AAAA;AAAA,EAI/C;AAGA,QAAM,cAAc,iBAAiB,GAAG,eAAe,MAAM,YAAY;AACzE,QAAM,iBAAiB,YACnB,wGACA;AACJ,WAAS;AAAA,IACP;AAAA,iDACkD,WAAW;AAAA,EAC1D,cAAc;AAAA;AAAA;AAAA,EAGnB;AAGA,WAAS;AAAA,IACP;AAAA,EAgBF;AAGA,WAAS;AAAA,IACP;AAAA,EAWF;AAGA,WAAS;AAAA,IACP;AAAA,EAcF;AAEA,SAAO,SAAS,KAAK,aAAa;AACpC;AAEO,SAAS,kBAAkBC,SAAmB;AAEnD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,CAAC,mBAAmB,cAAc,iBAAiB,WAAW,IAAI,MAAM,QAAQ,WAAW;AAAA,QAC/F,SAAgB,oBAAoB;AAAA,QACpC,SAAgB,kBAAkB,EAAE,gBAAgB,kBAAkB,CAAC;AAAA,QACvE,SAAgB,kBAAkB,EAAE,gBAAgB,YAAY,CAAC;AAAA,QACjE,SAAgB,kBAAkB,EAAE,gBAAgB,iBAAiB,CAAC;AAAA,MACxE,CAAC;AAED,YAAM,cAAc,kBAAkB,WAAW,cAAc,kBAAkB,QAAQ;AACzF,YAAM,iBAAiB,aAAa,WAAW,cAAc,aAAa,QAAQ;AAClF,YAAM,YAAY,gBAAgB,WAAW,cAAc,gBAAgB,QAAQ;AACnF,YAAM,gBAAgB,YAAY,WAAW,cAAc,YAAY,QAAQ;AAE/E,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,KAAK,IAAI;AAAA,UACT,MAAM,yBAAyB,aAAa,gBAAgB,WAAW,aAAa;AAAA,UACpF,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,CAAC,gBAAgB,eAAe,IAAI,MAAM,QAAQ,WAAW;AAAA,QACjE,SAAgB,kBAAkB,EAAE,gBAAgB,WAAW,CAAC;AAAA,QAChE,SAAgB,kBAAkB,EAAE,gBAAgB,YAAY,CAAC;AAAA,MACnE,CAAC;AAED,YAAM,QAAkB,CAAC,oCAA+B;AAExD,UAAI,eAAe,WAAW,aAAa;AACzC,YAAI,eAAe,MAAM,SAAS,GAAG;AACnC,gBAAM,QAAQ,eAAe,MAC1B,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,QAAG,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,MAAM,eAAe,EAAE,EAAE,EACnH,KAAK,IAAI;AACZ,gBAAM,KAAK,gBAAgB,eAAe,MAAM,MAAM;AAAA;AAAA,EAAc,KAAK,EAAE;AAAA,QAC7E,OAAO;AACL,gBAAM,KAAK,mGAAmG;AAAA,QAChH;AAAA,MACF,OAAO;AACL,cAAM,KAAK,0GAAqG;AAAA,MAClH;AAEA,UAAI,gBAAgB,WAAW,aAAa;AAC1C,YAAI,gBAAgB,MAAM,SAAS,GAAG;AACpC,gBAAM,OAAO,gBAAgB,MAC1B,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,QAAG,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,eAAe,EAAE,EAAE,EAC9F,KAAK,IAAI;AACZ,gBAAM,KAAK,iBAAiB,gBAAgB,MAAM,MAAM;AAAA;AAAA,EAAgB,IAAI,EAAE;AAAA,QAChF,OAAO;AACL,gBAAM,KAAK,oGAAoG;AAAA,QACjH;AAAA,MACF,OAAO;AACL,cAAM,KAAK,6GAAwG;AAAA,MACrH;AAEA,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,aAAa,GAAG,UAAU,gBAAgB,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,cAAc,MAAM,SAAgB,oBAAoB;AAE9D,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,qCAAqC,UAAU,gBAAgB,CAAC,EAAE;AAAA,MAC/G;AAEA,YAAM,YAAY,YACf,IAAI,CAAC,MAAM;AACV,cAAM,YAAY,EAAE,OACjB,IAAI,CAAC,MAAW,SAAS,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,EAAE,WAAW,eAAe,EAAE,GAAG,EAAE,aAAa,iBAAiB,EAAE,GAAG,EACpH,KAAK,IAAI;AACZ,eAAO,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,IAAI;AAAA,EAAQ,EAAE,eAAe,EAAE;AAAA;AAAA;AAAA,EAAoB,SAAS;AAAA,MAC1G,CAAC,EACA,KAAK,aAAa;AAErB,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,4BAA4B,YAAY,MAAM;AAAA;AAAA,EAAQ,SAAS,IAAI,UAAU,gBAAgB,CAAC;AAAA,MAClI;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA,IAAI,iBAAiB,iCAAiC;AAAA,MACpD,MAAM,YAAY;AAChB,cAAM,cAAc,MAAM,SAAgB,oBAAoB;AAC9D,eAAO;AAAA,UACL,WAAW,YAAY,IAAI,CAAC,OAAO;AAAA,YACjC,KAAK,kBAAkB,EAAE,IAAI;AAAA,YAC7B,MAAM,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK;AAAA,UACzC,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,OAAO,KAAK,EAAE,KAAK,MAAM;AACvB,YAAM,UAAU,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,KAAe,CAAC;AAC1F,YAAM,YAAY,QAAQ,IAAI,mBAAmB,EAAE,KAAK,aAAa;AAErE,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,KAAK,IAAI;AAAA,UACT,MAAM,aAAa;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,SAAS,MAAM,SAAgB,eAAe;AAEpD,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,gCAAgC,UAAU,gBAAgB,CAAC,EAAE;AAAA,MAC1G;AAEA,YAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC7C,YAAM,YAAY,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAChE,YAAM,WAAW,CAAC,aAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAEnF,YAAM,QAAkB,CAAC;AACzB,iBAAW,SAAS,QAAQ;AAC1B,cAAM,KAAK,MAAM,MAAM,IAAI,EAAE;AAC7B,mBAAW,SAAS,SAAS,MAAM,GAAG,GAAG;AACvC,gBAAM,KAAK,OAAO,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,EAAE,EAAE;AAAA,QACzF;AAAA,MACF;AACA,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,cAAc;AACzB,mBAAW,KAAK,WAAW;AACzB,gBAAM,KAAK,OAAO,EAAE,IAAI,MAAM,EAAE,IAAI,GAAG,EAAE,QAAQ,KAAK,EAAE,KAAK,MAAM,EAAE,EAAE;AAAA,QACzE;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,uBAAuB,OAAO,MAAM;AAAA;AAAA,EAAQ,MAAM,KAAK,IAAI,CAAC,IAAI,UAAU,gBAAgB,CAAC;AAAA,MAC/H;AAAA,IACF;AAAA,EACF;AACF;;;ACvSA,SAAS,KAAAC,UAAS;AAIX,SAAS,gBAAgBC,SAAmB;AACjD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQC,GAAE,OAAO,EAAE,SAAS,iFAAiF,EAAE;AAAA,IACjH,OAAO,EAAE,OAAO,MAAM;AACpB,YAAM,UAAU,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,iBAAiB,CAAC;AAC5F,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,WAAW,MAAM;AAE7D,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,UACL,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM,uCAAuC,MAAM;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,MACf;AAAA,QACC,CAAC,MACC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI;AAAA,UACtB,EAAE,MAAM,gBAAgB,EAAE,MAAM,YAAY,SAAS;AAAA,eAChD,EAAE,MAAM,eAAe,EAAE;AAAA,eACzB,EAAE,MAAM,cAAc,EAAE;AAAA,cACzB,EAAE,MAAM,aAAa,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,KACjD,EAAE,MAAM,eAAe,aAAa,EAAE,KAAK,aAAa,IAAI,WAAM,EAAE,KAAK,aAAa,MAAM;AAAA,IAAO;AAAA,MACxG,EACC,KAAK,WAAW;AAEnB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE,mFAAmF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnE,SAAS;AAAA;AAAA;AAAA,YAEnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAOC,GAAE,OAAO,EAAE,SAAS,8FAA8F,EAAE;AAAA,IAC7H,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,QAAQ,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,WAAW,CAAC;AAEpF,YAAM,kBAAkB,MACrB;AAAA,QACC,CAAC,MACC,GAAG,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,MACvE,EAAE,MAAM,cAAc,SAAS,IAAI,gCAA2B,EAAE,KAAK,aAAa,KAAK,IAAI,CAAC,KAAK,OACjG,EAAE,MAAM,aAAa,SAAS,IAC3B;AAAA,mBAAsB,EAAE,KAAK,YAAY,IAAI,CAAC,MAAW,GAAG,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,KAC/F;AAAA,MACR,EACC,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,kBACmB,KAAK;AAAA;AAAA;AAAA,EACQ,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,SAASC,GAAE,OAAO,EAAE,SAAS,yGAAyG,EAAE;AAAA,IAC1I,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,kBAAkB,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,YAAY,CAAC;AAC/F,YAAM,SAAS,CAAC,GAAG,eAAe,EAC/B,KAAK,CAAC,GAAG,OAAQ,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,EAAG,EACrE,MAAM,GAAG,CAAC;AAEb,YAAM,gBAAgB,OAAO,SAAS,IAClC,OAAO,IAAI,CAAC,MAAM,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,GAAG,EAAE,KAAK,IAAI,IACvF;AAEJ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,GACI,OAAO;AAAA;AAAA;AAAA,EACyB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAUrD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAaC,GAAE,OAAO,EAAE,SAAS,2FAA2F;AAAA,MAC5H,QAAQA,GAAE,OAAO,EAAE,SAAS,yEAAyE;AAAA,IACvG;AAAA,IACA,OAAO,EAAE,aAAa,OAAO,MAAM;AACjC,YAAM,WAAW,MAAM,SAAgB,kBAAkB,EAAE,gBAAgB,iBAAiB,CAAC;AAC7F,YAAM,gBAAgB,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM,WAAW,MAAM;AAEtE,YAAM,kBACJ,cAAc,SAAS,IACnB,cAAc,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,YAAO,EAAE,MAAM,eAAe,EAAE,EAAE,EAAE,KAAK,IAAI,IAChH;AAEN,YAAM,iBAAiB,SACpB,IAAI,CAAC,MAAM,UAAU,EAAE,WAAW,IAAI,QAAQ,YAAY,EAAE,GAAG,EAAE,CAAC,EAClE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EACvB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK;AAC/B,YAAM,aAAa,OAAO,OAAO,iBAAiB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAErE,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,GACI,WAAW;AAAA;AAAA,UACJ,MAAM;AAAA,qBACK,UAAU;AAAA;AAAA;AAAA,EACG,eAAe;AAAA;AAAA;AAAA,kBAE/B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAUjC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IAGA;AAAA,MACE,UAAUC,GAAE,OAAO,EAAE;AAAA,QACnB,oCACA,cAAc,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI;AAAA,MAC/D;AAAA,MACA,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,UAAU,YAAY,QAAQ,MAAM;AAC3C,YAAM,KAAK,YAAY,UAAU;AAEjC,UAAI,CAAC,IAAI;AACP,cAAM,YAAY,cAAc,EAC7B,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,WAAM,EAAE,gBAAgB,EAAE,EAC7D,KAAK,IAAI;AACZ,eAAO;AAAA,UACL,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MACE,aAAa,UAAU;AAAA;AAAA;AAAA,EACE,SAAS;AAAA;AAAA;AAAA,cAEtC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY;AAChB,UAAI;AACF,cAAM,kBAAkB,MAAM,SAAgB,kBAAkB;AAAA,UAC9D,gBAAgB,GAAG;AAAA,QACrB,CAAC;AACD,cAAM,SAAS,CAAC,GAAG,eAAe,EAC/B,KAAK,CAAC,GAAG,OAAQ,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,EAAG,EACrE,MAAM,GAAG,CAAC;AACb,YAAI,OAAO,SAAS,GAAG;AACrB,sBACE;AAAA,YAAe,GAAG,kBAAkB;AAAA,IACpC,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,QAChF;AAAA,MACF,QAAQ;AACN,oBAAY;AAAA,MACd;AAEA,YAAM,aAAa,GAAG,OACnB;AAAA,QAAI,CAAC,MACJ,aAAa,EAAE,GAAG,KAAK,EAAE,KAAK;AAAA,YACjB,EAAE,IAAI,qBAAqB,EAAE,mBAAmB,OAAO;AAAA,mBAChD,EAAE,WAAW;AAAA,4BACJ,EAAE,mBAAmB;AAAA,KACjD,EAAE,YACC,EAAE,UAAU;AAAA,UAAI,CAAC,MACf,iBAAiB,EAAE,MAAM;AAAA,KACxB,EAAE,UACC,EAAE,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,IACzD;AAAA,QACN,EAAE,KAAK,IAAI,IACX,MACJ;AAAA,2BAA8B,EAAE,aAAa,KAAK,OAAO,EAAE,aAAa,MAAM;AAAA,MAChF,EACC,KAAK,aAAa;AAErB,YAAM,cAAc,UAChB;AAAA,0CAA6C,OAAO;AAAA;AAAA,IACpD;AAEJ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA;AAAA,EACpB,GAAG,gBAAgB;AAAA,IACtB,cACA;AAAA;AAAA;AAAA;AAAA;AAAA,EACkC,GAAG,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAExC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAEF,GAAG,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAGc,GAAG,kBAAkB;AAAA,iBACzD,GAAG,iBAAiB,YAAY;AAAA,qBAC5B,GAAG,iBAAiB,gBAAgB;AAAA,IAC1D,YACA;AAAA;AAAA;AAAA;AAAA;AAAA,YAEJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;Ab7RA,IAAI,CAAC,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,IAAI,sBAAsB;AACrE,MAAI;AACF,UAAM,UAAUC,SAAQ,QAAQ,IAAI,GAAG,UAAU;AACjD,eAAW,QAAQC,cAAa,SAAS,OAAO,EAAE,MAAM,IAAI,GAAG;AAC7D,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,UAAI,UAAU,GAAI;AAClB,cAAQ,IAAI,QAAQ,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,IAClE;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,mBAAmB;AAEnB,IAAM,iBAAiB;AAEvB,cAAc;AAEd,IAAI;AACJ,IAAI;AACF,gBAAc,MAAM,eAAe;AACrC,SAAS,KAAU;AACjB,QAAM,OACJ,CAAC,QAAQ,IAAI,wBAAwB,CAAC,QAAQ,IAAI,kBAC9C,0GACA;AACN,UAAQ,OAAO,MAAM,yBAAyB,IAAI,OAAO,GAAG,IAAI;AAAA,CAAI;AACpE,UAAQ,KAAK,CAAC;AAChB;AAEA;AAAA,EACE,QAAQ,IAAI,kBAAkB;AAAA,EAC9B;AAAA,EACA;AACF;AAEA,IAAM,SAAS,IAAIC;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc,EAAE,SAAS,CAAC,EAAE;AAAA,IAC5B,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,uBAAuB,MAAM;AAC7B,mBAAmB,MAAM;AACzB,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;AAC1B,0BAA0B,MAAM;AAChC,0BAA0B,MAAM;AAChC,sBAAsB,MAAM;AAC5B,sBAAsB,MAAM;AAC5B,kBAAkB,MAAM;AACxB,gBAAgB,MAAM;AAEtB,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;AAE9B,eAAe,mBAAmB;AAChC,QAAM,kBAAkB;AACxB,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,GAAG,UAAU,gBAAgB;AACrC,QAAQ,GAAG,WAAW,gBAAgB;","names":["readFileSync","resolve","McpServer","workspaceId","workspace","workspaceId","server","z","server","z","z","log","server","workspaceId","z","z","server","z","z","passed","server","z","extractPreview","existsSync","readFileSync","resolve","z","server","z","resolveProjectRoot","resolve","existsSync","readFileSync","abs","z","server","z","z","server","z","server","z","server","z","resolve","readFileSync","McpServer"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/tools/knowledge.ts","../src/tools/labels.ts","../src/tools/health.ts","../src/tools/verify.ts","../src/tools/architecture.ts","../src/tools/workflows.ts","../src/workflows/definitions.ts","../src/tools/session.ts","../src/tools/gitchain.ts","../src/tools/maps.ts","../src/tools/start.ts","../src/presets/collections.ts","../src/resources/index.ts","../src/prompts/index.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { registerKnowledgeTools } from \"./tools/knowledge.js\";\nimport { registerLabelTools } from \"./tools/labels.js\";\nimport { registerHealthTools } from \"./tools/health.js\";\nimport { registerVerifyTools } from \"./tools/verify.js\";\nimport { registerSmartCaptureTools } from \"./tools/smart-capture.js\";\nimport { registerArchitectureTools } from \"./tools/architecture.js\";\nimport { registerWorkflowTools } from \"./tools/workflows.js\";\nimport { registerSessionTools } from \"./tools/session.js\";\nimport { registerGitChainTools } from \"./tools/gitchain.js\";\nimport { registerMapTools } from \"./tools/maps.js\";\nimport { registerStartTools } from \"./tools/start.js\";\nimport { registerResources } from \"./resources/index.js\";\nimport { registerPrompts } from \"./prompts/index.js\";\nimport {\n getWorkspaceId,\n bootstrap,\n orphanAgentSession,\n startAgentSession,\n getAgentSessionId,\n recoverSessionState,\n} from \"./client.js\";\nimport { initAnalytics, trackSessionStarted, shutdownAnalytics } from \"./analytics.js\";\n\nif (!process.env.CONVEX_SITE_URL && !process.env.PRODUCTBRAIN_API_KEY) {\n try {\n const envPath = resolve(process.cwd(), \".env.mcp\");\n for (const line of readFileSync(envPath, \"utf-8\").split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n process.env[trimmed.slice(0, eqIdx)] ??= trimmed.slice(eqIdx + 1);\n }\n } catch {\n // .env.mcp not found — rely on env vars being set by the launcher\n }\n}\n\nbootstrap();\n\nconst SERVER_VERSION = \"2.0.0\";\n\ninitAnalytics();\n\nconst server = new McpServer(\n {\n name: \"Product Brain\",\n version: SERVER_VERSION,\n },\n {\n capabilities: { logging: {} },\n instructions: [\n \"Product Brain — the single source of truth for product knowledge.\",\n \"Terminology, standards, and core data all live here — no need to check external docs.\",\n \"\",\n \"Workflow:\",\n \" 1. Start: call `agent-start` to begin a tracked session.\",\n \" 2. Orient: call `orient` to load workspace context and unlock write tools.\",\n \" 3. Discover: use `search` to find entries, or `list-entries` to browse.\",\n \" 4. Drill in: use `get-entry` for full details — data, labels, relations, history.\",\n \" 5. Context: use `gather-context` with an entryId or a task description.\",\n \" 6. Capture: use `capture` to create entries — auto-links and scores in one call.\",\n \" 7. Commit: use `commit-entry` to promote drafts to SSOT.\",\n \" 8. Connect: use `suggest-links` then `relate-entries` to build the graph.\",\n \" 9. Close: call `agent-close` when done — records session activity.\",\n \"\",\n \"Write tools (capture, update-entry, relate-entries, commit-entry) require:\",\n \" - An active agent session (call agent-start)\",\n \" - Completed orientation (call orient)\",\n \" - A readwrite API key scope\",\n ].join(\"\\n\"),\n },\n);\n\nconst enabledModules = new Set(\n (process.env.PB_MODULES ?? \"core,gitchain,arch\")\n .split(\",\").map((m) => m.trim().toLowerCase()),\n);\n\n// Core (always registered)\nregisterSessionTools(server);\nregisterKnowledgeTools(server);\nregisterLabelTools(server);\nregisterHealthTools(server);\nregisterVerifyTools(server);\nregisterSmartCaptureTools(server);\nregisterWorkflowTools(server);\n\n// Opt-in modules\nif (enabledModules.has(\"gitchain\")) registerGitChainTools(server);\nif (enabledModules.has(\"gitchain\")) registerMapTools(server);\nif (enabledModules.has(\"arch\")) registerArchitectureTools(server);\nregisterStartTools(server);\n\n// Resources and prompts (always registered)\nregisterResources(server);\nregisterPrompts(server);\n\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n\n// On startup: resolve workspace, start agent session, track analytics.\n// Session start is deferred — if it fails, the agent can still call agent-start manually.\ngetWorkspaceId()\n .then(async (wsId) => {\n trackSessionStarted(wsId, SERVER_VERSION);\n try {\n await startAgentSession();\n process.stderr.write(\"[MCP] Agent session started automatically.\\n\");\n } catch (err: any) {\n process.stderr.write(`[MCP] Auto session start failed: ${err.message}. Call agent-start manually.\\n`);\n // Try to recover from an existing session in Convex\n await recoverSessionState();\n }\n })\n .catch(() => {\n process.stderr.write(\"[MCP] Workspace resolution deferred — will retry on first tool call.\\n\");\n });\n\nasync function gracefulShutdown() {\n if (getAgentSessionId()) {\n await orphanAgentSession();\n }\n await shutdownAnalytics();\n process.exit(0);\n}\n\nprocess.on(\"SIGINT\", gracefulShutdown);\nprocess.on(\"SIGTERM\", gracefulShutdown);\n\nprocess.stdin.on(\"end\", async () => {\n if (getAgentSessionId()) {\n await orphanAgentSession();\n }\n await shutdownAnalytics();\n process.exit(0);\n});\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext, requireWriteAccess, recordSessionActivity, getAgentSessionId } from \"../client.js\";\n\nfunction extractPreview(data: any, maxLen: number): string {\n if (!data || typeof data !== \"object\") return \"\";\n const raw = data.description ?? data.canonical ?? data.detail ?? \"\";\n if (typeof raw !== \"string\" || !raw) return \"\";\n return raw.length > maxLen ? raw.substring(0, maxLen) + \"...\" : raw;\n}\n\nexport function registerKnowledgeTools(server: McpServer) {\n\n server.registerTool(\n \"list-collections\",\n {\n title: \"Browse Collections\",\n description:\n \"List every knowledge collection in the workspace — glossary, business rules, tracking events, standards, etc. \" +\n \"Returns each collection's slug, name, description, and field schema. \" +\n \"Start here before capture so you know which collections exist and what fields they expect.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n\n if (collections.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No collections found in this workspace.\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = c.fields\n .map((f: any) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n return `## ${c.name} (\\`${c.slug}\\`)\\n${c.description || \"_No description_\"}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"list-entries\",\n {\n title: \"Browse Entries\",\n description:\n \"List entries in a collection, with optional filters for status, tag, or label. \" +\n \"Returns entry IDs, names, status, and a data preview. \" +\n \"Use list-collections first to discover available collection slugs.\",\n inputSchema: {\n collection: z.string().optional().describe(\"Collection slug, e.g. 'glossary', 'tracking-events', 'business-rules'\"),\n status: z.string().optional().describe(\"Filter: draft | active | verified | deprecated\"),\n tag: z.string().optional().describe(\"Filter by internal tag, e.g. 'health:ambiguous'\"),\n label: z.string().optional().describe(\"Filter by label slug — matches entries across all collections\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ collection, status, tag, label }) => {\n let entries: any[];\n\n if (label) {\n entries = await mcpQuery<any[]>(\"chain.listEntriesByLabel\", { labelSlug: label });\n if (status) entries = entries.filter((e: any) => e.status === status);\n } else {\n entries = await mcpQuery<any[]>(\"chain.listEntries\", {\n collectionSlug: collection,\n status,\n tag,\n });\n }\n\n if (entries.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No entries match the given filters.\" }] };\n }\n\n const formatted = entries\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const dataPreview = e.data\n ? Object.entries(e.data)\n .slice(0, 4)\n .map(([k, v]) => ` ${k}: ${typeof v === \"string\" ? v.substring(0, 120) : JSON.stringify(v)}`)\n .join(\"\\n\")\n : \"\";\n return `- ${id}${e.name} \\`${e.status}\\`${dataPreview ? `\\n${dataPreview}` : \"\"}`;\n })\n .join(\"\\n\\n\");\n\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n return {\n content: [{ type: \"text\" as const, text: `# Entries${scope} (${entries.length})\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"get-entry\",\n {\n title: \"Look Up Entry\",\n description:\n \"Retrieve a single knowledge entry by its human-readable ID (e.g. 'T-SUPPLIER', 'BR-001', 'EVT-workspace_created'). \" +\n \"Returns the full record: all data fields, labels, relations, and change history. \" +\n \"Use search or list-entries first to discover entry IDs.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'BR-001', 'EVT-workspace_created'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const entry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n\n if (!entry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n const lines: string[] = [\n `# ${entry.entryId ? `${entry.entryId}: ` : \"\"}${entry.name}`,\n \"\",\n `**Status:** ${entry.status}`,\n ];\n\n if (entry.data && typeof entry.data === \"object\") {\n lines.push(\"\");\n for (const [key, val] of Object.entries(entry.data)) {\n const display = typeof val === \"string\" ? val : JSON.stringify(val);\n lines.push(`**${key}:** ${display}`);\n }\n }\n\n if (entry.tags?.length > 0) {\n lines.push(\"\", `**Tags:** ${entry.tags.join(\", \")}`);\n }\n\n if (entry.labels?.length > 0) {\n lines.push(\"\", `**Labels:** ${entry.labels.map((l: any) => `\\`${l.slug ?? l.name}\\``).join(\", \")}`);\n }\n\n if (entry.relations?.length > 0) {\n lines.push(\"\", \"## Relations\");\n for (const r of entry.relations) {\n const arrow = r.direction === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const other = r.otherEntryId ? `${r.otherEntryId}: ${r.otherName}` : (r.otherName ?? \"unknown\");\n lines.push(`- ${arrow} **${r.type}** ${other}`);\n }\n }\n\n if (entry.history?.length > 0) {\n lines.push(\"\", \"## History (last 10)\");\n for (const h of entry.history.slice(-10)) {\n const date = new Date(h.timestamp).toISOString().split(\"T\")[0];\n lines.push(`- ${date}: ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"update-entry\",\n {\n title: \"Update Entry\",\n description:\n \"Update an existing entry by its human-readable ID. Only provide the fields you want to change — data fields are merged with existing values. \" +\n \"Creates a draft version by default. Set autoPublish=true to publish immediately. \" +\n \"Use get-entry first to see current values. SOS-020: Cannot update tension status via MCP — process decides (use Product Brain UI after approval).\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to update, e.g. 'T-SUPPLIER', 'BR-001'\"),\n name: z.string().optional().describe(\"New display name\"),\n status: z.string().optional().describe(\"New status: draft | active | verified | deprecated\"),\n data: z.record(z.unknown()).optional().describe(\"Fields to update (merged with existing data)\"),\n order: z.number().optional().describe(\"New sort order\"),\n autoPublish: z.boolean().optional().default(false).describe(\"If true, publishes the change immediately. If false (default), creates a draft version.\"),\n },\n annotations: { idempotentHint: true, destructiveHint: false },\n },\n async ({ entryId, name, status, data, order, autoPublish }) => {\n try {\n requireWriteAccess();\n\n const id = await mcpMutation<string>(\"chain.updateEntry\", {\n entryId,\n name,\n status,\n data,\n order,\n autoPublish,\n changedBy: getAgentSessionId() ? `agent:${getAgentSessionId()}` : undefined,\n });\n\n await recordSessionActivity({ entryModified: entryId });\n\n const wsCtx = await getWorkspaceContext();\n const mode = autoPublish ? 'published' : 'saved as draft';\n return {\n content: [{ type: \"text\" as const, text: `# Entry Updated\\n\\n**${entryId}** has been ${mode}.\\n\\nInternal ID: ${id}\\n**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})` }],\n };\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"SOS-020\")) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# SOS-020: Tension Status Cannot Be Changed via MCP\\n\\n` +\n `Tension status (open, in-progress, closed) must be changed through the defined process, not via MCP.\\n\\n` +\n `**What you can do:**\\n` +\n `- Create tensions: \\`capture collection=tensions name=\"...\" description=\"...\"\\`\\n` +\n `- List tensions: \\`list-entries collection=tensions\\`\\n` +\n `- Update non-status fields (raised, date, priority, description) via \\`update-entry\\`\\n` +\n `- After process approval, a human uses the Product Brain UI to change status\\n\\n` +\n `Process criteria (TBD): e.g. 3+ users approved, or 7 days without valid concerns.`,\n }],\n };\n }\n throw error;\n }\n }\n );\n\n server.registerTool(\n \"search\",\n {\n title: \"Search the Chain\",\n description:\n \"Full-text search across all entries on the Chain. Returns entry names, collection, status, and a description preview. \" +\n \"Scope results to a specific collection (e.g. collection='business-rules') or filter by status (e.g. status='active'). \" +\n \"Use this to discover entries before calling get-entry for full details.\",\n inputSchema: {\n query: z.string().describe(\"Search text (min 2 characters)\"),\n collection: z.string().optional().describe(\"Scope to a collection slug, e.g. 'business-rules', 'glossary', 'tracking-events'\"),\n status: z.string().optional().describe(\"Filter by status: draft | active | verified | deprecated\"),\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n async ({ query, collection, status }) => {\n const scope = collection ? ` in \\`${collection}\\`` : \"\";\n await server.sendLoggingMessage({ level: \"info\", data: `Searching${scope} for \"${query}\"...`, logger: \"product-os\" });\n\n const [results, collections] = await Promise.all([\n mcpQuery<any[]>(\"chain.searchEntries\", { query, collectionSlug: collection, status }),\n mcpQuery<any[]>(\"chain.listCollections\"),\n ]);\n\n if (results.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No results for \"${query}\"${scope}. Try a broader search or check list-collections for available data.` }] };\n }\n\n const collMap = new Map<string, { name: string; slug: string }>();\n for (const c of collections) {\n collMap.set(c._id, { name: c.name, slug: c.slug });\n }\n\n const countsBySlug = new Map<string, number>();\n for (const e of results) {\n const col = collMap.get(e.collectionId);\n const slug = col?.slug ?? \"unknown\";\n countsBySlug.set(slug, (countsBySlug.get(slug) ?? 0) + 1);\n }\n const collSummary = [...countsBySlug.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([slug, count]) => `${count} ${slug}`)\n .join(\", \");\n\n const formatted = results\n .map((e) => {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const col = collMap.get(e.collectionId);\n const colTag = col ? ` [${col.slug}]` : \"\";\n const desc = extractPreview(e.data, 150);\n const preview = desc ? `\\n ${desc}` : \"\";\n return `- ${id}${e.name} \\`${e.status}\\`${colTag}${preview}`;\n })\n .join(\"\\n\");\n\n const header = `# Search Results for \"${query}\"${scope} (${results.length} match${results.length === 1 ? \"\" : \"es\"})\\n\\n**By collection:** ${collSummary}`;\n const footer = `_Tip: Use \\`collection\\` param to scope search. Use get-entry with an entry ID for full details._`;\n\n return {\n content: [{ type: \"text\" as const, text: `${header}\\n\\n${formatted}\\n\\n${footer}` }],\n };\n }\n );\n\n server.registerTool(\n \"get-history\",\n {\n title: \"Entry Change History\",\n description:\n \"Get the audit trail for an entry — when it was created, updated, status-changed, etc. \" +\n \"Returns timestamped events with change details.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'T-SUPPLIER', 'BR-001'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId }) => {\n const history = await mcpQuery<any[]>(\"chain.listEntryHistory\", { entryId });\n\n if (history.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No history found for \\`${entryId}\\`.` }] };\n }\n\n const formatted = history\n .map((h) => {\n const date = new Date(h.timestamp).toISOString();\n const changes = h.changes ? ` — ${JSON.stringify(h.changes)}` : \"\";\n return `- **${date}** ${h.event}${h.changedBy ? ` _(${h.changedBy})_` : \"\"}${changes}`;\n })\n .join(\"\\n\");\n\n return {\n content: [{ type: \"text\" as const, text: `# History for \\`${entryId}\\` (${history.length} events)\\n\\n${formatted}` }],\n };\n }\n );\n\n server.registerTool(\n \"relate-entries\",\n {\n title: \"Link Two Entries\",\n description:\n \"Create a typed relation between two entries, building the knowledge graph. \" +\n \"Use get-entry to see existing relations before adding new ones.\\n\\n\" +\n \"Recommended relation types (extensible — any string is accepted):\\n\" +\n \"- related_to, depends_on, replaces, conflicts_with, references, confused_with\\n\" +\n \"- governs — a rule constrains behavior of a feature\\n\" +\n \"- defines_term_for — a glossary term is canonical vocabulary for a feature/area\\n\" +\n \"- belongs_to — a feature belongs to a product area or parent concept\\n\" +\n \"- informs — a decision or insight informs a feature\\n\" +\n \"- surfaces_tension_in — a tension exists within a feature area\\n\\n\" +\n \"Check glossary for relation type definitions if unsure which to use.\",\n inputSchema: {\n from: z.string().describe(\"Source entry ID, e.g. 'T-SUPPLIER'\"),\n to: z.string().describe(\"Target entry ID, e.g. 'BR-001'\"),\n type: z.string().describe(\"Relation type — use a recommended type or any descriptive string\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ from, to, type }) => {\n requireWriteAccess();\n\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: from,\n toEntryId: to,\n type,\n });\n\n await recordSessionActivity({ relationCreated: true });\n\n const wsCtx = await getWorkspaceContext();\n return {\n content: [{ type: \"text\" as const, text: `# Relation Created\\n\\n**${from}** \\u2014[${type}]\\u2192 **${to}**\\n**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})` }],\n };\n }\n );\n\n server.registerTool(\n \"batch-relate\",\n {\n title: \"Batch Link Entries\",\n description:\n \"Create multiple relations in one call. Accepts an array of {from, to, type} objects. \" +\n \"Use after suggest-links to apply several suggestions at once instead of calling relate-entries repeatedly.\\n\\n\" +\n \"Each relation is created independently — if one fails, the others still succeed. \" +\n \"Returns a summary of created and failed relations.\",\n inputSchema: {\n relations: z.array(z.object({\n from: z.string().describe(\"Source entry ID\"),\n to: z.string().describe(\"Target entry ID\"),\n type: z.string().describe(\"Relation type\"),\n })).min(1).max(20).describe(\"Array of relations to create\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ relations }) => {\n requireWriteAccess();\n\n const results: { from: string; to: string; type: string; ok: boolean; error?: string }[] = [];\n\n for (const rel of relations) {\n try {\n await mcpMutation(\"chain.createEntryRelation\", {\n fromEntryId: rel.from,\n toEntryId: rel.to,\n type: rel.type,\n });\n results.push({ ...rel, ok: true });\n } catch (e: any) {\n results.push({ ...rel, ok: false, error: e.message || \"Unknown error\" });\n }\n }\n\n const created = results.filter((r) => r.ok);\n const failed = results.filter((r) => !r.ok);\n\n const lines = [`# Batch Link Results\\n`];\n lines.push(`**${created.length}** created, **${failed.length}** failed out of ${relations.length} total.\\n`);\n\n if (created.length > 0) {\n lines.push(\"## Created\");\n for (const r of created) {\n lines.push(`- **${r.from}** —[${r.type}]→ **${r.to}**`);\n }\n }\n\n if (failed.length > 0) {\n lines.push(\"\");\n lines.push(\"## Failed\");\n for (const r of failed) {\n lines.push(`- **${r.from}** → **${r.to}** (${r.type}): _${r.error}_`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"find-related\",\n {\n title: \"Find Related Entries\",\n description:\n \"Navigate the knowledge graph — find all entries related to a given entry. \" +\n \"Shows incoming references (what points to this entry), outgoing references (what this entry points to), or both. \" +\n \"Use after get-entry to explore connections, or to answer 'what depends on X?' or 'what references Y?'\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID, e.g. 'GT-019', 'SOS-006'\"),\n direction: z.enum([\"incoming\", \"outgoing\", \"both\"]).default(\"both\")\n .describe(\"Filter: 'incoming' = what references this entry, 'outgoing' = what this entry references\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, direction }) => {\n const relations = await mcpQuery<any[]>(\"chain.listEntryRelations\", { entryId });\n\n if (relations.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No relations found for \\`${entryId}\\`. Use relate-entries to create connections.` }] };\n }\n\n const sourceEntry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n if (!sourceEntry) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n const sourceInternalId = sourceEntry._id;\n\n const MAX_RELATIONS = 25;\n const truncated = relations.length > MAX_RELATIONS;\n const capped = relations.slice(0, MAX_RELATIONS);\n\n const otherIds = new Set<string>();\n for (const r of capped) {\n const otherId = r.fromId === sourceInternalId ? r.toId : r.fromId;\n otherIds.add(otherId);\n }\n\n const otherEntries = new Map<string, { entryId?: string; name: string; collectionId: string }>();\n for (const id of otherIds) {\n const entry = await mcpQuery<any>(\"chain.getEntry\", { id });\n if (entry) {\n otherEntries.set(entry._id, { entryId: entry.entryId, name: entry.name, collectionId: entry.collectionId });\n }\n }\n\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n const collMap = new Map<string, string>();\n for (const c of collections) collMap.set(c._id, c.slug);\n\n const lines: string[] = [`# Relations for ${entryId}: ${sourceEntry.name}`, \"\"];\n\n const enriched = capped.map((r) => {\n const isOutgoing = r.fromId === sourceInternalId;\n const otherId = isOutgoing ? r.toId : r.fromId;\n const other = otherEntries.get(otherId);\n const otherLabel = other?.entryId ? `${other.entryId}: ${other.name}` : (other?.name ?? \"(deleted)\");\n const colSlug = other ? (collMap.get(other.collectionId) ?? \"unknown\") : \"unknown\";\n return { isOutgoing, type: r.type, otherLabel, colSlug };\n });\n\n const outgoing = enriched.filter((r) => r.isOutgoing);\n const incoming = enriched.filter((r) => !r.isOutgoing);\n\n if ((direction === \"outgoing\" || direction === \"both\") && outgoing.length > 0) {\n lines.push(`## Outgoing (${outgoing.length})`);\n for (const r of outgoing) {\n lines.push(`- \\u2192 **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n if ((direction === \"incoming\" || direction === \"both\") && incoming.length > 0) {\n lines.push(`## Incoming (${incoming.length})`);\n for (const r of incoming) {\n lines.push(`- \\u2190 **${r.type}** ${r.otherLabel} [${r.colSlug}]`);\n }\n lines.push(\"\");\n }\n\n const shown = direction === \"outgoing\" ? outgoing : direction === \"incoming\" ? incoming : enriched;\n if (shown.length === 0) {\n lines.push(`No ${direction} relations found for \\`${entryId}\\`.`);\n }\n\n if (truncated) {\n lines.push(`_Showing first ${MAX_RELATIONS} of ${relations.length} relations. Use get-entry for the full picture._`);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"gather-context\",\n {\n title: \"Gather Context\",\n description:\n \"Assemble knowledge context in one call. Three modes:\\n\\n\" +\n \"1. **By entry** (entryId): Traverse the knowledge graph around a specific entry. \" +\n \"Returns all related entries grouped by collection.\\n\" +\n \"2. **By task** (task): Auto-load relevant domain knowledge for a natural-language task. \" +\n \"Searches the chain, traverses the graph, and returns ranked entries with confidence scores.\\n\" +\n \"3. **Graph mode** (entryId + mode='graph'): Enhanced graph traversal with provenance — \" +\n \"each entry includes the full path that led to it (via what relations, from what starting point).\\n\\n\" +\n \"Use mode 1/3 when you have a specific entry ID. Use mode 2 at the start of a conversation \" +\n \"to ground the agent in domain context before writing code or making recommendations.\",\n inputSchema: {\n entryId: z.string().optional().describe(\"Entry ID for graph traversal, e.g. 'FEAT-001', 'GT-019'\"),\n task: z.string().optional().describe(\"Natural-language task description for auto-loading relevant context\"),\n mode: z.enum([\"search\", \"graph\"]).default(\"search\").optional()\n .describe(\"'search' (default, backward-compatible) or 'graph' (enhanced with provenance paths)\"),\n maxHops: z.number().min(1).max(3).default(2)\n .describe(\"How many relation hops to traverse (1=direct only, 2=default, 3=wide net)\"),\n maxResults: z.number().min(1).max(25).default(10).optional()\n .describe(\"Max entries to return in task mode (default 10)\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, task, mode, maxHops, maxResults }) => {\n if (!entryId && !task) {\n return { content: [{ type: \"text\" as const, text: \"Provide either `entryId` (graph traversal) or `task` (auto-load context for a task).\" }] };\n }\n\n // Graph mode: enhanced traversal with provenance paths\n if (entryId && mode === \"graph\") {\n const result = await mcpQuery<any>(\"chain.graphGatherContext\", {\n entryId,\n maxHops: maxHops ?? 2,\n });\n\n if (!result?.root) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n if (result.context.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context for ${result.root.entryId}: ${result.root.name}\\n\\n` +\n `_No relations found._ This entry is not yet connected to the knowledge graph.\\n\\n` +\n `Use \\`suggest-links\\` to discover potential connections.`,\n }],\n };\n }\n\n const byCollection = new Map<string, any[]>();\n for (const entry of result.context) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context for ${result.root.entryId}: ${result.root.name} (graph mode)`,\n `_${result.totalFound} related entries across ${byCollection.size} collections (${result.hopsTraversed} hops)_`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"→\" : \"←\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const provenancePath = e.provenance && e.provenance.length > 1\n ? `\\n _Path: ${e.provenance.map((p: any) => `${p.entryId ?? p.name} [${p.relationType}]`).join(\" → \")}_`\n : \"\";\n const preview = e.preview ? `\\n ${e.preview.substring(0, 120)}` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}${provenancePath}${preview}`);\n }\n lines.push(\"\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n // Task mode: compose searchEntries + gatherContext to build task context.\n if (task && !entryId) {\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Loading context for task: \"${task.substring(0, 80)}...\"`,\n logger: \"product-brain\",\n });\n\n const searchTerms = task\n .replace(/[^\\w\\s]/g, \" \")\n .split(/\\s+/)\n .filter((w) => w.length > 3)\n .slice(0, 12)\n .join(\" \");\n\n const searchResults = await mcpQuery<any[]>(\"chain.searchEntries\", {\n query: searchTerms,\n });\n\n if (!searchResults || searchResults.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context Loaded\\n\\n**Confidence:** None\\n\\n` +\n `No context found for this task. The chain may not cover this area yet.\\n\\n` +\n `_Consider capturing domain knowledge discovered during this task via \\`capture\\`._`,\n }],\n };\n }\n\n const limit = maxResults ?? 10;\n const topHits = searchResults.slice(0, Math.min(limit, 5));\n\n interface ContextEntry {\n entryId?: string;\n name: string;\n collectionName: string;\n hop: number;\n relationType?: string;\n }\n const allEntries: ContextEntry[] = [];\n const seenIds = new Set<string>();\n\n for (const hit of topHits) {\n const hitId = hit.entryId ?? hit._id;\n if (!hitId || seenIds.has(hitId)) continue;\n seenIds.add(hitId);\n\n allEntries.push({\n entryId: hit.entryId,\n name: hit.name ?? \"Untitled\",\n collectionName: hit.collectionName ?? hit.collectionSlug ?? \"unknown\",\n hop: 0,\n });\n\n if (hit.entryId) {\n try {\n const graph = await mcpQuery<any>(\"chain.gatherContext\", {\n entryId: hit.entryId,\n maxHops: maxHops ?? 2,\n });\n if (graph?.related) {\n for (const rel of graph.related) {\n const relId = rel.entryId ?? rel._id;\n if (relId && !seenIds.has(relId)) {\n seenIds.add(relId);\n allEntries.push({\n entryId: rel.entryId,\n name: rel.name ?? \"Untitled\",\n collectionName: rel.collectionName ?? \"unknown\",\n hop: rel.hop ?? 1,\n relationType: rel.relationType,\n });\n }\n }\n }\n } catch {\n // Graph traversal failed for this entry; continue with others\n }\n }\n\n if (allEntries.length >= limit) break;\n }\n\n const trimmed = allEntries.slice(0, limit);\n const confidence = trimmed.length >= 5 ? \"high\" : trimmed.length >= 2 ? \"medium\" : \"low\";\n\n const byCollection = new Map<string, ContextEntry[]>();\n for (const entry of trimmed) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context Loaded`,\n `**Confidence:** ${confidence.charAt(0).toUpperCase() + confidence.slice(1)}`,\n `**Matched:** ${trimmed.length} entries across ${byCollection.size} collection${byCollection.size === 1 ? \"\" : \"s\"}`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`### ${collName} (${entries.length})`);\n for (const e of entries) {\n const id = e.entryId ? `**${e.entryId}:** ` : \"\";\n const hopLabel = e.hop > 0 ? ` _(hop ${e.hop}${e.relationType ? `, ${e.relationType}` : \"\"})_` : \"\";\n lines.push(`- ${id}${e.name}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n lines.push(`_Use \\`get-entry\\` for full details on any entry._`);\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n // Entry mode: traverse the knowledge graph around a specific entry\n const result = await mcpQuery<any>(\"chain.gatherContext\", { entryId, maxHops });\n\n if (!result?.root) {\n return { content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }] };\n }\n\n if (result.related.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# Context for ${result.root.entryId}: ${result.root.name}\\n\\n` +\n `_No relations found._ This entry is not yet connected to the knowledge graph.\\n\\n` +\n `Use \\`suggest-links\\` to discover potential connections, or \\`relate-entries\\` to link manually.`,\n }],\n };\n }\n\n const byCollection = new Map<string, typeof result.related>();\n for (const entry of result.related) {\n const key = entry.collectionName;\n if (!byCollection.has(key)) byCollection.set(key, []);\n byCollection.get(key)!.push(entry);\n }\n\n const lines: string[] = [\n `# Context for ${result.root.entryId}: ${result.root.name}`,\n `_${result.totalRelations} related entries across ${byCollection.size} collections (${result.hopsTraversed} hops traversed)_`,\n \"\",\n ];\n\n for (const [collName, entries] of byCollection) {\n lines.push(`## ${collName} (${entries.length})`);\n for (const e of entries) {\n const arrow = e.relationDirection === \"outgoing\" ? \"\\u2192\" : \"\\u2190\";\n const hopLabel = e.hop > 1 ? ` (hop ${e.hop})` : \"\";\n const id = e.entryId ? `${e.entryId}: ` : \"\";\n lines.push(`- ${arrow} **${e.relationType}** ${id}${e.name}${hopLabel}`);\n }\n lines.push(\"\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"suggest-links\",\n {\n title: \"Suggest Links\",\n description:\n \"Discover potential connections for an entry using graph-aware intelligence. \" +\n \"Accepts an entry ID (e.g. 'FEAT-001') OR an entry name (e.g. 'Chain Intelligence'). \" +\n \"Traverses the knowledge graph (2-hop BFS) and scores candidates by graph distance, \" +\n \"text similarity, and relation type fit. Also finds text-similar entries not yet in the graph.\\n\\n\" +\n \"Returns ranked suggestions with confidence scores, recommended relation types, and \" +\n \"graph-path reasoning explaining WHY each connection matters.\\n\\n\" +\n \"This is a discovery tool — review suggestions and use relate-entries to create the ones that make sense.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID (e.g. 'FEAT-001') or entry name (e.g. 'Chain Intelligence') to find suggestions for\"),\n limit: z.number().min(1).max(20).default(10)\n .describe(\"Max number of suggestions to return\"),\n depth: z.number().min(1).max(3).default(2)\n .describe(\"Graph traversal depth: 1=direct neighbors only, 2=default, 3=wide net\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ entryId, limit, depth }) => {\n const result = await mcpQuery<any>(\"chain.graphSuggestLinks\", {\n entryId,\n maxHops: depth ?? 2,\n limit: limit ?? 10,\n });\n\n if (!result || !result.suggestions || result.suggestions.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No suggestions found for \\`${entryId}\\` — it may already be well-connected, or no similar entries exist.` }] };\n }\n\n const resolved = result.resolvedEntry;\n const resolvedLabel = resolved\n ? `\\`${resolved.entryId ?? resolved.name}\\` (${resolved.name})`\n : `\\`${entryId}\\``;\n\n const suggestions = result.suggestions;\n const graphCount = suggestions.filter((s: any) => s.graphDistance > 0).length;\n const textCount = suggestions.filter((s: any) => s.graphDistance === -1).length;\n const sourceId = resolved?.entryId ?? entryId;\n\n const lines = [\n `# Link Suggestions for ${resolvedLabel}`,\n `_${suggestions.length} potential connections (${graphCount} via graph, ${textCount} via text similarity)._`,\n \"\",\n ];\n\n // Quick Wins — top 3 highest-scoring, actionable at a glance\n const top3 = suggestions.slice(0, 3);\n lines.push(\"## Quick Wins (top 3)\");\n const batchArgs: string[] = [];\n for (const s of top3) {\n const tid = s.entryId ?? \"(no ID)\";\n const relType = s.recommendedRelationType || \"related_to\";\n lines.push(`- **${tid}**: ${s.name} [${s.collectionSlug}] — ${s.score}/100 → \\`${relType}\\``);\n if (s.entryId) batchArgs.push(`{from:\"${sourceId}\",to:\"${tid}\",type:\"${relType}\"}`);\n }\n lines.push(\"\");\n if (batchArgs.length > 0) {\n lines.push(`**Link all 3:** \\`batch-relate relations=[${batchArgs.join(\",\")}]\\``);\n lines.push(\"\");\n }\n\n // Full list\n if (suggestions.length > 3) {\n lines.push(\"## All Suggestions\");\n for (let i = 0; i < suggestions.length; i++) {\n const s = suggestions[i];\n const scoreBar = \"█\".repeat(Math.round(s.score / 10)) + \"░\".repeat(10 - Math.round(s.score / 10));\n const hopLabel = s.graphDistance > 0 ? `${s.graphDistance}-hop` : \"text\";\n const recType = s.recommendedRelationType !== \"related_to\" ? ` → \\`${s.recommendedRelationType}\\`` : \"\";\n lines.push(`${i + 1}. **${s.entryId ?? \"(no ID)\"}**: ${s.name} [${s.collectionSlug}] (${hopLabel})`);\n lines.push(` ${scoreBar} ${s.score}/100${recType}`);\n if (s.preview) {\n lines.push(` ${s.preview}`);\n }\n lines.push(` _${s.reasoning}_`);\n }\n }\n\n lines.push(\"\");\n lines.push(`**To link one:** \\`relate-entries from=\"${sourceId}\" to=\"{target_id}\" type=\"{type}\"\\``);\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"commit-entry\",\n {\n title: \"Commit Entry to Chain\",\n description:\n \"Promote a draft entry to committed status (SSOT on the Chain). \" +\n \"Runs a keyword contradiction check against governance entries before committing. \" +\n \"Warnings are advisory — they do not block the commit.\\n\\n\" +\n \"Use after capture + suggest-links + relate-entries to finalize an entry.\",\n inputSchema: {\n entryId: z.string().describe(\"Entry ID to commit, e.g. 'TEN-abc123', 'GT-019'\"),\n },\n annotations: { destructiveHint: false },\n },\n async ({ entryId }) => {\n requireWriteAccess();\n\n const { runContradictionCheck } = await import(\"./smart-capture.js\");\n\n const entry = await mcpQuery<any>(\"chain.getEntry\", { entryId });\n if (!entry) {\n return {\n content: [{ type: \"text\" as const, text: `Entry \\`${entryId}\\` not found. Try search to find the right ID.` }],\n };\n }\n\n // Run contradiction check before committing\n const descField = entry.data?.description ?? entry.data?.canonical ?? entry.data?.rationale ?? \"\";\n const warnings = await runContradictionCheck(entry.name, descField);\n\n if (warnings.length > 0) {\n await recordSessionActivity({ contradictionWarning: true });\n }\n\n const result = await mcpMutation<any>(\"chain.commitEntry\", { entryId });\n\n await recordSessionActivity({ entryModified: entryId });\n\n const wsCtx = await getWorkspaceContext();\n const lines: string[] = [\n `# Committed: ${entryId}`,\n `**${entry.name}** promoted to SSOT on the Chain.`,\n `**Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})`,\n ];\n\n if (warnings.length > 0) {\n lines.push(\"\");\n lines.push(\"⚠ Contradiction check: proposed entry matched existing governance entries:\");\n for (const w of warnings) {\n lines.push(`- ${w.name} (${w.collection}, ${w.entryId}) — has 'governs' relation to ${w.governsCount} entries`);\n }\n lines.push(\"Run gather-context on these entries before committing.\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nexport function registerLabelTools(server: McpServer) {\n\n server.registerTool(\n \"labels\",\n {\n title: \"Labels\",\n description:\n \"Manage workspace labels — list, create, update, delete, apply to entries, or remove from entries. \" +\n \"Labels can be applied to any entry across any collection for cross-domain filtering. \" +\n \"Similar to labels in Linear or GitHub. Labels support hierarchy (groups with children).\",\n inputSchema: {\n action: z.enum([\"list\", \"create\", \"update\", \"delete\", \"apply\", \"remove\"])\n .describe(\"Action: list all labels, create/update/delete a label, or apply/remove a label on an entry\"),\n slug: z.string().optional().describe(\"Label slug (required for create/update/delete/apply/remove)\"),\n name: z.string().optional().describe(\"Display name (required for create)\"),\n color: z.string().optional().describe(\"Hex color, e.g. '#ef4444'\"),\n description: z.string().optional().describe(\"What this label means\"),\n parentSlug: z.string().optional().describe(\"Parent group slug for label hierarchy\"),\n isGroup: z.boolean().optional().describe(\"True if this is a group container, not a taggable label\"),\n order: z.number().optional().describe(\"Sort order within its group\"),\n entryId: z.string().optional().describe(\"Entry ID for apply/remove actions\"),\n },\n },\n async ({ action, slug, name, color, description, parentSlug, isGroup, order, entryId }) => {\n if (action === \"list\") {\n const labels = await mcpQuery<any[]>(\"chain.listLabels\");\n\n if (labels.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No labels defined in this workspace yet.\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [\"# Workspace Labels\"];\n\n for (const group of groups) {\n lines.push(`\\n## ${group.name}`);\n if (group.description) lines.push(`_${group.description}_`);\n for (const child of children(group._id)) {\n const c = child.color ? ` ${child.color}` : \"\";\n lines.push(` - \\`${child.slug}\\` ${child.name}${c}`);\n }\n }\n\n if (ungrouped.length > 0) {\n lines.push(\"\\n## Ungrouped\");\n for (const label of ungrouped) {\n const c = label.color ? ` ${label.color}` : \"\";\n lines.push(`- \\`${label.slug}\\` ${label.name}${c}${label.description ? ` — _${label.description}_` : \"\"}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n if (!slug) {\n return { content: [{ type: \"text\" as const, text: \"A `slug` is required for this action.\" }] };\n }\n\n if (action === \"create\") {\n if (!name) {\n return { content: [{ type: \"text\" as const, text: \"Cannot create a label without a name.\" }] };\n }\n\n let parentId: string | undefined;\n if (parentSlug) {\n const labels = await mcpQuery<any[]>(\"chain.listLabels\");\n const parent = labels.find((l: any) => l.slug === parentSlug);\n if (!parent) {\n return { content: [{ type: \"text\" as const, text: `Parent label \\`${parentSlug}\\` not found. Use \\`labels action=list\\` to see available groups.` }] };\n }\n parentId = parent._id;\n }\n\n await mcpMutation(\"chain.createLabel\", { slug, name, color, description, parentId, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Created\\n\\n**${name}** (\\`${slug}\\`)` }] };\n }\n\n if (action === \"update\") {\n await mcpMutation(\"chain.updateLabel\", { slug, name, color, description, isGroup, order });\n return { content: [{ type: \"text\" as const, text: `# Label Updated\\n\\n\\`${slug}\\` has been updated.` }] };\n }\n\n if (action === \"delete\") {\n await mcpMutation(\"chain.deleteLabel\", { slug });\n return { content: [{ type: \"text\" as const, text: `# Label Deleted\\n\\n\\`${slug}\\` removed from all entries and deleted.` }] };\n }\n\n if (action === \"apply\" || action === \"remove\") {\n if (!entryId) {\n return { content: [{ type: \"text\" as const, text: \"An `entryId` is required for apply/remove actions.\" }] };\n }\n\n if (action === \"apply\") {\n await mcpMutation(\"chain.applyLabel\", { entryId, labelSlug: slug });\n return { content: [{ type: \"text\" as const, text: `Label \\`${slug}\\` applied to **${entryId}**.` }] };\n }\n\n await mcpMutation(\"chain.removeLabel\", { entryId, labelSlug: slug });\n return { content: [{ type: \"text\" as const, text: `Label \\`${slug}\\` removed from **${entryId}**.` }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpCall, getWorkspaceId, getWorkspaceContext, getAuditLog, getAgentSessionId, setSessionOriented, getApiKeyScope, type AuditEntry } from \"../client.js\";\n\ntype CallCategory = \"read\" | \"search\" | \"write\" | \"label\" | \"meta\";\n\nconst CALL_CATEGORIES: Record<string, CallCategory> = {\n \"chain.getEntry\": \"read\",\n \"chain.listEntries\": \"read\",\n \"chain.listEntryHistory\": \"read\",\n \"chain.listEntryRelations\": \"read\",\n \"chain.listEntriesByLabel\": \"read\",\n \"chain.searchEntries\": \"search\",\n \"chain.createEntry\": \"write\",\n \"chain.updateEntry\": \"write\",\n \"chain.createEntryRelation\": \"write\",\n \"chain.applyLabel\": \"label\",\n \"chain.removeLabel\": \"label\",\n \"chain.createLabel\": \"label\",\n \"chain.updateLabel\": \"label\",\n \"chain.deleteLabel\": \"label\",\n \"chain.listCollections\": \"meta\",\n \"chain.getCollection\": \"meta\",\n \"chain.listLabels\": \"meta\",\n \"resolveWorkspace\": \"meta\",\n};\n\nfunction categorize(fn: string): CallCategory {\n return CALL_CATEGORIES[fn] ?? \"meta\";\n}\n\nfunction formatDuration(ms: number): string {\n if (ms < 60_000) return `${Math.round(ms / 1000)}s`;\n const mins = Math.floor(ms / 60_000);\n const secs = Math.round((ms % 60_000) / 1000);\n return `${mins}m ${secs}s`;\n}\n\nfunction buildSessionSummary(log: readonly AuditEntry[]): string {\n if (log.length === 0) return \"\";\n\n const byCategory = new Map<CallCategory, Map<string, number>>();\n let errorCount = 0;\n let writeCreates = 0;\n let writeUpdates = 0;\n\n for (const entry of log) {\n const cat = categorize(entry.fn);\n if (!byCategory.has(cat)) byCategory.set(cat, new Map());\n const fnCounts = byCategory.get(cat)!;\n fnCounts.set(entry.fn, (fnCounts.get(entry.fn) ?? 0) + 1);\n\n if (entry.status === \"error\") errorCount++;\n if (entry.fn === \"chain.createEntry\" && entry.status === \"ok\") writeCreates++;\n if (entry.fn === \"chain.updateEntry\" && entry.status === \"ok\") writeUpdates++;\n }\n\n const firstTs = new Date(log[0].ts).getTime();\n const lastTs = new Date(log[log.length - 1].ts).getTime();\n const duration = formatDuration(lastTs - firstTs);\n\n const lines: string[] = [`# Session Summary (${duration})\\n`];\n\n const categoryLabels: [CallCategory, string][] = [\n [\"read\", \"Reads\"],\n [\"search\", \"Searches\"],\n [\"write\", \"Writes\"],\n [\"label\", \"Labels\"],\n [\"meta\", \"Meta\"],\n ];\n\n for (const [cat, label] of categoryLabels) {\n const fnCounts = byCategory.get(cat);\n if (!fnCounts || fnCounts.size === 0) continue;\n const total = [...fnCounts.values()].reduce((a, b) => a + b, 0);\n const detail = [...fnCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([fn, count]) => `${fn.replace(\"chain.\", \"\")} x${count}`)\n .join(\", \");\n lines.push(`- **${label}:** ${total} call${total === 1 ? \"\" : \"s\"} (${detail})`);\n }\n\n lines.push(`- **Errors:** ${errorCount}`);\n\n if (writeCreates > 0 || writeUpdates > 0) {\n lines.push(\"\");\n lines.push(\"## Knowledge Contribution\");\n if (writeCreates > 0) lines.push(`- ${writeCreates} entr${writeCreates === 1 ? \"y\" : \"ies\"} created`);\n if (writeUpdates > 0) lines.push(`- ${writeUpdates} entr${writeUpdates === 1 ? \"y\" : \"ies\"} updated`);\n }\n\n return lines.join(\"\\n\");\n}\n\nexport function registerHealthTools(server: McpServer) {\n\n server.registerTool(\n \"health\",\n {\n title: \"Health Check\",\n description:\n \"Verify that Product Brain is running and can reach its backend. \" +\n \"Returns workspace status, collection count, entry count, and latency. \" +\n \"Use this to confirm connectivity before doing real work.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const start = Date.now();\n const errors: string[] = [];\n\n let workspaceId: string | undefined;\n try {\n workspaceId = await getWorkspaceId();\n } catch (e: any) {\n errors.push(`Workspace resolution failed: ${e.message}`);\n }\n\n let collections: any[] = [];\n try {\n collections = await mcpQuery<any[]>(\"chain.listCollections\");\n } catch (e: any) {\n errors.push(`Collection fetch failed: ${e.message}`);\n }\n\n let totalEntries = 0;\n if (collections.length > 0) {\n try {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n totalEntries = entries.length;\n } catch (e: any) {\n errors.push(`Entry count failed: ${e.message}`);\n }\n }\n\n let wsCtx: { workspaceSlug: string; workspaceName: string } | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch { /* already captured workspace error above */ }\n\n const durationMs = Date.now() - start;\n const healthy = errors.length === 0;\n\n const lines = [\n `# ${healthy ? \"Healthy\" : \"Degraded\"}`,\n \"\",\n `**Workspace:** ${workspaceId ?? \"unresolved\"}`,\n `**Workspace Slug:** ${wsCtx?.workspaceSlug ?? \"unknown\"}`,\n `**Workspace Name:** ${wsCtx?.workspaceName ?? \"unknown\"}`,\n `**Collections:** ${collections.length}`,\n `**Entries:** ${totalEntries}`,\n `**Latency:** ${durationMs}ms`,\n ];\n\n if (errors.length > 0) {\n lines.push(\"\", \"## Errors\");\n for (const err of errors) {\n lines.push(`- ${err}`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"whoami\",\n {\n title: \"Session Identity\",\n description:\n \"Returns the current workspace and auth context for this MCP session. \" +\n \"Use at the start of a session to confirm you're operating on the right workspace before making writes.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const ctx = await getWorkspaceContext();\n const lines = [\n `# Session Identity`,\n \"\",\n `**Workspace ID:** ${ctx.workspaceId}`,\n `**Workspace Slug:** ${ctx.workspaceSlug}`,\n `**Workspace Name:** ${ctx.workspaceName}`,\n ];\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"workspace-status\",\n {\n title: \"Workspace Status\",\n description:\n \"The 'Monday morning' tool — returns workspace readiness score, specific gaps with \" +\n \"suggested next actions, and workspace stats (entries, relations, orphans, drafts).\\n\\n\" +\n \"Use this to understand how ready the workspace is, what foundational knowledge is missing, \" +\n \"and what to work on next. Great for starting a session or planning knowledge work.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const result = await mcpQuery<any>(\"chain.workspaceReadiness\");\n\n const { score, totalChecks, passedChecks, checks, gaps, stats } = result;\n\n const scoreBar = \"█\".repeat(Math.round(score / 10)) + \"░\".repeat(10 - Math.round(score / 10));\n\n const lines = [\n `# Workspace Readiness: ${score}%`,\n `${scoreBar} ${passedChecks}/${totalChecks} requirements met`,\n \"\",\n \"## Stats\",\n `- **Entries:** ${stats.totalEntries} (${stats.activeCount} active, ${stats.draftCount} draft)`,\n `- **Relations:** ${stats.totalRelations}`,\n `- **Collections:** ${stats.collectionCount}`,\n `- **Orphaned:** ${stats.orphanedCount} committed entries with no relations`,\n \"\",\n ];\n\n if (gaps.length > 0) {\n lines.push(\"## Gaps (action required)\");\n for (const gap of gaps) {\n lines.push(`- [ ] **${gap.label}** — ${gap.description}`);\n lines.push(` ${gap.current}/${gap.required} | _${gap.guidance}_`);\n }\n lines.push(\"\");\n }\n\n const passed = checks.filter((c: any) => c.passed);\n if (passed.length > 0) {\n lines.push(\"## Passed\");\n for (const check of passed) {\n lines.push(`- [x] **${check.label}** (${check.current}/${check.required})`);\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"orient\",\n {\n title: \"Orient — Start Here\",\n description:\n \"The single entry point for starting a session. Returns everything needed in one call: \" +\n \"workspace identity, readiness score, prior session summaries, architecture/governance \" +\n \"constraints, open tensions, and suggested next actions.\\n\\n\" +\n \"Use this FIRST. One call to orient replaces 3–5 individual tool calls.\\n\\n\" +\n \"Completing orientation unlocks write tools for the active session.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const errors: string[] = [];\n const agentSessionId = getAgentSessionId();\n\n let wsCtx: { workspaceSlug: string; workspaceName: string; workspaceId: string } | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch (e: any) {\n errors.push(`Workspace: ${e.message}`);\n }\n\n // Pull order (hard-capped, per spec):\n // 1. Last 3 closed session summaries\n // 2. Up to 8 entries from architecture, decisions, business-rules (committed only, by updatedAt desc)\n // 3. All open tensions (no cap)\n // 4. Workspace readiness score and gaps\n\n let priorSessions: any[] = [];\n let maxSessions = 3;\n if (wsCtx) {\n try {\n priorSessions = await mcpQuery<any[]>(\"agent.recentSessions\", { limit: maxSessions });\n } catch { /* non-critical */ }\n }\n\n let constraintEntries: any[] = [];\n let maxConstraints = 8;\n try {\n const [archEntries, ruleEntries, decisionEntries] = await Promise.all([\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"architecture\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"decisions\" }),\n ]);\n const committed = [\n ...(archEntries ?? []).filter((e: any) => e.status === \"active\" || e.status === \"healthy\"),\n ...(ruleEntries ?? []).filter((e: any) => e.status === \"Active\" || e.status === \"active\"),\n ...(decisionEntries ?? []).filter((e: any) => e.status === \"Decided\" || e.status === \"active\"),\n ];\n constraintEntries = committed\n .sort((a: any, b: any) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, maxConstraints);\n } catch { /* non-critical */ }\n\n let openTensions: any[] = [];\n try {\n const tensions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"tensions\" });\n openTensions = (tensions ?? []).filter((e: any) => e.status === \"draft\");\n } catch { /* non-critical */ }\n\n let readiness: any = null;\n try {\n readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n } catch (e: any) {\n errors.push(`Readiness: ${e.message}`);\n }\n\n // Build response, estimating token count.\n // Rough estimate: 1 token ≈ 4 chars. Target < 6000 tokens = ~24000 chars.\n const TOKEN_LIMIT = 6000;\n const CHAR_PER_TOKEN = 4;\n const CHAR_LIMIT = TOKEN_LIMIT * CHAR_PER_TOKEN;\n\n const lines: string[] = [];\n let charCount = 0;\n\n function addLine(line: string): void {\n lines.push(line);\n charCount += line.length + 1;\n }\n\n function addLines(ls: string[]): void {\n for (const l of ls) addLine(l);\n }\n\n // --- Identity ---\n if (wsCtx) {\n addLine(`# ${wsCtx.workspaceName}`);\n addLine(`_Workspace \\`${wsCtx.workspaceSlug}\\` — Product Brain is healthy._`);\n } else {\n addLine(\"# Workspace\");\n addLine(\"_Could not resolve workspace._\");\n }\n addLine(\"\");\n\n // --- Readiness (never cut) ---\n if (readiness) {\n const scoreBar = \"█\".repeat(Math.round(readiness.score / 10)) + \"░\".repeat(10 - Math.round(readiness.score / 10));\n addLine(`## Readiness: ${readiness.score}%`);\n addLine(`${scoreBar} ${readiness.passedChecks}/${readiness.totalChecks} requirements`);\n addLine(\"\");\n if (readiness.gaps && readiness.gaps.length > 0) {\n addLine(\"### Gaps\");\n for (const gap of readiness.gaps) {\n addLine(`- [ ] **${gap.label}** (${gap.current}/${gap.required}) — _${gap.guidance}_`);\n }\n addLine(\"\");\n }\n }\n\n // --- Open tensions (never cut) ---\n if (openTensions.length > 0) {\n addLine(`## Open Tensions (${openTensions.length})`);\n for (const t of openTensions) {\n const id = t.entryId ?? \"(no ID)\";\n const prio = t.data?.priority ?? \"\";\n addLine(`- \\`${id}\\` ${t.name}${prio ? ` _(${prio})_` : \"\"}`);\n }\n addLine(\"\");\n }\n\n // --- Token budget check: if we're over budget, cut sessions to 2, constraints to 5 ---\n if (charCount > CHAR_LIMIT * 0.6) {\n maxSessions = 2;\n maxConstraints = 5;\n priorSessions = priorSessions.slice(0, maxSessions);\n constraintEntries = constraintEntries.slice(0, maxConstraints);\n }\n\n // --- Prior sessions ---\n if (priorSessions.length > 0) {\n addLine(`## Prior Agent Sessions (last ${priorSessions.length})`);\n for (const s of priorSessions) {\n const date = new Date(s.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(s.entriesCreated) ? s.entriesCreated.length : s.entriesCreated ?? 0;\n const modified = Array.isArray(s.entriesModified) ? s.entriesModified.length : s.entriesModified ?? 0;\n const stats = `${created} created, ${modified} modified, ${s.relationsCreated ?? 0} relations`;\n const gates = (s.gateFailures ?? 0) > 0 ? `, ${s.gateFailures} gate failures` : \"\";\n const warns = (s.contradictionWarnings ?? 0) > 0 ? `, ${s.contradictionWarnings} contradiction warnings` : \"\";\n addLine(`- **${date}** (${s.status}, by ${s.initiatedBy ?? \"unknown\"}) — ${stats}${gates}${warns}`);\n }\n addLine(\"\");\n }\n\n // --- Architecture & governance constraints ---\n if (constraintEntries.length > 0) {\n addLine(`## Active Constraints (${constraintEntries.length})`);\n addLine(\"_Architecture, business rules, and decisions that govern this workspace._\");\n addLine(\"\");\n for (const c of constraintEntries) {\n const id = c.entryId ?? \"(no ID)\";\n const col = c.collectionSlug ?? \"\";\n const desc = c.data?.description ?? c.data?.rationale ?? \"\";\n const truncated = desc.length > 100 ? desc.slice(0, 100) + \"...\" : desc;\n addLine(`- \\`${id}\\` **${c.name}** [${col}] — ${truncated}`);\n }\n addLine(\"\");\n }\n\n if (errors.length > 0) {\n addLine(\"## Errors\");\n for (const err of errors) addLine(`- ${err}`);\n addLine(\"\");\n }\n\n // --- Mark session as oriented ---\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n\n const scope = getApiKeyScope();\n const sessionInfo = `Session ${agentSessionId}.`;\n const readinessInfo = readiness ? `${readiness.score}% readiness.` : \"\";\n const tensionInfo = openTensions.length > 0 ? `${openTensions.length} open tensions.` : \"No open tensions.\";\n\n let sessionSummary = \"\";\n if (priorSessions.length > 0) {\n const lastSession = priorSessions[0];\n const created = Array.isArray(lastSession.entriesCreated) ? lastSession.entriesCreated.length : lastSession.entriesCreated ?? 0;\n const modified = Array.isArray(lastSession.entriesModified) ? lastSession.entriesModified.length : lastSession.entriesModified ?? 0;\n sessionSummary = `Last session: ${created} created, ${modified} modified.`;\n }\n\n addLine(\"---\");\n addLine(`Orientation complete. ${sessionInfo} Write tools now available. ${readinessInfo} ${tensionInfo} ${sessionSummary}`);\n } catch {\n addLine(\"---\");\n addLine(\"_Warning: Could not mark session as oriented. Write tools may be restricted._\");\n }\n } else {\n addLine(\"---\");\n addLine(\"_No active agent session. Call `agent-start` to begin a tracked session._\");\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n );\n\n server.registerTool(\n \"mcp-audit\",\n {\n title: \"Session Audit Log\",\n description:\n \"Show a session summary (reads, writes, searches, contributions) and the last N backend calls. \" +\n \"Useful for debugging, tracing tool behavior, and seeing what you contributed to the chain.\",\n inputSchema: {\n limit: z.number().min(1).max(50).default(20).describe(\"How many recent calls to show (max 50)\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ limit }) => {\n const log = getAuditLog();\n const recent = log.slice(-limit);\n\n if (recent.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No calls recorded yet this session.\" }] };\n }\n\n const summary = buildSessionSummary(log);\n\n const logLines = [`# Audit Log (last ${recent.length} of ${log.length} total)\\n`];\n for (const entry of recent) {\n const icon = entry.status === \"ok\" ? \"\\u2713\" : \"\\u2717\";\n const errPart = entry.error ? ` \\u2014 ${entry.error}` : \"\";\n logLines.push(`${icon} \\`${entry.fn}\\` ${entry.durationMs}ms ${entry.status}${errPart}`);\n }\n\n return {\n content: [{ type: \"text\" as const, text: `${summary}\\n\\n---\\n\\n${logLines.join(\"\\n\")}` }],\n };\n }\n );\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\n// ── Types ──────────────────────────────────────────────────────────────\n\ntype MappingKind = \"file\" | \"schema\" | \"conceptual\";\ntype CheckResult = \"verified\" | \"drifted\" | \"unverifiable\";\n\ninterface MappingCheck {\n entryId: string;\n entryName: string;\n field: string;\n kind: MappingKind;\n result: CheckResult;\n reason: string;\n currentStatus: string;\n}\n\ninterface RefCheck {\n entryId: string;\n entryName: string;\n refValue: string;\n found: boolean;\n}\n\n// ── Project Root Resolution ────────────────────────────────────────────\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\n// ── Schema Parser ──────────────────────────────────────────────────────\n\nfunction parseConvexSchema(schemaPath: string): Map<string, Set<string>> {\n const content = readFileSync(schemaPath, \"utf-8\");\n const tables = new Map<string, Set<string>>();\n let currentTable: string | null = null;\n\n for (const line of content.split(\"\\n\")) {\n const tableMatch = line.match(/^\\t(\\w+):\\s*defineTable\\(/);\n if (tableMatch) {\n currentTable = tableMatch[1];\n tables.set(currentTable, new Set());\n continue;\n }\n\n if (currentTable && /^\\t[}\\)]/.test(line) && !/^\\t\\t/.test(line)) {\n currentTable = null;\n continue;\n }\n\n if (currentTable) {\n const fieldMatch = line.match(/^\\t\\t(\\w+):\\s*v\\./);\n if (fieldMatch) tables.get(currentTable)!.add(fieldMatch[1]);\n }\n }\n\n return tables;\n}\n\n// ── Code Mapping Classifiers ───────────────────────────────────────────\n\nfunction cleanFieldRef(field: string): string {\n return field\n .replace(/\\s*\\(.*\\)\\s*$/, \"\")\n .replace(/\\s*=\\s*.*$/, \"\")\n .trim();\n}\n\nfunction splitMultiRefs(field: string): string[] {\n if (field.includes(\" + \")) return field.split(/\\s*\\+\\s*/);\n return [field];\n}\n\nconst FILE_EXT_RE = /\\.(ts|js|svelte|json|css|md|jsx|tsx|mjs|cjs)(?:\\s|$)/i;\n\nfunction classifyRef(cleaned: string): MappingKind {\n if (cleaned.includes(\"/\") || FILE_EXT_RE.test(cleaned) || /^\\.\\w+/.test(cleaned)) {\n return \"file\";\n }\n if (/^\\w+\\.\\w+$/.test(cleaned)) return \"schema\";\n if (/^\\w+\\s+table$/i.test(cleaned)) return \"schema\";\n return \"conceptual\";\n}\n\n// ── Verification Checkers ──────────────────────────────────────────────\n\nfunction checkFileRef(ref: string, root: string): { result: CheckResult; reason: string } {\n const filePart = ref.split(/\\s+/)[0];\n const fullPath = resolve(root, filePart);\n if (existsSync(fullPath)) return { result: \"verified\", reason: \"exists\" };\n return { result: \"drifted\", reason: `not found: ${filePart}` };\n}\n\nfunction checkSchemaRef(\n ref: string,\n schema: Map<string, Set<string>>,\n): { result: CheckResult; reason: string } {\n const tableOnlyMatch = ref.match(/^(\\w+)\\s+table$/i);\n if (tableOnlyMatch) {\n const table = tableOnlyMatch[1];\n if (schema.has(table)) return { result: \"verified\", reason: `table \"${table}\" exists` };\n return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n }\n\n const dotIdx = ref.indexOf(\".\");\n if (dotIdx > 0) {\n const table = ref.slice(0, dotIdx);\n const field = ref.slice(dotIdx + 1);\n if (!schema.has(table)) return { result: \"drifted\", reason: `table \"${table}\" not found in schema` };\n if (!schema.get(table)!.has(field)) return { result: \"drifted\", reason: `field \"${field}\" not found in table \"${table}\"` };\n return { result: \"verified\", reason: `${table}.${field} exists` };\n }\n\n return { result: \"unverifiable\", reason: \"could not parse schema reference\" };\n}\n\n// ── Trust Report Formatter ─────────────────────────────────────────────\n\nfunction formatTrustReport(\n collection: string,\n entryCount: number,\n mappings: MappingCheck[],\n refs: RefCheck[],\n fixes: string[],\n mode: string,\n schemaTableCount: number,\n projectRoot: string,\n): string {\n const verified = mappings.filter((c) => c.result === \"verified\").length;\n const drifted = mappings.filter((c) => c.result === \"drifted\").length;\n const unverifiable = mappings.filter((c) => c.result === \"unverifiable\").length;\n\n const refsValid = refs.filter((c) => c.found).length;\n const refsBroken = refs.filter((c) => !c.found).length;\n\n const totalChecks = mappings.length + refs.length;\n const totalPassed = verified + refsValid;\n const trustScore = totalChecks > 0 ? Math.round((totalPassed / totalChecks) * 100) : 100;\n\n const lines: string[] = [\n `# Trust Report: ${collection} (${entryCount} entries scanned)`,\n \"\",\n ];\n\n if (mappings.length > 0) {\n lines.push(\n \"## Code Mapping Verification\",\n `- ${mappings.length} mappings checked`,\n `- ${verified} verified (${Math.round((verified / mappings.length) * 100)}%)`,\n `- ${drifted} drifted (file/schema not found)`,\n `- ${unverifiable} unverifiable (conceptual — skipped)`,\n \"\",\n );\n }\n\n if (drifted > 0) {\n lines.push(\"### Drifted Mappings\");\n for (const mc of mappings.filter((c) => c.result === \"drifted\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\` — ${mc.reason}`);\n }\n lines.push(\"\");\n }\n\n if (unverifiable > 0) {\n lines.push(\"### Unverifiable (Conceptual)\");\n for (const mc of mappings.filter((c) => c.result === \"unverifiable\")) {\n lines.push(`- **${mc.entryId}** (${mc.entryName}): \\`${mc.field}\\``);\n }\n lines.push(\"\");\n }\n\n if (refs.length > 0) {\n lines.push(\n \"## Cross-Reference Verification\",\n `- ${refs.length} references checked`,\n `- ${refsValid} valid (${refs.length > 0 ? Math.round((refsValid / refs.length) * 100) : 0}%)`,\n `- ${refsBroken} broken`,\n \"\",\n );\n }\n\n if (refsBroken > 0) {\n lines.push(\"### Broken References\");\n for (const rc of refs.filter((c) => !c.found)) {\n lines.push(`- **${rc.entryId}** (${rc.entryName}): relatedRules \\`${rc.refValue}\\` — entry not found`);\n }\n lines.push(\"\");\n }\n\n lines.push(`## Trust Score: ${trustScore}% (${totalPassed} of ${totalChecks} checks passed)`);\n\n if (mode === \"fix\" && fixes.length > 0) {\n lines.push(\n \"\",\n \"## Applied Fixes\",\n `Updated codeMapping status from \\`aligned\\` → \\`drifted\\` on ${fixes.length} entr${fixes.length === 1 ? \"y\" : \"ies\"}:`,\n );\n for (const eid of fixes) lines.push(`- ${eid}`);\n } else if (mode === \"report\" && drifted > 0) {\n const fixable = mappings.filter((c) => c.result === \"drifted\" && c.currentStatus === \"aligned\").length;\n if (fixable > 0) {\n lines.push(\"\", `_${fixable} mapping(s) marked \"aligned\" but actually drifted. Run with mode=\"fix\" to update._`);\n }\n }\n\n lines.push(\"\", \"---\", `_Schema: ${schemaTableCount} tables parsed from convex/schema.ts. Project root: ${projectRoot}_`);\n\n return lines.join(\"\\n\");\n}\n\n// ── Tool Registration ──────────────────────────────────────────────────\n\nexport function registerVerifyTools(server: McpServer) {\n server.registerTool(\n \"verify\",\n {\n title: \"Verify the Chain\",\n description:\n \"Verify knowledge entries against the actual codebase. Checks glossary code mappings \" +\n \"(do referenced files and schema fields still exist?) and validates cross-references \" +\n \"(do relatedRules point to real entries?). Produces a trust report with a trust score. \" +\n \"Use mode='fix' to auto-update drifted codeMapping statuses.\",\n inputSchema: {\n collection: z.string().default(\"glossary\")\n .describe(\"Collection slug to verify (default: glossary)\"),\n mode: z.enum([\"report\", \"fix\"]).default(\"report\")\n .describe(\"'report' = read-only trust report. 'fix' = also update drifted codeMapping statuses.\"),\n },\n annotations: { readOnlyHint: false },\n },\n async ({ collection, mode }) => {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Verification Failed\\n\\n\" +\n \"Cannot find project root (looked for `convex/schema.ts` in cwd and parent directory).\\n\\n\" +\n \"Set `WORKSPACE_PATH` in `.env.mcp` to the absolute path of the Product Brain project root.\",\n }],\n };\n }\n\n const schema = parseConvexSchema(resolve(projectRoot, \"convex/schema.ts\"));\n\n await server.sendLoggingMessage({\n level: \"info\",\n data: `Verifying \"${collection}\" against ${schema.size} schema tables at ${projectRoot}`,\n logger: \"product-os\",\n });\n\n const scopedEntries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: collection });\n\n if (scopedEntries.length === 0) {\n return {\n content: [{ type: \"text\" as const, text: `No entries found in \\`${collection}\\`. Nothing to verify.` }],\n };\n }\n\n // Build cross-reference lookup: fetch all entries to check relatedRules\n let allEntryIds: Set<string>;\n try {\n const allEntries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n allEntryIds = new Set(allEntries.map((e: any) => e.entryId).filter(Boolean));\n } catch {\n allEntryIds = new Set(scopedEntries.map((e: any) => e.entryId).filter(Boolean));\n }\n\n const mappingChecks: MappingCheck[] = [];\n const refChecks: RefCheck[] = [];\n\n for (const entry of scopedEntries) {\n const eid = entry.entryId ?? entry.name;\n const ename = entry.name;\n\n // ── Code mapping verification ──\n const codeMappings: any[] = entry.data?.codeMapping ?? [];\n for (const cm of codeMappings) {\n const rawField: string = cm.field ?? \"\";\n for (const rawRef of splitMultiRefs(rawField)) {\n const cleaned = cleanFieldRef(rawRef);\n if (!cleaned) continue;\n\n const kind = classifyRef(cleaned);\n let result: CheckResult;\n let reason: string;\n\n if (kind === \"file\") {\n ({ result, reason } = checkFileRef(cleaned, projectRoot));\n } else if (kind === \"schema\") {\n ({ result, reason } = checkSchemaRef(cleaned, schema));\n } else {\n result = \"unverifiable\";\n reason = \"conceptual reference\";\n }\n\n mappingChecks.push({\n entryId: eid, entryName: ename, field: rawRef.trim(),\n kind, result, reason, currentStatus: cm.status ?? \"unknown\",\n });\n }\n }\n\n // ── Cross-reference verification (relatedRules only) ──\n const MAX_CROSS_REFS = 50;\n const relatedRules: string[] = entry.data?.relatedRules ?? [];\n for (const ruleId of relatedRules) {\n if (refChecks.length >= MAX_CROSS_REFS) break;\n refChecks.push({\n entryId: eid, entryName: ename, refValue: ruleId,\n found: allEntryIds.has(ruleId),\n });\n }\n }\n\n // ── Fix mode: update aligned → drifted ──\n const fixes: string[] = [];\n if (mode === \"fix\") {\n const driftedByEntry = new Map<string, Set<string>>();\n for (const mc of mappingChecks) {\n if (mc.result === \"drifted\" && mc.currentStatus === \"aligned\") {\n if (!driftedByEntry.has(mc.entryId)) driftedByEntry.set(mc.entryId, new Set());\n driftedByEntry.get(mc.entryId)!.add(mc.field);\n }\n }\n\n for (const [eid, driftedFields] of driftedByEntry) {\n const entry = scopedEntries.find((e: any) => (e.entryId ?? e.name) === eid);\n if (!entry?.entryId) continue;\n\n const updated = (entry.data?.codeMapping ?? []).map((cm: any) =>\n cm.status === \"aligned\" && driftedFields.has(cm.field)\n ? { ...cm, status: \"drifted\" }\n : cm,\n );\n\n await mcpMutation(\"chain.updateEntry\", {\n entryId: entry.entryId,\n data: { codeMapping: updated },\n });\n fixes.push(entry.entryId);\n }\n }\n\n const report = formatTrustReport(\n collection, scopedEntries.length,\n mappingChecks, refChecks, fixes, mode,\n schema.size, projectRoot,\n );\n\n return { content: [{ type: \"text\" as const, text: report }] };\n },\n );\n}\n","/**\n * Architecture tools — ARCH-node-mcp (Core layer)\n *\n * Tools: architecture (show/explore/flow), architecture-admin (seed/check)\n * Chain refs: FEAT-ARCH-001 (Architecture Explorer), FEAT-dep-health (Dep Health Scanner),\n * SOS-dbl1n9 (dependency direction rule), GT-wk426u (Fitness Function)\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { resolve, relative, dirname, normalize } from \"node:path\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation } from \"../client.js\";\n\nconst COLLECTION_SLUG = \"architecture\";\n\nconst COLLECTION_FIELDS = [\n { key: \"archType\", label: \"Architecture Type\", type: \"select\", required: true, options: [\"template\", \"layer\", \"node\", \"flow\"], searchable: true },\n { key: \"templateRef\", label: \"Template Entry ID\", type: \"text\", searchable: false },\n { key: \"layerRef\", label: \"Layer Entry ID\", type: \"text\", searchable: false },\n { key: \"description\", label: \"Description\", type: \"text\", searchable: true },\n { key: \"color\", label: \"Color\", type: \"text\" },\n { key: \"icon\", label: \"Icon\", type: \"text\" },\n { key: \"sourceNode\", label: \"Source Node (flows)\", type: \"text\" },\n { key: \"targetNode\", label: \"Target Node (flows)\", type: \"text\" },\n { key: \"filePaths\", label: \"File Paths\", type: \"text\", searchable: true },\n { key: \"owner\", label: \"Owner (circle/role)\", type: \"text\", searchable: true },\n { key: \"layerOrder\", label: \"Layer Order (for templates)\", type: \"text\" },\n { key: \"rationale\", label: \"Why Here? (placement rationale)\", type: \"text\", searchable: true },\n { key: \"dependsOn\", label: \"Allowed Dependencies (layers this can import from)\", type: \"text\" },\n];\n\ninterface ArchEntry {\n _id: string;\n entryId: string;\n name: string;\n status: string;\n order: number;\n data: Record<string, unknown>;\n tags?: string[];\n}\n\nasync function ensureCollection(): Promise<void> {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n if (collections.some((c: any) => c.slug === COLLECTION_SLUG)) return;\n\n await mcpMutation(\"chain.createCollection\", {\n slug: COLLECTION_SLUG,\n name: \"Architecture\",\n icon: \"🏗️\",\n description:\n \"System architecture map — templates, layers, nodes, and flows. \" +\n \"Visualized in the Architecture Explorer and via MCP architecture tools.\",\n fields: COLLECTION_FIELDS,\n });\n}\n\nasync function listArchEntries(): Promise<ArchEntry[]> {\n return mcpQuery<ArchEntry[]>(\"chain.listEntries\", { collectionSlug: COLLECTION_SLUG });\n}\n\nfunction byTag(entries: ArchEntry[], archType: string): ArchEntry[] {\n return entries\n .filter((e) => e.tags?.includes(`archType:${archType}`) || e.data?.archType === archType)\n .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));\n}\n\n// ── HTML renderer for MCP Apps ──────────────────────────────────────────────\n\nfunction renderArchitectureHtml(\n layers: ArchEntry[],\n nodes: ArchEntry[],\n flows: ArchEntry[],\n templateName: string,\n): string {\n const layerHtml = layers.map((layer) => {\n const layerNodes = nodes.filter(\n (n) => n.data?.layerRef === layer.entryId\n );\n const nodeCards = layerNodes.map((n) => `\n <div class=\"node\" title=\"${escHtml(String(n.data?.description ?? ''))}\">\n <span class=\"node-icon\">${escHtml(String(n.data?.icon ?? '◻'))}</span>\n <span class=\"node-name\">${escHtml(n.name)}</span>\n </div>\n `).join(\"\");\n\n return `\n <div class=\"layer\" style=\"--layer-color: ${escHtml(String(layer.data?.color ?? '#666'))}\">\n <div class=\"layer-label\">\n <span class=\"layer-dot\"></span>\n <span class=\"layer-name\">${escHtml(layer.name)}</span>\n <span class=\"layer-count\">${layerNodes.length}</span>\n </div>\n <div class=\"layer-desc\">${escHtml(String(layer.data?.description ?? ''))}</div>\n <div class=\"nodes\">${nodeCards || '<span class=\"empty\">No components</span>'}</div>\n </div>\n `;\n }).join(\"\");\n\n return `<!DOCTYPE html>\n<html><head><meta charset=\"utf-8\"><style>\n*{margin:0;padding:0;box-sizing:border-box}\nbody{font-family:-apple-system,system-ui,sans-serif;background:#1a1a2e;color:#e0e0e0;padding:16px}\nh1{font-size:14px;font-weight:600;color:#a0a0c0;margin-bottom:12px;letter-spacing:.04em}\n.layer{border-left:3px solid var(--layer-color);padding:8px 12px;margin-bottom:8px;background:rgba(255,255,255,.03);border-radius:0 6px 6px 0}\n.layer-label{display:flex;align-items:center;gap:8px;margin-bottom:4px}\n.layer-dot{width:8px;height:8px;border-radius:50%;background:var(--layer-color)}\n.layer-name{font-size:12px;font-weight:600;color:#fff;letter-spacing:.03em}\n.layer-count{font-size:10px;color:var(--layer-color);background:rgba(255,255,255,.06);padding:1px 6px;border-radius:8px}\n.layer-desc{font-size:11px;color:#888;margin-bottom:6px}\n.nodes{display:flex;flex-wrap:wrap;gap:6px}\n.node{display:flex;align-items:center;gap:4px;background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);border-radius:4px;padding:4px 8px;font-size:11px;cursor:default;transition:border-color .15s}\n.node:hover{border-color:var(--layer-color)}\n.node-icon{font-size:12px}\n.node-name{color:#ddd}\n.empty{font-size:11px;color:#555;font-style:italic}\n.flows{margin-top:12px;border-top:1px solid rgba(255,255,255,.06);padding-top:8px}\n.flow{font-size:11px;color:#888;padding:2px 0}\n.flow-arrow{color:#6366f1;margin:0 4px}\n</style></head><body>\n<h1>${escHtml(templateName)}</h1>\n${layerHtml}\n${flows.length > 0 ? `<div class=\"flows\"><div style=\"font-size:10px;color:#666;margin-bottom:4px;letter-spacing:.06em\">DATA FLOWS</div>${flows.map((f) => `<div class=\"flow\">${escHtml(f.name)}<span class=\"flow-arrow\">→</span><span style=\"color:#aaa\">${escHtml(String(f.data?.description ?? ''))}</span></div>`).join(\"\")}</div>` : \"\"}\n</body></html>`;\n}\n\nfunction escHtml(s: string): string {\n return s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\").replace(/\"/g, \"&quot;\");\n}\n\nfunction formatLayerText(layer: ArchEntry, nodes: ArchEntry[]): string {\n const layerNodes = nodes.filter((n) => n.data?.layerRef === layer.entryId);\n const nodeList = layerNodes.map((n) => {\n const desc = n.data?.description ? ` — ${n.data.description}` : \"\";\n const owner = n.data?.owner ? ` (${n.data.owner})` : \"\";\n return ` - ${n.data?.icon ?? \"◻\"} **${n.name}**${desc}${owner}`;\n }).join(\"\\n\");\n return `### ${layer.name}\\n${layer.data?.description ?? \"\"}\\n\\n${nodeList || \" _No components_\"}`;\n}\n\n// ── Seed data: Product OS default architecture ──────────────────────────────\n\nconst SEED_TEMPLATE = {\n entryId: \"ARCH-tpl-product-os\",\n name: \"Product OS Default\",\n data: {\n archType: \"template\",\n description: \"Default 4-layer architecture: Auth → Infrastructure → Core → Features, with an outward Integration layer\",\n layerOrder: JSON.stringify([\"auth\", \"infrastructure\", \"core\", \"features\", \"integration\"]),\n },\n};\n\nconst SEED_LAYERS = [\n { entryId: \"ARCH-layer-auth\", name: \"Auth\", order: 0, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#22c55e\", description: \"Authentication, user management, and workspace-scoped access control\", icon: \"🔐\", dependsOn: \"none\", rationale: \"Foundation layer. Auth depends on nothing — it is the first gate. No layer may bypass auth. All other layers depend on auth to know who the user is and which workspace they belong to.\" } },\n { entryId: \"ARCH-layer-infra\", name: \"Infrastructure\", order: 1, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#ec4899\", description: \"Real-time data, event tracking, and AI model infrastructure\", icon: \"⚙️\", dependsOn: \"Auth\", rationale: \"Infrastructure sits on top of Auth. It provides the database, analytics, and AI plumbing that Core and Features consume. Infra may import from Auth (needs workspace context) but never from Core or Features.\" } },\n { entryId: \"ARCH-layer-core\", name: \"Core\", order: 2, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#8b5cf6\", description: \"Business logic, knowledge graph, workflow engines, and MCP tooling\", icon: \"🧠\", dependsOn: \"Auth, Infrastructure\", rationale: \"Core contains business logic and engines that are UI-agnostic. It may import from Auth and Infra. Features depend on Core, but Core must never depend on Features — this is what keeps engines reusable across different UIs.\" } },\n { entryId: \"ARCH-layer-features\", name: \"Features\", order: 3, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#6366f1\", description: \"User-facing pages, components, and feature modules\", icon: \"✦\", dependsOn: \"Auth, Infrastructure, Core\", rationale: \"Features are the user-facing layer — SvelteKit routes, components, and page-level logic. Features may import from any lower layer but nothing above may import from Features. This is the outermost application layer.\" } },\n { entryId: \"ARCH-layer-integration\", name: \"Integration\", order: 4, data: { archType: \"layer\", templateRef: \"ARCH-tpl-product-os\", color: \"#f59e0b\", description: \"Outward connections to external tools, IDEs, and services\", icon: \"🔌\", dependsOn: \"Core\", rationale: \"Integration is a lateral/outward layer — it connects to external systems (IDE, GitHub, Linear). It depends on Core (to expose knowledge) but sits outside the main stack. External tools call into Core via Integration, never directly into Features.\" } },\n];\n\nconst SEED_NODES = [\n // Auth layer\n { entryId: \"ARCH-node-clerk\", name: \"Clerk\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🔑\", description: \"Authentication provider — sign-in/sign-up pages, session management, organization-level access control. UserSync.svelte is cross-cutting layout glue (not mapped here).\", filePaths: \"src/routes/sign-in/, src/routes/sign-up/\", owner: \"Platform\", rationale: \"Auth layer because Clerk is the identity gate. Every request flows through auth first. No other layer provides identity.\" } },\n { entryId: \"ARCH-node-workspace\", name: \"Workspace Scoping\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-auth\", color: \"#22c55e\", icon: \"🏢\", description: \"Multi-tenancy anchor — all data is workspace-scoped via workspaceId\", filePaths: \"src/lib/stores/workspace.ts, convex/workspaces.ts\", owner: \"Platform\", rationale: \"Auth layer because workspace scoping is the second gate after identity. All queries require workspaceId, making this foundational.\" } },\n\n // Infrastructure layer\n { entryId: \"ARCH-node-convex\", name: \"Convex\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"⚡\", description: \"Reactive database with real-time sync, serverless functions, and type-safe API generation. Unified Collections + Entries model\", filePaths: \"convex/schema.ts, convex/entries.ts, convex/http.ts\", owner: \"Platform\", rationale: \"Infrastructure because Convex is raw persistence and reactivity plumbing. It stores data but has no business logic opinions. Core and Features consume it.\" } },\n { entryId: \"ARCH-node-posthog\", name: \"PostHog\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"📊\", description: \"Product analytics — workspace-scoped events, feature flags, session replay\", filePaths: \"src/lib/analytics.ts, src/lib/components/PostHogWorkspaceSync.svelte\", owner: \"Platform\", rationale: \"Infrastructure because PostHog is analytics plumbing — event collection and aggregation. It has no knowledge of business domains.\" } },\n { entryId: \"ARCH-node-openrouter\", name: \"OpenRouter\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-infra\", color: \"#ec4899\", icon: \"🤖\", description: \"AI model routing for ChainWork artifact generation — streaming responses with format-aware prompts\", filePaths: \"src/routes/api/chainwork/generate/+server.ts\", owner: \"ChainWork\", rationale: \"Infrastructure because OpenRouter is an AI model gateway — it routes prompts to models. The strategy logic lives in ChainWork Engine (Core); this is just the pipe.\" } },\n\n // Core layer\n { entryId: \"ARCH-node-mcp\", name: \"MCP Server\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🔧\", description: \"~19 modular tools exposing the knowledge graph as AI-consumable operations — capture, context assembly, verification, quality checks\", filePaths: \"packages/mcp-server/src/index.ts, packages/mcp-server/src/tools/\", owner: \"AI DX\", rationale: \"Core layer because the MCP server encodes business operations — capture with auto-linking, quality scoring, governance rules. It depends on Infra (Convex) but never touches UI routes. Why not Infrastructure? Because it has domain opinions. Why not Features? Because it has no UI — any client (Cursor, CLI, API) can call it.\" } },\n { entryId: \"ARCH-node-knowledge-graph\", name: \"Knowledge Graph\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"🕸️\", description: \"20 collections, 170+ entries with typed cross-collection relations. Smart capture, auto-linking, quality scoring\", filePaths: \"convex/mcpKnowledge.ts, convex/entries.ts\", owner: \"Knowledge\", rationale: \"Core layer because the knowledge graph IS the domain model — collections, entries, relations, versioning, quality scoring. Glossary DATA, business rules DATA, tension DATA all live here. Why not Features? Because the data model exists independently of any page. The Glossary page in Features is just one way to visualize terms that Core owns. Think: Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-governance\", name: \"Governance Engine\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⚖️\", description: \"Circles, roles, consent-based decision-making, tension processing with IDM-inspired async workflows\", filePaths: \"convex/versioning.ts, src/lib/components/versioning/\", owner: \"Governance\", rationale: \"Core layer because governance logic (draft→publish workflows, consent-based decisions, tension status rules) is business process that multiple UIs consume. Why not Features? Because the versioning system and proposal flow are reusable engines — the Governance Pages in Features are just one rendering of these rules.\" } },\n { entryId: \"ARCH-node-chainwork-engine\", name: \"ChainWork Engine\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-core\", color: \"#8b5cf6\", icon: \"⛓\", description: \"Guided strategy creation through 5-step coherence chain — AI-generated artifacts with scoring and achievements\", filePaths: \"src/lib/components/chainwork/config.ts, src/lib/components/chainwork/scoring.ts\", owner: \"ChainWork\", rationale: \"Core layer because the coherence chain logic, scoring algorithm, and quality gates are business rules. config.ts defines chain steps, scoring.ts computes quality — these could power a CLI or API. Why not Features? Because the ChainWork UI wizard in Features is just one skin over this engine.\" } },\n\n // Features layer\n { entryId: \"ARCH-node-command-center\", name: \"Command Center\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⬡\", description: \"Calm home screen — daily orientation, triage mode, pulse metrics, momentum tracking\", filePaths: \"src/routes/+page.svelte, src/lib/components/command-center/\", owner: \"Command Center\", rationale: \"Features layer because the Command Center is a SvelteKit page — PulseMetrics, NeedsAttention, DailyBriefing are UI components that assemble data from Core queries. Why not Core? Because it has no reusable business logic or engines — it is pure layout and presentation. If you deleted this page, no business rule would break.\" } },\n { entryId: \"ARCH-node-chainwork-ui\", name: \"ChainWork UI\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⛓\", description: \"Multi-step wizard for strategy artifact creation — setup, chain steps, quality gates, output\", filePaths: \"src/routes/chainwork/, src/lib/components/chainwork/\", owner: \"ChainWork\", rationale: \"Features layer because the ChainWork UI is the wizard interface — step navigation, form inputs, output rendering. Why not Core? Because the scoring logic and chain config ARE in Core (ChainWork Engine). This is the presentation skin over that engine. Delete this page and the engine still works via MCP.\" } },\n { entryId: \"ARCH-node-glossary\", name: \"Glossary\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"Aa\", description: \"Canonical vocabulary management — term detail, code drift detection, inline term linking\", filePaths: \"src/routes/glossary/, src/lib/components/glossary/\", owner: \"Knowledge\", rationale: \"Features layer — NOT Core or Infrastructure — because this is the Glossary PAGE: the SvelteKit route for browsing, editing, and viewing terms. Why not Core? Because Core owns the glossary DATA (Knowledge Graph) and term-linking logic. The MCP server also accesses glossary terms without any page. Why not Infrastructure? Because glossary is domain-specific vocabulary, not generic plumbing. The page is one consumer of the data — Core owns the dictionary, Features owns the dictionary app.\" } },\n { entryId: \"ARCH-node-tensions\", name: \"Tensions\", order: 3, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"⚡\", description: \"Tension capture and processing — raise, triage, resolve through governance workflow\", filePaths: \"src/routes/tensions/, src/lib/components/tensions/\", owner: \"Governance\", rationale: \"Features layer because this is the Tensions PAGE — the UI for raising, listing, and viewing tensions. Why not Core? Because tension data, status rules (SOS-020), and processing logic already live in Core (Governance Engine). This page is a form + list view that reads from and writes to Core. Delete it and the governance engine still processes tensions via MCP.\" } },\n { entryId: \"ARCH-node-strategy\", name: \"Strategy\", order: 4, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"▣\", description: \"Product strategy pages — vision, ecosystem, product areas, decision frameworks, sequencing\", filePaths: \"src/routes/strategy/, src/routes/bridge/, src/routes/topology/\", owner: \"Strategy\", rationale: \"Features layer because Strategy is a set of SvelteKit pages (strategy, bridge, topology) that visualize strategy entries. Why not Core? Because the strategy data (vision, principles, ecosystem layers) lives in the Knowledge Graph (Core). These pages render and allow inline editing — they consume Core downward.\" } },\n { entryId: \"ARCH-node-governance-ui\", name: \"Governance Pages\", order: 5, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"◈\", description: \"Roles, circles, principles, policies, decisions, proposals, business rules\", filePaths: \"src/routes/roles/, src/routes/circles/, src/routes/decisions/, src/routes/proposals/\", owner: \"Governance\", rationale: \"Features layer because these are governance PAGES — list views and detail views for roles, circles, decisions, proposals. Why not Core? Because the governance ENGINE (versioning, consent, IDM) IS in Core. These pages are the user-facing window into governance data. The logic doesn't live here, only the rendering.\" } },\n { entryId: \"ARCH-node-artifacts\", name: \"Artifacts\", order: 6, data: { archType: \"node\", layerRef: \"ARCH-layer-features\", color: \"#6366f1\", icon: \"📄\", description: \"Strategy artifacts from ChainWork — pitches, briefs, one-pagers linked to the knowledge graph\", filePaths: \"src/routes/artifacts/\", owner: \"ChainWork\", rationale: \"Features layer because the Artifacts page is a list/detail view for strategy artifacts produced by ChainWork. Why not Core? Because artifact data and scoring live in Core (ChainWork Engine). This page just renders the output and links back to the knowledge graph.\" } },\n\n // Integration layer\n { entryId: \"ARCH-node-cursor\", name: \"Cursor IDE\", order: 0, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🖥️\", description: \"AI-assisted development with MCP-powered knowledge context — smart capture, verification, context assembly in the editor\", filePaths: \".cursor/mcp.json, .cursor/rules/\", owner: \"AI DX\", rationale: \"Integration layer because Cursor is an external tool that connects INTO our system via MCP. Why not Core or Features? Because Cursor itself is not our code — it's a consumer. The .cursor/ config files define how it talks to us, but Cursor lives outside our deployment boundary.\" } },\n { entryId: \"ARCH-node-github\", name: \"GitHub\", order: 1, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"🐙\", description: \"Code repository, PR reviews with governance context, CI/CD\", owner: \"Platform\", rationale: \"Integration layer because GitHub is an external service. Why not Infrastructure? Because Infra is about plumbing we control (database, analytics). GitHub is a third-party that hooks into our Core (PR reviews checking governance rules) but is not part of our deployed application.\" } },\n { entryId: \"ARCH-node-linear\", name: \"Linear (planned)\", order: 2, data: { archType: \"node\", layerRef: \"ARCH-layer-integration\", color: \"#f59e0b\", icon: \"📐\", description: \"Issue tracking, roadmap sync, tension-to-issue pipeline (planned integration)\", owner: \"Platform\", rationale: \"Integration layer because Linear is an external issue tracker. Why not Infrastructure? Because Infra is generic plumbing we run. Linear is a third-party tool we connect to. The planned pipeline bridges tensions (Core) to Linear issues — a classic outward integration pattern.\" } },\n];\n\nconst SEED_FLOWS = [\n { entryId: \"ARCH-flow-smart-capture\", name: \"Capture Flow\", order: 0, data: { archType: \"flow\", sourceNode: \"ARCH-node-cursor\", targetNode: \"ARCH-node-knowledge-graph\", description: \"Developer/AI calls capture via MCP → entry created with auto-linking and quality score → stored in Knowledge Graph\", color: \"#8b5cf6\" } },\n { entryId: \"ARCH-flow-governance\", name: \"Governance Flow\", order: 1, data: { archType: \"flow\", sourceNode: \"ARCH-node-tensions\", targetNode: \"ARCH-node-governance\", description: \"Tension raised → appears in Command Center → triaged → processed via IDM → decision logged\", color: \"#6366f1\" } },\n { entryId: \"ARCH-flow-chainwork\", name: \"ChainWork Strategy Flow\", order: 2, data: { archType: \"flow\", sourceNode: \"ARCH-node-chainwork-ui\", targetNode: \"ARCH-node-artifacts\", description: \"Leader opens ChainWork → walks coherence chain → AI generates artifact → scored and published to knowledge graph\", color: \"#f59e0b\" } },\n { entryId: \"ARCH-flow-knowledge-trust\", name: \"Knowledge Trust Flow\", order: 3, data: { archType: \"flow\", sourceNode: \"ARCH-node-mcp\", targetNode: \"ARCH-node-glossary\", description: \"MCP verify tool checks entries against codebase → file existence, schema references validated → trust scores updated\", color: \"#22c55e\" } },\n { entryId: \"ARCH-flow-analytics\", name: \"Analytics Flow\", order: 4, data: { archType: \"flow\", sourceNode: \"ARCH-node-command-center\", targetNode: \"ARCH-node-posthog\", description: \"Feature views and actions tracked → workspace-scoped events → PostHog group analytics → Command Center metrics\", color: \"#ec4899\" } },\n];\n\n// ── Tool Registration ───────────────────────────────────────────────────────\n\nexport function registerArchitectureTools(server: McpServer) {\n\n // ─── architecture: viewing operations ───────────────────────────────\n\n server.registerTool(\n \"architecture\",\n {\n title: \"Architecture\",\n description:\n \"Explore the system architecture — show the full map, explore a specific layer, or visualize a data flow.\\n\\n\" +\n \"Actions:\\n\" +\n \"- `show`: Render the layered architecture map (Auth → Infra → Core → Features → Integration)\\n\" +\n \"- `explore`: Drill into a layer to see nodes, ownership, file paths\\n\" +\n \"- `flow`: Visualize a data flow path between nodes\",\n inputSchema: {\n action: z.enum([\"show\", \"explore\", \"flow\"])\n .describe(\"Action: show full map, explore a layer, or visualize a flow\"),\n template: z.string().optional().describe(\"Template entry ID to filter by (for show)\"),\n layer: z.string().optional().describe(\"Layer name or entry ID (for explore), e.g. 'Core' or 'ARCH-layer-core'\"),\n flow: z.string().optional().describe(\"Flow name or entry ID (for flow), e.g. 'Smart Capture Flow'\"),\n },\n annotations: { readOnlyHint: true },\n },\n async ({ action, template, layer, flow }) => {\n await ensureCollection();\n const all = await listArchEntries();\n\n if (action === \"show\") {\n const templates = byTag(all, \"template\");\n const activeTemplate = template\n ? templates.find((t) => t.entryId === template)\n : templates[0];\n\n const templateName = activeTemplate?.name ?? \"System Architecture\";\n const templateId = activeTemplate?.entryId;\n\n const layers = byTag(all, \"layer\")\n .filter((l) => !templateId || l.data?.templateRef === templateId);\n const nodes = byTag(all, \"node\");\n const flows = byTag(all, \"flow\");\n\n if (layers.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Architecture Explorer\\n\\nNo architecture data found. Use `architecture-admin action=seed` to populate the default architecture.\",\n }],\n };\n }\n\n const textLayers = layers.map((l) => formatLayerText(l, nodes)).join(\"\\n\\n\");\n const textFlows = flows.length > 0\n ? \"\\n\\n---\\n\\n## Data Flows\\n\\n\" + flows.map((f) =>\n `- **${f.name}**: ${f.data?.description ?? \"\"}`\n ).join(\"\\n\")\n : \"\";\n\n const text = `# ${templateName}\\n\\n${textLayers}${textFlows}`;\n const html = renderArchitectureHtml(layers, nodes, flows, templateName);\n\n return {\n content: [\n { type: \"text\" as const, text },\n { type: \"resource\" as const, resource: { uri: `ui://product-os/architecture`, mimeType: \"text/html\", text: html } },\n ],\n };\n }\n\n if (action === \"explore\") {\n if (!layer) return { content: [{ type: \"text\" as const, text: \"A `layer` is required for explore.\" }] };\n\n const layers = byTag(all, \"layer\");\n const target = layers.find(\n (l) => l.name.toLowerCase() === layer.toLowerCase() || l.entryId === layer\n );\n\n if (!target) {\n const available = layers.map((l) => `\\`${l.name}\\``).join(\", \");\n return { content: [{ type: \"text\" as const, text: `Layer \"${layer}\" not found. Available layers: ${available}` }] };\n }\n\n const nodes = byTag(all, \"node\").filter((n) => n.data?.layerRef === target.entryId);\n const flows = byTag(all, \"flow\").filter(\n (f) => nodes.some((n) => n.entryId === f.data?.sourceNode || n.entryId === f.data?.targetNode)\n );\n\n const depRule = target.data?.dependsOn\n ? `\\n**Dependency rule:** May import from ${target.data.dependsOn === \"none\" ? \"nothing (foundation layer)\" : target.data.dependsOn}.\\n`\n : \"\";\n const layerRationale = target.data?.rationale ? `\\n> ${target.data.rationale}\\n` : \"\";\n\n const nodeDetail = nodes.map((n) => {\n const lines = [`#### ${n.data?.icon ?? \"◻\"} ${n.name}`];\n if (n.data?.description) lines.push(String(n.data.description));\n if (n.data?.owner) lines.push(`**Owner:** ${n.data.owner}`);\n if (n.data?.filePaths) lines.push(`**Files:** \\`${n.data.filePaths}\\``);\n if (n.data?.rationale) lines.push(`\\n**Why here?** ${n.data.rationale}`);\n return lines.join(\"\\n\");\n }).join(\"\\n\\n\");\n\n const flowLines = flows.length > 0\n ? \"\\n\\n### Connected Flows\\n\\n\" + flows.map((f) => `- ${f.name}: ${f.data?.description ?? \"\"}`).join(\"\\n\")\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# ${target.data?.icon ?? \"\"} ${target.name} Layer\\n\\n${target.data?.description ?? \"\"}${depRule}${layerRationale}\\n**${nodes.length} components**\\n\\n${nodeDetail}${flowLines}`,\n }],\n };\n }\n\n if (action === \"flow\") {\n if (!flow) return { content: [{ type: \"text\" as const, text: \"A `flow` name or entry ID is required.\" }] };\n\n const flows = byTag(all, \"flow\");\n const target = flows.find(\n (f) => f.name.toLowerCase() === flow.toLowerCase() || f.entryId === flow\n );\n\n if (!target) {\n const available = flows.map((f) => `\\`${f.name}\\``).join(\", \");\n return { content: [{ type: \"text\" as const, text: `Flow \"${flow}\" not found. Available flows: ${available}` }] };\n }\n\n const nodes = byTag(all, \"node\");\n const source = nodes.find((n) => n.entryId === target.data?.sourceNode);\n const dest = nodes.find((n) => n.entryId === target.data?.targetNode);\n\n const lines = [\n `# ${target.name}`,\n \"\",\n `**${source?.data?.icon ?? \"?\"} ${source?.name ?? \"Unknown\"}** → **${dest?.data?.icon ?? \"?\"} ${dest?.name ?? \"Unknown\"}**`,\n \"\",\n String(target.data?.description ?? \"\"),\n ];\n\n if (source) {\n lines.push(\"\", `### Source: ${source.name}`, String(source.data?.description ?? \"\"));\n if (source.data?.filePaths) lines.push(`Files: \\`${source.data.filePaths}\\``);\n }\n if (dest) {\n lines.push(\"\", `### Target: ${dest.name}`, String(dest.data?.description ?? \"\"));\n if (dest.data?.filePaths) lines.push(`Files: \\`${dest.data.filePaths}\\``);\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n // ─── architecture-admin: seed and health check ──────────────────────\n\n server.registerTool(\n \"architecture-admin\",\n {\n title: \"Architecture Admin\",\n description:\n \"Architecture maintenance — seed the default architecture data or run a dependency health check.\\n\\n\" +\n \"Actions:\\n\" +\n \"- `seed`: Populate the architecture collection with the default Product OS map. Safe to re-run.\\n\" +\n \"- `check`: Scan the codebase for dependency direction violations against layer rules.\",\n inputSchema: {\n action: z.enum([\"seed\", \"check\"])\n .describe(\"Action: seed default architecture data, or check dependency health\"),\n },\n },\n async ({ action }) => {\n if (action === \"seed\") {\n await ensureCollection();\n const existing = await listArchEntries();\n const existingIds = new Set(existing.map((e) => e.entryId));\n\n let created = 0;\n let updated = 0;\n let unchanged = 0;\n\n const allSeeds = [\n { ...SEED_TEMPLATE, order: 0, status: \"active\" },\n ...SEED_LAYERS.map((l) => ({ ...l, status: \"active\" as const })),\n ...SEED_NODES.map((n) => ({ ...n, status: \"active\" as const })),\n ...SEED_FLOWS.map((f) => ({ ...f, status: \"active\" as const })),\n ];\n\n for (const seed of allSeeds) {\n if (existingIds.has(seed.entryId)) {\n const existingEntry = existing.find((e) => e.entryId === seed.entryId);\n const existingData = (existingEntry?.data ?? {}) as Record<string, unknown>;\n const seedData = seed.data as Record<string, unknown>;\n const hasChanges = Object.keys(seedData).some(\n (k) => seedData[k] !== undefined && existingData[k] !== seedData[k],\n );\n if (hasChanges) {\n const mergedData = { ...existingData, ...seedData };\n await mcpMutation(\"chain.updateEntry\", { entryId: seed.entryId, data: mergedData });\n updated++;\n } else {\n unchanged++;\n }\n continue;\n }\n await mcpMutation(\"chain.createEntry\", {\n collectionSlug: COLLECTION_SLUG,\n entryId: seed.entryId,\n name: seed.name,\n status: seed.status,\n data: seed.data,\n order: seed.order ?? 0,\n });\n created++;\n }\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Architecture Seeded\\n\\n**Created:** ${created} entries\\n**Updated:** ${updated} (merged new fields)\\n**Unchanged:** ${unchanged}\\n\\nUse \\`architecture action=show\\` to view the map.`,\n }],\n };\n }\n\n if (action === \"check\") {\n const projectRoot = resolveProjectRoot();\n if (!projectRoot) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"# Scan Failed\\n\\nCannot find project root (looked for `convex/schema.ts` in cwd and parent). \" +\n \"Set `WORKSPACE_PATH` env var to the absolute path of the Product OS project root.\",\n }],\n };\n }\n\n await ensureCollection();\n const all = await listArchEntries();\n const layers = byTag(all, \"layer\");\n const nodes = byTag(all, \"node\");\n\n const result = scanDependencies(projectRoot, layers, nodes);\n\n return { content: [{ type: \"text\" as const, text: formatScanReport(result) }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n}\n\n// ── Scanner Engine — FEAT-dep-health, enforces SOS-dbl1n9 (dependency direction) ──\n\ninterface Violation {\n sourceNode: string;\n sourceLayer: string;\n sourceFile: string;\n importPath: string;\n targetNode: string;\n targetLayer: string;\n rule: string;\n}\n\ninterface ScanResult {\n violations: Violation[];\n filesScanned: number;\n importsChecked: number;\n unmappedImports: number;\n nodeResults: Map<string, { violations: Violation[]; filesScanned: number }>;\n}\n\nfunction resolveProjectRoot(): string | null {\n const candidates = [\n process.env.WORKSPACE_PATH,\n process.cwd(),\n resolve(process.cwd(), \"..\"),\n ].filter(Boolean) as string[];\n\n for (const dir of candidates) {\n const resolved = resolve(dir);\n if (existsSync(resolve(resolved, \"convex/schema.ts\"))) return resolved;\n }\n return null;\n}\n\nfunction scanDependencies(\n projectRoot: string,\n layers: ArchEntry[],\n nodes: ArchEntry[],\n): ScanResult {\n const layerMap = new Map<string, ArchEntry>();\n for (const l of layers) layerMap.set(l.entryId, l);\n\n const allowedDeps = buildAllowedDeps(layers);\n const nodePathPrefixes = buildNodePrefixes(nodes);\n\n const violations: Violation[] = [];\n const nodeResults = new Map<string, { violations: Violation[]; filesScanned: number }>();\n let totalFiles = 0;\n let totalImports = 0;\n let unmapped = 0;\n\n for (const node of nodes) {\n const layerRef = String(node.data?.layerRef ?? \"\");\n const layer = layerMap.get(layerRef);\n if (!layer) continue;\n\n const filePaths = parseFilePaths(node);\n const nodeViolations: Violation[] = [];\n let nodeFileCount = 0;\n\n for (const fp of filePaths) {\n const absPath = resolve(projectRoot, fp);\n const files = collectFiles(absPath);\n\n for (const file of files) {\n nodeFileCount++;\n totalFiles++;\n const relFile = relative(projectRoot, file);\n const imports = parseImports(file);\n\n for (const imp of imports) {\n totalImports++;\n const resolved = resolveImport(imp, file, projectRoot);\n if (!resolved) { unmapped++; continue; }\n\n const targetNode = findNodeByPath(resolved, nodePathPrefixes);\n if (!targetNode) { unmapped++; continue; }\n\n const targetLayerRef = String(targetNode.data?.layerRef ?? \"\");\n const targetLayer = layerMap.get(targetLayerRef);\n if (!targetLayer) continue;\n\n if (targetLayerRef === layerRef) continue;\n\n const allowed = allowedDeps.get(layerRef);\n if (allowed && !allowed.has(targetLayerRef)) {\n const v: Violation = {\n sourceNode: node.name,\n sourceLayer: layer.name,\n sourceFile: relFile,\n importPath: imp,\n targetNode: targetNode.name,\n targetLayer: targetLayer.name,\n rule: `${layer.name} cannot import from ${targetLayer.name}`,\n };\n violations.push(v);\n nodeViolations.push(v);\n }\n }\n }\n }\n\n nodeResults.set(node.entryId, { violations: nodeViolations, filesScanned: nodeFileCount });\n }\n\n return { violations, filesScanned: totalFiles, importsChecked: totalImports, unmappedImports: unmapped, nodeResults };\n}\n\nfunction buildAllowedDeps(layers: ArchEntry[]): Map<string, Set<string>> {\n const nameToId = new Map<string, string>();\n for (const l of layers) nameToId.set(l.name.toLowerCase(), l.entryId);\n\n const allowed = new Map<string, Set<string>>();\n for (const layer of layers) {\n const deps = String(layer.data?.dependsOn ?? \"none\");\n const set = new Set<string>();\n if (deps !== \"none\") {\n for (const dep of deps.split(\",\").map((d) => d.trim().toLowerCase())) {\n const id = nameToId.get(dep);\n if (id) set.add(id);\n }\n }\n allowed.set(layer.entryId, set);\n }\n return allowed;\n}\n\nfunction buildNodePrefixes(nodes: ArchEntry[]): { prefix: string; node: ArchEntry }[] {\n const entries: { prefix: string; node: ArchEntry }[] = [];\n for (const node of nodes) {\n for (const fp of parseFilePaths(node)) {\n entries.push({ prefix: normalize(fp), node });\n }\n }\n entries.sort((a, b) => b.prefix.length - a.prefix.length);\n return entries;\n}\n\nfunction parseFilePaths(node: ArchEntry): string[] {\n const raw = node.data?.filePaths;\n if (!raw || typeof raw !== \"string\") return [];\n return raw.split(\",\").map((p) => p.trim()).filter(Boolean);\n}\n\nfunction collectFiles(absPath: string): string[] {\n if (!existsSync(absPath)) return [];\n const stat = statSync(absPath);\n if (stat.isFile()) {\n return isScannableFile(absPath) ? [absPath] : [];\n }\n if (!stat.isDirectory()) return [];\n\n const results: string[] = [];\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name.startsWith(\".\") || entry.name === \"node_modules\") continue;\n const full = resolve(dir, entry.name);\n if (entry.isDirectory()) walk(full);\n else if (isScannableFile(full)) results.push(full);\n }\n };\n walk(absPath);\n return results;\n}\n\nfunction isScannableFile(p: string): boolean {\n return /\\.(ts|js|svelte)$/.test(p) && !p.endsWith(\".d.ts\");\n}\n\nfunction parseImports(filePath: string): string[] {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const re = /(?:^|\\n)\\s*import\\s+(?:[\\s\\S]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g;\n const imports: string[] = [];\n let match: RegExpExecArray | null;\n while ((match = re.exec(content)) !== null) {\n imports.push(match[1]);\n }\n return imports;\n } catch {\n return [];\n }\n}\n\nconst EXTENSIONS = [\".ts\", \".js\", \".svelte\", \"/index.ts\", \"/index.js\", \"/index.svelte\"];\n\nfunction tryResolveWithExtension(absPath: string): string | null {\n if (existsSync(absPath) && statSync(absPath).isFile()) return absPath;\n for (const ext of EXTENSIONS) {\n const withExt = absPath + ext;\n if (existsSync(withExt)) return withExt;\n }\n return null;\n}\n\nfunction resolveImport(imp: string, fromFile: string, root: string): string | null {\n let rel: string | null = null;\n if (imp.startsWith(\"$lib/\")) rel = imp.replace(\"$lib/\", \"src/lib/\");\n else if (imp.startsWith(\"$convex/\")) rel = imp.replace(\"$convex/\", \"convex/\");\n else if (imp.startsWith(\"$env/\") || imp.startsWith(\"$app/\")) return null;\n else if (imp.startsWith(\"./\") || imp.startsWith(\"../\")) {\n const fromDir = dirname(fromFile);\n const abs = resolve(fromDir, imp);\n rel = relative(root, abs);\n }\n if (!rel) return null;\n\n const abs = resolve(root, rel);\n const actual = tryResolveWithExtension(abs);\n return actual ? relative(root, actual) : rel;\n}\n\nfunction findNodeByPath(\n filePath: string,\n prefixes: { prefix: string; node: ArchEntry }[],\n): ArchEntry | null {\n const normalized = normalize(filePath);\n for (const { prefix, node } of prefixes) {\n if (normalized.startsWith(prefix)) return node;\n }\n return null;\n}\n\nfunction formatScanReport(result: ScanResult): string {\n const lines: string[] = [];\n\n if (result.violations.length === 0) {\n lines.push(\n `# Architecture Health Check Passed`,\n \"\",\n `**0 violations** across ${result.filesScanned} files (${result.importsChecked} imports checked, ${result.unmappedImports} unmapped).`,\n \"\",\n \"All imports respect the layer dependency rules.\",\n );\n } else {\n lines.push(\n `# Architecture Health Check — ${result.violations.length} Violation${result.violations.length === 1 ? \"\" : \"s\"}`,\n \"\",\n `Scanned ${result.filesScanned} files, checked ${result.importsChecked} imports, found **${result.violations.length} violation${result.violations.length === 1 ? \"\" : \"s\"}** (${result.unmappedImports} unmapped).`,\n \"\",\n );\n\n const byNode = new Map<string, Violation[]>();\n for (const v of result.violations) {\n if (!byNode.has(v.sourceNode)) byNode.set(v.sourceNode, []);\n byNode.get(v.sourceNode)!.push(v);\n }\n\n for (const [nodeName, vs] of byNode) {\n lines.push(`## ${nodeName} (${vs[0].sourceLayer})`);\n for (const v of vs) {\n lines.push(`- \\`${v.sourceFile}\\` imports \\`${v.importPath}\\` → **${v.targetNode}** (${v.targetLayer}) — ${v.rule}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"---\", \"\");\n\n const nodeEntries = [...result.nodeResults.entries()];\n const cleanCount = nodeEntries.filter(([, r]) => r.violations.length === 0 && r.filesScanned > 0).length;\n const dirtyCount = nodeEntries.filter(([, r]) => r.violations.length > 0).length;\n const emptyCount = nodeEntries.filter(([, r]) => r.filesScanned === 0).length;\n\n lines.push(\n `**Summary:** ${cleanCount} clean nodes, ${dirtyCount} with violations, ${emptyCount} with no files.`,\n );\n\n return lines.join(\"\\n\");\n}\n","/**\n * Workflow tools — ARCH-node-mcp (Core layer)\n * Chain: FEAT-MCP-001 (MCP Server)\n *\n * Tools for discovering and running Chainwork workflows via MCP.\n * The actual facilitation happens in the agent — these tools provide\n * the definitions, state tracking, and chain integration.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpMutation } from \"../client.js\";\nimport {\n getWorkflow,\n listWorkflows,\n type WorkflowDefinition,\n} from \"../workflows/definitions.js\";\n\nfunction formatWorkflowCard(wf: WorkflowDefinition): string {\n const roundList = wf.rounds\n .map((r) => ` ${r.num}. ${r.label} (${r.type}, ~${r.maxDurationHint ?? \"?\"})`)\n .join(\"\\n\");\n\n return (\n `## ${wf.icon} ${wf.name}\\n` +\n `**ID**: \\`${wf.id}\\`\\n` +\n `${wf.shortDescription}\\n\\n` +\n `**Rounds** (${wf.rounds.length}):\\n${roundList}\\n\\n` +\n `**Output**: Creates entries in \\`${wf.kbOutputCollection}\\` collection.\\n` +\n `_Use the \\`run-workflow\\` prompt with workflow=\"${wf.id}\" to start._`\n );\n}\n\nexport function registerWorkflowTools(server: McpServer) {\n\n server.registerTool(\n \"list-workflows\",\n {\n title: \"List Workflows\",\n description:\n \"List all available Chainwork workflows — retro, shape-a-bet, IDM, etc. \" +\n \"Each workflow is a structured multi-round facilitation ceremony that the agent runs in Facilitator Mode. \" +\n \"Use the `run-workflow` prompt to actually launch one.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n const workflows = listWorkflows();\n\n if (workflows.length === 0) {\n return {\n content: [{\n type: \"text\" as const,\n text: \"No workflows registered yet. Check back after the workflow definitions are configured.\",\n }],\n };\n }\n\n const cards = workflows.map(formatWorkflowCard).join(\"\\n\\n---\\n\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Available Chainwork Workflows\\n\\n` +\n `${workflows.length} workflow(s) available. Use the \\`run-workflow\\` prompt to launch one.\\n\\n` +\n `---\\n\\n${cards}`,\n }],\n };\n },\n );\n\n server.registerTool(\n \"workflow-checkpoint\",\n {\n title: \"Workflow Checkpoint\",\n description:\n \"Record the output of a workflow round. Captures the round's data to the Chain \" +\n \"as a structured entry. Use this during Facilitator Mode after completing each round \" +\n \"to persist progress — so if the conversation is interrupted, work is not lost.\\n\\n\" +\n \"At workflow completion, this tool can also generate the final summary entry.\",\n inputSchema: {\n workflowId: z.string().describe(\"Workflow ID (e.g., 'retro')\"),\n roundId: z.string().describe(\"Round ID (e.g., 'what-went-well')\"),\n output: z.string().describe(\"The round's output — synthesized by the facilitator from the conversation\"),\n isFinal: z.boolean().optional().describe(\n \"If true, this is the final checkpoint and triggers the summary chain entry creation\",\n ),\n summaryName: z.string().optional().describe(\n \"Name for the final chain entry (required when isFinal=true)\",\n ),\n summaryDescription: z.string().optional().describe(\n \"Full description/rationale for the final chain entry (required when isFinal=true)\",\n ),\n },\n annotations: { destructiveHint: false },\n },\n async ({ workflowId, roundId, output, isFinal, summaryName, summaryDescription }) => {\n const wf = getWorkflow(workflowId);\n if (!wf) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found. ` +\n `Available: ${listWorkflows().map((w) => w.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. Continue the conversation — the facilitator has the context.`,\n }],\n };\n }\n\n const round = wf.rounds.find((r) => r.id === roundId);\n if (!round) {\n return {\n content: [{\n type: \"text\" as const,\n text:\n `Round \"${roundId}\" not found in workflow \"${workflowId}\". ` +\n `Available rounds: ${wf.rounds.map((r) => r.id).join(\", \")}.\\n\\n` +\n `This checkpoint was NOT saved. The conversation context is preserved — continue facilitating.`,\n }],\n };\n }\n\n const lines: string[] = [\n `## Checkpoint: Round ${round.num} — ${round.label}`,\n `Workflow: ${wf.name} (\\`${wf.id}\\`)`,\n \"\",\n ];\n\n if (isFinal && summaryName && summaryDescription) {\n try {\n const entryId = await mcpMutation<string>(\"chain.createEntry\", {\n collectionSlug: wf.kbOutputCollection,\n name: summaryName,\n status: \"draft\",\n data: {\n [wf.kbOutputTemplate.descriptionField]: summaryDescription,\n workflowType: wf.id,\n completedRound: roundId,\n date: new Date().toISOString().split(\"T\")[0],\n },\n createdBy: `workflow:${wf.id}`,\n });\n\n lines.push(\n `**Entry Committed**: \\`${entryId}\\``,\n `Collection: \\`${wf.kbOutputCollection}\\``,\n `Name: ${summaryName}`,\n \"\",\n `The retro is now committed to the Chain. `,\n `Use \\`suggest-links\\` on this entry to connect it to related knowledge.`,\n );\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n lines.push(\n `**Chain commit failed**: ${msg}`,\n \"\",\n `The retro output is preserved in this conversation. `,\n `You can manually create the entry later using \\`capture\\` with:`,\n `- Collection: \\`${wf.kbOutputCollection}\\``,\n `- Name: ${summaryName}`,\n `- Description: (copy from the conversation summary above)`,\n );\n }\n } else {\n lines.push(\n `Round ${round.num} output recorded.`,\n `Output: ${output.substring(0, 200)}${output.length > 200 ? \"...\" : \"\"}`,\n );\n\n const currentIdx = wf.rounds.findIndex((r) => r.id === roundId);\n if (currentIdx < wf.rounds.length - 1) {\n const next = wf.rounds[currentIdx + 1];\n lines.push(\n \"\",\n `**Next**: Round ${next.num} — ${next.label}`,\n `_${next.instruction}_`,\n );\n } else {\n lines.push(\n \"\",\n `**All rounds complete.** Call this tool again with \\`isFinal: true\\` to commit to the Chain.`,\n );\n }\n }\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n },\n );\n}\n","/**\n * Chainwork Workflow Definitions — ARCH-node-mcp (Core layer)\n * Chain: GT-006 (MCP), FEAT-MCP-001\n *\n * Each workflow is a typed chain of rounds with facilitation instructions.\n * The agent uses these to drive structured conversations in Facilitator Mode.\n */\n\nexport interface WorkflowRound {\n id: string;\n num: string;\n label: string;\n type: \"open\" | \"choice\" | \"synthesis\" | \"commit\" | \"close\";\n instruction: string;\n facilitatorGuidance: string;\n questions?: WorkflowQuestion[];\n outputSchema: {\n field: string;\n description: string;\n format: \"freetext\" | \"list\" | \"choice\" | \"structured\";\n };\n kbCollection?: string;\n maxDurationHint?: string;\n}\n\nexport interface WorkflowQuestion {\n id: string;\n prompt: string;\n options?: { id: string; label: string }[];\n allowMultiple?: boolean;\n required?: boolean;\n}\n\nexport interface WorkflowDefinition {\n id: string;\n name: string;\n shortDescription: string;\n icon: string;\n facilitatorPreamble: string;\n rounds: WorkflowRound[];\n kbOutputCollection: string;\n kbOutputTemplate: {\n nameTemplate: string;\n descriptionField: string;\n };\n errorRecovery: string;\n}\n\n// ── Retro Workflow ──────────────────────────────────────────────────────────\n\nconst RETRO_WORKFLOW: WorkflowDefinition = {\n id: \"retro\",\n name: \"Retrospective\",\n shortDescription:\n \"Structured team retrospective — reflect, surface patterns, commit to actions. Commits a decision entry to the Chain.\",\n icon: \"◎\",\n facilitatorPreamble: `You are now in **Facilitator Mode**. You are not a coding assistant — you are a facilitator running a structured retrospective.\n\n## Your Behavior\n\n1. **Guide, don't solve.** Ask questions, reflect back, synthesize. Never jump to solutions.\n2. **One round at a time.** Complete each round fully before moving to the next. No skipping.\n3. **Use structured questions** (AskQuestion tool) for choices and multi-select. Use open conversation for reflection.\n4. **Create a Plan** at the start showing all rounds as tasks. Update it as you progress.\n5. **Synthesize between rounds.** After collecting input, reflect back what you heard before moving on.\n6. **Never go silent.** If something fails, say what happened and what to do next.\n7. **Commit to the Chain** at the end using the Product OS capture tool.\n8. **Match the energy.** Be warm but structured. This is a ceremony, not a checklist.\n\n## Communication Style\n\n- Start each round with its number, name, and a brief instruction\n- Use quotes and emphasis to reflect back what the participant said\n- End each round with a brief synthesis before transitioning\n- When a round is complete, mark it as done in the Plan\n- If the participant seems stuck, offer prompts — never pressure\n- If a tool call fails, explain what happened and offer an alternative path\n\n## Error Recovery\n\nIf at any point a tool call or MCP operation fails:\n1. Tell the participant what you were trying to do\n2. Explain what went wrong (briefly, no stack traces)\n3. Offer a manual alternative (e.g., \"I'll capture this in the conversation instead\")\n4. Continue the workflow — never halt completely\n\n## Plan Structure\n\nCreate a Cursor Plan with these rounds as tasks. Mark each in_progress as you enter it, completed when done.`,\n\n rounds: [\n {\n id: \"set-stage\",\n num: \"01\",\n label: \"Set the Stage\",\n type: \"choice\",\n instruction:\n \"Before we dive in, let's frame what we're reflecting on. What's the scope of this retro?\",\n facilitatorGuidance:\n \"Start warm. Ask the participant to pick or describe what they're retro-ing. Confirm the scope before proceeding. If they gave context already in their initial message, use it — don't make them repeat.\",\n questions: [\n {\n id: \"scope\",\n prompt:\n \"What are we reflecting on? Pick one or describe your own.\",\n options: [\n { id: \"last-week\", label: \"Last week's work\" },\n { id: \"last-sprint\", label: \"Last sprint/cycle\" },\n { id: \"specific-project\", label: \"A specific project or feature\" },\n { id: \"process\", label: \"A process or workflow\" },\n { id: \"custom\", label: \"Something else — let me describe it\" },\n ],\n },\n ],\n outputSchema: {\n field: \"scope\",\n description: \"What timeframe or project is being retro'd\",\n format: \"freetext\",\n },\n maxDurationHint: \"2 min\",\n },\n {\n id: \"what-went-well\",\n num: \"02\",\n label: \"What Went Well\",\n type: \"open\",\n instruction:\n \"Let's start with the good. What went well? What are you proud of? What should we do more of?\",\n facilitatorGuidance:\n \"Celebrate. Reflect back each win with genuine emphasis. Ask follow-ups like 'What made that work?' or 'Who else contributed to that?' Collect at least 3 items before synthesizing. Don't rush past the positive — teams skip this too fast.\",\n outputSchema: {\n field: \"wentWell\",\n description: \"List of things that went well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"what-didnt-go-well\",\n num: \"03\",\n label: \"What Didn't Go Well\",\n type: \"open\",\n instruction:\n \"Now the harder part. What didn't go well? What frustrated you? Where did things break down?\",\n facilitatorGuidance:\n \"Create safety. Acknowledge that this is harder. Don't judge or immediately problem-solve — just listen and capture. Ask 'What was the impact of that?' and 'When did you first notice it?'. Reflect back without softening. Collect at least 3 items.\",\n outputSchema: {\n field: \"didntGoWell\",\n description: \"List of things that didn't go well\",\n format: \"list\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"patterns\",\n num: \"04\",\n label: \"Patterns & Insights\",\n type: \"synthesis\",\n instruction:\n \"Looking at what went well and what didn't — what patterns do you see? What's the deeper insight?\",\n facilitatorGuidance:\n \"This is YOUR moment as facilitator. Synthesize what you've heard across rounds 2 and 3. Surface themes, connections, and contradictions. Propose 2-3 patterns and ask the participant to react. This round transforms raw observations into actionable insights. Don't let the participant skip the 'why' — push for root causes.\",\n outputSchema: {\n field: \"patterns\",\n description: \"Synthesized patterns and insights\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"actions\",\n num: \"05\",\n label: \"Actions & Commitments\",\n type: \"commit\",\n instruction:\n \"Based on these patterns, what will we actually change? Be specific — who does what, by when?\",\n facilitatorGuidance:\n \"Push for specificity. 'Be better at X' is not an action. 'Randy will set up a 15-min weekly check-in by Friday' is. Each action needs an owner and a deadline. Aim for 2-4 concrete actions. Use AskQuestion to confirm the final list. These become the retro's output.\",\n questions: [\n {\n id: \"action-confirm\",\n prompt: \"Are these actions concrete enough to actually happen?\",\n options: [\n { id: \"yes\", label: \"Yes — these are clear and actionable\" },\n { id: \"refine\", label: \"Let me refine some of these\" },\n { id: \"add\", label: \"I want to add more\" },\n ],\n },\n ],\n outputSchema: {\n field: \"actions\",\n description: \"Committed actions with owners and deadlines\",\n format: \"structured\",\n },\n maxDurationHint: \"5 min\",\n },\n {\n id: \"close\",\n num: \"06\",\n label: \"Close & Capture\",\n type: \"close\",\n instruction:\n \"One last thing — in one sentence, what's the single most important thing you're taking away from this retro?\",\n facilitatorGuidance:\n \"Keep it brief. One sentence reflection. Then summarize the entire retro: scope, key wins, key pain points, patterns identified, actions committed. Ask if they want to commit this to the Chain. If yes, use capture to create a decision/tension entry. Thank them for the retro.\",\n outputSchema: {\n field: \"takeaway\",\n description: \"Single-sentence takeaway\",\n format: \"freetext\",\n },\n kbCollection: \"decisions\",\n maxDurationHint: \"2 min\",\n },\n ],\n\n kbOutputCollection: \"decisions\",\n kbOutputTemplate: {\n nameTemplate: \"Retro: {scope} — {date}\",\n descriptionField: \"rationale\",\n },\n\n errorRecovery: `If anything goes wrong during the retro:\n\n1. **MCP tool failure**: Skip the chain commit step. Summarize everything in the conversation instead. Suggest the participant runs \\`capture\\` manually later.\n2. **AskQuestion not available**: Fall back to numbered options in plain text. \"Reply with 1, 2, or 3.\"\n3. **Plan creation fails**: Continue without the Plan. The conversation IS the record.\n4. **Participant goes off-topic**: Gently redirect: \"That's valuable — let's capture it. For now, let's stay with [current round].\"\n5. **Participant wants to stop**: Respect it. Summarize what you have so far. Offer to commit partial results to the Chain.\n\nThe retro must never fail silently. Always communicate state.`,\n};\n\n// ── Workflow Registry ───────────────────────────────────────────────────────\n\nconst WORKFLOWS = new Map<string, WorkflowDefinition>([\n [\"retro\", RETRO_WORKFLOW],\n]);\n\nexport function getWorkflow(id: string): WorkflowDefinition | undefined {\n return WORKFLOWS.get(id);\n}\n\nexport function listWorkflows(): WorkflowDefinition[] {\n return Array.from(WORKFLOWS.values());\n}\n\nexport function getWorkflowIds(): string[] {\n return Array.from(WORKFLOWS.keys());\n}\n","/**\n * Agent session tools — lifecycle management for agent persistent memory.\n * Chain: PB-TEN-001 (AI starts from zero every session)\n *\n * agent-start: Explicit session start. Returns identity string.\n * agent-close: Explicit session close. Blocks writes after close.\n * agent-status: Check current session state.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport {\n getWorkspaceContext,\n startAgentSession,\n closeAgentSession,\n getAgentSessionId,\n isSessionOriented,\n getApiKeyScope,\n mcpCall,\n} from \"../client.js\";\n\nexport function registerSessionTools(server: McpServer): void {\n server.registerTool(\n \"agent-start\",\n {\n title: \"Start Agent Session\",\n description:\n \"Start an agent session. Creates a tracked session for this workspace with full attribution. \" +\n \"If a session is already active, it gets superseded (graceful handover). \" +\n \"Write tools are available after calling orient.\",\n annotations: { readOnlyHint: false },\n },\n async () => {\n try {\n const result = await startAgentSession();\n\n const lines: string[] = [];\n\n if (result.superseded) {\n lines.push(\n `Previous session superseded. Session ${result.superseded.previousSessionId} ` +\n `(started ${result.superseded.startedAt}, initiated by ${result.superseded.initiatedBy}) was closed.`,\n \"\",\n );\n }\n\n lines.push(\n `Session ${result.sessionId} active. ` +\n `Initiated by ${result.initiatedBy}. ` +\n `Workspace ${result.workspaceName}. ` +\n `Scope: ${result.toolsScope}. ` +\n `Write tools available after orient.`,\n );\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Failed to start agent session: ${err.message}` }],\n isError: true,\n };\n }\n },\n );\n\n server.registerTool(\n \"agent-close\",\n {\n title: \"Close Agent Session\",\n description:\n \"Close the current agent session. Records structured session data (entries created, \" +\n \"modified, relations, gate results). After this, write tools are blocked even if \" +\n \"the MCP connection stays open.\",\n annotations: { readOnlyHint: false },\n },\n async () => {\n try {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return {\n content: [{ type: \"text\" as const, text: \"No active agent session to close.\" }],\n };\n }\n\n const session = await mcpCall<Record<string, unknown>>(\"agent.getSession\", {\n sessionId,\n });\n\n await closeAgentSession();\n\n const lines: string[] = [\n `Session ${sessionId} closed.`,\n \"\",\n ];\n\n if (session) {\n const created = (session.entriesCreated as string[])?.length ?? 0;\n const modified = (session.entriesModified as string[])?.length ?? 0;\n const relations = (session.relationsCreated as number) ?? 0;\n const gates = (session.gateFailures as number) ?? 0;\n const warnings = (session.contradictionWarnings as number) ?? 0;\n\n lines.push(\n `| Metric | Count |`,\n `|--------|-------|`,\n `| Entries created | ${created} |`,\n `| Entries modified | ${modified} |`,\n `| Relations created | ${relations} |`,\n `| Gate failures | ${gates} |`,\n `| Contradiction warnings | ${warnings} |`,\n );\n }\n\n lines.push(\"\", \"Write tools are now blocked. Session data saved for future orientation.\");\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Failed to close agent session: ${err.message}` }],\n isError: true,\n };\n }\n },\n );\n\n server.registerTool(\n \"agent-status\",\n {\n title: \"Agent Session Status\",\n description:\n \"Check the current agent session status — whether a session is active, \" +\n \"whether orientation is complete, and session activity so far.\",\n annotations: { readOnlyHint: true },\n },\n async () => {\n try {\n const sessionId = getAgentSessionId();\n if (!sessionId) {\n return {\n content: [{ type: \"text\" as const, text: \"No active agent session. Call `agent-start` to begin.\" }],\n };\n }\n\n const session = await mcpCall<Record<string, unknown>>(\"agent.getSession\", {\n sessionId,\n });\n\n if (!session) {\n return {\n content: [{ type: \"text\" as const, text: \"Session ID cached but not found in Convex. Call `agent-start` to create a new session.\" }],\n };\n }\n\n const oriented = isSessionOriented();\n const created = (session.entriesCreated as string[])?.length ?? 0;\n const modified = (session.entriesModified as string[])?.length ?? 0;\n\n const lines = [\n `Session ${sessionId} ${session.status}.`,\n `Initiated by ${session.initiatedBy}.`,\n `Scope: ${session.toolsScope}.`,\n `Oriented: ${oriented ? \"yes\" : \"no\"}.`,\n \"\",\n `| Metric | Value |`,\n `|--------|-------|`,\n `| Entries created | ${created} |`,\n `| Entries modified | ${modified} |`,\n `| Relations created | ${session.relationsCreated ?? 0} |`,\n `| Started | ${new Date(session.startedAt as number).toISOString()} |`,\n `| Expires | ${new Date(session.expiresAt as number).toISOString()} |`,\n ];\n\n return { content: [{ type: \"text\" as const, text: lines.join(\"\\n\") }] };\n } catch (err: any) {\n return {\n content: [{ type: \"text\" as const, text: `Failed to get session status: ${err.message}` }],\n isError: true,\n };\n }\n },\n );\n}\n","/**\n * GitChain MCP tools — consolidated chain lifecycle operations.\n *\n * 4 tools (down from 14) covering CRUD, versioning, branching, and review.\n * Backend calls are unchanged — same Convex `gitchain.*` namespace.\n *\n * Chain: GT-vaw0re (Git Chain), FEAT-CW-001 (ChainWork Engine)\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext } from \"../client.js\";\n\nfunction linkSummary(links: Record<string, string>): string {\n return Object.entries(links)\n .map(([id, content]) => {\n const filled = typeof content === \"string\" && content.length > 0;\n const preview = filled\n ? content.substring(0, 80) + (content.length > 80 ? \"...\" : \"\")\n : \"(empty)\";\n return ` - **${id}**: ${preview}`;\n })\n .join(\"\\n\");\n}\n\nexport function registerGitChainTools(server: McpServer) {\n\n // ─── chain: CRUD operations ─────────────────────────────────────────\n\n server.registerTool(\n \"chain\",\n {\n title: \"Chain\",\n description:\n \"Manage processes — create, get, list, or edit process links. \" +\n \"Processes are versioned knowledge artifacts that follow a process template \" +\n \"(e.g. Strategy Coherence: Problem → Insight → Choice → Action → Outcome).\",\n inputSchema: {\n action: z.enum([\"create\", \"get\", \"list\", \"edit\"])\n .describe(\"Action: create a process, get process details, list all processes, or edit a process link\"),\n chainEntryId: z.string().optional()\n .describe(\"Chain entry ID (required for get/edit)\"),\n title: z.string().optional()\n .describe(\"Process title (required for create)\"),\n chainTypeId: z.string().optional().default(\"strategy-coherence\")\n .describe(\"Process template slug for create: 'strategy-coherence', 'idm-proposal', or any custom template slug\"),\n description: z.string().optional()\n .describe(\"Description (for create)\"),\n linkId: z.string().optional()\n .describe(\"Link to edit (for edit action): problem, insight, choice, action, outcome\"),\n content: z.string().optional()\n .describe(\"New content for the link (for edit action)\"),\n status: z.string().optional()\n .describe(\"Filter by status for list: 'draft' or 'active'\"),\n author: z.string().optional()\n .describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n },\n },\n async ({ action, chainEntryId, title, chainTypeId, description, linkId, content, status, author }) => {\n if (action === \"create\") {\n if (!title) return { content: [{ type: \"text\" as const, text: \"A `title` is required to create a process.\" }] };\n\n const result = await mcpMutation<{ _id: string; entryId: string }>(\n \"gitchain.createChain\",\n { title, chainTypeId, description, author }\n );\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Process Created\\n\\n` +\n `- **Entry ID:** \\`${result.entryId}\\`\\n` +\n `- **Title:** ${title}\\n` +\n `- **Type:** ${chainTypeId}\\n` +\n `- **Status:** draft\\n\\n` +\n `Use \\`chain action=edit chainEntryId=\"${result.entryId}\" linkId=\"problem\" content=\"...\"\\` to start filling in links.`,\n }],\n };\n }\n\n if (action === \"get\") {\n if (!chainEntryId) return { content: [{ type: \"text\" as const, text: \"A `chainEntryId` is required.\" }] };\n\n const chain = await mcpQuery<any>(\"gitchain.getChain\", { chainEntryId });\n if (!chain) {\n return { content: [{ type: \"text\" as const, text: `Process \"${chainEntryId}\" not found.` }] };\n }\n\n const scoreSection = chain.scores\n ? `\\n## Coherence: ${chain.coherenceScore}%\\n\\n` +\n chain.scores.sections\n .map((s: any) => `- **${s.key}**: ${s.power}/100 (${\"★\".repeat(Math.min(s.stars ?? 0, 5))}${\"☆\".repeat(Math.max(0, 5 - (s.stars ?? 0)))})`)\n .join(\"\\n\")\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# ${chain.name}\\n\\n` +\n `- **Entry ID:** \\`${chain.entryId}\\`\\n` +\n `- **Type:** ${chain.chainTypeName}\\n` +\n `- **Status:** ${chain.status}\\n` +\n `- **Links filled:** ${chain.filledCount}/${chain.totalCount}\\n` +\n `- **Version:** ${chain.currentVersion}\\n` +\n `- **Created by:** ${chain.createdBy ?? \"unknown\"}\\n` +\n `- **History events:** ${chain.historyCount}\\n` +\n scoreSection +\n `\\n\\n## Links\\n\\n` +\n linkSummary(chain.links),\n }],\n };\n }\n\n if (action === \"list\") {\n const chains = await mcpQuery<any[]>(\"gitchain.listChains\", {\n chainTypeId,\n status,\n });\n\n if (chains.length === 0) {\n return { content: [{ type: \"text\" as const, text: \"No processes found. Use `chain action=create` to create one.\" }] };\n }\n\n const formatted = chains\n .map((c) =>\n `- **\\`${c.entryId}\\`** ${c.name} — ${c.chainTypeId} · ` +\n `${c.filledCount}/${c.totalCount} links · ` +\n `coherence: ${c.coherenceScore}% · status: ${c.status}`\n )\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Chains (${chains.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"edit\") {\n if (!chainEntryId) return { content: [{ type: \"text\" as const, text: \"A `chainEntryId` is required.\" }] };\n if (!linkId) return { content: [{ type: \"text\" as const, text: \"A `linkId` is required (e.g. problem, insight, choice, action, outcome).\" }] };\n if (!content) return { content: [{ type: \"text\" as const, text: \"The `content` for the link is required.\" }] };\n\n const result = await mcpMutation<{\n _id: string; entryId: string; linkId: string; status: string;\n }>(\"gitchain.editLink\", { chainEntryId, linkId, content, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Link Updated\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Link:** ${result.linkId}\\n` +\n `- **Chain status:** ${result.status}\\n` +\n `- **Content length:** ${content.length} chars\\n\\n` +\n `Use \\`chain action=get\\` to see the full chain with updated scores.`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n // ─── chain-version: versioning operations ───────────────────────────\n\n server.registerTool(\n \"chain-version\",\n {\n title: \"Chain Version\",\n description:\n \"Manage process versions — commit snapshots, list commits, view history, diff versions, or revert. \" +\n \"Commits record all link content, compute coherence scores, and track changes.\",\n inputSchema: {\n action: z.enum([\"commit\", \"list\", \"diff\", \"revert\", \"history\"])\n .describe(\"Action: commit a snapshot, list commits, diff two versions, revert to a version, or view history\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n commitMessage: z.string().optional()\n .describe(\"Commit message (required for commit). Convention: type(link): description\"),\n versionA: z.number().optional().describe(\"Earlier version for diff\"),\n versionB: z.number().optional().describe(\"Later version for diff\"),\n toVersion: z.number().optional().describe(\"Version number to revert to\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n },\n annotations: { readOnlyHint: false },\n },\n async ({ action, chainEntryId, commitMessage, versionA, versionB, toVersion, author }) => {\n if (action === \"commit\") {\n if (!commitMessage) return { content: [{ type: \"text\" as const, text: \"A `commitMessage` is required.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; version: number; coherenceScore: number;\n linksModified: string[]; commitLintWarning: string | null;\n }>(\"gitchain.commitChain\", { chainEntryId, commitMessage, author });\n\n const warning = result.commitLintWarning\n ? `\\n\\n> **Lint warning:** ${result.commitLintWarning}`\n : \"\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Committed v${result.version}\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Version:** ${result.version}\\n` +\n `- **Message:** ${commitMessage}\\n` +\n `- **Coherence:** ${result.coherenceScore}%\\n` +\n `- **Links modified:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n` +\n warning,\n }],\n };\n }\n\n if (action === \"list\") {\n const commits = await mcpQuery<any[]>(\"gitchain.listCommits\", { chainEntryId });\n\n if (commits.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No commits found for chain \"${chainEntryId}\". Use \\`chain-version action=commit\\` to create the first snapshot.` }] };\n }\n\n const formatted = commits\n .map((c: any) => {\n const date = new Date(c.createdAt).toISOString().replace(\"T\", \" \").substring(0, 19);\n const msg = c.commitMessage ?? c.changeNote ?? \"(no message)\";\n const links = c.linksModified?.length > 0 ? ` [${c.linksModified.join(\", \")}]` : \"\";\n return `- **v${c.version}** ${date} by ${c.author} — ${msg}${links} (${c.versionStatus})`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Commits for ${chainEntryId} (${commits.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"diff\") {\n if (versionA == null || versionB == null) {\n return { content: [{ type: \"text\" as const, text: \"Both `versionA` and `versionB` are required for diff.\" }] };\n }\n\n const diff = await mcpMutation<any>(\"gitchain.diffVersions\", { chainEntryId, versionA, versionB });\n\n let text =\n `# Diff: v${versionA} → v${versionB}\\n\\n` +\n `- **Chain:** \\`${diff.chainEntryId}\\`\\n` +\n `- **Coherence:** ${diff.coherenceBefore}% → ${diff.coherenceAfter}% (${diff.coherenceDelta >= 0 ? \"+\" : \"\"}${diff.coherenceDelta})\\n` +\n `- **Links changed:** ${diff.linksChanged.length > 0 ? diff.linksChanged.join(\", \") : \"none\"}\\n`;\n\n for (const ld of diff.linkDiffs) {\n if (ld.status === \"unchanged\") continue;\n text += `\\n## ${ld.linkId} (${ld.status})\\n\\n`;\n const wordDiff = diff.wordDiffs[ld.linkId];\n if (wordDiff?.length > 0) {\n for (const w of wordDiff) {\n if (w.type === \"delete\") text += `~~${w.value.substring(0, 200)}~~`;\n else if (w.type === \"insert\") text += `**${w.value.substring(0, 200)}**`;\n else text += w.value.substring(0, 200);\n }\n text += \"\\n\";\n }\n }\n\n return { content: [{ type: \"text\" as const, text }] };\n }\n\n if (action === \"revert\") {\n if (toVersion == null) return { content: [{ type: \"text\" as const, text: \"A `toVersion` is required for revert.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; revertedTo: number; newVersion: number; linksModified: string[];\n }>(\"gitchain.revertChain\", { chainEntryId, toVersion, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Reverted\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Reverted to:** v${result.revertedTo}\\n` +\n `- **New version:** v${result.newVersion}\\n` +\n `- **Links affected:** ${result.linksModified.length > 0 ? result.linksModified.join(\", \") : \"none\"}\\n\\n` +\n `History is preserved — this created a new version, not a destructive reset.`,\n }],\n };\n }\n\n if (action === \"history\") {\n const history = await mcpQuery<any[]>(\"gitchain.getHistory\", { chainEntryId });\n\n if (history.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No history found for chain \"${chainEntryId}\".` }] };\n }\n\n const formatted = history\n .sort((a: any, b: any) => b.timestamp - a.timestamp)\n .map((h: any) => {\n const date = new Date(h.timestamp).toISOString().replace(\"T\", \" \").substring(0, 19);\n return `- **${date}** [${h.event}] by ${h.changedBy ?? \"unknown\"} — ${h.note ?? \"\"}`;\n })\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# History for ${chainEntryId} (${history.length} events)\\n\\n${formatted}` }] };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n // ─── chain-branch: branching operations ─────────────────────────────\n\n server.registerTool(\n \"chain-branch\",\n {\n title: \"Chain Branch\",\n description:\n \"Manage process branches — create a branch for isolated editing, list branches, \" +\n \"merge a branch back into main, or check for conflicts.\",\n inputSchema: {\n action: z.enum([\"create\", \"list\", \"merge\", \"conflicts\"])\n .describe(\"Action: create a branch, list branches, merge a branch, or check for conflicts\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n branchName: z.string().optional()\n .describe(\"Branch name (required for merge/conflicts, optional for create)\"),\n strategy: z.enum([\"merge_commit\", \"squash\"]).optional()\n .describe(\"Merge strategy: 'merge_commit' (default) or 'squash'\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n },\n },\n async ({ action, chainEntryId, branchName, strategy, author }) => {\n if (action === \"create\") {\n const result = await mcpMutation<{\n branchId: string; name: string; baseVersion: number;\n }>(\"gitchain.createBranch\", { chainEntryId, name: branchName, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Branch Created\\n\\n` +\n `- **Name:** ${result.name}\\n` +\n `- **Based on:** v${result.baseVersion}\\n` +\n `- **Chain:** \\`${chainEntryId}\\`\\n\\n` +\n `Edit links and commit on this branch, then use \\`chain-branch action=merge\\` to land changes.`,\n }],\n };\n }\n\n if (action === \"list\") {\n const branches = await mcpMutation<any[]>(\"gitchain.listBranches\", { chainEntryId });\n\n if (branches.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No branches found for chain \"${chainEntryId}\".` }] };\n }\n\n const formatted = branches\n .map((b: any) => `- **${b.name}** (${b.status}) — based on v${b.baseVersion}, by ${b.createdBy}`)\n .join(\"\\n\");\n\n return { content: [{ type: \"text\" as const, text: `# Branches for ${chainEntryId} (${branches.length})\\n\\n${formatted}` }] };\n }\n\n if (action === \"merge\") {\n if (!branchName) return { content: [{ type: \"text\" as const, text: \"A `branchName` is required for merge.\" }] };\n\n const result = await mcpMutation<{\n entryId: string; branchName: string; version: number; strategy: string;\n }>(\"gitchain.mergeBranch\", { chainEntryId, branchName, strategy, author });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Branch Merged\\n\\n` +\n `- **Chain:** \\`${result.entryId}\\`\\n` +\n `- **Branch:** ${result.branchName} (now closed)\\n` +\n `- **Version:** v${result.version}\\n` +\n `- **Strategy:** ${result.strategy}\\n\\n` +\n `Main is now at v${result.version}. The branch has been closed.`,\n }],\n };\n }\n\n if (action === \"conflicts\") {\n if (!branchName) return { content: [{ type: \"text\" as const, text: \"A `branchName` is required for conflict check.\" }] };\n\n const result = await mcpMutation<any>(\"gitchain.checkConflicts\", { chainEntryId, branchName });\n\n if (!result.hasConflicts) {\n return {\n content: [{\n type: \"text\" as const,\n text: `# No Conflicts\\n\\nBranch \"${branchName}\" on \\`${chainEntryId}\\` has no conflicts. Safe to merge.`,\n }],\n };\n }\n\n const conflictLines = result.conflicts\n .map((c: any) =>\n `- **${c.linkId}** — modified by: ${c.branches.map((b: any) => `${b.branchName} (${b.author})`).join(\", \")}`\n )\n .join(\"\\n\");\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Conflicts Detected\\n\\n` +\n `Branch \"${branchName}\" conflicts with other branches on these links:\\n\\n` +\n conflictLines +\n `\\n\\nResolve conflicts before merging.`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n\n // ─── chain-review: quality gate and comments ────────────────────────\n\n server.registerTool(\n \"chain-review\",\n {\n title: \"Chain Review\",\n description:\n \"Review process quality — run the coherence gate or manage comments on process versions. \" +\n \"The gate checks: coherence score >= 70%, all links filled, commit message convention.\",\n inputSchema: {\n action: z.enum([\"gate\", \"comment\", \"resolve-comment\", \"list-comments\"])\n .describe(\"Action: run coherence gate, add a comment, resolve a comment, or list comments\"),\n chainEntryId: z.string().describe(\"The chain's entry ID\"),\n commitMessage: z.string().optional()\n .describe(\"Commit message to lint (for gate action)\"),\n versionNumber: z.number().optional()\n .describe(\"Version to comment on or list comments for\"),\n linkId: z.string().optional()\n .describe(\"Link this comment targets (optional for comment)\"),\n body: z.string().optional()\n .describe(\"Comment text (required for comment action)\"),\n commentId: z.string().optional()\n .describe(\"Comment ID (required for resolve-comment)\"),\n author: z.string().optional().describe(\"Who is performing the action. Defaults to 'mcp'.\"),\n },\n annotations: { readOnlyHint: false },\n },\n async ({ action, chainEntryId, commitMessage, versionNumber, linkId, body, commentId, author }) => {\n if (action === \"gate\") {\n const gate = await mcpQuery<any>(\"gitchain.runGate\", { chainEntryId, commitMessage });\n\n const checkLines = gate.checks\n .map((c: any) => `- ${c.pass ? \"PASS\" : \"FAIL\"} **${c.name}**: ${c.detail}`)\n .join(\"\\n\");\n\n const icon = gate.pass ? \"PASS\" : \"BLOCKED\";\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Gate: ${icon}\\n\\n` +\n `- **Score:** ${gate.score}%\\n` +\n `- **Threshold:** ${gate.threshold}%\\n\\n` +\n `## Checks\\n\\n${checkLines}`,\n }],\n };\n }\n\n if (action === \"comment\") {\n if (!versionNumber) return { content: [{ type: \"text\" as const, text: \"A `versionNumber` is required.\" }] };\n if (!body) return { content: [{ type: \"text\" as const, text: \"A `body` is required.\" }] };\n\n const result = await mcpMutation<any>(\"gitchain.addComment\", {\n chainEntryId, versionNumber, linkId, body, author,\n });\n\n return {\n content: [{\n type: \"text\" as const,\n text:\n `# Comment Added\\n\\n` +\n `- **Chain:** \\`${result.chainEntryId}\\`\\n` +\n `- **Version:** v${result.versionNumber}\\n` +\n (result.linkId ? `- **Link:** ${result.linkId}\\n` : \"\") +\n `- **Body:** ${body.substring(0, 200)}`,\n }],\n };\n }\n\n if (action === \"resolve-comment\") {\n if (!commentId) return { content: [{ type: \"text\" as const, text: \"A `commentId` is required.\" }] };\n await mcpMutation(\"gitchain.resolveComment\", { commentId });\n return { content: [{ type: \"text\" as const, text: `Comment resolved.` }] };\n }\n\n if (action === \"list-comments\") {\n const comments = await mcpMutation<any[]>(\"gitchain.listComments\", {\n chainEntryId, versionNumber,\n });\n\n if (comments.length === 0) {\n return { content: [{ type: \"text\" as const, text: `No comments found for chain \"${chainEntryId}\"${versionNumber ? ` v${versionNumber}` : \"\"}.` }] };\n }\n\n const formatted = comments\n .map((c: any) => {\n const date = new Date(c.createdAt).toISOString().replace(\"T\", \" \").substring(0, 19);\n const resolved = c.resolved ? \" (RESOLVED)\" : \"\";\n const link = c.linkId ? ` [${c.linkId}]` : \"\";\n return `- **v${c.version}${link}** ${date} by ${c.author}${resolved}: ${c.body.substring(0, 150)}`;\n })\n .join(\"\\n\");\n\n const unresolvedCount = comments.filter((c: any) => !c.resolved).length;\n\n return {\n content: [{\n type: \"text\" as const,\n text: `# Comments for ${chainEntryId} (${comments.length}, ${unresolvedCount} unresolved)\\n\\n${formatted}`,\n }],\n };\n }\n\n return { content: [{ type: \"text\" as const, text: \"Unknown action.\" }] };\n }\n );\n}\n","/**\n * Map Composition MCP tools — CRUD, slot management, versioning, and suggestion.\n *\n * Maps are composed frameworks (e.g. Lean Canvas) assembled from shared\n * ingredient entries across collections. Each slot holds references to\n * ingredients; committing pins versions to create an immutable snapshot.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery, mcpMutation, getWorkspaceContext } from \"../client.js\";\n\nfunction slotSummary(slots: Record<string, any[]>): string {\n return Object.entries(slots)\n .map(([id, refs]) => {\n if (!refs || refs.length === 0) return ` - **${id}**: (empty)`;\n const items = refs\n .map((r: any) => {\n const name = r.ingredientName ?? r.label ?? r.entryId;\n const version = r.pinnedVersion ? ` v${r.pinnedVersion}` : \"\";\n const status = r.ingredientStatus ? ` [${r.ingredientStatus}]` : \"\";\n return `${name}${version}${status}`;\n })\n .join(\", \");\n return ` - **${id}**: ${items}`;\n })\n .join(\"\\n\");\n}\n\nexport function registerMapTools(server: McpServer) {\n // ─── map: CRUD operations ──────────────────────────────────────────\n\n server.registerTool(\n \"map\",\n {\n title: \"Map\",\n description:\n \"Manage composed framework maps — create, get, or list. \" +\n \"Maps assemble ingredient entries into framework slots (e.g. Lean Canvas). \" +\n \"Use map-slot to add/remove ingredients, map-version to commit and view history.\",\n inputSchema: {\n action: z\n .enum([\"create\", \"get\", \"list\"])\n .describe(\"Action: create a map, get map details, or list all maps\"),\n mapEntryId: z.string().optional().describe(\"Map entry ID (for get)\"),\n title: z.string().optional().describe(\"Map title (for create)\"),\n templateId: z\n .string()\n .optional()\n .default(\"lean-canvas\")\n .describe(\"Template slug for create: 'lean-canvas' or any composed template\"),\n description: z.string().optional().describe(\"Description (for create)\"),\n slotIds: z\n .array(z.string())\n .optional()\n .describe(\"Slot IDs to initialize (for create; auto-populated from template if omitted)\"),\n status: z.string().optional().describe(\"Filter by status for list\"),\n },\n },\n async ({ action, mapEntryId, title, templateId, description, slotIds, status }) => {\n if (action === \"create\") {\n if (!title) {\n return {\n content: [\n { type: \"text\" as const, text: \"A `title` is required to create a map.\" },\n ],\n };\n }\n\n const result = await mcpMutation<{ _id: string; entryId: string }>(\n \"maps.createMap\",\n { title, templateId, description, slotIds }\n );\n\n const wsCtx = await getWorkspaceContext();\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Map Created\\n\\n` +\n `- **Entry ID:** \\`${result.entryId}\\`\\n` +\n `- **Title:** ${title}\\n` +\n `- **Template:** ${templateId}\\n` +\n `- **Status:** draft\\n` +\n `- **Workspace:** ${wsCtx.workspaceSlug} (${wsCtx.workspaceId})\\n\\n` +\n `Use \\`map-slot action=add mapEntryId=\"${result.entryId}\" slotId=\"problem\" ingredientEntryId=\"...\"\\` to start filling slots.`,\n },\n ],\n };\n }\n\n if (action === \"get\") {\n if (!mapEntryId) {\n return {\n content: [{ type: \"text\" as const, text: \"A `mapEntryId` is required.\" }],\n };\n }\n\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# ${map.name}\\n\\n` +\n `- **Entry ID:** \\`${map.entryId}\\`\\n` +\n `- **Template:** ${map.templateName}\\n` +\n `- **Status:** ${map.status}\\n` +\n `- **Version:** ${map.currentVersion}\\n` +\n `- **Completion:** ${map.completionScore}% (${map.filledSlots}/${map.totalSlots} slots)\\n\\n` +\n `## Slots\\n\\n` +\n slotSummary(map.slots),\n },\n ],\n };\n }\n\n if (action === \"list\") {\n const maps = await mcpQuery<any[]>(\"maps.listMaps\", {\n templateId: templateId !== \"lean-canvas\" ? templateId : undefined,\n status,\n });\n\n if (!maps || maps.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"No maps found. Create one with `map action=create title=\\\"My Canvas\\\"`.\",\n },\n ],\n };\n }\n\n const lines = maps.map(\n (m: any) =>\n `- **${m.name}** (\\`${m.entryId}\\`) — ${m.templateId}, ${m.completionScore}% complete, v${m.currentVersion}`\n );\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Maps (${maps.length})\\n\\n${lines.join(\"\\n\")}`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n\n // ─── map-slot: manage ingredients in slots ─────────────────────────\n\n server.registerTool(\n \"map-slot\",\n {\n title: \"Map Slot\",\n description:\n \"Add, remove, or replace ingredient references in a map's slots. \" +\n \"Ingredients are entries from any collection that fill a framework position.\",\n inputSchema: {\n action: z\n .enum([\"add\", \"remove\", \"replace\", \"list\"])\n .describe(\"Action: add/remove/replace an ingredient in a slot, or list slot contents\"),\n mapEntryId: z.string().describe(\"Map entry ID\"),\n slotId: z.string().optional().describe(\"Slot ID (e.g. 'problem', 'customer-segments')\"),\n ingredientEntryId: z\n .string()\n .optional()\n .describe(\"Ingredient entry ID to add/remove\"),\n newIngredientEntryId: z\n .string()\n .optional()\n .describe(\"New ingredient entry ID (for replace)\"),\n label: z.string().optional().describe(\"Display label override\"),\n author: z.string().optional().describe(\"Who is performing the action\"),\n },\n },\n async ({\n action,\n mapEntryId,\n slotId,\n ingredientEntryId,\n newIngredientEntryId,\n label,\n author,\n }) => {\n if (action === \"list\") {\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n if (slotId && map.slots[slotId]) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Slot: ${slotId}\\n\\n` +\n (map.slots[slotId].length === 0\n ? \"(empty)\"\n : map.slots[slotId]\n .map(\n (r: any) =>\n `- **${r.ingredientName ?? r.entryId}** (\\`${r.entryId}\\`)${r.pinnedVersion ? ` v${r.pinnedVersion}` : \"\"}`\n )\n .join(\"\\n\")),\n },\n ],\n };\n }\n\n return {\n content: [\n { type: \"text\" as const, text: `## All Slots\\n\\n${slotSummary(map.slots)}` },\n ],\n };\n }\n\n if (action === \"add\") {\n if (!slotId || !ingredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Both `slotId` and `ingredientEntryId` are required for add.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.addToSlot\", {\n mapEntryId,\n slotId,\n ingredientEntryId,\n label,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Added \\`${ingredientEntryId}\\` to slot \"${slotId}\" on map \\`${mapEntryId}\\`.`,\n },\n ],\n };\n }\n\n if (action === \"remove\") {\n if (!slotId || !ingredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"Both `slotId` and `ingredientEntryId` are required for remove.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.removeFromSlot\", {\n mapEntryId,\n slotId,\n ingredientEntryId,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Removed \\`${ingredientEntryId}\\` from slot \"${slotId}\" on map \\`${mapEntryId}\\`.`,\n },\n ],\n };\n }\n\n if (action === \"replace\") {\n if (!slotId || !ingredientEntryId || !newIngredientEntryId) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: \"`slotId`, `ingredientEntryId`, and `newIngredientEntryId` are required for replace.\",\n },\n ],\n };\n }\n\n await mcpMutation(\"maps.replaceInSlot\", {\n mapEntryId,\n slotId,\n oldIngredientEntryId: ingredientEntryId,\n newIngredientEntryId,\n label,\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `Replaced \\`${ingredientEntryId}\\` with \\`${newIngredientEntryId}\\` in slot \"${slotId}\".`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n\n // ─── map-version: commit, list history, diff ───────────────────────\n\n server.registerTool(\n \"map-version\",\n {\n title: \"Map Version\",\n description:\n \"Commit a map (pins ingredient versions), list commit history, or view a specific commit.\",\n inputSchema: {\n action: z\n .enum([\"commit\", \"list\", \"history\"])\n .describe(\"Action: commit the map, list commits, or view commit history\"),\n mapEntryId: z.string().describe(\"Map entry ID\"),\n commitMessage: z\n .string()\n .optional()\n .describe(\"Commit message (for commit action)\"),\n author: z.string().optional().describe(\"Who is committing\"),\n },\n },\n async ({ action, mapEntryId, commitMessage, author }) => {\n if (action === \"commit\") {\n const result = await mcpMutation<any>(\"maps.commitMap\", {\n mapEntryId,\n commitMessage: commitMessage ?? \"Map committed\",\n author,\n });\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Map Committed\\n\\n` +\n `- **Version:** ${result.version}\\n` +\n `- **Completion:** ${result.completionScore}%\\n` +\n `- **Slots modified:** ${result.slotsModified.length > 0 ? result.slotsModified.join(\", \") : \"(none)\"}\\n\\n` +\n `All ingredient references have been pinned at their current versions.`,\n },\n ],\n };\n }\n\n if (action === \"list\" || action === \"history\") {\n const commits = await mcpQuery<any[]>(\"maps.listMapCommits\", {\n mapEntryId,\n });\n\n if (!commits || commits.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: `No commits yet for map \\`${mapEntryId}\\`. Use \\`map-version action=commit\\` to create the first snapshot.`,\n },\n ],\n };\n }\n\n const lines = commits.map(\n (c: any) =>\n `- **v${c.version}** (${new Date(c.createdAt).toLocaleDateString()}) — ${c.commitMessage ?? \"(no message)\"} — by ${c.author}` +\n (c.slotsModified.length > 0\n ? `\\n Slots changed: ${c.slotsModified.join(\", \")}`\n : \"\")\n );\n\n return {\n content: [\n {\n type: \"text\" as const,\n text: `# Map History: \\`${mapEntryId}\\` (${commits.length} commits)\\n\\n${lines.join(\"\\n\")}`,\n },\n ],\n };\n }\n\n return {\n content: [{ type: \"text\" as const, text: `Unknown action: ${action}` }],\n };\n }\n );\n\n // ─── map-suggest: find ingredients to fill slots ───────────────────\n\n server.registerTool(\n \"map-suggest\",\n {\n title: \"Map Suggest\",\n description:\n \"Given a map with empty slots, search the Chain for ingredients that could fill them. \" +\n \"Uses keyword search and collection matching based on the template's suggested collections.\",\n inputSchema: {\n mapEntryId: z.string().describe(\"Map entry ID to suggest ingredients for\"),\n slotId: z\n .string()\n .optional()\n .describe(\"Specific slot to find ingredients for (or all empty slots)\"),\n query: z\n .string()\n .optional()\n .describe(\"Optional search query to narrow ingredient suggestions\"),\n },\n },\n async ({ mapEntryId, slotId, query }) => {\n const map = await mcpQuery<any>(\"maps.getMap\", { mapEntryId });\n if (!map) {\n return {\n content: [{ type: \"text\" as const, text: `Map \"${mapEntryId}\" not found.` }],\n };\n }\n\n const emptySlots = slotId\n ? [slotId].filter((id) => (map.slots[id]?.length ?? 0) === 0)\n : Object.entries(map.slots as Record<string, any[]>)\n .filter(([, refs]) => refs.length === 0)\n .map(([id]) => id);\n\n if (emptySlots.length === 0) {\n return {\n content: [\n {\n type: \"text\" as const,\n text: slotId\n ? `Slot \"${slotId}\" already has ingredients.`\n : \"All slots have ingredients. Nothing to suggest.\",\n },\n ],\n };\n }\n\n const slotDefs = map.slotDefs ?? [];\n const suggestions: string[] = [];\n\n for (const sid of emptySlots) {\n const def = slotDefs.find((s: any) => s.id === sid);\n const searchQuery = query ?? def?.label ?? sid;\n\n const results = await mcpQuery<any[]>(\"knowledge.search\", {\n query: searchQuery,\n limit: 5,\n });\n\n if (results && results.length > 0) {\n const items = results.map(\n (r: any) =>\n ` - **${r.name}** (\\`${r.entryId}\\`, ${r.collectionName ?? \"unknown\"}) — ${r.status}`\n );\n suggestions.push(\n `### ${def?.label ?? sid}\\n${def?.description ?? \"\"}\\n\\n${items.join(\"\\n\")}`\n );\n } else {\n suggestions.push(\n `### ${def?.label ?? sid}\\n_No matching entries found. Create ingredients first._`\n );\n }\n }\n\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n `# Ingredient Suggestions for \"${map.name}\"\\n\\n` +\n suggestions.join(\"\\n\\n\") +\n `\\n\\nUse \\`map-slot action=add mapEntryId=\"${mapEntryId}\" slotId=\"...\" ingredientEntryId=\"...\"\\` to add ingredients.`,\n },\n ],\n };\n }\n );\n}\n","/**\n * `start` tool — the unified MCP entry point for Product Brain.\n *\n * Freshness detection:\n * - Workspace is set up (has non-system entries): runs orient-style response\n * - Workspace is fresh (no entries or only system entries): runs guided setup\n *\n * `orient` continues to exist unchanged for backward compatibility.\n * `start` calls orient internally for the \"set up\" path.\n */\n\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport {\n mcpQuery,\n mcpCall,\n getWorkspaceId,\n getWorkspaceContext,\n getAgentSessionId,\n setSessionOriented,\n getApiKeyScope,\n} from \"../client.js\";\nimport { COLLECTION_PRESETS, listPresets, getPreset, type CollectionPresetDef } from \"../presets/collections.js\";\n\nexport function registerStartTools(server: McpServer) {\n server.registerTool(\n \"start\",\n {\n title: \"Start Product Brain\",\n description:\n \"The zero-friction entry point. Say 'start PB' to begin.\\n\\n\" +\n \"- **Fresh workspace**: asks what you're building, seeds tailored collections, \" +\n \"and gets you ready to capture knowledge immediately.\\n\" +\n \"- **Existing workspace**: returns readiness score, recent activity, open tensions, \" +\n \"and suggested next actions (same as orient).\\n\\n\" +\n \"Use this as your first call. Replaces the need to call orient, workspace-status, \" +\n \"or health separately.\",\n inputSchema: {\n preset: z\n .string()\n .optional()\n .describe(\n \"Collection preset ID to seed (e.g. 'software-product', 'content-business', 'agency', 'saas-api', 'general'). \" +\n \"Only used for fresh workspaces. If omitted on a fresh workspace, returns the preset menu.\"\n ),\n },\n annotations: { readOnlyHint: false },\n },\n async ({ preset }) => {\n const errors: string[] = [];\n const agentSessionId = getAgentSessionId();\n\n let wsCtx: {\n workspaceSlug: string;\n workspaceName: string;\n workspaceId: string;\n } | null = null;\n try {\n wsCtx = await getWorkspaceContext();\n } catch (e: any) {\n errors.push(`Workspace: ${e.message}`);\n }\n\n if (!wsCtx) {\n return {\n content: [\n {\n type: \"text\" as const,\n text:\n \"# Could not connect to Product Brain\\n\\n\" +\n (errors.length > 0 ? errors.map((e) => `- ${e}`).join(\"\\n\") : \"Check your API key and CONVEX_SITE_URL.\"),\n },\n ],\n };\n }\n\n const isFresh = await detectFreshWorkspace();\n\n if (isFresh && !preset) {\n return { content: [{ type: \"text\" as const, text: buildPresetMenu(wsCtx) }] };\n }\n\n if (isFresh && preset) {\n return { content: [{ type: \"text\" as const, text: await seedPreset(wsCtx, preset, agentSessionId) }] };\n }\n\n // Workspace is set up — run orient-style response\n return { content: [{ type: \"text\" as const, text: await buildOrientResponse(wsCtx, agentSessionId, errors) }] };\n }\n );\n}\n\nasync function detectFreshWorkspace(): Promise<boolean> {\n try {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", {});\n const nonSystem = (entries ?? []).filter((e: any) => !e.isSystem);\n return nonSystem.length === 0;\n } catch {\n return false;\n }\n}\n\nfunction buildPresetMenu(wsCtx: { workspaceName: string; workspaceSlug: string }): string {\n const presets = listPresets();\n const lines = [\n `# Welcome to ${wsCtx.workspaceName}`,\n \"\",\n \"Your workspace is fresh — let's set it up. **What are you building?**\",\n \"\",\n \"Choose a preset to tailor your collections:\",\n \"\",\n ];\n\n for (const p of presets) {\n lines.push(`- **${p.name}** (\\`${p.id}\\`) — ${p.description} (${p.collectionCount} collections)`);\n }\n\n lines.push(\n \"\",\n 'Call `start` again with your choice, e.g.: `start preset=\"software-product\"`',\n \"\",\n \"_You can always add, remove, or customize collections later._\",\n );\n\n return lines.join(\"\\n\");\n}\n\nasync function seedPreset(\n wsCtx: { workspaceName: string; workspaceSlug: string },\n presetId: string,\n agentSessionId: string | null,\n): Promise<string> {\n const preset = getPreset(presetId);\n if (!preset) {\n return (\n `Preset \"${presetId}\" not found.\\n\\n` +\n `Available presets: ${listPresets().map((p) => `\\`${p.id}\\``).join(\", \")}`\n );\n }\n\n const seeded: string[] = [];\n const skipped: string[] = [];\n\n for (const col of preset.collections) {\n try {\n await mcpCall(\"chain.createCollection\", {\n slug: col.slug,\n name: col.name,\n description: col.description,\n icon: col.icon,\n fields: col.fields,\n isDefault: false,\n createdBy: \"preset:\" + presetId,\n });\n seeded.push(col.name);\n } catch {\n skipped.push(`${col.name} (already exists)`);\n }\n }\n\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n } catch { /* non-critical */ }\n }\n\n const lines = [\n `# ${wsCtx.workspaceName} is ready`,\n \"\",\n `Seeded **${preset.name}** preset with ${seeded.length} collection${seeded.length === 1 ? \"\" : \"s\"}:`,\n \"\",\n ];\n\n for (const name of seeded) {\n lines.push(`- ${name}`);\n }\n\n if (skipped.length > 0) {\n lines.push(\"\", \"Skipped (already exist):\");\n for (const name of skipped) {\n lines.push(`- ${name}`);\n }\n }\n\n lines.push(\n \"\",\n \"## What's next?\",\n \"\",\n \"Start capturing knowledge. Here are example commands for your collections:\",\n \"\",\n );\n\n for (const col of preset.collections.slice(0, 3)) {\n lines.push(\n `- \\`capture collection=\"${col.slug}\" name=\"...\" description=\"...\"\\` — add to ${col.name}`,\n );\n }\n\n lines.push(\n \"\",\n \"After capturing a few entries, use `suggest-links` to connect them into a knowledge graph.\",\n \"\",\n \"---\",\n `Orientation complete. Write tools are available.`,\n );\n\n return lines.join(\"\\n\");\n}\n\nasync function buildOrientResponse(\n wsCtx: { workspaceName: string; workspaceSlug: string; workspaceId: string },\n agentSessionId: string | null,\n errors: string[],\n): Promise<string> {\n let priorSessions: any[] = [];\n try {\n priorSessions = await mcpQuery<any[]>(\"agent.recentSessions\", { limit: 3 });\n } catch { /* non-critical */ }\n\n let constraintEntries: any[] = [];\n try {\n const [archEntries, ruleEntries, decisionEntries] = await Promise.all([\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"architecture\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"decisions\" }),\n ]);\n const committed = [\n ...(archEntries ?? []).filter((e: any) => e.status === \"active\" || e.status === \"healthy\"),\n ...(ruleEntries ?? []).filter((e: any) => e.status === \"Active\" || e.status === \"active\"),\n ...(decisionEntries ?? []).filter((e: any) => e.status === \"Decided\" || e.status === \"active\"),\n ];\n constraintEntries = committed\n .sort((a: any, b: any) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, 8);\n } catch { /* non-critical */ }\n\n let openTensions: any[] = [];\n try {\n const tensions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"tensions\" });\n openTensions = (tensions ?? []).filter((e: any) => e.status === \"draft\");\n } catch { /* non-critical */ }\n\n let readiness: any = null;\n try {\n readiness = await mcpQuery<any>(\"chain.workspaceReadiness\");\n } catch (e: any) {\n errors.push(`Readiness: ${e.message}`);\n }\n\n const lines: string[] = [];\n\n lines.push(`# ${wsCtx.workspaceName}`);\n lines.push(`_Workspace \\`${wsCtx.workspaceSlug}\\` — Product Brain is healthy._`);\n lines.push(\"\");\n\n if (readiness) {\n const scoreBar =\n \"█\".repeat(Math.round(readiness.score / 10)) +\n \"░\".repeat(10 - Math.round(readiness.score / 10));\n lines.push(`## Readiness: ${readiness.score}%`);\n lines.push(`${scoreBar} ${readiness.passedChecks}/${readiness.totalChecks} requirements`);\n lines.push(\"\");\n if (readiness.gaps?.length > 0) {\n lines.push(\"### Gaps\");\n for (const gap of readiness.gaps) {\n lines.push(`- [ ] **${gap.label}** (${gap.current}/${gap.required}) — _${gap.guidance}_`);\n }\n lines.push(\"\");\n }\n }\n\n if (openTensions.length > 0) {\n lines.push(`## Open Tensions (${openTensions.length})`);\n for (const t of openTensions) {\n const id = t.entryId ?? \"(no ID)\";\n const prio = t.data?.priority ?? \"\";\n lines.push(`- \\`${id}\\` ${t.name}${prio ? ` _(${prio})_` : \"\"}`);\n }\n lines.push(\"\");\n }\n\n if (priorSessions.length > 0) {\n lines.push(`## Prior Agent Sessions (last ${priorSessions.length})`);\n for (const s of priorSessions) {\n const date = new Date(s.startedAt).toISOString().split(\"T\")[0];\n const created = Array.isArray(s.entriesCreated) ? s.entriesCreated.length : s.entriesCreated ?? 0;\n const modified = Array.isArray(s.entriesModified) ? s.entriesModified.length : s.entriesModified ?? 0;\n const stats = `${created} created, ${modified} modified, ${s.relationsCreated ?? 0} relations`;\n lines.push(`- **${date}** (${s.status}, by ${s.initiatedBy ?? \"unknown\"}) — ${stats}`);\n }\n lines.push(\"\");\n }\n\n if (constraintEntries.length > 0) {\n lines.push(`## Active Constraints (${constraintEntries.length})`);\n lines.push(\"_Architecture, business rules, and decisions that govern this workspace._\");\n lines.push(\"\");\n for (const c of constraintEntries) {\n const id = c.entryId ?? \"(no ID)\";\n const col = c.collectionSlug ?? \"\";\n const desc = c.data?.description ?? c.data?.rationale ?? \"\";\n const truncated = desc.length > 100 ? desc.slice(0, 100) + \"...\" : desc;\n lines.push(`- \\`${id}\\` **${c.name}** [${col}] — ${truncated}`);\n }\n lines.push(\"\");\n }\n\n if (errors.length > 0) {\n lines.push(\"## Errors\");\n for (const err of errors) lines.push(`- ${err}`);\n lines.push(\"\");\n }\n\n if (agentSessionId) {\n try {\n await mcpCall(\"agent.markOriented\", { sessionId: agentSessionId });\n setSessionOriented(true);\n\n const readinessInfo = readiness ? `${readiness.score}% readiness.` : \"\";\n const tensionInfo =\n openTensions.length > 0\n ? `${openTensions.length} open tensions.`\n : \"No open tensions.\";\n\n lines.push(\"---\");\n lines.push(\n `Orientation complete. Session ${agentSessionId}. Write tools now available. ${readinessInfo} ${tensionInfo}`,\n );\n } catch {\n lines.push(\"---\");\n lines.push(\"_Warning: Could not mark session as oriented. Write tools may be restricted._\");\n }\n } else {\n lines.push(\"---\");\n lines.push(\"_No active agent session. Call `agent-start` to begin a tracked session._\");\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Collection presets — curated starter sets for common workspace types.\n * Each preset is a list of collection definitions that can be seeded\n * into a fresh workspace via the `start` flow.\n *\n * These are the seed of a future collection marketplace.\n */\n\nexport interface CollectionPresetField {\n key: string;\n label: string;\n type: string;\n required?: boolean;\n options?: string[];\n searchable?: boolean;\n}\n\nexport interface CollectionPresetDef {\n slug: string;\n name: string;\n description: string;\n icon?: string;\n fields: CollectionPresetField[];\n}\n\nexport interface CollectionPreset {\n id: string;\n name: string;\n description: string;\n collections: CollectionPresetDef[];\n}\n\nexport const COLLECTION_PRESETS: CollectionPreset[] = [\n {\n id: \"software-product\",\n name: \"Software Product\",\n description: \"For teams building software products — glossary, features, architecture, tech debt, and API endpoints\",\n collections: [\n { slug: \"glossary\", name: \"Glossary\", description: \"Canonical terminology for the product domain\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"select\", options: [\"Platform & Architecture\", \"Knowledge Management\", \"AI & Developer Tools\", \"Governance & Process\"] }, { key: \"confusedWith\", label: \"Confused With\", type: \"array\" }] },\n { slug: \"features\", name: \"Features\", description: \"Product features and capabilities\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"scope\", label: \"Scope\", type: \"string\" }, { key: \"area\", label: \"Area\", type: \"string\" }, { key: \"status\", label: \"Status\", type: \"select\", options: [\"proposed\", \"in-progress\", \"shipped\", \"deprecated\"] }] },\n { slug: \"architecture\", name: \"Architecture\", description: \"System architecture layers and components\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"layer\", label: \"Layer\", type: \"string\" }, { key: \"dependencies\", label: \"Dependencies\", type: \"array\" }] },\n { slug: \"tech-debt\", name: \"Tech Debt\", description: \"Technical debt items to track and address\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }, { key: \"area\", label: \"Area\", type: \"string\" }, { key: \"effort\", label: \"Effort\", type: \"select\", options: [\"small\", \"medium\", \"large\"] }] },\n { slug: \"api-endpoints\", name: \"API Endpoints\", description: \"REST/GraphQL endpoints and their contracts\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"method\", label: \"Method\", type: \"select\", options: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] }, { key: \"path\", label: \"Path\", type: \"string\" }, { key: \"auth\", label: \"Auth Required\", type: \"select\", options: [\"none\", \"api-key\", \"bearer\", \"session\"] }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Significant decisions with rationale and context\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }, { key: \"alternatives\", label: \"Alternatives\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Friction points, pain points, and unmet needs\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }, { key: \"severity\", label: \"Severity\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"content-business\",\n name: \"Content Business\",\n description: \"For content creators, publishers, and media companies — topics, audience segments, content calendar, and brand voice\",\n collections: [\n { slug: \"glossary\", name: \"Glossary\", description: \"Industry terminology and brand language\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"topics\", name: \"Topics\", description: \"Content topics and themes\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"pillar\", label: \"Content Pillar\", type: \"string\" }, { key: \"stage\", label: \"Stage\", type: \"select\", options: [\"idea\", \"researching\", \"drafting\", \"published\", \"evergreen\"] }] },\n { slug: \"audience-segments\", name: \"Audience Segments\", description: \"Target reader/viewer personas\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"painPoints\", label: \"Pain Points\", type: \"string\" }, { key: \"channels\", label: \"Channels\", type: \"array\" }] },\n { slug: \"brand-voice\", name: \"Brand Voice\", description: \"Tone, style, and voice guidelines\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"doThis\", label: \"Do This\", type: \"string\" }, { key: \"notThis\", label: \"Not This\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Editorial and strategic decisions\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Content gaps, audience friction, and unmet needs\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"agency\",\n name: \"Agency\",\n description: \"For agencies managing multiple clients — client profiles, project scopes, deliverables, and processes\",\n collections: [\n { slug: \"glossary\", name: \"Glossary\", description: \"Agency and client terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"clients\", name: \"Clients\", description: \"Client profiles and relationship context\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"industry\", label: \"Industry\", type: \"string\" }, { key: \"contact\", label: \"Primary Contact\", type: \"string\" }] },\n { slug: \"deliverables\", name: \"Deliverables\", description: \"Standard deliverable types and templates\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"type\", label: \"Type\", type: \"string\" }, { key: \"estimatedHours\", label: \"Estimated Hours\", type: \"string\" }] },\n { slug: \"processes\", name: \"Processes\", description: \"Standard operating procedures and workflows\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"steps\", label: \"Steps\", type: \"string\" }, { key: \"owner\", label: \"Owner\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Strategic and operational decisions\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Process bottlenecks and client friction\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n {\n id: \"saas-api\",\n name: \"SaaS API\",\n description: \"For API-first SaaS products — endpoints, schemas, rate limits, changelog, and integration guides\",\n collections: [\n { slug: \"glossary\", name: \"Glossary\", description: \"API and domain terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"api-endpoints\", name: \"API Endpoints\", description: \"API routes and contracts\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"method\", label: \"Method\", type: \"select\", options: [\"GET\", \"POST\", \"PUT\", \"PATCH\", \"DELETE\"] }, { key: \"path\", label: \"Path\", type: \"string\" }, { key: \"auth\", label: \"Auth\", type: \"select\", options: [\"none\", \"api-key\", \"bearer\", \"oauth\"] }] },\n { slug: \"schemas\", name: \"Schemas\", description: \"Data models and API schemas\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"format\", label: \"Format\", type: \"select\", options: [\"json\", \"protobuf\", \"graphql\", \"openapi\"] }, { key: \"version\", label: \"Version\", type: \"string\" }] },\n { slug: \"rate-limits\", name: \"Rate Limits\", description: \"Rate limiting policies and tiers\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"tier\", label: \"Tier\", type: \"string\" }, { key: \"limit\", label: \"Limit\", type: \"string\" }] },\n { slug: \"changelog\", name: \"Changelog\", description: \"API version history and breaking changes\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"version\", label: \"Version\", type: \"string\" }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"breaking\", label: \"Breaking\", type: \"select\", options: [\"yes\", \"no\"] }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"API design decisions and rationale\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }] },\n ],\n },\n {\n id: \"general\",\n name: \"General\",\n description: \"A minimal starter set — glossary, decisions, and tensions. Add more collections as you need them.\",\n collections: [\n { slug: \"glossary\", name: \"Glossary\", description: \"Canonical terminology\", fields: [{ key: \"canonical\", label: \"Canonical\", type: \"string\", required: true, searchable: true }, { key: \"category\", label: \"Category\", type: \"string\" }] },\n { slug: \"decisions\", name: \"Decisions\", description: \"Decisions with rationale\", fields: [{ key: \"rationale\", label: \"Rationale\", type: \"string\", required: true, searchable: true }, { key: \"date\", label: \"Date\", type: \"string\" }, { key: \"decidedBy\", label: \"Decided By\", type: \"string\" }] },\n { slug: \"tensions\", name: \"Tensions\", description: \"Friction points and unmet needs\", fields: [{ key: \"description\", label: \"Description\", type: \"string\", required: true, searchable: true }, { key: \"priority\", label: \"Priority\", type: \"select\", options: [\"low\", \"medium\", \"high\", \"critical\"] }] },\n ],\n },\n];\n\nexport function getPreset(id: string): CollectionPreset | undefined {\n return COLLECTION_PRESETS.find((p) => p.id === id);\n}\n\nexport function listPresets(): Array<{ id: string; name: string; description: string; collectionCount: number }> {\n return COLLECTION_PRESETS.map((p) => ({\n id: p.id,\n name: p.name,\n description: p.description,\n collectionCount: p.collections.length,\n }));\n}\n","import { McpServer, ResourceTemplate } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { mcpQuery } from \"../client.js\";\n\nfunction formatEntryMarkdown(entry: any): string {\n const id = entry.entryId ? `${entry.entryId}: ` : \"\";\n const lines = [`## ${id}${entry.name} [${entry.status}]`];\n if (entry.data && typeof entry.data === \"object\") {\n for (const [key, val] of Object.entries(entry.data)) {\n if (val && key !== \"rawData\") {\n lines.push(`**${key}**: ${typeof val === \"string\" ? val : JSON.stringify(val)}`);\n }\n }\n }\n return lines.join(\"\\n\");\n}\n\nfunction buildOrientationMarkdown(\n collections: any[] | null,\n trackingEvents: any[] | null,\n standards: any[] | null,\n businessRules: any[] | null,\n): string {\n const sections: string[] = [\"# Product Brain — Orientation\"];\n\n // Core Product Architecture (the three primitives)\n sections.push(\n \"## Core Product Architecture\\n\" +\n \"The Chain is a versioned, connected, compounding knowledge base — the SSOT for a product team.\\n\" +\n \"Everything on the Chain is one of **three primitives**:\\n\\n\" +\n \"- **Entry** (atom) — a discrete knowledge unit: target audience, business rule, glossary term, metric, tension. Lives in a collection.\\n\" +\n \"- **Process** (authored) — a narrative chain with named links (Strategy Coherence, IDM Proposal). Content is inline text. Collection: `chains`.\\n\" +\n \"- **Map** (composed) — a framework assembled by reference (Lean Canvas, Empathy Map). Slots point to ingredient entries. Collection: `maps`.\\n\\n\" +\n \"Entries are atoms. Processes author narrative from atoms. Maps compose frameworks from atoms.\\n\" +\n \"All three share the same versioning, branching, gating, and relation system.\\n\\n\" +\n \"The Chain compounds: each new relation makes entries discoverable from more starting points → \" +\n \"gather-context returns richer results → AI processes have more context → quality scores improve → \" +\n \"next commit is smarter than the last.\",\n );\n\n // Architecture\n sections.push(\n \"## Architecture\\n\" +\n \"```\\n\" +\n \"Cursor (stdio) → MCP Server (mcp-server/src/index.ts)\\n\" +\n \" → POST /api/mcp with Bearer token\\n\" +\n \" → Convex HTTP Action (convex/http.ts)\\n\" +\n \" → internalQuery / internalMutation (convex/mcpKnowledge.ts)\\n\" +\n \" → Convex DB (workspace-scoped)\\n\" +\n \"```\\n\" +\n \"Security: API key auth on every request, workspace-scoped data, internal functions blocked from external clients.\\n\" +\n \"Key files: `packages/mcp-server/src/client.ts` (HTTP client + audit), `convex/schema.ts` (schema).\",\n );\n\n // Data model\n if (collections) {\n const collList = collections\n .map((c) => {\n const prefix = c.icon ? `${c.icon} ` : \"\";\n return `- ${prefix}**${c.name}** (\\`${c.slug}\\`) — ${c.description || \"no description\"}`;\n })\n .join(\"\\n\");\n sections.push(\n `## Data Model (${collections.length} collections)\\n` +\n \"Unified entries model: collections define field schemas, entries hold data in a flexible `data` field.\\n\" +\n \"The `data` field is polymorphic: plain fields for generic entries, `ChainData` (chainTypeId + links) for processes, `MapData` (templateId + slots) for maps.\\n\" +\n \"Tags for filtering (e.g. `severity:high`), relations via `entryRelations`, versions via `entryVersions`, labels via `labels` + `entryLabels`.\\n\\n\" +\n collList + \"\\n\\n\" +\n \"Use `list-collections` for field schemas, `get-entry` for full records.\",\n );\n } else {\n sections.push(\n \"## Data Model\\n\" +\n \"Could not load collections — use `list-collections` to browse manually.\",\n );\n }\n\n // Business rules\n const rulesCount = businessRules ? `${businessRules.length} entries` : \"not loaded — collection may not exist yet\";\n sections.push(\n \"## Business Rules\\n\" +\n `Collection: \\`business-rules\\` (${rulesCount}).\\n` +\n \"Find rules: `search` for text search, `list-entries collection=business-rules` to browse.\\n\" +\n \"Check compliance: use the `review-against-rules` prompt (pass a domain).\\n\" +\n \"Draft a new rule: use the `draft-rule-from-context` prompt.\",\n );\n\n // Analytics / tracking\n const eventsCount = trackingEvents ? `${trackingEvents.length} events` : \"not loaded — collection may not exist yet\";\n const conventionNote = standards\n ? \"Naming convention: `object_action` in snake_case with past-tense verbs (from standards collection).\"\n : \"Naming convention: `object_action` in snake_case with past-tense verbs.\";\n sections.push(\n \"## Analytics & Tracking\\n\" +\n `Event catalog: \\`tracking-events\\` collection (${eventsCount}).\\n` +\n `${conventionNote}\\n` +\n \"Implementation: `src/lib/analytics.ts`. Workspace-scoped events MUST use `withWorkspaceGroup()`.\\n\" +\n \"Browse: `list-entries collection=tracking-events`.\",\n );\n\n // Knowledge Graph\n sections.push(\n \"## Knowledge Graph\\n\" +\n \"Entries are connected via typed relations (`entryRelations` table). Relations are bidirectional and collection-agnostic — any entry can link to any other entry.\\n\\n\" +\n \"**Recommended relation types** (extensible — any string accepted):\\n\" +\n \"- `governs` — a rule constrains behavior of a feature\\n\" +\n \"- `defines_term_for` — a glossary term is canonical vocabulary for a feature/area\\n\" +\n \"- `belongs_to` — a feature belongs to a product area or parent concept\\n\" +\n \"- `informs` — a decision or insight informs a feature\\n\" +\n \"- `fills_slot` — an ingredient entry fills a slot in a map\\n\" +\n \"- `surfaces_tension_in` — a tension exists within a feature area\\n\" +\n \"- `related_to`, `depends_on`, `replaces`, `conflicts_with`, `references`, `confused_with`\\n\\n\" +\n \"Each relation type is defined as a glossary entry (prefix `GT-REL-*`) to prevent terminology drift.\\n\\n\" +\n \"**Tools:**\\n\" +\n \"- `gather-context` — get the full context around any entry (multi-hop graph traversal)\\n\" +\n \"- `suggest-links` — discover potential connections for an entry\\n\" +\n \"- `relate-entries` — create a typed link between two entries\\n\" +\n \"- `find-related` — list direct relations for an entry\\n\\n\" +\n \"**Convention:** When creating or updating entries in governed collections, always use `suggest-links` to discover and create relevant relations.\",\n );\n\n // Creating Knowledge\n sections.push(\n \"## Creating Knowledge\\n\" +\n \"**Entries:** Use `capture` as the primary tool for creating new entries. It handles the full workflow in one call:\\n\" +\n \"1. Creates the entry with collection-aware defaults (auto-fills dates, infers domains, sets priority)\\n\" +\n \"2. Auto-links related entries from across the chain (up to 5 confident matches)\\n\" +\n \"3. Returns a quality scorecard (X/10) with actionable improvement suggestions\\n\\n\" +\n \"**Smart profiles** exist for: `tensions`, `business-rules`, `glossary`, `decisions`, `features`, `audiences`, `strategy`, `standards`, `maps`, `chains`, `tracking-events`.\\n\" +\n \"All other collections use the `ENT-{random}` fallback profile.\\n\\n\" +\n \"**Processes:** Use `chain action=create` with a template (e.g., `strategy-coherence`, `idm-proposal`). Fill links with `chain action=edit`.\\n\\n\" +\n \"**Maps:** Use `map action=create` with a template (e.g., `lean-canvas`). Fill slots with `map-slot action=add`. Commit with `map-version action=commit`.\\n\" +\n \"Note: committing a map version creates a snapshot but does NOT change the entry status. To activate: `update-entry entryId=MAP-xxx status=active autoPublish=true`.\\n\" +\n \"Use `map-suggest` to discover ingredients for empty slots.\\n\\n\" +\n \"**Prompts** (invoke via MCP prompt protocol):\\n\" +\n \"- `name-check` — verify a name against glossary conventions\\n\" +\n \"- `draft-decision-record` — scaffold a decision entry\\n\" +\n \"- `review-against-rules` — check work against business rules for a domain\\n\" +\n \"- `draft-rule-from-context` — create a new business rule from context\\n\" +\n \"- `run-workflow` — run a structured ceremony (e.g., retrospective)\\n\\n\" +\n \"Use `quality-check` to score existing entries retroactively.\\n\" +\n \"Use `update-entry` for post-creation adjustments (status changes, field updates, deprecation).\",\n );\n\n // Where to go next\n sections.push(\n \"## Where to Go Next\\n\" +\n \"- **Create entry** → `capture` tool (auto-links + quality score in one call)\\n\" +\n \"- **Full context** → `gather-context` tool (by entry ID or task description)\\n\" +\n \"- **Discover links** → `suggest-links` tool\\n\" +\n \"- **Quality audit** → `quality-check` tool\\n\" +\n \"- **Terminology** → `name-check` prompt or `productbrain://terminology` resource\\n\" +\n \"- **Schema details** → `productbrain://collections` resource or `list-collections` tool\\n\" +\n \"- **Labels** → `productbrain://labels` resource or `labels` tool\\n\" +\n \"- **Any collection** → `productbrain://{slug}/entries` resource\\n\" +\n \"- **Log a decision** → `draft-decision-record` prompt\\n\" +\n \"- **Build a map** → `map action=create` + `map-slot action=add` + `map-version action=commit`\\n\" +\n \"- **Architecture map** → `architecture action=show` tool (layered system visualization)\\n\" +\n \"- **Explore a layer** → `architecture action=explore` tool (drill into Auth, Core, Features, etc.)\\n\" +\n \"- **Growth funnel** → `productbrain://growth-funnel` resource or `list-entries collection=strategy status=draft`\\n\" +\n \"- **Audiences** → `productbrain://audiences/entries` resource or `list-entries collection=audiences`\\n\" +\n \"- **Session identity** → `whoami` tool (workspace + auth context)\\n\" +\n \"- **Health check** → `health` tool\\n\" +\n \"- **Debug MCP calls** → `mcp-audit` tool\",\n );\n\n return sections.join(\"\\n\\n---\\n\\n\");\n}\n\nexport function registerResources(server: McpServer) {\n // Orientation: single-call system map for AI developers\n server.resource(\n \"chain-orientation\",\n \"productbrain://orientation\",\n async (uri) => {\n const [collectionsResult, eventsResult, standardsResult, rulesResult] = await Promise.allSettled([\n mcpQuery<any[]>(\"chain.listCollections\"),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"tracking-events\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"standards\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" }),\n ]);\n\n const collections = collectionsResult.status === \"fulfilled\" ? collectionsResult.value : null;\n const trackingEvents = eventsResult.status === \"fulfilled\" ? eventsResult.value : null;\n const standards = standardsResult.status === \"fulfilled\" ? standardsResult.value : null;\n const businessRules = rulesResult.status === \"fulfilled\" ? rulesResult.value : null;\n\n return {\n contents: [{\n uri: uri.href,\n text: buildOrientationMarkdown(collections, trackingEvents, standards, businessRules),\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n // Terminology: glossary + standards summary for deep-dives\n server.resource(\n \"chain-terminology\",\n \"productbrain://terminology\",\n async (uri) => {\n const [glossaryResult, standardsResult] = await Promise.allSettled([\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"glossary\" }),\n mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"standards\" }),\n ]);\n\n const lines: string[] = [\"# Product Brain — Terminology\"];\n\n if (glossaryResult.status === \"fulfilled\") {\n if (glossaryResult.value.length > 0) {\n const terms = glossaryResult.value\n .map((t) => `- **${t.name}** (${t.entryId ?? \"—\"}) [${t.status}]: ${t.data?.canonical ?? t.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Glossary (${glossaryResult.value.length} terms)\\n\\n${terms}`);\n } else {\n lines.push(\"## Glossary\\n\\nNo glossary terms yet. Use `capture` with collection `glossary` to add terms.\");\n }\n } else {\n lines.push(\"## Glossary\\n\\nCould not load glossary — use `list-entries collection=glossary` to browse manually.\");\n }\n\n if (standardsResult.status === \"fulfilled\") {\n if (standardsResult.value.length > 0) {\n const stds = standardsResult.value\n .map((s) => `- **${s.name}** (${s.entryId ?? \"—\"}) [${s.status}]: ${s.data?.description ?? \"\"}`)\n .join(\"\\n\");\n lines.push(`## Standards (${standardsResult.value.length} entries)\\n\\n${stds}`);\n } else {\n lines.push(\"## Standards\\n\\nNo standards yet. Use `capture` with collection `standards` to add standards.\");\n }\n } else {\n lines.push(\"## Standards\\n\\nCould not load standards — use `list-entries collection=standards` to browse manually.\");\n }\n\n return {\n contents: [{ uri: uri.href, text: lines.join(\"\\n\\n---\\n\\n\"), mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-collections\",\n \"productbrain://collections\",\n async (uri) => {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n\n if (collections.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No collections in this workspace.\", mimeType: \"text/markdown\" }] };\n }\n\n const formatted = collections\n .map((c) => {\n const fieldList = c.fields\n .map((f: any) => ` - \\`${f.key}\\` (${f.type}${f.required ? \", required\" : \"\"}${f.searchable ? \", searchable\" : \"\"})`)\n .join(\"\\n\");\n return `## ${c.icon ?? \"\"} ${c.name} (\\`${c.slug}\\`)\\n${c.description || \"\"}\\n\\n**Fields:**\\n${fieldList}`;\n })\n .join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{ uri: uri.href, text: `# Knowledge Collections (${collections.length})\\n\\n${formatted}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n\n server.resource(\n \"chain-collection-entries\",\n new ResourceTemplate(\"productbrain://{slug}/entries\", {\n list: async () => {\n const collections = await mcpQuery<any[]>(\"chain.listCollections\");\n return {\n resources: collections.map((c) => ({\n uri: `productbrain://${c.slug}/entries`,\n name: `${c.icon ?? \"\"} ${c.name}`.trim(),\n })),\n };\n },\n }),\n async (uri, { slug }) => {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: slug as string });\n const formatted = entries.map(formatEntryMarkdown).join(\"\\n\\n---\\n\\n\");\n\n return {\n contents: [{\n uri: uri.href,\n text: formatted || \"No entries in this collection.\",\n mimeType: \"text/markdown\",\n }],\n };\n }\n );\n\n server.resource(\n \"chain-labels\",\n \"productbrain://labels\",\n async (uri) => {\n const labels = await mcpQuery<any[]>(\"chain.listLabels\");\n\n if (labels.length === 0) {\n return { contents: [{ uri: uri.href, text: \"No labels in this workspace.\", mimeType: \"text/markdown\" }] };\n }\n\n const groups = labels.filter((l) => l.isGroup);\n const ungrouped = labels.filter((l) => !l.isGroup && !l.parentId);\n const children = (parentId: string) => labels.filter((l) => l.parentId === parentId);\n\n const lines: string[] = [];\n for (const group of groups) {\n lines.push(`## ${group.name}`);\n for (const child of children(group._id)) {\n lines.push(`- \\`${child.slug}\\` ${child.name}${child.color ? ` (${child.color})` : \"\"}`);\n }\n }\n if (ungrouped.length > 0) {\n lines.push(\"## Ungrouped\");\n for (const l of ungrouped) {\n lines.push(`- \\`${l.slug}\\` ${l.name}${l.color ? ` (${l.color})` : \"\"}`);\n }\n }\n\n return {\n contents: [{ uri: uri.href, text: `# Workspace Labels (${labels.length})\\n\\n${lines.join(\"\\n\")}`, mimeType: \"text/markdown\" }],\n };\n }\n );\n}\n","import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { mcpQuery } from \"../client.js\";\nimport { getWorkflow, listWorkflows } from \"../workflows/definitions.js\";\n\nexport function registerPrompts(server: McpServer) {\n server.prompt(\n \"review-against-rules\",\n \"Review code or a design decision against all business rules for a given domain. Fetches the rules and asks you to do a structured compliance review.\",\n { domain: z.string().describe(\"Business rule domain (e.g. 'Identity & Access', 'Governance & Decision-Making')\") },\n async ({ domain }) => {\n const entries = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" });\n const rules = entries.filter((e) => e.data?.domain === domain);\n\n if (rules.length === 0) {\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: `No business rules found for domain \"${domain}\". Use the list-entries tool with collection \"business-rules\" to see available domains.`,\n },\n },\n ],\n };\n }\n\n const rulesText = rules\n .map(\n (r) =>\n `### ${r.entryId ?? \"\"}: ${r.name}\\n` +\n `Status: ${r.status} | Severity: ${r.data?.severity ?? \"unknown\"}\\n` +\n `Description: ${r.data?.description ?? \"\"}\\n` +\n `Data Impact: ${r.data?.dataImpact ?? \"\"}\\n` +\n `Platforms: ${(r.data?.platforms ?? []).join(\", \")}\\n` +\n (r.data?.conflictWith ? `CONFLICT: ${r.data.conflictWith.rule} — ${r.data.conflictWith.nature}\\n` : \"\")\n )\n .join(\"\\n---\\n\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Review the current code or design against the following business rules for the \"${domain}\" domain.\\n\\n` +\n `For each rule, assess:\\n` +\n `1. Is the current implementation compliant?\\n` +\n `2. Are there potential violations or edge cases?\\n` +\n `3. What specific changes would be needed for compliance?\\n\\n` +\n `Business Rules:\\n\\n${rulesText}\\n\\n` +\n `Provide a structured review with a compliance status for each rule (COMPLIANT / AT RISK / VIOLATION / NOT APPLICABLE).`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"name-check\",\n \"Check variable names, field names, or API names against the glossary for terminology alignment. Flags drift from canonical terms.\",\n { names: z.string().describe(\"Comma-separated list of names to check (e.g. 'vendor_id, compliance_level, formulator_type')\") },\n async ({ names }) => {\n const terms = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"glossary\" });\n\n const glossaryContext = terms\n .map(\n (t) =>\n `${t.name} (${t.entryId ?? \"\"}) [${t.status}]: ${t.data?.canonical ?? \"\"}` +\n (t.data?.confusedWith?.length > 0 ? ` — Often confused with: ${t.data.confusedWith.join(\", \")}` : \"\") +\n (t.data?.codeMapping?.length > 0\n ? `\\n Code mappings: ${t.data.codeMapping.map((m: any) => `${m.platform}:${m.field}`).join(\", \")}`\n : \"\")\n )\n .join(\"\\n\");\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Check the following names against the glossary for terminology alignment:\\n\\n` +\n `Names to check: ${names}\\n\\n` +\n `Glossary (canonical terms):\\n${glossaryContext}\\n\\n` +\n `For each name:\\n` +\n `1. Does it match a canonical term? If so, which one?\\n` +\n `2. Is there terminology drift? (e.g. using \"vendor\" instead of \"supplier\", \"compliance\" instead of \"conformance\")\\n` +\n `3. Suggest the canonical alternative if drift is detected.\\n` +\n `4. Flag any names that don't have a corresponding glossary term (might need one).\\n\\n` +\n `Format as a table: Name | Status | Canonical Form | Action Needed`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-decision-record\",\n \"Draft a structured decision record from a description of what was decided. Includes context from recent decisions and relevant rules.\",\n { context: z.string().describe(\"Description of the decision (e.g. 'We decided to use MRSL v3.1 as the conformance baseline because...')\") },\n async ({ context }) => {\n const recentDecisions = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"decisions\" });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n\n const recentContext = sorted.length > 0\n ? sorted.map((d) => `- [${d.status}] ${d.name} (${d.data?.date ?? \"no date\"})`).join(\"\\n\")\n : \"No previous decisions recorded.\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a structured decision record from the following context:\\n\\n` +\n `\"${context}\"\\n\\n` +\n `Recent decisions for reference:\\n${recentContext}\\n\\n` +\n `Structure the decision record with:\\n` +\n `1. **Title**: Concise decision statement\\n` +\n `2. **Decided by**: Who made or approved this decision\\n` +\n `3. **Date**: When it was decided\\n` +\n `4. **Status**: decided / proposed / revisited\\n` +\n `5. **Rationale**: Why this decision was made, including trade-offs considered\\n` +\n `6. **Alternatives considered**: What else was on the table\\n` +\n `7. **Related rules or tensions**: Any business rules or tensions this connects to\\n\\n` +\n `After drafting, I can log it using the capture tool with collection \"decisions\".`,\n },\n },\n ],\n };\n }\n );\n\n server.prompt(\n \"draft-rule-from-context\",\n \"Draft a new business rule from an observation or discovery made while coding. Fetches existing rules for the domain to ensure consistency.\",\n {\n observation: z.string().describe(\"What you observed or discovered (e.g. 'Suppliers can have multiple org types in Gateway')\"),\n domain: z.string().describe(\"Which domain this rule belongs to (e.g. 'Governance & Decision-Making')\"),\n },\n async ({ observation, domain }) => {\n const allRules = await mcpQuery<any[]>(\"chain.listEntries\", { collectionSlug: \"business-rules\" });\n const existingRules = allRules.filter((r) => r.data?.domain === domain);\n\n const existingContext =\n existingRules.length > 0\n ? existingRules.map((r) => `${r.entryId ?? \"\"}: ${r.name} [${r.status}] — ${r.data?.description ?? \"\"}`).join(\"\\n\")\n : \"No existing rules for this domain.\";\n\n const highestRuleNum = allRules\n .map((r) => parseInt((r.entryId ?? \"\").replace(/^[A-Z]+-/, \"\"), 10))\n .filter((n) => !isNaN(n))\n .sort((a, b) => b - a)[0] || 0;\n const nextRuleId = `SOS-${String(highestRuleNum + 1).padStart(3, \"0\")}`;\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Draft a business rule based on this observation:\\n\\n` +\n `\"${observation}\"\\n\\n` +\n `Domain: ${domain}\\n` +\n `Suggested rule ID: ${nextRuleId}\\n\\n` +\n `Existing rules in this domain:\\n${existingContext}\\n\\n` +\n `Draft the rule with these fields:\\n` +\n `1. **entryId**: ${nextRuleId}\\n` +\n `2. **name**: Concise rule title\\n` +\n `3. **data.description**: What the rule states\\n` +\n `4. **data.rationale**: Why this rule matters\\n` +\n `5. **data.dataImpact**: How this affects data models, APIs, or storage\\n` +\n `6. **data.severity**: high / medium / low\\n` +\n `7. **data.platforms**: Which platforms are affected\\n` +\n `8. **data.relatedRules**: Any related existing rules\\n\\n` +\n `Make sure the rule is consistent with existing rules and doesn't contradict them. ` +\n `After drafting, I can create it using the capture tool with collection \"business-rules\".`,\n },\n },\n ],\n };\n }\n );\n\n // ── Run Workflow Prompt ──────────────────────────────────────────────────\n\n server.prompt(\n \"run-workflow\",\n \"Launch a Chainwork workflow (retro, shape, IDM) in Facilitator Mode. \" +\n \"Returns the full workflow definition, facilitation instructions, and round structure. \" +\n \"The agent enters Facilitator Mode and guides the participant through each round.\",\n {\n workflow: z.string().describe(\n \"Workflow ID to run. Available: \" +\n listWorkflows().map((w) => `'${w.id}' (${w.name})`).join(\", \"),\n ),\n context: z.string().optional().describe(\n \"Optional context from the participant (e.g., 'retro on last sprint', 'shape the Chainwork API bet')\",\n ),\n },\n async ({ workflow: workflowId, context }) => {\n const wf = getWorkflow(workflowId);\n\n if (!wf) {\n const available = listWorkflows()\n .map((w) => `- **${w.id}**: ${w.name} — ${w.shortDescription}`)\n .join(\"\\n\");\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `Workflow \"${workflowId}\" not found.\\n\\n` +\n `Available workflows:\\n${available}\\n\\n` +\n `Use one of these IDs to run a workflow.`,\n },\n },\n ],\n };\n }\n\n // Fetch recent chain context for richer facilitation\n let kbContext = \"\";\n try {\n const recentDecisions = await mcpQuery<any[]>(\"chain.listEntries\", {\n collectionSlug: wf.kbOutputCollection,\n });\n const sorted = [...recentDecisions]\n .sort((a, b) => ((b.data?.date ?? \"\") > (a.data?.date ?? \"\") ? 1 : -1))\n .slice(0, 5);\n if (sorted.length > 0) {\n kbContext =\n `\\n## Recent ${wf.kbOutputCollection} entries (for context)\\n` +\n sorted.map((d) => `- ${d.entryId ?? \"\"}: ${d.name} [${d.status}]`).join(\"\\n\");\n }\n } catch {\n kbContext = \"\\n_Could not load chain context — proceed without it._\";\n }\n\n const roundsPlan = wf.rounds\n .map((r) =>\n `### Round ${r.num}: ${r.label}\\n` +\n `**Type**: ${r.type} | **Duration**: ~${r.maxDurationHint ?? \"5 min\"}\\n` +\n `**Instruction**: ${r.instruction}\\n` +\n `**Facilitator guidance**: ${r.facilitatorGuidance}\\n` +\n (r.questions\n ? r.questions.map((q) =>\n `**Question**: ${q.prompt}\\n` +\n (q.options\n ? q.options.map((o) => ` - ${o.id}: ${o.label}`).join(\"\\n\")\n : \" _(open response)_\"),\n ).join(\"\\n\")\n : \"\") +\n `\\n**Output**: Capture to \\`${r.outputSchema.field}\\` (${r.outputSchema.format})`,\n )\n .join(\"\\n\\n---\\n\\n\");\n\n const contextLine = context\n ? `\\nThe participant provided this context: \"${context}\"\\nUse it — don't make them repeat themselves.\\n`\n : \"\";\n\n return {\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text:\n `# ${wf.icon} ${wf.name} Workflow — Facilitator Mode\\n\\n` +\n `${wf.shortDescription}\\n` +\n contextLine +\n `\\n---\\n\\n` +\n `## Facilitator Instructions\\n\\n${wf.facilitatorPreamble}\\n\\n` +\n `---\\n\\n` +\n `## Rounds\\n\\n${roundsPlan}\\n\\n` +\n `---\\n\\n` +\n `## Error Recovery\\n\\n${wf.errorRecovery}\\n\\n` +\n `---\\n\\n` +\n `## Chain Output\\n\\n` +\n `When complete, use \\`capture\\` to create a \\`${wf.kbOutputCollection}\\` entry.\\n` +\n `Name template: ${wf.kbOutputTemplate.nameTemplate}\\n` +\n `Description field: ${wf.kbOutputTemplate.descriptionField}\\n` +\n kbContext +\n `\\n\\n---\\n\\n` +\n `**BEGIN THE WORKFLOW NOW.** Start with Round 01. Create a Plan first.`,\n },\n },\n ],\n };\n },\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAAA,qBAAoB;AAC7B,SAAS,WAAAC,gBAAe;AACxB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,4BAA4B;;;ACFrC,SAAS,SAAS;AAGlB,SAAS,eAAe,MAAW,QAAwB;AACzD,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAC9C,QAAM,MAAM,KAAK,eAAe,KAAK,aAAa,KAAK,UAAU;AACjE,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAK,QAAO;AAC5C,SAAO,IAAI,SAAS,SAAS,IAAI,UAAU,GAAG,MAAM,IAAI,QAAQ;AAClE;AAEO,SAAS,uBAAuBC,SAAmB;AAExD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,cAAc,MAAM,SAAgB,uBAAuB;AAEjE,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,0CAA0C,CAAC,EAAE;AAAA,MACjG;AAEA,YAAM,YAAY,YACf,IAAI,CAAC,MAAM;AACV,cAAM,YAAY,EAAE,OACjB,IAAI,CAAC,MAAW,SAAS,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,EAAE,WAAW,eAAe,EAAE,GAAG,EAAE,aAAa,iBAAiB,EAAE,GAAG,EACpH,KAAK,IAAI;AACZ,eAAO,MAAM,EAAE,IAAI,OAAO,EAAE,IAAI;AAAA,EAAQ,EAAE,eAAe,kBAAkB;AAAA;AAAA;AAAA,EAAoB,SAAS;AAAA,MAC1G,CAAC,EACA,KAAK,aAAa;AAErB,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,4BAA4B,YAAY,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC;AAAA,MAC9G;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uEAAuE;AAAA,QAClH,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gDAAgD;AAAA,QACvF,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,iDAAiD;AAAA,QACrF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oEAA+D;AAAA,MACvG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,YAAY,QAAQ,KAAK,MAAM,MAAM;AAC5C,UAAI;AAEJ,UAAI,OAAO;AACT,kBAAU,MAAM,SAAgB,4BAA4B,EAAE,WAAW,MAAM,CAAC;AAChF,YAAI,OAAQ,WAAU,QAAQ,OAAO,CAAC,MAAW,EAAE,WAAW,MAAM;AAAA,MACtE,OAAO;AACL,kBAAU,MAAM,SAAgB,qBAAqB;AAAA,UACnD,gBAAgB;AAAA,UAChB;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,sCAAsC,CAAC,EAAE;AAAA,MAC7F;AAEA,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,cAAM,cAAc,EAAE,OAClB,OAAO,QAAQ,EAAE,IAAI,EAClB,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,KAAK,OAAO,MAAM,WAAW,EAAE,UAAU,GAAG,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,EAAE,EAC5F,KAAK,IAAI,IACZ;AACJ,eAAO,KAAK,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,cAAc;AAAA,EAAK,WAAW,KAAK,EAAE;AAAA,MACjF,CAAC,EACA,KAAK,MAAM;AAEd,YAAM,QAAQ,aAAa,SAAS,UAAU,OAAO;AACrD,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,YAAY,KAAK,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC;AAAA,MACpG;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,gEAAgE;AAAA,MAC/F;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,QAAQ,MAAM,SAAc,kBAAkB,EAAE,QAAQ,CAAC;AAE/D,UAAI,CAAC,OAAO;AACV,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,iDAAiD,CAAC,EAAE;AAAA,MAC1H;AAEA,YAAM,QAAkB;AAAA,QACtB,KAAK,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,EAAE,GAAG,MAAM,IAAI;AAAA,QAC3D;AAAA,QACA,eAAe,MAAM,MAAM;AAAA,MAC7B;AAEA,UAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,cAAM,KAAK,EAAE;AACb,mBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AACnD,gBAAM,UAAU,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG;AAClE,gBAAM,KAAK,KAAK,GAAG,OAAO,OAAO,EAAE;AAAA,QACrC;AAAA,MACF;AAEA,UAAI,MAAM,MAAM,SAAS,GAAG;AAC1B,cAAM,KAAK,IAAI,aAAa,MAAM,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,MACrD;AAEA,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,cAAM,KAAK,IAAI,eAAe,MAAM,OAAO,IAAI,CAAC,MAAW,KAAK,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACpG;AAEA,UAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,cAAM,KAAK,IAAI,cAAc;AAC7B,mBAAW,KAAK,MAAM,WAAW;AAC/B,gBAAM,QAAQ,EAAE,cAAc,aAAa,WAAW;AACtD,gBAAM,QAAQ,EAAE,eAAe,GAAG,EAAE,YAAY,KAAK,EAAE,SAAS,KAAM,EAAE,aAAa;AACrF,gBAAM,KAAK,KAAK,KAAK,MAAM,EAAE,IAAI,MAAM,KAAK,EAAE;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,cAAM,KAAK,IAAI,sBAAsB;AACrC,mBAAW,KAAK,MAAM,QAAQ,MAAM,GAAG,GAAG;AACxC,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7D,gBAAM,KAAK,KAAK,IAAI,KAAK,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,EAAE,SAAS,OAAO,EAAE,EAAE;AAAA,QAC/E;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,iDAAiD;AAAA,QAC9E,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kBAAkB;AAAA,QACvD,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oDAAoD;AAAA,QAC3F,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,SAAS,8CAA8C;AAAA,QAC9F,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,gBAAgB;AAAA,QACtD,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,SAAS,yFAAyF;AAAA,MACvJ;AAAA,MACA,aAAa,EAAE,gBAAgB,MAAM,iBAAiB,MAAM;AAAA,IAC9D;AAAA,IACA,OAAO,EAAE,SAAS,MAAM,QAAQ,MAAM,OAAO,YAAY,MAAM;AAC7D,UAAI;AACF,2BAAmB;AAEnB,cAAM,KAAK,MAAM,YAAoB,qBAAqB;AAAA,UACxD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,kBAAkB,IAAI,SAAS,kBAAkB,CAAC,KAAK;AAAA,QACpE,CAAC;AAED,cAAM,sBAAsB,EAAE,eAAe,QAAQ,CAAC;AAEtD,cAAM,QAAQ,MAAM,oBAAoB;AACxC,cAAM,OAAO,cAAc,cAAc;AACzC,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,OAAO,eAAe,IAAI;AAAA;AAAA,eAAqB,EAAE;AAAA,iBAAoB,MAAM,aAAa,KAAK,MAAM,WAAW,IAAI,CAAC;AAAA,QACtL;AAAA,MACF,SAAS,OAAgB;AACvB,cAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACjE,YAAI,IAAI,SAAS,SAAS,GAAG;AAC3B,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAQR,CAAC;AAAA,UACH;AAAA,QACF;AACA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,OAAO,EAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,QAC3D,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kFAAkF;AAAA,QAC7H,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0DAA0D;AAAA,MACnG;AAAA,MACA,aAAa,EAAE,cAAc,MAAM,eAAe,KAAK;AAAA,IACzD;AAAA,IACA,OAAO,EAAE,OAAO,YAAY,OAAO,MAAM;AACvC,YAAM,QAAQ,aAAa,SAAS,UAAU,OAAO;AACrD,YAAMA,QAAO,mBAAmB,EAAE,OAAO,QAAQ,MAAM,YAAY,KAAK,SAAS,KAAK,QAAQ,QAAQ,aAAa,CAAC;AAEpH,YAAM,CAAC,SAAS,WAAW,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC/C,SAAgB,uBAAuB,EAAE,OAAO,gBAAgB,YAAY,OAAO,CAAC;AAAA,QACpF,SAAgB,uBAAuB;AAAA,MACzC,CAAC;AAED,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,KAAK,IAAI,KAAK,uEAAuE,CAAC,EAAE;AAAA,MAC/J;AAEA,YAAM,UAAU,oBAAI,IAA4C;AAChE,iBAAW,KAAK,aAAa;AAC3B,gBAAQ,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC;AAAA,MACnD;AAEA,YAAM,eAAe,oBAAI,IAAoB;AAC7C,iBAAW,KAAK,SAAS;AACvB,cAAM,MAAM,QAAQ,IAAI,EAAE,YAAY;AACtC,cAAM,OAAO,KAAK,QAAQ;AAC1B,qBAAa,IAAI,OAAO,aAAa,IAAI,IAAI,KAAK,KAAK,CAAC;AAAA,MAC1D;AACA,YAAM,cAAc,CAAC,GAAG,aAAa,QAAQ,CAAC,EAC3C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,GAAG,KAAK,IAAI,IAAI,EAAE,EACzC,KAAK,IAAI;AAEZ,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,cAAM,MAAM,QAAQ,IAAI,EAAE,YAAY;AACtC,cAAM,SAAS,MAAM,KAAK,IAAI,IAAI,MAAM;AACxC,cAAM,OAAO,eAAe,EAAE,MAAM,GAAG;AACvC,cAAM,UAAU,OAAO;AAAA,IAAO,IAAI,KAAK;AACvC,eAAO,KAAK,EAAE,GAAG,EAAE,IAAI,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO;AAAA,MAC5D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAM,SAAS,yBAAyB,KAAK,IAAI,KAAK,KAAK,QAAQ,MAAM,SAAS,QAAQ,WAAW,IAAI,KAAK,IAAI;AAAA;AAAA,qBAA2B,WAAW;AACxJ,YAAM,SAAS;AAEf,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,GAAG,MAAM;AAAA;AAAA,EAAO,SAAS;AAAA;AAAA,EAAO,MAAM,GAAG,CAAC;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,uCAAuC;AAAA,MACtE;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,UAAU,MAAM,SAAgB,0BAA0B,EAAE,QAAQ,CAAC;AAE3E,UAAI,QAAQ,WAAW,GAAG;AACxB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,0BAA0B,OAAO,MAAM,CAAC,EAAE;AAAA,MAC9F;AAEA,YAAM,YAAY,QACf,IAAI,CAAC,MAAM;AACV,cAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY;AAC/C,cAAM,UAAU,EAAE,UAAU,WAAM,KAAK,UAAU,EAAE,OAAO,CAAC,KAAK;AAChE,eAAO,OAAO,IAAI,MAAM,EAAE,KAAK,GAAG,EAAE,YAAY,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO;AAAA,MACtF,CAAC,EACA,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,OAAO,OAAO,QAAQ,MAAM;AAAA;AAAA,EAAe,SAAS,GAAG,CAAC;AAAA,MACtH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAUF,aAAa;AAAA,QACX,MAAM,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,QAC9D,IAAI,EAAE,OAAO,EAAE,SAAS,gCAAgC;AAAA,QACxD,MAAM,EAAE,OAAO,EAAE,SAAS,uEAAkE;AAAA,MAC9F;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,MAAM,IAAI,KAAK,MAAM;AAC5B,yBAAmB;AAEnB,YAAM,YAAY,6BAA6B;AAAA,QAC7C,aAAa;AAAA,QACb,WAAW;AAAA,QACX;AAAA,MACF,CAAC;AAED,YAAM,sBAAsB,EAAE,iBAAiB,KAAK,CAAC;AAErD,YAAM,QAAQ,MAAM,oBAAoB;AACxC,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAA2B,IAAI,aAAa,IAAI,aAAa,EAAE;AAAA,iBAAsB,MAAM,aAAa,KAAK,MAAM,WAAW,IAAI,CAAC;AAAA,MAC9K;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,WAAW,EAAE,MAAM,EAAE,OAAO;AAAA,UAC1B,MAAM,EAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,UAC3C,IAAI,EAAE,OAAO,EAAE,SAAS,iBAAiB;AAAA,UACzC,MAAM,EAAE,OAAO,EAAE,SAAS,eAAe;AAAA,QAC3C,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,8BAA8B;AAAA,MAC5D;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,UAAU,MAAM;AACvB,yBAAmB;AAEnB,YAAM,UAAqF,CAAC;AAE5F,iBAAW,OAAO,WAAW;AAC3B,YAAI;AACF,gBAAM,YAAY,6BAA6B;AAAA,YAC7C,aAAa,IAAI;AAAA,YACjB,WAAW,IAAI;AAAA,YACf,MAAM,IAAI;AAAA,UACZ,CAAC;AACD,kBAAQ,KAAK,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC;AAAA,QACnC,SAAS,GAAQ;AACf,kBAAQ,KAAK,EAAE,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,WAAW,gBAAgB,CAAC;AAAA,QACzE;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,OAAO,CAAC,MAAM,EAAE,EAAE;AAC1C,YAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE;AAE1C,YAAM,QAAQ,CAAC;AAAA,CAAwB;AACvC,YAAM,KAAK,KAAK,QAAQ,MAAM,iBAAiB,OAAO,MAAM,oBAAoB,UAAU,MAAM;AAAA,CAAW;AAE3G,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,KAAK,YAAY;AACvB,mBAAW,KAAK,SAAS;AACvB,gBAAM,KAAK,OAAO,EAAE,IAAI,aAAQ,EAAE,IAAI,aAAQ,EAAE,EAAE,IAAI;AAAA,QACxD;AAAA,MACF;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,WAAW;AACtB,mBAAW,KAAK,QAAQ;AACtB,gBAAM,KAAK,OAAO,EAAE,IAAI,eAAU,EAAE,EAAE,OAAO,EAAE,IAAI,OAAO,EAAE,KAAK,GAAG;AAAA,QACtE;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,oCAAoC;AAAA,QACjE,WAAW,EAAE,KAAK,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,QAAQ,MAAM,EAC/D,SAAS,0FAA0F;AAAA,MACxG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,UAAU,MAAM;AAChC,YAAM,YAAY,MAAM,SAAgB,4BAA4B,EAAE,QAAQ,CAAC;AAE/E,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,4BAA4B,OAAO,gDAAgD,CAAC,EAAE;AAAA,MAC1I;AAEA,YAAM,cAAc,MAAM,SAAc,kBAAkB,EAAE,QAAQ,CAAC;AACrE,UAAI,CAAC,aAAa;AAChB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,iDAAiD,CAAC,EAAE;AAAA,MAC1H;AACA,YAAM,mBAAmB,YAAY;AAErC,YAAM,gBAAgB;AACtB,YAAM,YAAY,UAAU,SAAS;AACrC,YAAM,SAAS,UAAU,MAAM,GAAG,aAAa;AAE/C,YAAM,WAAW,oBAAI,IAAY;AACjC,iBAAW,KAAK,QAAQ;AACtB,cAAM,UAAU,EAAE,WAAW,mBAAmB,EAAE,OAAO,EAAE;AAC3D,iBAAS,IAAI,OAAO;AAAA,MACtB;AAEA,YAAM,eAAe,oBAAI,IAAsE;AAC/F,iBAAW,MAAM,UAAU;AACzB,cAAM,QAAQ,MAAM,SAAc,kBAAkB,EAAE,GAAG,CAAC;AAC1D,YAAI,OAAO;AACT,uBAAa,IAAI,MAAM,KAAK,EAAE,SAAS,MAAM,SAAS,MAAM,MAAM,MAAM,cAAc,MAAM,aAAa,CAAC;AAAA,QAC5G;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,SAAgB,uBAAuB;AACjE,YAAM,UAAU,oBAAI,IAAoB;AACxC,iBAAW,KAAK,YAAa,SAAQ,IAAI,EAAE,KAAK,EAAE,IAAI;AAEtD,YAAM,QAAkB,CAAC,mBAAmB,OAAO,KAAK,YAAY,IAAI,IAAI,EAAE;AAE9E,YAAM,WAAW,OAAO,IAAI,CAAC,MAAM;AACjC,cAAM,aAAa,EAAE,WAAW;AAChC,cAAM,UAAU,aAAa,EAAE,OAAO,EAAE;AACxC,cAAM,QAAQ,aAAa,IAAI,OAAO;AACtC,cAAM,aAAa,OAAO,UAAU,GAAG,MAAM,OAAO,KAAK,MAAM,IAAI,KAAM,OAAO,QAAQ;AACxF,cAAM,UAAU,QAAS,QAAQ,IAAI,MAAM,YAAY,KAAK,YAAa;AACzE,eAAO,EAAE,YAAY,MAAM,EAAE,MAAM,YAAY,QAAQ;AAAA,MACzD,CAAC;AAED,YAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU;AACpD,YAAM,WAAW,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU;AAErD,WAAK,cAAc,cAAc,cAAc,WAAW,SAAS,SAAS,GAAG;AAC7E,cAAM,KAAK,gBAAgB,SAAS,MAAM,GAAG;AAC7C,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,UAAU,KAAK,EAAE,OAAO,GAAG;AAAA,QACpE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,WAAK,cAAc,cAAc,cAAc,WAAW,SAAS,SAAS,GAAG;AAC7E,cAAM,KAAK,gBAAgB,SAAS,MAAM,GAAG;AAC7C,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,cAAc,EAAE,IAAI,MAAM,EAAE,UAAU,KAAK,EAAE,OAAO,GAAG;AAAA,QACpE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,YAAM,QAAQ,cAAc,aAAa,WAAW,cAAc,aAAa,WAAW;AAC1F,UAAI,MAAM,WAAW,GAAG;AACtB,cAAM,KAAK,MAAM,SAAS,0BAA0B,OAAO,KAAK;AAAA,MAClE;AAEA,UAAI,WAAW;AACb,cAAM,KAAK,kBAAkB,aAAa,OAAO,UAAU,MAAM,kDAAkD;AAAA,MACrH;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MASF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,QACjG,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,qEAAqE;AAAA,QAC1G,MAAM,EAAE,KAAK,CAAC,UAAU,OAAO,CAAC,EAAE,QAAQ,QAAQ,EAAE,SAAS,EAC1D,SAAS,qFAAqF;AAAA,QACjG,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EACxC,SAAS,2EAA2E;AAAA,QACvF,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,EACxD,SAAS,iDAAiD;AAAA,MAC/D;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,MAAM,MAAM,SAAS,WAAW,MAAM;AACtD,UAAI,CAAC,WAAW,CAAC,MAAM;AACrB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,uFAAuF,CAAC,EAAE;AAAA,MAC9I;AAGA,UAAI,WAAW,SAAS,SAAS;AAC/B,cAAMC,UAAS,MAAM,SAAc,4BAA4B;AAAA,UAC7D;AAAA,UACA,SAAS,WAAW;AAAA,QACtB,CAAC;AAED,YAAI,CAACA,SAAQ,MAAM;AACjB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,iDAAiD,CAAC,EAAE;AAAA,QAC1H;AAEA,YAAIA,QAAO,QAAQ,WAAW,GAAG;AAC/B,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM,iBAAiBA,QAAO,KAAK,OAAO,KAAKA,QAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,YAGjE,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAMC,gBAAe,oBAAI,IAAmB;AAC5C,mBAAW,SAASD,QAAO,SAAS;AAClC,gBAAM,MAAM,MAAM;AAClB,cAAI,CAACC,cAAa,IAAI,GAAG,EAAG,CAAAA,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,UAAAA,cAAa,IAAI,GAAG,EAAG,KAAK,KAAK;AAAA,QACnC;AAEA,cAAMC,SAAkB;AAAA,UACtB,iBAAiBF,QAAO,KAAK,OAAO,KAAKA,QAAO,KAAK,IAAI;AAAA,UACzD,IAAIA,QAAO,UAAU,2BAA2BC,cAAa,IAAI,iBAAiBD,QAAO,aAAa;AAAA,UACtG;AAAA,QACF;AAEA,mBAAW,CAAC,UAAU,OAAO,KAAKC,eAAc;AAC9C,UAAAC,OAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,MAAM,GAAG;AAC/C,qBAAW,KAAK,SAAS;AACvB,kBAAM,QAAQ,EAAE,sBAAsB,aAAa,WAAM;AACzD,kBAAM,KAAK,EAAE,UAAU,GAAG,EAAE,OAAO,OAAO;AAC1C,kBAAM,WAAW,EAAE,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM;AACjD,kBAAM,iBAAiB,EAAE,cAAc,EAAE,WAAW,SAAS,IACzD;AAAA,WAAc,EAAE,WAAW,IAAI,CAAC,MAAW,GAAG,EAAE,WAAW,EAAE,IAAI,KAAK,EAAE,YAAY,GAAG,EAAE,KAAK,UAAK,CAAC,MACpG;AACJ,kBAAM,UAAU,EAAE,UAAU;AAAA,IAAO,EAAE,QAAQ,UAAU,GAAG,GAAG,CAAC,KAAK;AACnE,YAAAA,OAAM,KAAK,KAAK,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,EAAE;AAAA,UACpG;AACA,UAAAA,OAAM,KAAK,EAAE;AAAA,QACf;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAMA,OAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE;AAGA,UAAI,QAAQ,CAAC,SAAS;AACpB,cAAMH,QAAO,mBAAmB;AAAA,UAC9B,OAAO;AAAA,UACP,MAAM,8BAA8B,KAAK,UAAU,GAAG,EAAE,CAAC;AAAA,UACzD,QAAQ;AAAA,QACV,CAAC;AAED,cAAM,cAAc,KACjB,QAAQ,YAAY,GAAG,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,EAAE,EACX,KAAK,GAAG;AAEX,cAAM,gBAAgB,MAAM,SAAgB,uBAAuB;AAAA,UACjE,OAAO;AAAA,QACT,CAAC;AAED,YAAI,CAAC,iBAAiB,cAAc,WAAW,GAAG;AAChD,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAGR,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,QAAQ,cAAc;AAC5B,cAAM,UAAU,cAAc,MAAM,GAAG,KAAK,IAAI,OAAO,CAAC,CAAC;AASzD,cAAM,aAA6B,CAAC;AACpC,cAAM,UAAU,oBAAI,IAAY;AAEhC,mBAAW,OAAO,SAAS;AACzB,gBAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,cAAI,CAAC,SAAS,QAAQ,IAAI,KAAK,EAAG;AAClC,kBAAQ,IAAI,KAAK;AAEjB,qBAAW,KAAK;AAAA,YACd,SAAS,IAAI;AAAA,YACb,MAAM,IAAI,QAAQ;AAAA,YAClB,gBAAgB,IAAI,kBAAkB,IAAI,kBAAkB;AAAA,YAC5D,KAAK;AAAA,UACP,CAAC;AAED,cAAI,IAAI,SAAS;AACf,gBAAI;AACF,oBAAM,QAAQ,MAAM,SAAc,uBAAuB;AAAA,gBACvD,SAAS,IAAI;AAAA,gBACb,SAAS,WAAW;AAAA,cACtB,CAAC;AACD,kBAAI,OAAO,SAAS;AAClB,2BAAW,OAAO,MAAM,SAAS;AAC/B,wBAAM,QAAQ,IAAI,WAAW,IAAI;AACjC,sBAAI,SAAS,CAAC,QAAQ,IAAI,KAAK,GAAG;AAChC,4BAAQ,IAAI,KAAK;AACjB,+BAAW,KAAK;AAAA,sBACd,SAAS,IAAI;AAAA,sBACb,MAAM,IAAI,QAAQ;AAAA,sBAClB,gBAAgB,IAAI,kBAAkB;AAAA,sBACtC,KAAK,IAAI,OAAO;AAAA,sBAChB,cAAc,IAAI;AAAA,oBACpB,CAAC;AAAA,kBACH;AAAA,gBACF;AAAA,cACF;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF;AAEA,cAAI,WAAW,UAAU,MAAO;AAAA,QAClC;AAEA,cAAM,UAAU,WAAW,MAAM,GAAG,KAAK;AACzC,cAAM,aAAa,QAAQ,UAAU,IAAI,SAAS,QAAQ,UAAU,IAAI,WAAW;AAEnF,cAAME,gBAAe,oBAAI,IAA4B;AACrD,mBAAW,SAAS,SAAS;AAC3B,gBAAM,MAAM,MAAM;AAClB,cAAI,CAACA,cAAa,IAAI,GAAG,EAAG,CAAAA,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,UAAAA,cAAa,IAAI,GAAG,EAAG,KAAK,KAAK;AAAA,QACnC;AAEA,cAAMC,SAAkB;AAAA,UACtB;AAAA,UACA,mBAAmB,WAAW,OAAO,CAAC,EAAE,YAAY,IAAI,WAAW,MAAM,CAAC,CAAC;AAAA,UAC3E,gBAAgB,QAAQ,MAAM,mBAAmBD,cAAa,IAAI,cAAcA,cAAa,SAAS,IAAI,KAAK,GAAG;AAAA,UAClH;AAAA,QACF;AAEA,mBAAW,CAAC,UAAU,OAAO,KAAKA,eAAc;AAC9C,UAAAC,OAAM,KAAK,OAAO,QAAQ,KAAK,QAAQ,MAAM,GAAG;AAChD,qBAAW,KAAK,SAAS;AACvB,kBAAM,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,SAAS;AAC9C,kBAAM,WAAW,EAAE,MAAM,IAAI,UAAU,EAAE,GAAG,GAAG,EAAE,eAAe,KAAK,EAAE,YAAY,KAAK,EAAE,OAAO;AACjG,YAAAA,OAAM,KAAK,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,QAAQ,EAAE;AAAA,UAC1C;AACA,UAAAA,OAAM,KAAK,EAAE;AAAA,QACf;AAEA,QAAAA,OAAM,KAAK,oDAAoD;AAE/D,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAMA,OAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE;AAGA,YAAM,SAAS,MAAM,SAAc,uBAAuB,EAAE,SAAS,QAAQ,CAAC;AAE9E,UAAI,CAAC,QAAQ,MAAM;AACjB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,iDAAiD,CAAC,EAAE;AAAA,MAC1H;AAEA,UAAI,OAAO,QAAQ,WAAW,GAAG;AAC/B,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,iBAAiB,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,UAGjE,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,eAAe,oBAAI,IAAmC;AAC5D,iBAAW,SAAS,OAAO,SAAS;AAClC,cAAM,MAAM,MAAM;AAClB,YAAI,CAAC,aAAa,IAAI,GAAG,EAAG,cAAa,IAAI,KAAK,CAAC,CAAC;AACpD,qBAAa,IAAI,GAAG,EAAG,KAAK,KAAK;AAAA,MACnC;AAEA,YAAM,QAAkB;AAAA,QACtB,iBAAiB,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,IAAI;AAAA,QACzD,IAAI,OAAO,cAAc,2BAA2B,aAAa,IAAI,iBAAiB,OAAO,aAAa;AAAA,QAC1G;AAAA,MACF;AAEA,iBAAW,CAAC,UAAU,OAAO,KAAK,cAAc;AAC9C,cAAM,KAAK,MAAM,QAAQ,KAAK,QAAQ,MAAM,GAAG;AAC/C,mBAAW,KAAK,SAAS;AACvB,gBAAM,QAAQ,EAAE,sBAAsB,aAAa,WAAW;AAC9D,gBAAM,WAAW,EAAE,MAAM,IAAI,SAAS,EAAE,GAAG,MAAM;AACjD,gBAAM,KAAK,EAAE,UAAU,GAAG,EAAE,OAAO,OAAO;AAC1C,gBAAM,KAAK,KAAK,KAAK,MAAM,EAAE,YAAY,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,QAAQ,EAAE;AAAA,QACzE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAH,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAOF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,8FAA8F;AAAA,QAC3H,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EACxC,SAAS,qCAAqC;AAAA,QACjD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,EACtC,SAAS,uEAAuE;AAAA,MACrF;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,SAAS,OAAO,MAAM,MAAM;AACnC,YAAM,SAAS,MAAM,SAAc,2BAA2B;AAAA,QAC5D;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,OAAO,SAAS;AAAA,MAClB,CAAC;AAED,UAAI,CAAC,UAAU,CAAC,OAAO,eAAe,OAAO,YAAY,WAAW,GAAG;AACrE,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,8BAA8B,OAAO,2EAAsE,CAAC,EAAE;AAAA,MAClK;AAEA,YAAM,WAAW,OAAO;AACxB,YAAM,gBAAgB,WAClB,KAAK,SAAS,WAAW,SAAS,IAAI,OAAO,SAAS,IAAI,MAC1D,KAAK,OAAO;AAEhB,YAAM,cAAc,OAAO;AAC3B,YAAM,aAAa,YAAY,OAAO,CAAC,MAAW,EAAE,gBAAgB,CAAC,EAAE;AACvE,YAAM,YAAY,YAAY,OAAO,CAAC,MAAW,EAAE,kBAAkB,EAAE,EAAE;AACzE,YAAM,WAAW,UAAU,WAAW;AAEtC,YAAM,QAAQ;AAAA,QACZ,0BAA0B,aAAa;AAAA,QACvC,IAAI,YAAY,MAAM,2BAA2B,UAAU,eAAe,SAAS;AAAA,QACnF;AAAA,MACF;AAGA,YAAM,OAAO,YAAY,MAAM,GAAG,CAAC;AACnC,YAAM,KAAK,uBAAuB;AAClC,YAAM,YAAsB,CAAC;AAC7B,iBAAW,KAAK,MAAM;AACpB,cAAM,MAAM,EAAE,WAAW;AACzB,cAAM,UAAU,EAAE,2BAA2B;AAC7C,cAAM,KAAK,OAAO,GAAG,OAAO,EAAE,IAAI,KAAK,EAAE,cAAc,YAAO,EAAE,KAAK,iBAAY,OAAO,IAAI;AAC5F,YAAI,EAAE,QAAS,WAAU,KAAK,UAAU,QAAQ,SAAS,GAAG,WAAW,OAAO,IAAI;AAAA,MACpF;AACA,YAAM,KAAK,EAAE;AACb,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,6CAA6C,UAAU,KAAK,GAAG,CAAC,KAAK;AAChF,cAAM,KAAK,EAAE;AAAA,MACf;AAGA,UAAI,YAAY,SAAS,GAAG;AAC1B,cAAM,KAAK,oBAAoB;AAC/B,iBAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,gBAAM,IAAI,YAAY,CAAC;AACvB,gBAAM,WAAW,SAAI,OAAO,KAAK,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,EAAE,QAAQ,EAAE,CAAC;AAChG,gBAAM,WAAW,EAAE,gBAAgB,IAAI,GAAG,EAAE,aAAa,SAAS;AAClE,gBAAM,UAAU,EAAE,4BAA4B,eAAe,aAAQ,EAAE,uBAAuB,OAAO;AACrG,gBAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,WAAW,SAAS,OAAO,EAAE,IAAI,KAAK,EAAE,cAAc,MAAM,QAAQ,GAAG;AACnG,gBAAM,KAAK,MAAM,QAAQ,IAAI,EAAE,KAAK,OAAO,OAAO,EAAE;AACpD,cAAI,EAAE,SAAS;AACb,kBAAM,KAAK,MAAM,EAAE,OAAO,EAAE;AAAA,UAC9B;AACA,gBAAM,KAAK,OAAO,EAAE,SAAS,GAAG;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,2CAA2C,QAAQ,oCAAoC;AAElG,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,SAAS,EAAE,OAAO,EAAE,SAAS,iDAAiD;AAAA,MAChF;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM;AACrB,yBAAmB;AAEnB,YAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,6BAAoB;AAEnE,YAAM,QAAQ,MAAM,SAAc,kBAAkB,EAAE,QAAQ,CAAC;AAC/D,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,OAAO,iDAAiD,CAAC;AAAA,QAC/G;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,MAAM,eAAe,MAAM,MAAM,aAAa,MAAM,MAAM,aAAa;AAC/F,YAAM,WAAW,MAAM,sBAAsB,MAAM,MAAM,SAAS;AAElE,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,sBAAsB,EAAE,sBAAsB,KAAK,CAAC;AAAA,MAC5D;AAEA,YAAM,SAAS,MAAM,YAAiB,qBAAqB,EAAE,QAAQ,CAAC;AAEtE,YAAM,sBAAsB,EAAE,eAAe,QAAQ,CAAC;AAEtD,YAAM,QAAQ,MAAM,oBAAoB;AACxC,YAAM,QAAkB;AAAA,QACtB,gBAAgB,OAAO;AAAA,QACvB,KAAK,MAAM,IAAI;AAAA,QACf,kBAAkB,MAAM,aAAa,KAAK,MAAM,WAAW;AAAA,MAC7D;AAEA,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,KAAK,EAAE;AACb,cAAM,KAAK,iFAA4E;AACvF,mBAAW,KAAK,UAAU;AACxB,gBAAM,KAAK,KAAK,EAAE,IAAI,KAAK,EAAE,UAAU,KAAK,EAAE,OAAO,sCAAiC,EAAE,YAAY,UAAU;AAAA,QAChH;AACA,cAAM,KAAK,wDAAwD;AAAA,MACrE;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEF;;;ACz4BA,SAAS,KAAAI,UAAS;AAGX,SAAS,mBAAmBC,SAAmB;AAEpD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,QAAQ,UAAU,UAAU,UAAU,SAAS,QAAQ,CAAC,EACrE,SAAS,4FAA4F;AAAA,QACxG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,QAClG,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,oCAAoC;AAAA,QACzE,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,QACjE,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uBAAuB;AAAA,QACnE,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAAA,QAClF,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,yDAAyD;AAAA,QAClG,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,QACnE,SAASA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mCAAmC;AAAA,MAC7E;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,MAAM,MAAM,OAAO,aAAa,YAAY,SAAS,OAAO,QAAQ,MAAM;AACzF,UAAI,WAAW,QAAQ;AACrB,cAAM,SAAS,MAAM,SAAgB,kBAAkB;AAEvD,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,2CAA2C,CAAC,EAAE;AAAA,QAClG;AAEA,cAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC7C,cAAM,YAAY,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAChE,cAAM,WAAW,CAAC,aAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAEnF,cAAM,QAAkB,CAAC,oBAAoB;AAE7C,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,KAAK;AAAA,KAAQ,MAAM,IAAI,EAAE;AAC/B,cAAI,MAAM,YAAa,OAAM,KAAK,IAAI,MAAM,WAAW,GAAG;AAC1D,qBAAW,SAAS,SAAS,MAAM,GAAG,GAAG;AACvC,kBAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAC5C,kBAAM,KAAK,SAAS,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,CAAC,EAAE;AAAA,UACtD;AAAA,QACF;AAEA,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,KAAK,gBAAgB;AAC3B,qBAAW,SAAS,WAAW;AAC7B,kBAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK;AAC5C,kBAAM,KAAK,OAAO,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,cAAc,YAAO,MAAM,WAAW,MAAM,EAAE,EAAE;AAAA,UAC3G;AAAA,QACF;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE;AAEA,UAAI,CAAC,MAAM;AACT,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wCAAwC,CAAC,EAAE;AAAA,MAC/F;AAEA,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,MAAM;AACT,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wCAAwC,CAAC,EAAE;AAAA,QAC/F;AAEA,YAAI;AACJ,YAAI,YAAY;AACd,gBAAM,SAAS,MAAM,SAAgB,kBAAkB;AACvD,gBAAM,SAAS,OAAO,KAAK,CAAC,MAAW,EAAE,SAAS,UAAU;AAC5D,cAAI,CAAC,QAAQ;AACX,mBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,UAAU,oEAAoE,CAAC,EAAE;AAAA,UACvJ;AACA,qBAAW,OAAO;AAAA,QACpB;AAEA,cAAM,YAAY,qBAAqB,EAAE,MAAM,MAAM,OAAO,aAAa,UAAU,SAAS,MAAM,CAAC;AACnG,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,SAAS,IAAI,MAAM,CAAC,EAAE;AAAA,MACtG;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,YAAY,qBAAqB,EAAE,MAAM,MAAM,OAAO,aAAa,SAAS,MAAM,CAAC;AACzF,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,uBAAuB,CAAC,EAAE;AAAA,MAC1G;AAEA,UAAI,WAAW,UAAU;AACvB,cAAM,YAAY,qBAAqB,EAAE,KAAK,CAAC;AAC/C,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,IAAwB,IAAI,2CAA2C,CAAC,EAAE;AAAA,MAC9H;AAEA,UAAI,WAAW,WAAW,WAAW,UAAU;AAC7C,YAAI,CAAC,SAAS;AACZ,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,qDAAqD,CAAC,EAAE;AAAA,QAC5G;AAEA,YAAI,WAAW,SAAS;AACtB,gBAAM,YAAY,oBAAoB,EAAE,SAAS,WAAW,KAAK,CAAC;AAClE,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,IAAI,mBAAmB,OAAO,MAAM,CAAC,EAAE;AAAA,QACtG;AAEA,cAAM,YAAY,qBAAqB,EAAE,SAAS,WAAW,KAAK,CAAC;AACnE,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,WAAW,IAAI,qBAAqB,OAAO,MAAM,CAAC,EAAE;AAAA,MACxG;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AACF;;;AC9GA,SAAS,KAAAC,UAAS;AAKlB,IAAM,kBAAgD;AAAA,EACpD,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA,EAC5B,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,oBAAoB;AAAA,EACpB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,yBAAyB;AAAA,EACzB,uBAAuB;AAAA,EACvB,oBAAoB;AAAA,EACpB,oBAAoB;AACtB;AAEA,SAAS,WAAW,IAA0B;AAC5C,SAAO,gBAAgB,EAAE,KAAK;AAChC;AAEA,SAAS,eAAe,IAAoB;AAC1C,MAAI,KAAK,IAAQ,QAAO,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC;AAChD,QAAM,OAAO,KAAK,MAAM,KAAK,GAAM;AACnC,QAAM,OAAO,KAAK,MAAO,KAAK,MAAU,GAAI;AAC5C,SAAO,GAAG,IAAI,KAAK,IAAI;AACzB;AAEA,SAAS,oBAAoB,KAAoC;AAC/D,MAAI,IAAI,WAAW,EAAG,QAAO;AAE7B,QAAM,aAAa,oBAAI,IAAuC;AAC9D,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,eAAe;AAEnB,aAAW,SAAS,KAAK;AACvB,UAAM,MAAM,WAAW,MAAM,EAAE;AAC/B,QAAI,CAAC,WAAW,IAAI,GAAG,EAAG,YAAW,IAAI,KAAK,oBAAI,IAAI,CAAC;AACvD,UAAM,WAAW,WAAW,IAAI,GAAG;AACnC,aAAS,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;AAExD,QAAI,MAAM,WAAW,QAAS;AAC9B,QAAI,MAAM,OAAO,uBAAuB,MAAM,WAAW,KAAM;AAC/D,QAAI,MAAM,OAAO,uBAAuB,MAAM,WAAW,KAAM;AAAA,EACjE;AAEA,QAAM,UAAU,IAAI,KAAK,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ;AAC5C,QAAM,SAAS,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ;AACxD,QAAM,WAAW,eAAe,SAAS,OAAO;AAEhD,QAAM,QAAkB,CAAC,sBAAsB,QAAQ;AAAA,CAAK;AAE5D,QAAM,iBAA2C;AAAA,IAC/C,CAAC,QAAQ,OAAO;AAAA,IAChB,CAAC,UAAU,UAAU;AAAA,IACrB,CAAC,SAAS,QAAQ;AAAA,IAClB,CAAC,SAAS,QAAQ;AAAA,IAClB,CAAC,QAAQ,MAAM;AAAA,EACjB;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,gBAAgB;AACzC,UAAM,WAAW,WAAW,IAAI,GAAG;AACnC,QAAI,CAAC,YAAY,SAAS,SAAS,EAAG;AACtC,UAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAC9D,UAAM,SAAS,CAAC,GAAG,SAAS,QAAQ,CAAC,EAClC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,EAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,GAAG,GAAG,QAAQ,UAAU,EAAE,CAAC,KAAK,KAAK,EAAE,EAC5D,KAAK,IAAI;AACZ,UAAM,KAAK,OAAO,KAAK,OAAO,KAAK,QAAQ,UAAU,IAAI,KAAK,GAAG,KAAK,MAAM,GAAG;AAAA,EACjF;AAEA,QAAM,KAAK,iBAAiB,UAAU,EAAE;AAExC,MAAI,eAAe,KAAK,eAAe,GAAG;AACxC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,2BAA2B;AACtC,QAAI,eAAe,EAAG,OAAM,KAAK,KAAK,YAAY,QAAQ,iBAAiB,IAAI,MAAM,KAAK,UAAU;AACpG,QAAI,eAAe,EAAG,OAAM,KAAK,KAAK,YAAY,QAAQ,iBAAiB,IAAI,MAAM,KAAK,UAAU;AAAA,EACtG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,oBAAoBC,SAAmB;AAErD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,QAAQ,KAAK,IAAI;AACvB,YAAM,SAAmB,CAAC;AAE1B,UAAI;AACJ,UAAI;AACF,sBAAc,MAAM,eAAe;AAAA,MACrC,SAAS,GAAQ;AACf,eAAO,KAAK,gCAAgC,EAAE,OAAO,EAAE;AAAA,MACzD;AAEA,UAAI,cAAqB,CAAC;AAC1B,UAAI;AACF,sBAAc,MAAM,SAAgB,uBAAuB;AAAA,MAC7D,SAAS,GAAQ;AACf,eAAO,KAAK,4BAA4B,EAAE,OAAO,EAAE;AAAA,MACrD;AAEA,UAAI,eAAe;AACnB,UAAI,YAAY,SAAS,GAAG;AAC1B,YAAI;AACF,gBAAM,UAAU,MAAM,SAAgB,qBAAqB,CAAC,CAAC;AAC7D,yBAAe,QAAQ;AAAA,QACzB,SAAS,GAAQ;AACf,iBAAO,KAAK,uBAAuB,EAAE,OAAO,EAAE;AAAA,QAChD;AAAA,MACF;AAEA,UAAI,QAAiE;AACrE,UAAI;AACF,gBAAQ,MAAM,oBAAoB;AAAA,MACpC,QAAQ;AAAA,MAA+C;AAEvD,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,YAAM,UAAU,OAAO,WAAW;AAElC,YAAM,QAAQ;AAAA,QACZ,KAAK,UAAU,YAAY,UAAU;AAAA,QACrC;AAAA,QACA,kBAAkB,eAAe,YAAY;AAAA,QAC7C,uBAAuB,OAAO,iBAAiB,SAAS;AAAA,QACxD,uBAAuB,OAAO,iBAAiB,SAAS;AAAA,QACxD,oBAAoB,YAAY,MAAM;AAAA,QACtC,gBAAgB,YAAY;AAAA,QAC5B,gBAAgB,UAAU;AAAA,MAC5B;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,IAAI,WAAW;AAC1B,mBAAW,OAAO,QAAQ;AACxB,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,MAAM,MAAM,oBAAoB;AACtC,YAAM,QAAQ;AAAA,QACZ;AAAA,QACA;AAAA,QACA,qBAAqB,IAAI,WAAW;AAAA,QACpC,uBAAuB,IAAI,aAAa;AAAA,QACxC,uBAAuB,IAAI,aAAa;AAAA,MAC1C;AACA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,SAAS,MAAM,SAAc,0BAA0B;AAE7D,YAAM,EAAE,OAAO,aAAa,cAAc,QAAQ,MAAM,MAAM,IAAI;AAElE,YAAM,WAAW,SAAI,OAAO,KAAK,MAAM,QAAQ,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,QAAQ,EAAE,CAAC;AAE5F,YAAM,QAAQ;AAAA,QACZ,0BAA0B,KAAK;AAAA,QAC/B,GAAG,QAAQ,IAAI,YAAY,IAAI,WAAW;AAAA,QAC1C;AAAA,QACA;AAAA,QACA,kBAAkB,MAAM,YAAY,KAAK,MAAM,WAAW,YAAY,MAAM,UAAU;AAAA,QACtF,oBAAoB,MAAM,cAAc;AAAA,QACxC,sBAAsB,MAAM,eAAe;AAAA,QAC3C,mBAAmB,MAAM,aAAa;AAAA,QACtC;AAAA,MACF;AAEA,UAAI,KAAK,SAAS,GAAG;AACnB,cAAM,KAAK,2BAA2B;AACtC,mBAAW,OAAO,MAAM;AACtB,gBAAM,KAAK,WAAW,IAAI,KAAK,aAAQ,IAAI,WAAW,EAAE;AACxD,gBAAM,KAAK,KAAK,IAAI,OAAO,IAAI,IAAI,QAAQ,OAAO,IAAI,QAAQ,GAAG;AAAA,QACnE;AACA,cAAM,KAAK,EAAE;AAAA,MACf;AAEA,YAAM,SAAS,OAAO,OAAO,CAAC,MAAW,EAAE,MAAM;AACjD,UAAI,OAAO,SAAS,GAAG;AACrB,cAAM,KAAK,WAAW;AACtB,mBAAW,SAAS,QAAQ;AAC1B,gBAAM,KAAK,WAAW,MAAM,KAAK,OAAO,MAAM,OAAO,IAAI,MAAM,QAAQ,GAAG;AAAA,QAC5E;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAKF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,SAAmB,CAAC;AAC1B,YAAM,iBAAiB,kBAAkB;AAEzC,UAAI,QAAsF;AAC1F,UAAI;AACF,gBAAQ,MAAM,oBAAoB;AAAA,MACpC,SAAS,GAAQ;AACf,eAAO,KAAK,cAAc,EAAE,OAAO,EAAE;AAAA,MACvC;AAQA,UAAI,gBAAuB,CAAC;AAC5B,UAAI,cAAc;AAClB,UAAI,OAAO;AACT,YAAI;AACF,0BAAgB,MAAM,SAAgB,wBAAwB,EAAE,OAAO,YAAY,CAAC;AAAA,QACtF,QAAQ;AAAA,QAAqB;AAAA,MAC/B;AAEA,UAAI,oBAA2B,CAAC;AAChC,UAAI,iBAAiB;AACrB,UAAI;AACF,cAAM,CAAC,aAAa,aAAa,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,UACpE,SAAgB,qBAAqB,EAAE,gBAAgB,eAAe,CAAC;AAAA,UACvE,SAAgB,qBAAqB,EAAE,gBAAgB,iBAAiB,CAAC;AAAA,UACzE,SAAgB,qBAAqB,EAAE,gBAAgB,YAAY,CAAC;AAAA,QACtE,CAAC;AACD,cAAM,YAAY;AAAA,UAChB,IAAI,eAAe,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,YAAY,EAAE,WAAW,SAAS;AAAA,UACzF,IAAI,eAAe,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,YAAY,EAAE,WAAW,QAAQ;AAAA,UACxF,IAAI,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,aAAa,EAAE,WAAW,QAAQ;AAAA,QAC/F;AACA,4BAAoB,UACjB,KAAK,CAAC,GAAQ,OAAY,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE,EAChE,MAAM,GAAG,cAAc;AAAA,MAC5B,QAAQ;AAAA,MAAqB;AAE7B,UAAI,eAAsB,CAAC;AAC3B,UAAI;AACF,cAAM,WAAW,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,WAAW,CAAC;AAC1F,wBAAgB,YAAY,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,OAAO;AAAA,MACzE,QAAQ;AAAA,MAAqB;AAE7B,UAAI,YAAiB;AACrB,UAAI;AACF,oBAAY,MAAM,SAAc,0BAA0B;AAAA,MAC5D,SAAS,GAAQ;AACf,eAAO,KAAK,cAAc,EAAE,OAAO,EAAE;AAAA,MACvC;AAIA,YAAM,cAAc;AACpB,YAAM,iBAAiB;AACvB,YAAM,aAAa,cAAc;AAEjC,YAAM,QAAkB,CAAC;AACzB,UAAI,YAAY;AAEhB,eAAS,QAAQ,MAAoB;AACnC,cAAM,KAAK,IAAI;AACf,qBAAa,KAAK,SAAS;AAAA,MAC7B;AAEA,eAAS,SAAS,IAAoB;AACpC,mBAAW,KAAK,GAAI,SAAQ,CAAC;AAAA,MAC/B;AAGA,UAAI,OAAO;AACT,gBAAQ,KAAK,MAAM,aAAa,EAAE;AAClC,gBAAQ,gBAAgB,MAAM,aAAa,sCAAiC;AAAA,MAC9E,OAAO;AACL,gBAAQ,aAAa;AACrB,gBAAQ,gCAAgC;AAAA,MAC1C;AACA,cAAQ,EAAE;AAGV,UAAI,WAAW;AACb,cAAM,WAAW,SAAI,OAAO,KAAK,MAAM,UAAU,QAAQ,EAAE,CAAC,IAAI,SAAI,OAAO,KAAK,KAAK,MAAM,UAAU,QAAQ,EAAE,CAAC;AAChH,gBAAQ,iBAAiB,UAAU,KAAK,GAAG;AAC3C,gBAAQ,GAAG,QAAQ,IAAI,UAAU,YAAY,IAAI,UAAU,WAAW,eAAe;AACrF,gBAAQ,EAAE;AACV,YAAI,UAAU,QAAQ,UAAU,KAAK,SAAS,GAAG;AAC/C,kBAAQ,UAAU;AAClB,qBAAW,OAAO,UAAU,MAAM;AAChC,oBAAQ,WAAW,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,IAAI,QAAQ,aAAQ,IAAI,QAAQ,GAAG;AAAA,UACvF;AACA,kBAAQ,EAAE;AAAA,QACZ;AAAA,MACF;AAGA,UAAI,aAAa,SAAS,GAAG;AAC3B,gBAAQ,qBAAqB,aAAa,MAAM,GAAG;AACnD,mBAAW,KAAK,cAAc;AAC5B,gBAAM,KAAK,EAAE,WAAW;AACxB,gBAAM,OAAO,EAAE,MAAM,YAAY;AACjC,kBAAQ,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,EAAE,EAAE;AAAA,QAC9D;AACA,gBAAQ,EAAE;AAAA,MACZ;AAGA,UAAI,YAAY,aAAa,KAAK;AAChC,sBAAc;AACd,yBAAiB;AACjB,wBAAgB,cAAc,MAAM,GAAG,WAAW;AAClD,4BAAoB,kBAAkB,MAAM,GAAG,cAAc;AAAA,MAC/D;AAGA,UAAI,cAAc,SAAS,GAAG;AAC5B,gBAAQ,iCAAiC,cAAc,MAAM,GAAG;AAChE,mBAAW,KAAK,eAAe;AAC7B,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7D,gBAAM,UAAU,MAAM,QAAQ,EAAE,cAAc,IAAI,EAAE,eAAe,SAAS,EAAE,kBAAkB;AAChG,gBAAM,WAAW,MAAM,QAAQ,EAAE,eAAe,IAAI,EAAE,gBAAgB,SAAS,EAAE,mBAAmB;AACpG,gBAAM,QAAQ,GAAG,OAAO,aAAa,QAAQ,cAAc,EAAE,oBAAoB,CAAC;AAClF,gBAAM,SAAS,EAAE,gBAAgB,KAAK,IAAI,KAAK,EAAE,YAAY,mBAAmB;AAChF,gBAAM,SAAS,EAAE,yBAAyB,KAAK,IAAI,KAAK,EAAE,qBAAqB,4BAA4B;AAC3G,kBAAQ,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,EAAE,eAAe,SAAS,YAAO,KAAK,GAAG,KAAK,GAAG,KAAK,EAAE;AAAA,QACpG;AACA,gBAAQ,EAAE;AAAA,MACZ;AAGA,UAAI,kBAAkB,SAAS,GAAG;AAChC,gBAAQ,0BAA0B,kBAAkB,MAAM,GAAG;AAC7D,gBAAQ,2EAA2E;AACnF,gBAAQ,EAAE;AACV,mBAAW,KAAK,mBAAmB;AACjC,gBAAM,KAAK,EAAE,WAAW;AACxB,gBAAM,MAAM,EAAE,kBAAkB;AAChC,gBAAM,OAAO,EAAE,MAAM,eAAe,EAAE,MAAM,aAAa;AACzD,gBAAM,YAAY,KAAK,SAAS,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,QAAQ;AACnE,kBAAQ,OAAO,EAAE,QAAQ,EAAE,IAAI,OAAO,GAAG,YAAO,SAAS,EAAE;AAAA,QAC7D;AACA,gBAAQ,EAAE;AAAA,MACZ;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,gBAAQ,WAAW;AACnB,mBAAW,OAAO,OAAQ,SAAQ,KAAK,GAAG,EAAE;AAC5C,gBAAQ,EAAE;AAAA,MACZ;AAGA,UAAI,gBAAgB;AAClB,YAAI;AACF,gBAAM,QAAQ,sBAAsB,EAAE,WAAW,eAAe,CAAC;AACjE,6BAAmB,IAAI;AAEvB,gBAAM,QAAQ,eAAe;AAC7B,gBAAM,cAAc,WAAW,cAAc;AAC7C,gBAAM,gBAAgB,YAAY,GAAG,UAAU,KAAK,iBAAiB;AACrE,gBAAM,cAAc,aAAa,SAAS,IAAI,GAAG,aAAa,MAAM,oBAAoB;AAExF,cAAI,iBAAiB;AACrB,cAAI,cAAc,SAAS,GAAG;AAC5B,kBAAM,cAAc,cAAc,CAAC;AACnC,kBAAM,UAAU,MAAM,QAAQ,YAAY,cAAc,IAAI,YAAY,eAAe,SAAS,YAAY,kBAAkB;AAC9H,kBAAM,WAAW,MAAM,QAAQ,YAAY,eAAe,IAAI,YAAY,gBAAgB,SAAS,YAAY,mBAAmB;AAClI,6BAAiB,iBAAiB,OAAO,aAAa,QAAQ;AAAA,UAChE;AAEA,kBAAQ,KAAK;AACb,kBAAQ,yBAAyB,WAAW,+BAA+B,aAAa,IAAI,WAAW,IAAI,cAAc,EAAE;AAAA,QAC7H,QAAQ;AACN,kBAAQ,KAAK;AACb,kBAAQ,+EAA+E;AAAA,QACzF;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK;AACb,gBAAQ,2EAA2E;AAAA,MACrF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,OAAOC,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,SAAS,wCAAwC;AAAA,MAChG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,MAAM,YAAY;AACxB,YAAM,SAAS,IAAI,MAAM,CAAC,KAAK;AAE/B,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,sCAAsC,CAAC,EAAE;AAAA,MAC7F;AAEA,YAAM,UAAU,oBAAoB,GAAG;AAEvC,YAAM,WAAW,CAAC,qBAAqB,OAAO,MAAM,OAAO,IAAI,MAAM;AAAA,CAAW;AAChF,iBAAW,SAAS,QAAQ;AAC1B,cAAM,OAAO,MAAM,WAAW,OAAO,WAAW;AAChD,cAAM,UAAU,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK;AACzD,iBAAS,KAAK,GAAG,IAAI,MAAM,MAAM,EAAE,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM,GAAG,OAAO,EAAE;AAAA,MACzF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA,EAAc,SAAS,KAAK,IAAI,CAAC,GAAG,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AACF;;;ACvdA,SAAS,YAAY,oBAAoB;AACzC,SAAS,eAAe;AAExB,SAAS,KAAAC,UAAS;AA2BlB,SAAS,qBAAoC;AAC3C,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,EAC7B,EAAE,OAAO,OAAO;AAEhB,aAAW,OAAO,YAAY;AAC5B,UAAM,WAAW,QAAQ,GAAG;AAC5B,QAAI,WAAW,QAAQ,UAAU,kBAAkB,CAAC,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAIA,SAAS,kBAAkB,YAA8C;AACvE,QAAM,UAAU,aAAa,YAAY,OAAO;AAChD,QAAM,SAAS,oBAAI,IAAyB;AAC5C,MAAI,eAA8B;AAElC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,aAAa,KAAK,MAAM,2BAA2B;AACzD,QAAI,YAAY;AACd,qBAAe,WAAW,CAAC;AAC3B,aAAO,IAAI,cAAc,oBAAI,IAAI,CAAC;AAClC;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,KAAK,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,GAAG;AAChE,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,cAAc;AAChB,YAAM,aAAa,KAAK,MAAM,mBAAmB;AACjD,UAAI,WAAY,QAAO,IAAI,YAAY,EAAG,IAAI,WAAW,CAAC,CAAC;AAAA,IAC7D;AAAA,EACF;AAEA,SAAO;AACT;AAIA,SAAS,cAAc,OAAuB;AAC5C,SAAO,MACJ,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,cAAc,EAAE,EACxB,KAAK;AACV;AAEA,SAAS,eAAe,OAAyB;AAC/C,MAAI,MAAM,SAAS,KAAK,EAAG,QAAO,MAAM,MAAM,UAAU;AACxD,SAAO,CAAC,KAAK;AACf;AAEA,IAAM,cAAc;AAEpB,SAAS,YAAY,SAA8B;AACjD,MAAI,QAAQ,SAAS,GAAG,KAAK,YAAY,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,GAAG;AAChF,WAAO;AAAA,EACT;AACA,MAAI,aAAa,KAAK,OAAO,EAAG,QAAO;AACvC,MAAI,iBAAiB,KAAK,OAAO,EAAG,QAAO;AAC3C,SAAO;AACT;AAIA,SAAS,aAAa,KAAa,MAAuD;AACxF,QAAM,WAAW,IAAI,MAAM,KAAK,EAAE,CAAC;AACnC,QAAM,WAAW,QAAQ,MAAM,QAAQ;AACvC,MAAI,WAAW,QAAQ,EAAG,QAAO,EAAE,QAAQ,YAAY,QAAQ,SAAS;AACxE,SAAO,EAAE,QAAQ,WAAW,QAAQ,cAAc,QAAQ,GAAG;AAC/D;AAEA,SAAS,eACP,KACA,QACyC;AACzC,QAAM,iBAAiB,IAAI,MAAM,kBAAkB;AACnD,MAAI,gBAAgB;AAClB,UAAM,QAAQ,eAAe,CAAC;AAC9B,QAAI,OAAO,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,YAAY,QAAQ,UAAU,KAAK,WAAW;AACtF,WAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,wBAAwB;AAAA,EAC7E;AAEA,QAAM,SAAS,IAAI,QAAQ,GAAG;AAC9B,MAAI,SAAS,GAAG;AACd,UAAM,QAAQ,IAAI,MAAM,GAAG,MAAM;AACjC,UAAM,QAAQ,IAAI,MAAM,SAAS,CAAC;AAClC,QAAI,CAAC,OAAO,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,wBAAwB;AACnG,QAAI,CAAC,OAAO,IAAI,KAAK,EAAG,IAAI,KAAK,EAAG,QAAO,EAAE,QAAQ,WAAW,QAAQ,UAAU,KAAK,yBAAyB,KAAK,IAAI;AACzH,WAAO,EAAE,QAAQ,YAAY,QAAQ,GAAG,KAAK,IAAI,KAAK,UAAU;AAAA,EAClE;AAEA,SAAO,EAAE,QAAQ,gBAAgB,QAAQ,mCAAmC;AAC9E;AAIA,SAAS,kBACP,YACA,YACA,UACA,MACA,OACA,MACA,kBACA,aACQ;AACR,QAAM,WAAW,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,UAAU,EAAE;AACjE,QAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE;AAC/D,QAAM,eAAe,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,EAAE;AAEzE,QAAM,YAAY,KAAK,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE;AAC9C,QAAM,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE;AAEhD,QAAM,cAAc,SAAS,SAAS,KAAK;AAC3C,QAAM,cAAc,WAAW;AAC/B,QAAM,aAAa,cAAc,IAAI,KAAK,MAAO,cAAc,cAAe,GAAG,IAAI;AAErF,QAAM,QAAkB;AAAA,IACtB,mBAAmB,UAAU,KAAK,UAAU;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,SAAS,MAAM;AAAA,MACpB,KAAK,QAAQ,cAAc,KAAK,MAAO,WAAW,SAAS,SAAU,GAAG,CAAC;AAAA,MACzE,KAAK,OAAO;AAAA,MACZ,KAAK,YAAY;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,UAAM,KAAK,sBAAsB;AACjC,eAAW,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,GAAG;AAC/D,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,QAAQ,GAAG,KAAK,aAAQ,GAAG,MAAM,EAAE;AAAA,IACpF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,eAAe,GAAG;AACpB,UAAM,KAAK,+BAA+B;AAC1C,eAAW,MAAM,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,GAAG;AACpE,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,QAAQ,GAAG,KAAK,IAAI;AAAA,IACrE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,KAAK,SAAS,GAAG;AACnB,UAAM;AAAA,MACJ;AAAA,MACA,KAAK,KAAK,MAAM;AAAA,MAChB,KAAK,SAAS,WAAW,KAAK,SAAS,IAAI,KAAK,MAAO,YAAY,KAAK,SAAU,GAAG,IAAI,CAAC;AAAA,MAC1F,KAAK,UAAU;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,GAAG;AAClB,UAAM,KAAK,uBAAuB;AAClC,eAAW,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG;AAC7C,YAAM,KAAK,OAAO,GAAG,OAAO,OAAO,GAAG,SAAS,qBAAqB,GAAG,QAAQ,2BAAsB;AAAA,IACvG;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,QAAM,KAAK,mBAAmB,UAAU,MAAM,WAAW,OAAO,WAAW,iBAAiB;AAE5F,MAAI,SAAS,SAAS,MAAM,SAAS,GAAG;AACtC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,qEAAgE,MAAM,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,KAAK;AAAA,IACtH;AACA,eAAW,OAAO,MAAO,OAAM,KAAK,KAAK,GAAG,EAAE;AAAA,EAChD,WAAW,SAAS,YAAY,UAAU,GAAG;AAC3C,UAAM,UAAU,SAAS,OAAO,CAAC,MAAM,EAAE,WAAW,aAAa,EAAE,kBAAkB,SAAS,EAAE;AAChG,QAAI,UAAU,GAAG;AACf,YAAM,KAAK,IAAI,IAAI,OAAO,oFAAoF;AAAA,IAChH;AAAA,EACF;AAEA,QAAM,KAAK,IAAI,OAAO,YAAY,gBAAgB,uDAAuD,WAAW,GAAG;AAEvH,SAAO,MAAM,KAAK,IAAI;AACxB;AAIO,SAAS,oBAAoBC,SAAmB;AACrD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,QAAQ,UAAU,EACtC,SAAS,+CAA+C;AAAA,QAC3D,MAAMA,GAAE,KAAK,CAAC,UAAU,KAAK,CAAC,EAAE,QAAQ,QAAQ,EAC7C,SAAS,sFAAsF;AAAA,MACpG;AAAA,MACA,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,YAAY,KAAK,MAAM;AAC9B,YAAM,cAAc,mBAAmB;AACvC,UAAI,CAAC,aAAa;AAChB,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UAGR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,SAAS,kBAAkB,QAAQ,aAAa,kBAAkB,CAAC;AAEzE,YAAMD,QAAO,mBAAmB;AAAA,QAC9B,OAAO;AAAA,QACP,MAAM,cAAc,UAAU,aAAa,OAAO,IAAI,qBAAqB,WAAW;AAAA,QACtF,QAAQ;AAAA,MACV,CAAC;AAED,YAAM,gBAAgB,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,WAAW,CAAC;AAE/F,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,yBAAyB,UAAU,yBAAyB,CAAC;AAAA,QACxG;AAAA,MACF;AAGA,UAAI;AACJ,UAAI;AACF,cAAM,aAAa,MAAM,SAAgB,qBAAqB,CAAC,CAAC;AAChE,sBAAc,IAAI,IAAI,WAAW,IAAI,CAAC,MAAW,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,MAC7E,QAAQ;AACN,sBAAc,IAAI,IAAI,cAAc,IAAI,CAAC,MAAW,EAAE,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,MAChF;AAEA,YAAM,gBAAgC,CAAC;AACvC,YAAM,YAAwB,CAAC;AAE/B,iBAAW,SAAS,eAAe;AACjC,cAAM,MAAM,MAAM,WAAW,MAAM;AACnC,cAAM,QAAQ,MAAM;AAGpB,cAAM,eAAsB,MAAM,MAAM,eAAe,CAAC;AACxD,mBAAW,MAAM,cAAc;AAC7B,gBAAM,WAAmB,GAAG,SAAS;AACrC,qBAAW,UAAU,eAAe,QAAQ,GAAG;AAC7C,kBAAM,UAAU,cAAc,MAAM;AACpC,gBAAI,CAAC,QAAS;AAEd,kBAAM,OAAO,YAAY,OAAO;AAChC,gBAAI;AACJ,gBAAI;AAEJ,gBAAI,SAAS,QAAQ;AACnB,eAAC,EAAE,QAAQ,OAAO,IAAI,aAAa,SAAS,WAAW;AAAA,YACzD,WAAW,SAAS,UAAU;AAC5B,eAAC,EAAE,QAAQ,OAAO,IAAI,eAAe,SAAS,MAAM;AAAA,YACtD,OAAO;AACL,uBAAS;AACT,uBAAS;AAAA,YACX;AAEA,0BAAc,KAAK;AAAA,cACjB,SAAS;AAAA,cAAK,WAAW;AAAA,cAAO,OAAO,OAAO,KAAK;AAAA,cACnD;AAAA,cAAM;AAAA,cAAQ;AAAA,cAAQ,eAAe,GAAG,UAAU;AAAA,YACpD,CAAC;AAAA,UACH;AAAA,QACF;AAGA,cAAM,iBAAiB;AACvB,cAAM,eAAyB,MAAM,MAAM,gBAAgB,CAAC;AAC5D,mBAAW,UAAU,cAAc;AACjC,cAAI,UAAU,UAAU,eAAgB;AACxC,oBAAU,KAAK;AAAA,YACb,SAAS;AAAA,YAAK,WAAW;AAAA,YAAO,UAAU;AAAA,YAC1C,OAAO,YAAY,IAAI,MAAM;AAAA,UAC/B,CAAC;AAAA,QACH;AAAA,MACF;AAGA,YAAM,QAAkB,CAAC;AACzB,UAAI,SAAS,OAAO;AAClB,cAAM,iBAAiB,oBAAI,IAAyB;AACpD,mBAAW,MAAM,eAAe;AAC9B,cAAI,GAAG,WAAW,aAAa,GAAG,kBAAkB,WAAW;AAC7D,gBAAI,CAAC,eAAe,IAAI,GAAG,OAAO,EAAG,gBAAe,IAAI,GAAG,SAAS,oBAAI,IAAI,CAAC;AAC7E,2BAAe,IAAI,GAAG,OAAO,EAAG,IAAI,GAAG,KAAK;AAAA,UAC9C;AAAA,QACF;AAEA,mBAAW,CAAC,KAAK,aAAa,KAAK,gBAAgB;AACjD,gBAAM,QAAQ,cAAc,KAAK,CAAC,OAAY,EAAE,WAAW,EAAE,UAAU,GAAG;AAC1E,cAAI,CAAC,OAAO,QAAS;AAErB,gBAAM,WAAW,MAAM,MAAM,eAAe,CAAC,GAAG;AAAA,YAAI,CAAC,OACnD,GAAG,WAAW,aAAa,cAAc,IAAI,GAAG,KAAK,IACjD,EAAE,GAAG,IAAI,QAAQ,UAAU,IAC3B;AAAA,UACN;AAEA,gBAAM,YAAY,qBAAqB;AAAA,YACrC,SAAS,MAAM;AAAA,YACf,MAAM,EAAE,aAAa,QAAQ;AAAA,UAC/B,CAAC;AACD,gBAAM,KAAK,MAAM,OAAO;AAAA,QAC1B;AAAA,MACF;AAEA,YAAM,SAAS;AAAA,QACb;AAAA,QAAY,cAAc;AAAA,QAC1B;AAAA,QAAe;AAAA,QAAW;AAAA,QAAO;AAAA,QACjC,OAAO;AAAA,QAAM;AAAA,MACf;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,OAAO,CAAC,EAAE;AAAA,IAC9D;AAAA,EACF;AACF;;;ACvWA,SAAS,cAAAE,aAAY,gBAAAC,eAAc,aAAa,gBAAgB;AAChE,SAAS,WAAAC,UAAS,UAAU,SAAS,iBAAiB;AAEtD,SAAS,KAAAC,UAAS;AAGlB,IAAM,kBAAkB;AAExB,IAAM,oBAAoB;AAAA,EACxB,EAAE,KAAK,YAAY,OAAO,qBAAqB,MAAM,UAAU,UAAU,MAAM,SAAS,CAAC,YAAY,SAAS,QAAQ,MAAM,GAAG,YAAY,KAAK;AAAA,EAChJ,EAAE,KAAK,eAAe,OAAO,qBAAqB,MAAM,QAAQ,YAAY,MAAM;AAAA,EAClF,EAAE,KAAK,YAAY,OAAO,kBAAkB,MAAM,QAAQ,YAAY,MAAM;AAAA,EAC5E,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC3E,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,OAAO;AAAA,EAC7C,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,OAAO;AAAA,EAC3C,EAAE,KAAK,cAAc,OAAO,uBAAuB,MAAM,OAAO;AAAA,EAChE,EAAE,KAAK,cAAc,OAAO,uBAAuB,MAAM,OAAO;AAAA,EAChE,EAAE,KAAK,aAAa,OAAO,cAAc,MAAM,QAAQ,YAAY,KAAK;AAAA,EACxE,EAAE,KAAK,SAAS,OAAO,uBAAuB,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC7E,EAAE,KAAK,cAAc,OAAO,+BAA+B,MAAM,OAAO;AAAA,EACxE,EAAE,KAAK,aAAa,OAAO,mCAAmC,MAAM,QAAQ,YAAY,KAAK;AAAA,EAC7F,EAAE,KAAK,aAAa,OAAO,sDAAsD,MAAM,OAAO;AAChG;AAYA,eAAe,mBAAkC;AAC/C,QAAM,cAAc,MAAM,SAAgB,uBAAuB;AACjE,MAAI,YAAY,KAAK,CAAC,MAAW,EAAE,SAAS,eAAe,EAAG;AAE9D,QAAM,YAAY,0BAA0B;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,aACE;AAAA,IAEF,QAAQ;AAAA,EACV,CAAC;AACH;AAEA,eAAe,kBAAwC;AACrD,SAAO,SAAsB,qBAAqB,EAAE,gBAAgB,gBAAgB,CAAC;AACvF;AAEA,SAAS,MAAM,SAAsB,UAA+B;AAClE,SAAO,QACJ,OAAO,CAAC,MAAM,EAAE,MAAM,SAAS,YAAY,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,QAAQ,EACvF,KAAK,CAAC,GAAG,OAAO,EAAE,SAAS,MAAM,EAAE,SAAS,EAAE;AACnD;AAIA,SAAS,uBACP,QACA,OACA,OACA,cACQ;AACR,QAAM,YAAY,OAAO,IAAI,CAAC,UAAU;AACtC,UAAM,aAAa,MAAM;AAAA,MACvB,CAAC,MAAM,EAAE,MAAM,aAAa,MAAM;AAAA,IACpC;AACA,UAAM,YAAY,WAAW,IAAI,CAAC,MAAM;AAAA,iCACX,QAAQ,OAAO,EAAE,MAAM,eAAe,EAAE,CAAC,CAAC;AAAA,kCACzC,QAAQ,OAAO,EAAE,MAAM,QAAQ,QAAG,CAAC,CAAC;AAAA,kCACpC,QAAQ,EAAE,IAAI,CAAC;AAAA;AAAA,KAE5C,EAAE,KAAK,EAAE;AAEV,WAAO;AAAA,iDACsC,QAAQ,OAAO,MAAM,MAAM,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,qCAGxD,QAAQ,MAAM,IAAI,CAAC;AAAA,sCAClB,WAAW,MAAM;AAAA;AAAA,kCAErB,QAAQ,OAAO,MAAM,MAAM,eAAe,EAAE,CAAC,CAAC;AAAA,6BACnD,aAAa,0CAA0C;AAAA;AAAA;AAAA,EAGlF,CAAC,EAAE,KAAK,EAAE;AAEV,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBH,QAAQ,YAAY,CAAC;AAAA,EACzB,SAAS;AAAA,EACT,MAAM,SAAS,IAAI,oHAAoH,MAAM,IAAI,CAAC,MAAM,qBAAqB,QAAQ,EAAE,IAAI,CAAC,kEAA6D,QAAQ,OAAO,EAAE,MAAM,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,WAAW,EAAE;AAAA;AAE3U;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ;AACpG;AAEA,SAAS,gBAAgB,OAAkB,OAA4B;AACrE,QAAM,aAAa,MAAM,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,MAAM,OAAO;AACzE,QAAM,WAAW,WAAW,IAAI,CAAC,MAAM;AACrC,UAAM,OAAO,EAAE,MAAM,cAAc,WAAM,EAAE,KAAK,WAAW,KAAK;AAChE,UAAM,QAAQ,EAAE,MAAM,QAAQ,KAAK,EAAE,KAAK,KAAK,MAAM;AACrD,WAAO,OAAO,EAAE,MAAM,QAAQ,QAAG,MAAM,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK;AAAA,EAChE,CAAC,EAAE,KAAK,IAAI;AACZ,SAAO,OAAO,MAAM,IAAI;AAAA,EAAK,MAAM,MAAM,eAAe,EAAE;AAAA;AAAA,EAAO,YAAY,mBAAmB;AAClG;AAIA,IAAM,gBAAgB;AAAA,EACpB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,IACJ,UAAU;AAAA,IACV,aAAa;AAAA,IACb,YAAY,KAAK,UAAU,CAAC,QAAQ,kBAAkB,QAAQ,YAAY,aAAa,CAAC;AAAA,EAC1F;AACF;AAEA,IAAM,cAAc;AAAA,EAClB,EAAE,SAAS,mBAAmB,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,wEAAwE,MAAM,aAAM,WAAW,QAAQ,WAAW,+LAA0L,EAAE;AAAA,EAClc,EAAE,SAAS,oBAAoB,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,+DAA+D,MAAM,gBAAM,WAAW,QAAQ,WAAW,iNAAiN,EAAE;AAAA,EAC3d,EAAE,SAAS,mBAAmB,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,sEAAsE,MAAM,aAAM,WAAW,wBAAwB,WAAW,qOAAgO,EAAE;AAAA,EACtf,EAAE,SAAS,uBAAuB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,sDAAsD,MAAM,UAAK,WAAW,8BAA8B,WAAW,8NAAyN,EAAE;AAAA,EAC5e,EAAE,SAAS,0BAA0B,MAAM,eAAe,OAAO,GAAG,MAAM,EAAE,UAAU,SAAS,aAAa,uBAAuB,OAAO,WAAW,aAAa,6DAA6D,MAAM,aAAM,WAAW,QAAQ,WAAW,8PAAyP,EAAE;AACtgB;AAEA,IAAM,aAAa;AAAA;AAAA,EAEjB,EAAE,SAAS,mBAAmB,MAAM,SAAS,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,gLAA2K,WAAW,4CAA4C,OAAO,YAAY,WAAW,2HAA2H,EAAE;AAAA,EACthB,EAAE,SAAS,uBAAuB,MAAM,qBAAqB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,4EAAuE,WAAW,qDAAqD,OAAO,YAAY,WAAW,qIAAqI,EAAE;AAAA;AAAA,EAGrd,EAAE,SAAS,oBAAoB,MAAM,UAAU,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,UAAK,aAAa,kIAAkI,WAAW,uDAAuD,OAAO,YAAY,WAAW,6JAA6J,EAAE;AAAA,EAC5hB,EAAE,SAAS,qBAAqB,MAAM,WAAW,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,aAAM,aAAa,mFAA8E,WAAW,wEAAwE,OAAO,YAAY,WAAW,yIAAoI,EAAE;AAAA,EACne,EAAE,SAAS,wBAAwB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,oBAAoB,OAAO,WAAW,MAAM,aAAM,aAAa,2GAAsG,WAAW,gDAAgD,OAAO,aAAa,WAAW,2KAAsK,EAAE;AAAA;AAAA,EAG5gB,EAAE,SAAS,iBAAiB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,aAAM,aAAa,6IAAwI,WAAW,oEAAoE,OAAO,SAAS,WAAW,gVAAsU,EAAE;AAAA,EACttB,EAAE,SAAS,6BAA6B,MAAM,mBAAmB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,mBAAO,aAAa,oHAAoH,WAAW,6CAA6C,OAAO,aAAa,WAAW,iaAA4Z,EAAE;AAAA,EACvxB,EAAE,SAAS,wBAAwB,MAAM,qBAAqB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,gBAAM,aAAa,uGAAuG,WAAW,wDAAwD,OAAO,cAAc,WAAW,yUAA+T,EAAE;AAAA,EACrrB,EAAE,SAAS,8BAA8B,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,mBAAmB,OAAO,WAAW,MAAM,UAAK,aAAa,uHAAkH,WAAW,mFAAmF,OAAO,aAAa,WAAW,4SAAuS,EAAE;AAAA;AAAA,EAGtsB,EAAE,SAAS,4BAA4B,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,4FAAuF,WAAW,+DAA+D,OAAO,kBAAkB,WAAW,iVAAuU,EAAE;AAAA,EAC5rB,EAAE,SAAS,0BAA0B,MAAM,gBAAgB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,qGAAgG,WAAW,wDAAwD,OAAO,aAAa,WAAW,uTAAkT,EAAE;AAAA,EAChqB,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,MAAM,aAAa,iGAA4F,WAAW,sDAAsD,OAAO,aAAa,WAAW,2fAA4e,EAAE;AAAA,EAC70B,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,4FAAuF,WAAW,sDAAsD,OAAO,cAAc,WAAW,kXAA6W,EAAE;AAAA,EACzsB,EAAE,SAAS,sBAAsB,MAAM,YAAY,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,mGAA8F,WAAW,kEAAkE,OAAO,YAAY,WAAW,+TAA0T,EAAE;AAAA,EACvqB,EAAE,SAAS,2BAA2B,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,UAAK,aAAa,8EAA8E,WAAW,wFAAwF,OAAO,cAAc,WAAW,kUAA6T,EAAE;AAAA,EAC/rB,EAAE,SAAS,uBAAuB,MAAM,aAAa,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,uBAAuB,OAAO,WAAW,MAAM,aAAM,aAAa,sGAAiG,WAAW,yBAAyB,OAAO,aAAa,WAAW,0QAA0Q,EAAE;AAAA;AAAA,EAGrlB,EAAE,SAAS,oBAAoB,MAAM,cAAc,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,mBAAO,aAAa,iIAA4H,WAAW,oCAAoC,OAAO,SAAS,WAAW,6RAAwR,EAAE;AAAA,EACvoB,EAAE,SAAS,oBAAoB,MAAM,UAAU,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,aAAM,aAAa,8DAA8D,OAAO,YAAY,WAAW,0RAA0R,EAAE;AAAA,EAC1hB,EAAE,SAAS,oBAAoB,MAAM,oBAAoB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,UAAU,0BAA0B,OAAO,WAAW,MAAM,aAAM,aAAa,iFAAiF,OAAO,YAAY,WAAW,2RAAsR,EAAE;AACrjB;AAEA,IAAM,aAAa;AAAA,EACjB,EAAE,SAAS,2BAA2B,MAAM,gBAAgB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,oBAAoB,YAAY,6BAA6B,aAAa,gIAAsH,OAAO,UAAU,EAAE;AAAA,EAC/T,EAAE,SAAS,wBAAwB,MAAM,mBAAmB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,sBAAsB,YAAY,wBAAwB,aAAa,kHAA8F,OAAO,UAAU,EAAE;AAAA,EACpS,EAAE,SAAS,uBAAuB,MAAM,2BAA2B,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,0BAA0B,YAAY,uBAAuB,aAAa,mIAAoH,OAAO,UAAU,EAAE;AAAA,EACpU,EAAE,SAAS,6BAA6B,MAAM,wBAAwB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,iBAAiB,YAAY,sBAAsB,aAAa,kIAAwH,OAAO,UAAU,EAAE;AAAA,EACjU,EAAE,SAAS,uBAAuB,MAAM,kBAAkB,OAAO,GAAG,MAAM,EAAE,UAAU,QAAQ,YAAY,4BAA4B,YAAY,qBAAqB,aAAa,iIAAkH,OAAO,UAAU,EAAE;AAC3T;AAIO,SAAS,0BAA0BC,SAAmB;AAI3D,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAKF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,QAAQ,WAAW,MAAM,CAAC,EACvC,SAAS,6DAA6D;AAAA,QACzE,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2CAA2C;AAAA,QACpF,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wEAAwE;AAAA,QAC9G,MAAMA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6DAA6D;AAAA,MACpG;AAAA,MACA,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,OAAO,EAAE,QAAQ,UAAU,OAAO,KAAK,MAAM;AAC3C,YAAM,iBAAiB;AACvB,YAAM,MAAM,MAAM,gBAAgB;AAElC,UAAI,WAAW,QAAQ;AACrB,cAAM,YAAY,MAAM,KAAK,UAAU;AACvC,cAAM,iBAAiB,WACnB,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ,IAC5C,UAAU,CAAC;AAEf,cAAM,eAAe,gBAAgB,QAAQ;AAC7C,cAAM,aAAa,gBAAgB;AAEnC,cAAM,SAAS,MAAM,KAAK,OAAO,EAC9B,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,gBAAgB,UAAU;AAClE,cAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,cAAM,QAAQ,MAAM,KAAK,MAAM;AAE/B,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,aAAa,OAAO,IAAI,CAAC,MAAM,gBAAgB,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM;AAC3E,cAAM,YAAY,MAAM,SAAS,IAC7B,iCAAiC,MAAM;AAAA,UAAI,CAAC,MAC1C,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,eAAe,EAAE;AAAA,QAC/C,EAAE,KAAK,IAAI,IACX;AAEJ,cAAM,OAAO,KAAK,YAAY;AAAA;AAAA,EAAO,UAAU,GAAG,SAAS;AAC3D,cAAM,OAAO,uBAAuB,QAAQ,OAAO,OAAO,YAAY;AAEtE,eAAO;AAAA,UACL,SAAS;AAAA,YACP,EAAE,MAAM,QAAiB,KAAK;AAAA,YAC9B,EAAE,MAAM,YAAqB,UAAU,EAAE,KAAK,gCAAgC,UAAU,aAAa,MAAM,KAAK,EAAE;AAAA,UACpH;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,WAAW;AACxB,YAAI,CAAC,MAAO,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,qCAAqC,CAAC,EAAE;AAEtG,cAAM,SAAS,MAAM,KAAK,OAAO;AACjC,cAAM,SAAS,OAAO;AAAA,UACpB,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,MAAM,YAAY,KAAK,EAAE,YAAY;AAAA,QACvE;AAEA,YAAI,CAAC,QAAQ;AACX,gBAAM,YAAY,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI;AAC9D,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,UAAU,KAAK,kCAAkC,SAAS,GAAG,CAAC,EAAE;AAAA,QACpH;AAEA,cAAM,QAAQ,MAAM,KAAK,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,aAAa,OAAO,OAAO;AAClF,cAAM,QAAQ,MAAM,KAAK,MAAM,EAAE;AAAA,UAC/B,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,cAAc,EAAE,YAAY,EAAE,MAAM,UAAU;AAAA,QAC/F;AAEA,cAAM,UAAU,OAAO,MAAM,YACzB;AAAA,uCAA0C,OAAO,KAAK,cAAc,SAAS,+BAA+B,OAAO,KAAK,SAAS;AAAA,IACjI;AACJ,cAAM,iBAAiB,OAAO,MAAM,YAAY;AAAA,IAAO,OAAO,KAAK,SAAS;AAAA,IAAO;AAEnF,cAAM,aAAa,MAAM,IAAI,CAAC,MAAM;AAClC,gBAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,QAAQ,QAAG,IAAI,EAAE,IAAI,EAAE;AACtD,cAAI,EAAE,MAAM,YAAa,OAAM,KAAK,OAAO,EAAE,KAAK,WAAW,CAAC;AAC9D,cAAI,EAAE,MAAM,MAAO,OAAM,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE;AAC1D,cAAI,EAAE,MAAM,UAAW,OAAM,KAAK,gBAAgB,EAAE,KAAK,SAAS,IAAI;AACtE,cAAI,EAAE,MAAM,UAAW,OAAM,KAAK;AAAA,gBAAmB,EAAE,KAAK,SAAS,EAAE;AACvE,iBAAO,MAAM,KAAK,IAAI;AAAA,QACxB,CAAC,EAAE,KAAK,MAAM;AAEd,cAAM,YAAY,MAAM,SAAS,IAC7B,gCAAgC,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,eAAe,EAAE,EAAE,EAAE,KAAK,IAAI,IACvG;AAEJ,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,KAAK,OAAO,MAAM,QAAQ,EAAE,IAAI,OAAO,IAAI;AAAA;AAAA,EAAa,OAAO,MAAM,eAAe,EAAE,GAAG,OAAO,GAAG,cAAc;AAAA,IAAO,MAAM,MAAM;AAAA;AAAA,EAAoB,UAAU,GAAG,SAAS;AAAA,UACtL,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,YAAI,CAAC,KAAM,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,yCAAyC,CAAC,EAAE;AAEzG,cAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,cAAM,SAAS,MAAM;AAAA,UACnB,CAAC,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK,YAAY,KAAK,EAAE,YAAY;AAAA,QACtE;AAEA,YAAI,CAAC,QAAQ;AACX,gBAAM,YAAY,MAAM,IAAI,CAAC,MAAM,KAAK,EAAE,IAAI,IAAI,EAAE,KAAK,IAAI;AAC7D,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,SAAS,IAAI,iCAAiC,SAAS,GAAG,CAAC,EAAE;AAAA,QACjH;AAEA,cAAM,QAAQ,MAAM,KAAK,MAAM;AAC/B,cAAM,SAAS,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,MAAM,UAAU;AACtE,cAAM,OAAO,MAAM,KAAK,CAAC,MAAM,EAAE,YAAY,OAAO,MAAM,UAAU;AAEpE,cAAM,QAAQ;AAAA,UACZ,KAAK,OAAO,IAAI;AAAA,UAChB;AAAA,UACA,KAAK,QAAQ,MAAM,QAAQ,GAAG,IAAI,QAAQ,QAAQ,SAAS,eAAU,MAAM,MAAM,QAAQ,GAAG,IAAI,MAAM,QAAQ,SAAS;AAAA,UACvH;AAAA,UACA,OAAO,OAAO,MAAM,eAAe,EAAE;AAAA,QACvC;AAEA,YAAI,QAAQ;AACV,gBAAM,KAAK,IAAI,eAAe,OAAO,IAAI,IAAI,OAAO,OAAO,MAAM,eAAe,EAAE,CAAC;AACnF,cAAI,OAAO,MAAM,UAAW,OAAM,KAAK,YAAY,OAAO,KAAK,SAAS,IAAI;AAAA,QAC9E;AACA,YAAI,MAAM;AACR,gBAAM,KAAK,IAAI,eAAe,KAAK,IAAI,IAAI,OAAO,KAAK,MAAM,eAAe,EAAE,CAAC;AAC/E,cAAI,KAAK,MAAM,UAAW,OAAM,KAAK,YAAY,KAAK,KAAK,SAAS,IAAI;AAAA,QAC1E;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,QAAQ,OAAO,CAAC,EAC7B,SAAS,oEAAoE;AAAA,MAClF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AACpB,UAAI,WAAW,QAAQ;AACrB,cAAM,iBAAiB;AACvB,cAAM,WAAW,MAAM,gBAAgB;AACvC,cAAM,cAAc,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;AAE1D,YAAI,UAAU;AACd,YAAI,UAAU;AACd,YAAI,YAAY;AAEhB,cAAM,WAAW;AAAA,UACf,EAAE,GAAG,eAAe,OAAO,GAAG,QAAQ,SAAS;AAAA,UAC/C,GAAG,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,UAC/D,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,UAC9D,GAAG,WAAW,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,SAAkB,EAAE;AAAA,QAChE;AAEA,mBAAW,QAAQ,UAAU;AAC3B,cAAI,YAAY,IAAI,KAAK,OAAO,GAAG;AACjC,kBAAM,gBAAgB,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO;AACrE,kBAAM,eAAgB,eAAe,QAAQ,CAAC;AAC9C,kBAAM,WAAW,KAAK;AACtB,kBAAM,aAAa,OAAO,KAAK,QAAQ,EAAE;AAAA,cACvC,CAAC,MAAM,SAAS,CAAC,MAAM,UAAa,aAAa,CAAC,MAAM,SAAS,CAAC;AAAA,YACpE;AACA,gBAAI,YAAY;AACd,oBAAM,aAAa,EAAE,GAAG,cAAc,GAAG,SAAS;AAClD,oBAAM,YAAY,qBAAqB,EAAE,SAAS,KAAK,SAAS,MAAM,WAAW,CAAC;AAClF;AAAA,YACF,OAAO;AACL;AAAA,YACF;AACA;AAAA,UACF;AACA,gBAAM,YAAY,qBAAqB;AAAA,YACrC,gBAAgB;AAAA,YAChB,SAAS,KAAK;AAAA,YACd,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK;AAAA,YACX,OAAO,KAAK,SAAS;AAAA,UACvB,CAAC;AACD;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA;AAAA,eAAyC,OAAO;AAAA,eAA0B,OAAO;AAAA,iBAAwC,SAAS;AAAA;AAAA;AAAA,UAC1I,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,SAAS;AACtB,cAAM,cAAcC,oBAAmB;AACvC,YAAI,CAAC,aAAa;AAChB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA,YAER,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,iBAAiB;AACvB,cAAM,MAAM,MAAM,gBAAgB;AAClC,cAAM,SAAS,MAAM,KAAK,OAAO;AACjC,cAAM,QAAQ,MAAM,KAAK,MAAM;AAE/B,cAAM,SAAS,iBAAiB,aAAa,QAAQ,KAAK;AAE1D,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iBAAiB,MAAM,EAAE,CAAC,EAAE;AAAA,MAChF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AACF;AAsBA,SAASA,sBAAoC;AAC3C,QAAM,aAAa;AAAA,IACjB,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZC,SAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,EAC7B,EAAE,OAAO,OAAO;AAEhB,aAAW,OAAO,YAAY;AAC5B,UAAM,WAAWA,SAAQ,GAAG;AAC5B,QAAIC,YAAWD,SAAQ,UAAU,kBAAkB,CAAC,EAAG,QAAO;AAAA,EAChE;AACA,SAAO;AACT;AAEA,SAAS,iBACP,aACA,QACA,OACY;AACZ,QAAM,WAAW,oBAAI,IAAuB;AAC5C,aAAW,KAAK,OAAQ,UAAS,IAAI,EAAE,SAAS,CAAC;AAEjD,QAAM,cAAc,iBAAiB,MAAM;AAC3C,QAAM,mBAAmB,kBAAkB,KAAK;AAEhD,QAAM,aAA0B,CAAC;AACjC,QAAM,cAAc,oBAAI,IAA+D;AACvF,MAAI,aAAa;AACjB,MAAI,eAAe;AACnB,MAAI,WAAW;AAEf,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,OAAO,KAAK,MAAM,YAAY,EAAE;AACjD,UAAM,QAAQ,SAAS,IAAI,QAAQ;AACnC,QAAI,CAAC,MAAO;AAEZ,UAAM,YAAY,eAAe,IAAI;AACrC,UAAM,iBAA8B,CAAC;AACrC,QAAI,gBAAgB;AAEpB,eAAW,MAAM,WAAW;AAC1B,YAAM,UAAUA,SAAQ,aAAa,EAAE;AACvC,YAAM,QAAQ,aAAa,OAAO;AAElC,iBAAW,QAAQ,OAAO;AACxB;AACA;AACA,cAAM,UAAU,SAAS,aAAa,IAAI;AAC1C,cAAM,UAAU,aAAa,IAAI;AAEjC,mBAAW,OAAO,SAAS;AACzB;AACA,gBAAM,WAAW,cAAc,KAAK,MAAM,WAAW;AACrD,cAAI,CAAC,UAAU;AAAE;AAAY;AAAA,UAAU;AAEvC,gBAAM,aAAa,eAAe,UAAU,gBAAgB;AAC5D,cAAI,CAAC,YAAY;AAAE;AAAY;AAAA,UAAU;AAEzC,gBAAM,iBAAiB,OAAO,WAAW,MAAM,YAAY,EAAE;AAC7D,gBAAM,cAAc,SAAS,IAAI,cAAc;AAC/C,cAAI,CAAC,YAAa;AAElB,cAAI,mBAAmB,SAAU;AAEjC,gBAAM,UAAU,YAAY,IAAI,QAAQ;AACxC,cAAI,WAAW,CAAC,QAAQ,IAAI,cAAc,GAAG;AAC3C,kBAAM,IAAe;AAAA,cACnB,YAAY,KAAK;AAAA,cACjB,aAAa,MAAM;AAAA,cACnB,YAAY;AAAA,cACZ,YAAY;AAAA,cACZ,YAAY,WAAW;AAAA,cACvB,aAAa,YAAY;AAAA,cACzB,MAAM,GAAG,MAAM,IAAI,uBAAuB,YAAY,IAAI;AAAA,YAC5D;AACA,uBAAW,KAAK,CAAC;AACjB,2BAAe,KAAK,CAAC;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,gBAAY,IAAI,KAAK,SAAS,EAAE,YAAY,gBAAgB,cAAc,cAAc,CAAC;AAAA,EAC3F;AAEA,SAAO,EAAE,YAAY,cAAc,YAAY,gBAAgB,cAAc,iBAAiB,UAAU,YAAY;AACtH;AAEA,SAAS,iBAAiB,QAA+C;AACvE,QAAM,WAAW,oBAAI,IAAoB;AACzC,aAAW,KAAK,OAAQ,UAAS,IAAI,EAAE,KAAK,YAAY,GAAG,EAAE,OAAO;AAEpE,QAAM,UAAU,oBAAI,IAAyB;AAC7C,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,OAAO,MAAM,MAAM,aAAa,MAAM;AACnD,UAAM,MAAM,oBAAI,IAAY;AAC5B,QAAI,SAAS,QAAQ;AACnB,iBAAW,OAAO,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG;AACpE,cAAM,KAAK,SAAS,IAAI,GAAG;AAC3B,YAAI,GAAI,KAAI,IAAI,EAAE;AAAA,MACpB;AAAA,IACF;AACA,YAAQ,IAAI,MAAM,SAAS,GAAG;AAAA,EAChC;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAA2D;AACpF,QAAM,UAAiD,CAAC;AACxD,aAAW,QAAQ,OAAO;AACxB,eAAW,MAAM,eAAe,IAAI,GAAG;AACrC,cAAQ,KAAK,EAAE,QAAQ,UAAU,EAAE,GAAG,KAAK,CAAC;AAAA,IAC9C;AAAA,EACF;AACA,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM;AACxD,SAAO;AACT;AAEA,SAAS,eAAe,MAA2B;AACjD,QAAM,MAAM,KAAK,MAAM;AACvB,MAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO,CAAC;AAC7C,SAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAC3D;AAEA,SAAS,aAAa,SAA2B;AAC/C,MAAI,CAACC,YAAW,OAAO,EAAG,QAAO,CAAC;AAClC,QAAM,OAAO,SAAS,OAAO;AAC7B,MAAI,KAAK,OAAO,GAAG;AACjB,WAAO,gBAAgB,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC;AAAA,EACjD;AACA,MAAI,CAAC,KAAK,YAAY,EAAG,QAAO,CAAC;AAEjC,QAAM,UAAoB,CAAC;AAC3B,QAAM,OAAO,CAAC,QAAgB;AAC5B,eAAW,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;AAC7D,UAAI,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,SAAS,eAAgB;AACjE,YAAM,OAAOD,SAAQ,KAAK,MAAM,IAAI;AACpC,UAAI,MAAM,YAAY,EAAG,MAAK,IAAI;AAAA,eACzB,gBAAgB,IAAI,EAAG,SAAQ,KAAK,IAAI;AAAA,IACnD;AAAA,EACF;AACA,OAAK,OAAO;AACZ,SAAO;AACT;AAEA,SAAS,gBAAgB,GAAoB;AAC3C,SAAO,oBAAoB,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,OAAO;AAC3D;AAEA,SAAS,aAAa,UAA4B;AAChD,MAAI;AACF,UAAM,UAAUE,cAAa,UAAU,OAAO;AAC9C,UAAM,KAAK;AACX,UAAM,UAAoB,CAAC;AAC3B,QAAI;AACJ,YAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAC1C,cAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,IACvB;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAM,aAAa,CAAC,OAAO,OAAO,WAAW,aAAa,aAAa,eAAe;AAEtF,SAAS,wBAAwB,SAAgC;AAC/D,MAAID,YAAW,OAAO,KAAK,SAAS,OAAO,EAAE,OAAO,EAAG,QAAO;AAC9D,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,UAAU;AAC1B,QAAIA,YAAW,OAAO,EAAG,QAAO;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,cAAc,KAAa,UAAkB,MAA6B;AACjF,MAAI,MAAqB;AACzB,MAAI,IAAI,WAAW,OAAO,EAAG,OAAM,IAAI,QAAQ,SAAS,UAAU;AAAA,WACzD,IAAI,WAAW,UAAU,EAAG,OAAM,IAAI,QAAQ,YAAY,SAAS;AAAA,WACnE,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,EAAG,QAAO;AAAA,WAC3D,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,KAAK,GAAG;AACtD,UAAM,UAAU,QAAQ,QAAQ;AAChC,UAAME,OAAMH,SAAQ,SAAS,GAAG;AAChC,UAAM,SAAS,MAAMG,IAAG;AAAA,EAC1B;AACA,MAAI,CAAC,IAAK,QAAO;AAEjB,QAAM,MAAMH,SAAQ,MAAM,GAAG;AAC7B,QAAM,SAAS,wBAAwB,GAAG;AAC1C,SAAO,SAAS,SAAS,MAAM,MAAM,IAAI;AAC3C;AAEA,SAAS,eACP,UACA,UACkB;AAClB,QAAM,aAAa,UAAU,QAAQ;AACrC,aAAW,EAAE,QAAQ,KAAK,KAAK,UAAU;AACvC,QAAI,WAAW,WAAW,MAAM,EAAG,QAAO;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAA4B;AACpD,QAAM,QAAkB,CAAC;AAEzB,MAAI,OAAO,WAAW,WAAW,GAAG;AAClC,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,2BAA2B,OAAO,YAAY,WAAW,OAAO,cAAc,qBAAqB,OAAO,eAAe;AAAA,MACzH;AAAA,MACA;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM;AAAA,MACJ,sCAAiC,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG;AAAA,MAC/G;AAAA,MACA,WAAW,OAAO,YAAY,mBAAmB,OAAO,cAAc,qBAAqB,OAAO,WAAW,MAAM,aAAa,OAAO,WAAW,WAAW,IAAI,KAAK,GAAG,OAAO,OAAO,eAAe;AAAA,MACtM;AAAA,IACF;AAEA,UAAM,SAAS,oBAAI,IAAyB;AAC5C,eAAW,KAAK,OAAO,YAAY;AACjC,UAAI,CAAC,OAAO,IAAI,EAAE,UAAU,EAAG,QAAO,IAAI,EAAE,YAAY,CAAC,CAAC;AAC1D,aAAO,IAAI,EAAE,UAAU,EAAG,KAAK,CAAC;AAAA,IAClC;AAEA,eAAW,CAAC,UAAU,EAAE,KAAK,QAAQ;AACnC,YAAM,KAAK,MAAM,QAAQ,KAAK,GAAG,CAAC,EAAE,WAAW,GAAG;AAClD,iBAAW,KAAK,IAAI;AAClB,cAAM,KAAK,OAAO,EAAE,UAAU,gBAAgB,EAAE,UAAU,eAAU,EAAE,UAAU,OAAO,EAAE,WAAW,YAAO,EAAE,IAAI,EAAE;AAAA,MACrH;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,QAAM,KAAK,OAAO,EAAE;AAEpB,QAAM,cAAc,CAAC,GAAG,OAAO,YAAY,QAAQ,CAAC;AACpD,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,WAAW,KAAK,EAAE,eAAe,CAAC,EAAE;AAClG,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,SAAS,CAAC,EAAE;AAC1E,QAAM,aAAa,YAAY,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,iBAAiB,CAAC,EAAE;AAEvE,QAAM;AAAA,IACJ,gBAAgB,UAAU,iBAAiB,UAAU,qBAAqB,UAAU;AAAA,EACtF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACrsBA,SAAS,KAAAI,UAAS;;;ACwClB,IAAM,iBAAqC;AAAA,EACzC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,kBACE;AAAA,EACF,MAAM;AAAA,EACN,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCrB,QAAQ;AAAA,IACN;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,QACE;AAAA,UACF,SAAS;AAAA,YACP,EAAE,IAAI,aAAa,OAAO,mBAAmB;AAAA,YAC7C,EAAE,IAAI,eAAe,OAAO,oBAAoB;AAAA,YAChD,EAAE,IAAI,oBAAoB,OAAO,gCAAgC;AAAA,YACjE,EAAE,IAAI,WAAW,OAAO,wBAAwB;AAAA,YAChD,EAAE,IAAI,UAAU,OAAO,2CAAsC;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,WAAW;AAAA,QACT;AAAA,UACE,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,EAAE,IAAI,OAAO,OAAO,4CAAuC;AAAA,YAC3D,EAAE,IAAI,UAAU,OAAO,8BAA8B;AAAA,YACrD,EAAE,IAAI,OAAO,OAAO,qBAAqB;AAAA,UAC3C;AAAA,QACF;AAAA,MACF;AAAA,MACA,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,IACA;AAAA,MACE,IAAI;AAAA,MACJ,KAAK;AAAA,MACL,OAAO;AAAA,MACP,MAAM;AAAA,MACN,aACE;AAAA,MACF,qBACE;AAAA,MACF,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,MACV;AAAA,MACA,cAAc;AAAA,MACd,iBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,oBAAoB;AAAA,EACpB,kBAAkB;AAAA,IAChB,cAAc;AAAA,IACd,kBAAkB;AAAA,EACpB;AAAA,EAEA,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASjB;AAIA,IAAM,YAAY,oBAAI,IAAgC;AAAA,EACpD,CAAC,SAAS,cAAc;AAC1B,CAAC;AAEM,SAAS,YAAY,IAA4C;AACtE,SAAO,UAAU,IAAI,EAAE;AACzB;AAEO,SAAS,gBAAsC;AACpD,SAAO,MAAM,KAAK,UAAU,OAAO,CAAC;AACtC;;;ADlOA,SAAS,mBAAmB,IAAgC;AAC1D,QAAM,YAAY,GAAG,OAClB,IAAI,CAAC,MAAM,KAAK,EAAE,GAAG,KAAK,EAAE,KAAK,KAAK,EAAE,IAAI,MAAM,EAAE,mBAAmB,GAAG,GAAG,EAC7E,KAAK,IAAI;AAEZ,SACE,MAAM,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA,YACX,GAAG,EAAE;AAAA,EACf,GAAG,gBAAgB;AAAA;AAAA,cACP,GAAG,OAAO,MAAM;AAAA,EAAO,SAAS;AAAA;AAAA,mCACX,GAAG,kBAAkB;AAAA,kDACN,GAAG,EAAE;AAE5D;AAEO,SAAS,sBAAsBC,SAAmB;AAEvD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,YAAM,YAAY,cAAc;AAEhC,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,UAAU,IAAI,kBAAkB,EAAE,KAAK,aAAa;AAElE,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,UACR,MAAM;AAAA,UACN,MACE;AAAA;AAAA,EACG,UAAU,MAAM;AAAA;AAAA;AAAA;AAAA,EACT,KAAK;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAIF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,SAAS,6BAA6B;AAAA,QAC7D,SAASA,GAAE,OAAO,EAAE,SAAS,mCAAmC;AAAA,QAChE,QAAQA,GAAE,OAAO,EAAE,SAAS,gFAA2E;AAAA,QACvG,SAASA,GAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,UAC9B;AAAA,QACF;AAAA,QACA,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,UACjC;AAAA,QACF;AAAA,QACA,oBAAoBA,GAAE,OAAO,EAAE,SAAS,EAAE;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,MACA,aAAa,EAAE,iBAAiB,MAAM;AAAA,IACxC;AAAA,IACA,OAAO,EAAE,YAAY,SAAS,QAAQ,SAAS,aAAa,mBAAmB,MAAM;AACnF,YAAM,KAAK,YAAY,UAAU;AACjC,UAAI,CAAC,IAAI;AACP,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,aAAa,UAAU,2BACT,cAAc,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAE7D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,OAAO;AACpD,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,UAAU,OAAO,4BAA4B,UAAU,wBAClC,GAAG,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,UAE9D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,QAAkB;AAAA,QACtB,wBAAwB,MAAM,GAAG,WAAM,MAAM,KAAK;AAAA,QAClD,aAAa,GAAG,IAAI,OAAO,GAAG,EAAE;AAAA,QAChC;AAAA,MACF;AAEA,UAAI,WAAW,eAAe,oBAAoB;AAChD,YAAI;AACF,gBAAM,UAAU,MAAM,YAAoB,qBAAqB;AAAA,YAC7D,gBAAgB,GAAG;AAAA,YACnB,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,MAAM;AAAA,cACJ,CAAC,GAAG,iBAAiB,gBAAgB,GAAG;AAAA,cACxC,cAAc,GAAG;AAAA,cACjB,gBAAgB;AAAA,cAChB,OAAM,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,YAC7C;AAAA,YACA,WAAW,YAAY,GAAG,EAAE;AAAA,UAC9B,CAAC;AAED,gBAAM;AAAA,YACJ,0BAA0B,OAAO;AAAA,YACjC,iBAAiB,GAAG,kBAAkB;AAAA,YACtC,SAAS,WAAW;AAAA,YACpB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,KAAc;AACrB,gBAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC3D,gBAAM;AAAA,YACJ,4BAA4B,GAAG;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,YACA,mBAAmB,GAAG,kBAAkB;AAAA,YACxC,WAAW,WAAW;AAAA,YACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AACL,cAAM;AAAA,UACJ,SAAS,MAAM,GAAG;AAAA,UAClB,WAAW,OAAO,UAAU,GAAG,GAAG,CAAC,GAAG,OAAO,SAAS,MAAM,QAAQ,EAAE;AAAA,QACxE;AAEA,cAAM,aAAa,GAAG,OAAO,UAAU,CAAC,MAAM,EAAE,OAAO,OAAO;AAC9D,YAAI,aAAa,GAAG,OAAO,SAAS,GAAG;AACrC,gBAAM,OAAO,GAAG,OAAO,aAAa,CAAC;AACrC,gBAAM;AAAA,YACJ;AAAA,YACA,mBAAmB,KAAK,GAAG,WAAM,KAAK,KAAK;AAAA,YAC3C,IAAI,KAAK,WAAW;AAAA,UACtB;AAAA,QACF,OAAO;AACL,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,IACxE;AAAA,EACF;AACF;;;AEzKO,SAAS,qBAAqBC,SAAyB;AAC5D,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,YAAY;AACV,UAAI;AACF,cAAM,SAAS,MAAM,kBAAkB;AAEvC,cAAM,QAAkB,CAAC;AAEzB,YAAI,OAAO,YAAY;AACrB,gBAAM;AAAA,YACJ,wCAAwC,OAAO,WAAW,iBAAiB,aAC/D,OAAO,WAAW,SAAS,kBAAkB,OAAO,WAAW,WAAW;AAAA,YACtF;AAAA,UACF;AAAA,QACF;AAEA,cAAM;AAAA,UACJ,WAAW,OAAO,SAAS,yBACX,OAAO,WAAW,eACrB,OAAO,aAAa,YACvB,OAAO,UAAU;AAAA,QAE7B;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kCAAkC,IAAI,OAAO,GAAG,CAAC;AAAA,UAC1F,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,YAAY;AACV,UAAI;AACF,cAAM,YAAY,kBAAkB;AACpC,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,oCAAoC,CAAC;AAAA,UAChF;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,QAAiC,oBAAoB;AAAA,UACzE;AAAA,QACF,CAAC;AAED,cAAM,kBAAkB;AAExB,cAAM,QAAkB;AAAA,UACtB,WAAW,SAAS;AAAA,UACpB;AAAA,QACF;AAEA,YAAI,SAAS;AACX,gBAAM,UAAW,QAAQ,gBAA6B,UAAU;AAChE,gBAAM,WAAY,QAAQ,iBAA8B,UAAU;AAClE,gBAAM,YAAa,QAAQ,oBAA+B;AAC1D,gBAAM,QAAS,QAAQ,gBAA2B;AAClD,gBAAM,WAAY,QAAQ,yBAAoC;AAE9D,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA,uBAAuB,OAAO;AAAA,YAC9B,wBAAwB,QAAQ;AAAA,YAChC,yBAAyB,SAAS;AAAA,YAClC,qBAAqB,KAAK;AAAA,YAC1B,8BAA8B,QAAQ;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,KAAK,IAAI,yEAAyE;AAExF,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kCAAkC,IAAI,OAAO,GAAG,CAAC;AAAA,UAC1F,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa,EAAE,cAAc,KAAK;AAAA,IACpC;AAAA,IACA,YAAY;AACV,UAAI;AACF,cAAM,YAAY,kBAAkB;AACpC,YAAI,CAAC,WAAW;AACd,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wDAAwD,CAAC;AAAA,UACpG;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,QAAiC,oBAAoB;AAAA,UACzE;AAAA,QACF,CAAC;AAED,YAAI,CAAC,SAAS;AACZ,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,yFAAyF,CAAC;AAAA,UACrI;AAAA,QACF;AAEA,cAAM,WAAW,kBAAkB;AACnC,cAAM,UAAW,QAAQ,gBAA6B,UAAU;AAChE,cAAM,WAAY,QAAQ,iBAA8B,UAAU;AAElE,cAAM,QAAQ;AAAA,UACZ,WAAW,SAAS,IAAI,QAAQ,MAAM;AAAA,UACtC,gBAAgB,QAAQ,WAAW;AAAA,UACnC,UAAU,QAAQ,UAAU;AAAA,UAC5B,aAAa,WAAW,QAAQ,IAAI;AAAA,UACpC;AAAA,UACA;AAAA,UACA;AAAA,UACA,uBAAuB,OAAO;AAAA,UAC9B,wBAAwB,QAAQ;AAAA,UAChC,yBAAyB,QAAQ,oBAAoB,CAAC;AAAA,UACtD,eAAe,IAAI,KAAK,QAAQ,SAAmB,EAAE,YAAY,CAAC;AAAA,UAClE,eAAe,IAAI,KAAK,QAAQ,SAAmB,EAAE,YAAY,CAAC;AAAA,QACpE;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,KAAK,IAAI,EAAE,CAAC,EAAE;AAAA,MACxE,SAAS,KAAU;AACjB,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iCAAiC,IAAI,OAAO,GAAG,CAAC;AAAA,UACzF,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACzKA,SAAS,KAAAC,UAAS;AAGlB,SAAS,YAAY,OAAuC;AAC1D,SAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,IAAI,OAAO,MAAM;AACtB,UAAM,SAAS,OAAO,YAAY,YAAY,QAAQ,SAAS;AAC/D,UAAM,UAAU,SACZ,QAAQ,UAAU,GAAG,EAAE,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAC1D;AACJ,WAAO,SAAS,EAAE,OAAO,OAAO;AAAA,EAClC,CAAC,EACA,KAAK,IAAI;AACd;AAEO,SAAS,sBAAsBC,SAAmB;AAIvD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,UAAU,OAAO,QAAQ,MAAM,CAAC,EAC7C,SAAS,2FAA2F;AAAA,QACvG,cAAcA,GAAE,OAAO,EAAE,SAAS,EAC/B,SAAS,wCAAwC;AAAA,QACpD,OAAOA,GAAE,OAAO,EAAE,SAAS,EACxB,SAAS,qCAAqC;AAAA,QACjD,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,oBAAoB,EAC5D,SAAS,qGAAqG;AAAA,QACjH,aAAaA,GAAE,OAAO,EAAE,SAAS,EAC9B,SAAS,0BAA0B;AAAA,QACtC,QAAQA,GAAE,OAAO,EAAE,SAAS,EACzB,SAAS,2EAA2E;AAAA,QACvF,SAASA,GAAE,OAAO,EAAE,SAAS,EAC1B,SAAS,4CAA4C;AAAA,QACxD,QAAQA,GAAE,OAAO,EAAE,SAAS,EACzB,SAAS,gDAAgD;AAAA,QAC5D,QAAQA,GAAE,OAAO,EAAE,SAAS,EACzB,SAAS,kDAAkD;AAAA,MAChE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,cAAc,OAAO,aAAa,aAAa,QAAQ,SAAS,QAAQ,OAAO,MAAM;AACpG,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,MAAO,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,6CAA6C,CAAC,EAAE;AAE9G,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,EAAE,OAAO,aAAa,aAAa,OAAO;AAAA,QAC5C;AAEA,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,oBACqB,OAAO,OAAO;AAAA,eACnB,KAAK;AAAA,cACN,WAAW;AAAA;AAAA;AAAA,wCAEe,OAAO,OAAO;AAAA,UAC3D,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,OAAO;AACpB,YAAI,CAAC,aAAc,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gCAAgC,CAAC,EAAE;AAExG,cAAM,QAAQ,MAAM,SAAc,qBAAqB,EAAE,aAAa,CAAC;AACvE,YAAI,CAAC,OAAO;AACV,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,YAAY,YAAY,eAAe,CAAC,EAAE;AAAA,QAC9F;AAEA,cAAM,eAAe,MAAM,SACvB;AAAA,gBAAmB,MAAM,cAAc;AAAA;AAAA,IACvC,MAAM,OAAO,SACV,IAAI,CAAC,MAAW,OAAO,EAAE,GAAG,OAAO,EAAE,KAAK,SAAS,SAAI,OAAO,KAAK,IAAI,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC,GAAG,SAAI,OAAO,KAAK,IAAI,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EACzI,KAAK,IAAI,IACZ;AAEJ,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,KAAK,MAAM,IAAI;AAAA;AAAA,oBACM,MAAM,OAAO;AAAA,cACnB,MAAM,aAAa;AAAA,gBACjB,MAAM,MAAM;AAAA,sBACN,MAAM,WAAW,IAAI,MAAM,UAAU;AAAA,iBAC1C,MAAM,cAAc;AAAA,oBACjB,MAAM,aAAa,SAAS;AAAA,wBACxB,MAAM,YAAY;AAAA,IAC3C,eACA;AAAA;AAAA;AAAA;AAAA,IACA,YAAY,MAAM,KAAK;AAAA,UAC3B,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,cAAM,SAAS,MAAM,SAAgB,uBAAuB;AAAA,UAC1D;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,OAAO,WAAW,GAAG;AACvB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,+DAA+D,CAAC,EAAE;AAAA,QACtH;AAEA,cAAM,YAAY,OACf;AAAA,UAAI,CAAC,MACJ,SAAS,EAAE,OAAO,QAAQ,EAAE,IAAI,WAAM,EAAE,WAAW,SAChD,EAAE,WAAW,IAAI,EAAE,UAAU,0BAClB,EAAE,cAAc,kBAAe,EAAE,MAAM;AAAA,QACvD,EACC,KAAK,IAAI;AAEZ,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,aAAa,OAAO,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC,EAAE;AAAA,MACrG;AAEA,UAAI,WAAW,QAAQ;AACrB,YAAI,CAAC,aAAc,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gCAAgC,CAAC,EAAE;AACxG,YAAI,CAAC,OAAQ,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,2EAA2E,CAAC,EAAE;AAC7I,YAAI,CAAC,QAAS,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,0CAA0C,CAAC,EAAE;AAE7G,cAAM,SAAS,MAAM,YAElB,qBAAqB,EAAE,cAAc,QAAQ,SAAS,OAAO,CAAC;AAEjE,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,cACjB,OAAO,MAAM;AAAA,sBACL,OAAO,MAAM;AAAA,wBACX,QAAQ,MAAM;AAAA;AAAA;AAAA,UAE3C,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,UAAU,QAAQ,QAAQ,UAAU,SAAS,CAAC,EAC3D,SAAS,kGAAkG;AAAA,QAC9G,cAAcA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,QACxD,eAAeA,GAAE,OAAO,EAAE,SAAS,EAChC,SAAS,2EAA2E;AAAA,QACvF,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QACnE,UAAUA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QACjE,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,6BAA6B;AAAA,QACvE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,MAC3F;AAAA,MACA,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,QAAQ,cAAc,eAAe,UAAU,UAAU,WAAW,OAAO,MAAM;AACxF,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,cAAe,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iCAAiC,CAAC,EAAE;AAE1G,cAAM,SAAS,MAAM,YAGlB,wBAAwB,EAAE,cAAc,eAAe,OAAO,CAAC;AAElE,cAAM,UAAU,OAAO,oBACnB;AAAA;AAAA,sBAA2B,OAAO,iBAAiB,KACnD;AAEJ,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,gBAAgB,OAAO,OAAO;AAAA;AAAA,iBACZ,OAAO,OAAO;AAAA,iBACd,OAAO,OAAO;AAAA,iBACd,aAAa;AAAA,mBACX,OAAO,cAAc;AAAA,wBAChB,OAAO,cAAc,SAAS,IAAI,OAAO,cAAc,KAAK,IAAI,IAAI,MAAM;AAAA,IACnG;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,cAAM,UAAU,MAAM,SAAgB,wBAAwB,EAAE,aAAa,CAAC;AAE9E,YAAI,QAAQ,WAAW,GAAG;AACxB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,+BAA+B,YAAY,uEAAuE,CAAC,EAAE;AAAA,QACzK;AAEA,cAAM,YAAY,QACf,IAAI,CAAC,MAAW;AACf,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE;AAClF,gBAAM,MAAM,EAAE,iBAAiB,EAAE,cAAc;AAC/C,gBAAM,QAAQ,EAAE,eAAe,SAAS,IAAI,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC,MAAM;AACjF,iBAAO,QAAQ,EAAE,OAAO,MAAM,IAAI,OAAO,EAAE,MAAM,WAAM,GAAG,GAAG,KAAK,KAAK,EAAE,aAAa;AAAA,QACxF,CAAC,EACA,KAAK,IAAI;AAEZ,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iBAAiB,YAAY,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC,EAAE;AAAA,MAC3H;AAEA,UAAI,WAAW,QAAQ;AACrB,YAAI,YAAY,QAAQ,YAAY,MAAM;AACxC,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wDAAwD,CAAC,EAAE;AAAA,QAC/G;AAEA,cAAM,OAAO,MAAM,YAAiB,yBAAyB,EAAE,cAAc,UAAU,SAAS,CAAC;AAEjG,YAAI,OACF,YAAY,QAAQ,YAAO,QAAQ;AAAA;AAAA,iBACjB,KAAK,YAAY;AAAA,mBACf,KAAK,eAAe,YAAO,KAAK,cAAc,MAAM,KAAK,kBAAkB,IAAI,MAAM,EAAE,GAAG,KAAK,cAAc;AAAA,uBACzG,KAAK,aAAa,SAAS,IAAI,KAAK,aAAa,KAAK,IAAI,IAAI,MAAM;AAAA;AAE9F,mBAAW,MAAM,KAAK,WAAW;AAC/B,cAAI,GAAG,WAAW,YAAa;AAC/B,kBAAQ;AAAA,KAAQ,GAAG,MAAM,KAAK,GAAG,MAAM;AAAA;AAAA;AACvC,gBAAM,WAAW,KAAK,UAAU,GAAG,MAAM;AACzC,cAAI,UAAU,SAAS,GAAG;AACxB,uBAAW,KAAK,UAAU;AACxB,kBAAI,EAAE,SAAS,SAAU,SAAQ,KAAK,EAAE,MAAM,UAAU,GAAG,GAAG,CAAC;AAAA,uBACtD,EAAE,SAAS,SAAU,SAAQ,KAAK,EAAE,MAAM,UAAU,GAAG,GAAG,CAAC;AAAA,kBAC/D,SAAQ,EAAE,MAAM,UAAU,GAAG,GAAG;AAAA,YACvC;AACA,oBAAQ;AAAA,UACV;AAAA,QACF;AAEA,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,KAAK,CAAC,EAAE;AAAA,MACtD;AAEA,UAAI,WAAW,UAAU;AACvB,YAAI,aAAa,KAAM,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wCAAwC,CAAC,EAAE;AAEpH,cAAM,SAAS,MAAM,YAElB,wBAAwB,EAAE,cAAc,WAAW,OAAO,CAAC;AAE9D,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,sBACT,OAAO,UAAU;AAAA,sBACjB,OAAO,UAAU;AAAA,wBACf,OAAO,cAAc,SAAS,IAAI,OAAO,cAAc,KAAK,IAAI,IAAI,MAAM;AAAA;AAAA;AAAA,UAEvG,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,WAAW;AACxB,cAAM,UAAU,MAAM,SAAgB,uBAAuB,EAAE,aAAa,CAAC;AAE7E,YAAI,QAAQ,WAAW,GAAG;AACxB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,+BAA+B,YAAY,KAAK,CAAC,EAAE;AAAA,QACvG;AAEA,cAAM,YAAY,QACf,KAAK,CAAC,GAAQ,MAAW,EAAE,YAAY,EAAE,SAAS,EAClD,IAAI,CAAC,MAAW;AACf,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE;AAClF,iBAAO,OAAO,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,aAAa,SAAS,WAAM,EAAE,QAAQ,EAAE;AAAA,QACpF,CAAC,EACA,KAAK,IAAI;AAEZ,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iBAAiB,YAAY,KAAK,QAAQ,MAAM;AAAA;AAAA,EAAe,SAAS,GAAG,CAAC,EAAE;AAAA,MAClI;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,UAAU,QAAQ,SAAS,WAAW,CAAC,EACpD,SAAS,gFAAgF;AAAA,QAC5F,cAAcA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,QACxD,YAAYA,GAAE,OAAO,EAAE,SAAS,EAC7B,SAAS,iEAAiE;AAAA,QAC7E,UAAUA,GAAE,KAAK,CAAC,gBAAgB,QAAQ,CAAC,EAAE,SAAS,EACnD,SAAS,sDAAsD;AAAA,QAClE,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,MAC3F;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,cAAc,YAAY,UAAU,OAAO,MAAM;AAChE,UAAI,WAAW,UAAU;AACvB,cAAM,SAAS,MAAM,YAElB,yBAAyB,EAAE,cAAc,MAAM,YAAY,OAAO,CAAC;AAEtE,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,cACe,OAAO,IAAI;AAAA,mBACN,OAAO,WAAW;AAAA,iBACpB,YAAY;AAAA;AAAA;AAAA,UAElC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,cAAM,WAAW,MAAM,YAAmB,yBAAyB,EAAE,aAAa,CAAC;AAEnF,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gCAAgC,YAAY,KAAK,CAAC,EAAE;AAAA,QACxG;AAEA,cAAM,YAAY,SACf,IAAI,CAAC,MAAW,OAAO,EAAE,IAAI,OAAO,EAAE,MAAM,sBAAiB,EAAE,WAAW,QAAQ,EAAE,SAAS,EAAE,EAC/F,KAAK,IAAI;AAEZ,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,YAAY,KAAK,SAAS,MAAM;AAAA;AAAA,EAAQ,SAAS,GAAG,CAAC,EAAE;AAAA,MAC7H;AAEA,UAAI,WAAW,SAAS;AACtB,YAAI,CAAC,WAAY,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wCAAwC,CAAC,EAAE;AAE9G,cAAM,SAAS,MAAM,YAElB,wBAAwB,EAAE,cAAc,YAAY,UAAU,OAAO,CAAC;AAEzE,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,gBACf,OAAO,UAAU;AAAA,kBACf,OAAO,OAAO;AAAA,kBACd,OAAO,QAAQ;AAAA;AAAA,kBACf,OAAO,OAAO;AAAA,UACrC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,aAAa;AAC1B,YAAI,CAAC,WAAY,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iDAAiD,CAAC,EAAE;AAEvH,cAAM,SAAS,MAAM,YAAiB,2BAA2B,EAAE,cAAc,WAAW,CAAC;AAE7F,YAAI,CAAC,OAAO,cAAc;AACxB,iBAAO;AAAA,YACL,SAAS,CAAC;AAAA,cACR,MAAM;AAAA,cACN,MAAM;AAAA;AAAA,UAA6B,UAAU,UAAU,YAAY;AAAA,YACrE,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,gBAAgB,OAAO,UAC1B;AAAA,UAAI,CAAC,MACJ,OAAO,EAAE,MAAM,0BAAqB,EAAE,SAAS,IAAI,CAAC,MAAW,GAAG,EAAE,UAAU,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,QAC5G,EACC,KAAK,IAAI;AAEZ,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,UACW,UAAU;AAAA;AAAA,IACrB,gBACA;AAAA;AAAA;AAAA,UACJ,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GAAE,KAAK,CAAC,QAAQ,WAAW,mBAAmB,eAAe,CAAC,EACnE,SAAS,gFAAgF;AAAA,QAC5F,cAAcA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,QACxD,eAAeA,GAAE,OAAO,EAAE,SAAS,EAChC,SAAS,0CAA0C;AAAA,QACtD,eAAeA,GAAE,OAAO,EAAE,SAAS,EAChC,SAAS,4CAA4C;AAAA,QACxD,QAAQA,GAAE,OAAO,EAAE,SAAS,EACzB,SAAS,kDAAkD;AAAA,QAC9D,MAAMA,GAAE,OAAO,EAAE,SAAS,EACvB,SAAS,4CAA4C;AAAA,QACxD,WAAWA,GAAE,OAAO,EAAE,SAAS,EAC5B,SAAS,2CAA2C;AAAA,QACvD,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,kDAAkD;AAAA,MAC3F;AAAA,MACA,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,QAAQ,cAAc,eAAe,eAAe,QAAQ,MAAM,WAAW,OAAO,MAAM;AACjG,UAAI,WAAW,QAAQ;AACrB,cAAM,OAAO,MAAM,SAAc,oBAAoB,EAAE,cAAc,cAAc,CAAC;AAEpF,cAAM,aAAa,KAAK,OACrB,IAAI,CAAC,MAAW,KAAK,EAAE,OAAO,SAAS,MAAM,MAAM,EAAE,IAAI,OAAO,EAAE,MAAM,EAAE,EAC1E,KAAK,IAAI;AAEZ,cAAM,OAAO,KAAK,OAAO,SAAS;AAElC,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE,WAAW,IAAI;AAAA;AAAA,eACC,KAAK,KAAK;AAAA,mBACN,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA,EAClB,UAAU;AAAA,UAC9B,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,WAAW;AACxB,YAAI,CAAC,cAAe,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,iCAAiC,CAAC,EAAE;AAC1G,YAAI,CAAC,KAAM,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,wBAAwB,CAAC,EAAE;AAExF,cAAM,SAAS,MAAM,YAAiB,uBAAuB;AAAA,UAC3D;AAAA,UAAc;AAAA,UAAe;AAAA,UAAQ;AAAA,UAAM;AAAA,QAC7C,CAAC;AAED,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MACE;AAAA;AAAA,iBACkB,OAAO,YAAY;AAAA,kBAClB,OAAO,aAAa;AAAA,KACtC,OAAO,SAAS,eAAe,OAAO,MAAM;AAAA,IAAO,MACpD,eAAe,KAAK,UAAU,GAAG,GAAG,CAAC;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,WAAW,mBAAmB;AAChC,YAAI,CAAC,UAAW,QAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,6BAA6B,CAAC,EAAE;AAClG,cAAM,YAAY,2BAA2B,EAAE,UAAU,CAAC;AAC1D,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,oBAAoB,CAAC,EAAE;AAAA,MAC3E;AAEA,UAAI,WAAW,iBAAiB;AAC9B,cAAM,WAAW,MAAM,YAAmB,yBAAyB;AAAA,UACjE;AAAA,UAAc;AAAA,QAChB,CAAC;AAED,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gCAAgC,YAAY,IAAI,gBAAgB,KAAK,aAAa,KAAK,EAAE,IAAI,CAAC,EAAE;AAAA,QACpJ;AAEA,cAAM,YAAY,SACf,IAAI,CAAC,MAAW;AACf,gBAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,KAAK,GAAG,EAAE,UAAU,GAAG,EAAE;AAClF,gBAAM,WAAW,EAAE,WAAW,gBAAgB;AAC9C,gBAAM,OAAO,EAAE,SAAS,KAAK,EAAE,MAAM,MAAM;AAC3C,iBAAO,QAAQ,EAAE,OAAO,GAAG,IAAI,MAAM,IAAI,OAAO,EAAE,MAAM,GAAG,QAAQ,KAAK,EAAE,KAAK,UAAU,GAAG,GAAG,CAAC;AAAA,QAClG,CAAC,EACA,KAAK,IAAI;AAEZ,cAAM,kBAAkB,SAAS,OAAO,CAAC,MAAW,CAAC,EAAE,QAAQ,EAAE;AAEjE,eAAO;AAAA,UACL,SAAS,CAAC;AAAA,YACR,MAAM;AAAA,YACN,MAAM,kBAAkB,YAAY,KAAK,SAAS,MAAM,KAAK,eAAe;AAAA;AAAA,EAAmB,SAAS;AAAA,UAC1G,CAAC;AAAA,QACH;AAAA,MACF;AAEA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,kBAAkB,CAAC,EAAE;AAAA,IACzE;AAAA,EACF;AACF;;;ACjgBA,SAAS,KAAAC,UAAS;AAGlB,SAAS,YAAY,OAAsC;AACzD,SAAO,OAAO,QAAQ,KAAK,EACxB,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM;AACnB,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG,QAAO,SAAS,EAAE;AAClD,UAAM,QAAQ,KACX,IAAI,CAAC,MAAW;AACf,YAAM,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE;AAC9C,YAAM,UAAU,EAAE,gBAAgB,KAAK,EAAE,aAAa,KAAK;AAC3D,YAAM,SAAS,EAAE,mBAAmB,KAAK,EAAE,gBAAgB,MAAM;AACjE,aAAO,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM;AAAA,IACnC,CAAC,EACA,KAAK,IAAI;AACZ,WAAO,SAAS,EAAE,OAAO,KAAK;AAAA,EAChC,CAAC,EACA,KAAK,IAAI;AACd;AAEO,SAAS,iBAAiBC,SAAmB;AAGlD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAGF,aAAa;AAAA,QACX,QAAQC,GACL,KAAK,CAAC,UAAU,OAAO,MAAM,CAAC,EAC9B,SAAS,yDAAyD;AAAA,QACrE,YAAYA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QACnE,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC9D,YAAYA,GACT,OAAO,EACP,SAAS,EACT,QAAQ,aAAa,EACrB,SAAS,kEAAkE;AAAA,QAC9E,aAAaA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,0BAA0B;AAAA,QACtE,SAASA,GACN,MAAMA,GAAE,OAAO,CAAC,EAChB,SAAS,EACT,SAAS,8EAA8E;AAAA,QAC1F,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,2BAA2B;AAAA,MACpE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,YAAY,OAAO,YAAY,aAAa,SAAS,OAAO,MAAM;AACjF,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,OAAO;AACV,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,EAAE,MAAM,QAAiB,MAAM,yCAAyC;AAAA,YAC1E;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA,EAAE,OAAO,YAAY,aAAa,QAAQ;AAAA,QAC5C;AAEA,cAAM,QAAQ,MAAM,oBAAoB;AACxC,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE;AAAA;AAAA,oBACqB,OAAO,OAAO;AAAA,eACnB,KAAK;AAAA,kBACF,UAAU;AAAA;AAAA,mBAET,MAAM,aAAa,KAAK,MAAM,WAAW;AAAA;AAAA,wCACpB,OAAO,OAAO;AAAA,YAC3D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,OAAO;AACpB,YAAI,CAAC,YAAY;AACf,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,8BAA8B,CAAC;AAAA,UAC1E;AAAA,QACF;AAEA,cAAM,MAAM,MAAM,SAAc,eAAe,EAAE,WAAW,CAAC;AAC7D,YAAI,CAAC,KAAK;AACR,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,UAAU,eAAe,CAAC;AAAA,UAC7E;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE,KAAK,IAAI,IAAI;AAAA;AAAA,oBACQ,IAAI,OAAO;AAAA,kBACb,IAAI,YAAY;AAAA,gBAClB,IAAI,MAAM;AAAA,iBACT,IAAI,cAAc;AAAA,oBACf,IAAI,eAAe,MAAM,IAAI,WAAW,IAAI,IAAI,UAAU;AAAA;AAAA;AAAA;AAAA,IAE/E,YAAY,IAAI,KAAK;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,QAAQ;AACrB,cAAM,OAAO,MAAM,SAAgB,iBAAiB;AAAA,UAClD,YAAY,eAAe,gBAAgB,aAAa;AAAA,UACxD;AAAA,QACF,CAAC;AAED,YAAI,CAAC,QAAQ,KAAK,WAAW,GAAG;AAC9B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,QAAQ,KAAK;AAAA,UACjB,CAAC,MACC,OAAO,EAAE,IAAI,SAAS,EAAE,OAAO,cAAS,EAAE,UAAU,KAAK,EAAE,eAAe,gBAAgB,EAAE,cAAc;AAAA,QAC9G;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,WAAW,KAAK,MAAM;AAAA;AAAA,EAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,MAAM,GAAG,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,QAAQC,GACL,KAAK,CAAC,OAAO,UAAU,WAAW,MAAM,CAAC,EACzC,SAAS,2EAA2E;AAAA,QACvF,YAAYA,GAAE,OAAO,EAAE,SAAS,cAAc;AAAA,QAC9C,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,+CAA+C;AAAA,QACtF,mBAAmBA,GAChB,OAAO,EACP,SAAS,EACT,SAAS,mCAAmC;AAAA,QAC/C,sBAAsBA,GACnB,OAAO,EACP,SAAS,EACT,SAAS,uCAAuC;AAAA,QACnD,OAAOA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,wBAAwB;AAAA,QAC9D,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,8BAA8B;AAAA,MACvE;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAAM;AACJ,UAAI,WAAW,QAAQ;AACrB,cAAM,MAAM,MAAM,SAAc,eAAe,EAAE,WAAW,CAAC;AAC7D,YAAI,CAAC,KAAK;AACR,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,UAAU,eAAe,CAAC;AAAA,UAC7E;AAAA,QACF;AAEA,YAAI,UAAU,IAAI,MAAM,MAAM,GAAG;AAC/B,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MACE,WAAW,MAAM;AAAA;AAAA,KAChB,IAAI,MAAM,MAAM,EAAE,WAAW,IAC1B,YACA,IAAI,MAAM,MAAM,EACb;AAAA,kBACC,CAAC,MACC,OAAO,EAAE,kBAAkB,EAAE,OAAO,SAAS,EAAE,OAAO,MAAM,EAAE,gBAAgB,KAAK,EAAE,aAAa,KAAK,EAAE;AAAA,gBAC7G,EACC,KAAK,IAAI;AAAA,cACpB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,EAAE,MAAM,QAAiB,MAAM;AAAA;AAAA,EAAmB,YAAY,IAAI,KAAK,CAAC,GAAG;AAAA,UAC7E;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,OAAO;AACpB,YAAI,CAAC,UAAU,CAAC,mBAAmB;AACjC,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,YAAY,kBAAkB;AAAA,UAClC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,WAAW,iBAAiB,eAAe,MAAM,cAAc,UAAU;AAAA,YACjF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,UAAU;AACvB,YAAI,CAAC,UAAU,CAAC,mBAAmB;AACjC,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,YAAY,uBAAuB;AAAA,UACvC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,aAAa,iBAAiB,iBAAiB,MAAM,cAAc,UAAU;AAAA,YACrF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,WAAW;AACxB,YAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,sBAAsB;AAC1D,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,YAAY,sBAAsB;AAAA,UACtC;AAAA,UACA;AAAA,UACA,sBAAsB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,cAAc,iBAAiB,aAAa,oBAAoB,eAAe,MAAM;AAAA,YAC7F;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,MAAM,GAAG,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,aAAa;AAAA,QACX,QAAQC,GACL,KAAK,CAAC,UAAU,QAAQ,SAAS,CAAC,EAClC,SAAS,8DAA8D;AAAA,QAC1E,YAAYA,GAAE,OAAO,EAAE,SAAS,cAAc;AAAA,QAC9C,eAAeA,GACZ,OAAO,EACP,SAAS,EACT,SAAS,oCAAoC;AAAA,QAChD,QAAQA,GAAE,OAAO,EAAE,SAAS,EAAE,SAAS,mBAAmB;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,OAAO,EAAE,QAAQ,YAAY,eAAe,OAAO,MAAM;AACvD,UAAI,WAAW,UAAU;AACvB,cAAM,SAAS,MAAM,YAAiB,kBAAkB;AAAA,UACtD;AAAA,UACA,eAAe,iBAAiB;AAAA,UAChC;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE;AAAA;AAAA,iBACkB,OAAO,OAAO;AAAA,oBACX,OAAO,eAAe;AAAA,wBAClB,OAAO,cAAc,SAAS,IAAI,OAAO,cAAc,KAAK,IAAI,IAAI,QAAQ;AAAA;AAAA;AAAA,YAEzG;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,WAAW,UAAU,WAAW,WAAW;AAC7C,cAAM,UAAU,MAAM,SAAgB,uBAAuB;AAAA,UAC3D;AAAA,QACF,CAAC;AAED,YAAI,CAAC,WAAW,QAAQ,WAAW,GAAG;AACpC,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,4BAA4B,UAAU;AAAA,cAC9C;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,QAAQ,QAAQ;AAAA,UACpB,CAAC,MACC,QAAQ,EAAE,OAAO,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,mBAAmB,CAAC,YAAO,EAAE,iBAAiB,cAAc,cAAS,EAAE,MAAM,MAC1H,EAAE,cAAc,SAAS,IACtB;AAAA,mBAAsB,EAAE,cAAc,KAAK,IAAI,CAAC,KAChD;AAAA,QACR;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,oBAAoB,UAAU,OAAO,QAAQ,MAAM;AAAA;AAAA,EAAgB,MAAM,KAAK,IAAI,CAAC;AAAA,YAC3F;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,mBAAmB,MAAM,GAAG,CAAC;AAAA,MACxE;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAEF,aAAa;AAAA,QACX,YAAYC,GAAE,OAAO,EAAE,SAAS,yCAAyC;AAAA,QACzE,QAAQA,GACL,OAAO,EACP,SAAS,EACT,SAAS,4DAA4D;AAAA,QACxE,OAAOA,GACJ,OAAO,EACP,SAAS,EACT,SAAS,wDAAwD;AAAA,MACtE;AAAA,IACF;AAAA,IACA,OAAO,EAAE,YAAY,QAAQ,MAAM,MAAM;AACvC,YAAM,MAAM,MAAM,SAAc,eAAe,EAAE,WAAW,CAAC;AAC7D,UAAI,CAAC,KAAK;AACR,eAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,QAAQ,UAAU,eAAe,CAAC;AAAA,QAC7E;AAAA,MACF;AAEA,YAAM,aAAa,SACf,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,EAAE,GAAG,UAAU,OAAO,CAAC,IAC1D,OAAO,QAAQ,IAAI,KAA8B,EAC9C,OAAO,CAAC,CAAC,EAAE,IAAI,MAAM,KAAK,WAAW,CAAC,EACtC,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE;AAEvB,UAAI,WAAW,WAAW,GAAG;AAC3B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MAAM,SACF,SAAS,MAAM,+BACf;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,WAAW,IAAI,YAAY,CAAC;AAClC,YAAM,cAAwB,CAAC;AAE/B,iBAAW,OAAO,YAAY;AAC5B,cAAM,MAAM,SAAS,KAAK,CAAC,MAAW,EAAE,OAAO,GAAG;AAClD,cAAM,cAAc,SAAS,KAAK,SAAS;AAE3C,cAAM,UAAU,MAAM,SAAgB,oBAAoB;AAAA,UACxD,OAAO;AAAA,UACP,OAAO;AAAA,QACT,CAAC;AAED,YAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,gBAAM,QAAQ,QAAQ;AAAA,YACpB,CAAC,MACC,SAAS,EAAE,IAAI,SAAS,EAAE,OAAO,OAAO,EAAE,kBAAkB,SAAS,YAAO,EAAE,MAAM;AAAA,UACxF;AACA,sBAAY;AAAA,YACV,OAAO,KAAK,SAAS,GAAG;AAAA,EAAK,KAAK,eAAe,EAAE;AAAA;AAAA,EAAO,MAAM,KAAK,IAAI,CAAC;AAAA,UAC5E;AAAA,QACF,OAAO;AACL,sBAAY;AAAA,YACV,OAAO,KAAK,SAAS,GAAG;AAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MACE,iCAAiC,IAAI,IAAI;AAAA;AAAA,IACzC,YAAY,KAAK,MAAM,IACvB;AAAA;AAAA,wCAA6C,UAAU;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACxeA,SAAS,KAAAC,UAAS;;;ACoBX,IAAM,qBAAyC;AAAA,EACpD;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,gDAAgD,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,2BAA2B,wBAAwB,wBAAwB,sBAAsB,EAAE,GAAG,EAAE,KAAK,gBAAgB,OAAO,iBAAiB,MAAM,QAAQ,CAAC,EAAE;AAAA,MAC9a,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,qCAAqC,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,SAAS,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,UAAU,SAAS,CAAC,YAAY,eAAe,WAAW,YAAY,EAAE,CAAC,EAAE;AAAA,MACtZ,EAAE,MAAM,gBAAgB,MAAM,gBAAgB,aAAa,6CAA6C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,SAAS,GAAG,EAAE,KAAK,gBAAgB,OAAO,gBAAgB,MAAM,QAAQ,CAAC,EAAE;AAAA,MAClU,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,6CAA6C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,UAAU,SAAS,CAAC,SAAS,UAAU,OAAO,EAAE,CAAC,EAAE;AAAA,MAC9b,EAAE,MAAM,iBAAiB,MAAM,iBAAiB,aAAa,8CAA8C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,UAAU,SAAS,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ,EAAE,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,QAAQ,OAAO,iBAAiB,MAAM,UAAU,SAAS,CAAC,QAAQ,WAAW,UAAU,SAAS,EAAE,CAAC,EAAE;AAAA,MACxd,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,oDAAoD,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,aAAa,OAAO,cAAc,MAAM,SAAS,GAAG,EAAE,KAAK,gBAAgB,OAAO,gBAAgB,MAAM,SAAS,CAAC,EAAE;AAAA,MACzX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,iDAAiD,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,CAAC,EAAE;AAAA,IAC/Z;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,2CAA2C,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,MAC3P,EAAE,MAAM,UAAU,MAAM,UAAU,aAAa,6BAA6B,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,UAAU,OAAO,kBAAkB,MAAM,SAAS,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,UAAU,SAAS,CAAC,QAAQ,eAAe,YAAY,aAAa,WAAW,EAAE,CAAC,EAAE;AAAA,MAC3W,EAAE,MAAM,qBAAqB,MAAM,qBAAqB,aAAa,iCAAiC,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,cAAc,OAAO,eAAe,MAAM,SAAS,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,QAAQ,CAAC,EAAE;AAAA,MACnU,EAAE,MAAM,eAAe,MAAM,eAAe,aAAa,qCAAqC,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,UAAU,OAAO,WAAW,MAAM,SAAS,GAAG,EAAE,KAAK,WAAW,OAAO,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,MACnT,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,qCAAqC,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,aAAa,OAAO,cAAc,MAAM,SAAS,CAAC,EAAE;AAAA,MAC1S,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,oDAAoD,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,CAAC,EAAE;AAAA,IAC1T;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,iCAAiC,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,MACjP,EAAE,MAAM,WAAW,MAAM,WAAW,aAAa,4CAA4C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,SAAS,GAAG,EAAE,KAAK,WAAW,OAAO,mBAAmB,MAAM,SAAS,CAAC,EAAE;AAAA,MAC5T,EAAE,MAAM,gBAAgB,MAAM,gBAAgB,aAAa,4CAA4C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,kBAAkB,OAAO,mBAAmB,MAAM,SAAS,CAAC,EAAE;AAAA,MACrU,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,+CAA+C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,SAAS,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,SAAS,CAAC,EAAE;AAAA,MACjT,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,uCAAuC,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,CAAC,EAAE;AAAA,MACjP,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,2CAA2C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,CAAC,EAAE;AAAA,IACjT;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,8BAA8B,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,MAC9O,EAAE,MAAM,iBAAiB,MAAM,iBAAiB,aAAa,4BAA4B,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,UAAU,SAAS,CAAC,OAAO,QAAQ,OAAO,SAAS,QAAQ,EAAE,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,UAAU,SAAS,CAAC,QAAQ,WAAW,UAAU,OAAO,EAAE,CAAC,EAAE;AAAA,MAC3b,EAAE,MAAM,WAAW,MAAM,WAAW,aAAa,+BAA+B,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,UAAU,SAAS,CAAC,QAAQ,YAAY,WAAW,SAAS,EAAE,GAAG,EAAE,KAAK,WAAW,OAAO,WAAW,MAAM,SAAS,CAAC,EAAE;AAAA,MACxV,EAAE,MAAM,eAAe,MAAM,eAAe,aAAa,oCAAoC,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,SAAS,OAAO,SAAS,MAAM,SAAS,CAAC,EAAE;AAAA,MACxS,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,4CAA4C,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,WAAW,OAAO,WAAW,MAAM,SAAS,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE;AAAA,MAChY,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,sCAAsC,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,CAAC,EAAE;AAAA,IAClP;AAAA,EACF;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,aAAa;AAAA,MACX,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,yBAAyB,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,SAAS,CAAC,EAAE;AAAA,MACzO,EAAE,MAAM,aAAa,MAAM,aAAa,aAAa,4BAA4B,QAAQ,CAAC,EAAE,KAAK,aAAa,OAAO,aAAa,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,QAAQ,OAAO,QAAQ,MAAM,SAAS,GAAG,EAAE,KAAK,aAAa,OAAO,cAAc,MAAM,SAAS,CAAC,EAAE;AAAA,MACjS,EAAE,MAAM,YAAY,MAAM,YAAY,aAAa,mCAAmC,QAAQ,CAAC,EAAE,KAAK,eAAe,OAAO,eAAe,MAAM,UAAU,UAAU,MAAM,YAAY,KAAK,GAAG,EAAE,KAAK,YAAY,OAAO,YAAY,MAAM,UAAU,SAAS,CAAC,OAAO,UAAU,QAAQ,UAAU,EAAE,CAAC,EAAE;AAAA,IACzS;AAAA,EACF;AACF;AAEO,SAAS,UAAU,IAA0C;AAClE,SAAO,mBAAmB,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACnD;AAEO,SAAS,cAAiG;AAC/G,SAAO,mBAAmB,IAAI,CAAC,OAAO;AAAA,IACpC,IAAI,EAAE;AAAA,IACN,MAAM,EAAE;AAAA,IACR,aAAa,EAAE;AAAA,IACf,iBAAiB,EAAE,YAAY;AAAA,EACjC,EAAE;AACJ;;;ADrFO,SAAS,mBAAmBC,SAAmB;AACpD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MAOF,aAAa;AAAA,QACX,QAAQC,GACL,OAAO,EACP,SAAS,EACT;AAAA,UACC;AAAA,QAEF;AAAA,MACJ;AAAA,MACA,aAAa,EAAE,cAAc,MAAM;AAAA,IACrC;AAAA,IACA,OAAO,EAAE,OAAO,MAAM;AACpB,YAAM,SAAmB,CAAC;AAC1B,YAAM,iBAAiB,kBAAkB;AAEzC,UAAI,QAIO;AACX,UAAI;AACF,gBAAQ,MAAM,oBAAoB;AAAA,MACpC,SAAS,GAAQ;AACf,eAAO,KAAK,cAAc,EAAE,OAAO,EAAE;AAAA,MACvC;AAEA,UAAI,CAAC,OAAO;AACV,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,cACE,MAAM;AAAA,cACN,MACE,8CACC,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,IAAI;AAAA,YAClE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAU,MAAM,qBAAqB;AAE3C,UAAI,WAAW,CAAC,QAAQ;AACtB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,gBAAgB,KAAK,EAAE,CAAC,EAAE;AAAA,MAC9E;AAEA,UAAI,WAAW,QAAQ;AACrB,eAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,WAAW,OAAO,QAAQ,cAAc,EAAE,CAAC,EAAE;AAAA,MACvG;AAGA,aAAO,EAAE,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,MAAM,oBAAoB,OAAO,gBAAgB,MAAM,EAAE,CAAC,EAAE;AAAA,IAChH;AAAA,EACF;AACF;AAEA,eAAe,uBAAyC;AACtD,MAAI;AACF,UAAM,UAAU,MAAM,SAAgB,qBAAqB,CAAC,CAAC;AAC7D,UAAM,aAAa,WAAW,CAAC,GAAG,OAAO,CAAC,MAAW,CAAC,EAAE,QAAQ;AAChE,WAAO,UAAU,WAAW;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,OAAiE;AACxF,QAAM,UAAU,YAAY;AAC5B,QAAM,QAAQ;AAAA,IACZ,gBAAgB,MAAM,aAAa;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,KAAK,SAAS;AACvB,UAAM,KAAK,OAAO,EAAE,IAAI,SAAS,EAAE,EAAE,cAAS,EAAE,WAAW,KAAK,EAAE,eAAe,eAAe;AAAA,EAClG;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,WACb,OACA,UACA,gBACiB;AACjB,QAAM,SAAS,UAAU,QAAQ;AACjC,MAAI,CAAC,QAAQ;AACX,WACE,WAAW,QAAQ;AAAA;AAAA,qBACG,YAAY,EAAE,IAAI,CAAC,MAAM,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,EAE5E;AAEA,QAAM,SAAmB,CAAC;AAC1B,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,OAAO,aAAa;AACpC,QAAI;AACF,YAAM,QAAQ,0BAA0B;AAAA,QACtC,MAAM,IAAI;AAAA,QACV,MAAM,IAAI;AAAA,QACV,aAAa,IAAI;AAAA,QACjB,MAAM,IAAI;AAAA,QACV,QAAQ,IAAI;AAAA,QACZ,WAAW;AAAA,QACX,WAAW,YAAY;AAAA,MACzB,CAAC;AACD,aAAO,KAAK,IAAI,IAAI;AAAA,IACtB,QAAQ;AACN,cAAQ,KAAK,GAAG,IAAI,IAAI,mBAAmB;AAAA,IAC7C;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,QAAQ,sBAAsB,EAAE,WAAW,eAAe,CAAC;AACjE,yBAAmB,IAAI;AAAA,IACzB,QAAQ;AAAA,IAAqB;AAAA,EAC/B;AAEA,QAAM,QAAQ;AAAA,IACZ,KAAK,MAAM,aAAa;AAAA,IACxB;AAAA,IACA,YAAY,OAAO,IAAI,kBAAkB,OAAO,MAAM,cAAc,OAAO,WAAW,IAAI,KAAK,GAAG;AAAA,IAClG;AAAA,EACF;AAEA,aAAW,QAAQ,QAAQ;AACzB,UAAM,KAAK,KAAK,IAAI,EAAE;AAAA,EACxB;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,IAAI,0BAA0B;AACzC,eAAW,QAAQ,SAAS;AAC1B,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,OAAO,OAAO,YAAY,MAAM,GAAG,CAAC,GAAG;AAChD,UAAM;AAAA,MACJ,2BAA2B,IAAI,IAAI,kDAA6C,IAAI,IAAI;AAAA,IAC1F;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAe,oBACb,OACA,gBACA,QACiB;AACjB,MAAI,gBAAuB,CAAC;AAC5B,MAAI;AACF,oBAAgB,MAAM,SAAgB,wBAAwB,EAAE,OAAO,EAAE,CAAC;AAAA,EAC5E,QAAQ;AAAA,EAAqB;AAE7B,MAAI,oBAA2B,CAAC;AAChC,MAAI;AACF,UAAM,CAAC,aAAa,aAAa,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,MACpE,SAAgB,qBAAqB,EAAE,gBAAgB,eAAe,CAAC;AAAA,MACvE,SAAgB,qBAAqB,EAAE,gBAAgB,iBAAiB,CAAC;AAAA,MACzE,SAAgB,qBAAqB,EAAE,gBAAgB,YAAY,CAAC;AAAA,IACtE,CAAC;AACD,UAAM,YAAY;AAAA,MAChB,IAAI,eAAe,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,YAAY,EAAE,WAAW,SAAS;AAAA,MACzF,IAAI,eAAe,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,YAAY,EAAE,WAAW,QAAQ;AAAA,MACxF,IAAI,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,aAAa,EAAE,WAAW,QAAQ;AAAA,IAC/F;AACA,wBAAoB,UACjB,KAAK,CAAC,GAAQ,OAAY,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE,EAChE,MAAM,GAAG,CAAC;AAAA,EACf,QAAQ;AAAA,EAAqB;AAE7B,MAAI,eAAsB,CAAC;AAC3B,MAAI;AACF,UAAM,WAAW,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,WAAW,CAAC;AAC1F,oBAAgB,YAAY,CAAC,GAAG,OAAO,CAAC,MAAW,EAAE,WAAW,OAAO;AAAA,EACzE,QAAQ;AAAA,EAAqB;AAE7B,MAAI,YAAiB;AACrB,MAAI;AACF,gBAAY,MAAM,SAAc,0BAA0B;AAAA,EAC5D,SAAS,GAAQ;AACf,WAAO,KAAK,cAAc,EAAE,OAAO,EAAE;AAAA,EACvC;AAEA,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK,KAAK,MAAM,aAAa,EAAE;AACrC,QAAM,KAAK,gBAAgB,MAAM,aAAa,sCAAiC;AAC/E,QAAM,KAAK,EAAE;AAEb,MAAI,WAAW;AACb,UAAM,WACJ,SAAI,OAAO,KAAK,MAAM,UAAU,QAAQ,EAAE,CAAC,IAC3C,SAAI,OAAO,KAAK,KAAK,MAAM,UAAU,QAAQ,EAAE,CAAC;AAClD,UAAM,KAAK,iBAAiB,UAAU,KAAK,GAAG;AAC9C,UAAM,KAAK,GAAG,QAAQ,IAAI,UAAU,YAAY,IAAI,UAAU,WAAW,eAAe;AACxF,UAAM,KAAK,EAAE;AACb,QAAI,UAAU,MAAM,SAAS,GAAG;AAC9B,YAAM,KAAK,UAAU;AACrB,iBAAW,OAAO,UAAU,MAAM;AAChC,cAAM,KAAK,WAAW,IAAI,KAAK,OAAO,IAAI,OAAO,IAAI,IAAI,QAAQ,aAAQ,IAAI,QAAQ,GAAG;AAAA,MAC1F;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,KAAK,qBAAqB,aAAa,MAAM,GAAG;AACtD,eAAW,KAAK,cAAc;AAC5B,YAAM,KAAK,EAAE,WAAW;AACxB,YAAM,OAAO,EAAE,MAAM,YAAY;AACjC,YAAM,KAAK,OAAO,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,EAAE,EAAE;AAAA,IACjE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,KAAK,iCAAiC,cAAc,MAAM,GAAG;AACnE,eAAW,KAAK,eAAe;AAC7B,YAAM,OAAO,IAAI,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE,CAAC;AAC7D,YAAM,UAAU,MAAM,QAAQ,EAAE,cAAc,IAAI,EAAE,eAAe,SAAS,EAAE,kBAAkB;AAChG,YAAM,WAAW,MAAM,QAAQ,EAAE,eAAe,IAAI,EAAE,gBAAgB,SAAS,EAAE,mBAAmB;AACpG,YAAM,QAAQ,GAAG,OAAO,aAAa,QAAQ,cAAc,EAAE,oBAAoB,CAAC;AAClF,YAAM,KAAK,OAAO,IAAI,OAAO,EAAE,MAAM,QAAQ,EAAE,eAAe,SAAS,YAAO,KAAK,EAAE;AAAA,IACvF;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,kBAAkB,SAAS,GAAG;AAChC,UAAM,KAAK,0BAA0B,kBAAkB,MAAM,GAAG;AAChE,UAAM,KAAK,2EAA2E;AACtF,UAAM,KAAK,EAAE;AACb,eAAW,KAAK,mBAAmB;AACjC,YAAM,KAAK,EAAE,WAAW;AACxB,YAAM,MAAM,EAAE,kBAAkB;AAChC,YAAM,OAAO,EAAE,MAAM,eAAe,EAAE,MAAM,aAAa;AACzD,YAAM,YAAY,KAAK,SAAS,MAAM,KAAK,MAAM,GAAG,GAAG,IAAI,QAAQ;AACnE,YAAM,KAAK,OAAO,EAAE,QAAQ,EAAE,IAAI,OAAO,GAAG,YAAO,SAAS,EAAE;AAAA,IAChE;AACA,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK,WAAW;AACtB,eAAW,OAAO,OAAQ,OAAM,KAAK,KAAK,GAAG,EAAE;AAC/C,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,MAAI,gBAAgB;AAClB,QAAI;AACF,YAAM,QAAQ,sBAAsB,EAAE,WAAW,eAAe,CAAC;AACjE,yBAAmB,IAAI;AAEvB,YAAM,gBAAgB,YAAY,GAAG,UAAU,KAAK,iBAAiB;AACrE,YAAM,cACJ,aAAa,SAAS,IAClB,GAAG,aAAa,MAAM,oBACtB;AAEN,YAAM,KAAK,KAAK;AAChB,YAAM;AAAA,QACJ,iCAAiC,cAAc,gCAAgC,aAAa,IAAI,WAAW;AAAA,MAC7G;AAAA,IACF,QAAQ;AACN,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,+EAA+E;AAAA,IAC5F;AAAA,EACF,OAAO;AACL,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,2EAA2E;AAAA,EACxF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AEnVA,SAAoB,wBAAwB;AAG5C,SAAS,oBAAoB,OAAoB;AAC/C,QAAM,KAAK,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO;AAClD,QAAM,QAAQ,CAAC,MAAM,EAAE,GAAG,MAAM,IAAI,KAAK,MAAM,MAAM,GAAG;AACxD,MAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,UAAU;AAChD,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AACnD,UAAI,OAAO,QAAQ,WAAW;AAC5B,cAAM,KAAK,KAAK,GAAG,OAAO,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG,CAAC,EAAE;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,yBACP,aACA,gBACA,WACA,eACQ;AACR,QAAM,WAAqB,CAAC,oCAA+B;AAG3D,WAAS;AAAA,IACP;AAAA,EAWF;AAGA,WAAS;AAAA,IACP;AAAA,EAUF;AAGA,MAAI,aAAa;AACf,UAAM,WAAW,YACd,IAAI,CAAC,MAAM;AACV,YAAM,SAAS,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM;AACvC,aAAO,KAAK,MAAM,KAAK,EAAE,IAAI,SAAS,EAAE,IAAI,cAAS,EAAE,eAAe,gBAAgB;AAAA,IACxF,CAAC,EACA,KAAK,IAAI;AACZ,aAAS;AAAA,MACP,kBAAkB,YAAY,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,IAIpC,WAAW;AAAA,IAEb;AAAA,EACF,OAAO;AACL,aAAS;AAAA,MACP;AAAA,IAEF;AAAA,EACF;AAGA,QAAM,aAAa,gBAAgB,GAAG,cAAc,MAAM,aAAa;AACvE,WAAS;AAAA,IACP;AAAA,kCACmC,UAAU;AAAA;AAAA;AAAA;AAAA,EAI/C;AAGA,QAAM,cAAc,iBAAiB,GAAG,eAAe,MAAM,YAAY;AACzE,QAAM,iBAAiB,YACnB,wGACA;AACJ,WAAS;AAAA,IACP;AAAA,iDACkD,WAAW;AAAA,EAC1D,cAAc;AAAA;AAAA;AAAA,EAGnB;AAGA,WAAS;AAAA,IACP;AAAA,EAiBF;AAGA,WAAS;AAAA,IACP;AAAA,EAmBF;AAGA,WAAS;AAAA,IACP;AAAA,EAkBF;AAEA,SAAO,SAAS,KAAK,aAAa;AACpC;AAEO,SAAS,kBAAkBC,SAAmB;AAEnD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,CAAC,mBAAmB,cAAc,iBAAiB,WAAW,IAAI,MAAM,QAAQ,WAAW;AAAA,QAC/F,SAAgB,uBAAuB;AAAA,QACvC,SAAgB,qBAAqB,EAAE,gBAAgB,kBAAkB,CAAC;AAAA,QAC1E,SAAgB,qBAAqB,EAAE,gBAAgB,YAAY,CAAC;AAAA,QACpE,SAAgB,qBAAqB,EAAE,gBAAgB,iBAAiB,CAAC;AAAA,MAC3E,CAAC;AAED,YAAM,cAAc,kBAAkB,WAAW,cAAc,kBAAkB,QAAQ;AACzF,YAAM,iBAAiB,aAAa,WAAW,cAAc,aAAa,QAAQ;AAClF,YAAM,YAAY,gBAAgB,WAAW,cAAc,gBAAgB,QAAQ;AACnF,YAAM,gBAAgB,YAAY,WAAW,cAAc,YAAY,QAAQ;AAE/E,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,KAAK,IAAI;AAAA,UACT,MAAM,yBAAyB,aAAa,gBAAgB,WAAW,aAAa;AAAA,UACpF,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,CAAC,gBAAgB,eAAe,IAAI,MAAM,QAAQ,WAAW;AAAA,QACjE,SAAgB,qBAAqB,EAAE,gBAAgB,WAAW,CAAC;AAAA,QACnE,SAAgB,qBAAqB,EAAE,gBAAgB,YAAY,CAAC;AAAA,MACtE,CAAC;AAED,YAAM,QAAkB,CAAC,oCAA+B;AAExD,UAAI,eAAe,WAAW,aAAa;AACzC,YAAI,eAAe,MAAM,SAAS,GAAG;AACnC,gBAAM,QAAQ,eAAe,MAC1B,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,QAAG,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,MAAM,eAAe,EAAE,EAAE,EACnH,KAAK,IAAI;AACZ,gBAAM,KAAK,gBAAgB,eAAe,MAAM,MAAM;AAAA;AAAA,EAAc,KAAK,EAAE;AAAA,QAC7E,OAAO;AACL,gBAAM,KAAK,8FAA8F;AAAA,QAC3G;AAAA,MACF,OAAO;AACL,cAAM,KAAK,0GAAqG;AAAA,MAClH;AAEA,UAAI,gBAAgB,WAAW,aAAa;AAC1C,YAAI,gBAAgB,MAAM,SAAS,GAAG;AACpC,gBAAM,OAAO,gBAAgB,MAC1B,IAAI,CAAC,MAAM,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,QAAG,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,eAAe,EAAE,EAAE,EAC9F,KAAK,IAAI;AACZ,gBAAM,KAAK,iBAAiB,gBAAgB,MAAM,MAAM;AAAA;AAAA,EAAgB,IAAI,EAAE;AAAA,QAChF,OAAO;AACL,gBAAM,KAAK,+FAA+F;AAAA,QAC5G;AAAA,MACF,OAAO;AACL,cAAM,KAAK,6GAAwG;AAAA,MACrH;AAEA,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,MAAM,KAAK,aAAa,GAAG,UAAU,gBAAgB,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,cAAc,MAAM,SAAgB,uBAAuB;AAEjE,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,qCAAqC,UAAU,gBAAgB,CAAC,EAAE;AAAA,MAC/G;AAEA,YAAM,YAAY,YACf,IAAI,CAAC,MAAM;AACV,cAAM,YAAY,EAAE,OACjB,IAAI,CAAC,MAAW,SAAS,EAAE,GAAG,OAAO,EAAE,IAAI,GAAG,EAAE,WAAW,eAAe,EAAE,GAAG,EAAE,aAAa,iBAAiB,EAAE,GAAG,EACpH,KAAK,IAAI;AACZ,eAAO,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,IAAI;AAAA,EAAQ,EAAE,eAAe,EAAE;AAAA;AAAA;AAAA,EAAoB,SAAS;AAAA,MAC1G,CAAC,EACA,KAAK,aAAa;AAErB,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,4BAA4B,YAAY,MAAM;AAAA;AAAA,EAAQ,SAAS,IAAI,UAAU,gBAAgB,CAAC;AAAA,MAClI;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA,IAAI,iBAAiB,iCAAiC;AAAA,MACpD,MAAM,YAAY;AAChB,cAAM,cAAc,MAAM,SAAgB,uBAAuB;AACjE,eAAO;AAAA,UACL,WAAW,YAAY,IAAI,CAAC,OAAO;AAAA,YACjC,KAAK,kBAAkB,EAAE,IAAI;AAAA,YAC7B,MAAM,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK;AAAA,UACzC,EAAE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD,OAAO,KAAK,EAAE,KAAK,MAAM;AACvB,YAAM,UAAU,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,KAAe,CAAC;AAC7F,YAAM,YAAY,QAAQ,IAAI,mBAAmB,EAAE,KAAK,aAAa;AAErE,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,UACT,KAAK,IAAI;AAAA,UACT,MAAM,aAAa;AAAA,UACnB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,QAAQ;AACb,YAAM,SAAS,MAAM,SAAgB,kBAAkB;AAEvD,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,EAAE,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,gCAAgC,UAAU,gBAAgB,CAAC,EAAE;AAAA,MAC1G;AAEA,YAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,OAAO;AAC7C,YAAM,YAAY,OAAO,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ;AAChE,YAAM,WAAW,CAAC,aAAqB,OAAO,OAAO,CAAC,MAAM,EAAE,aAAa,QAAQ;AAEnF,YAAM,QAAkB,CAAC;AACzB,iBAAW,SAAS,QAAQ;AAC1B,cAAM,KAAK,MAAM,MAAM,IAAI,EAAE;AAC7B,mBAAW,SAAS,SAAS,MAAM,GAAG,GAAG;AACvC,gBAAM,KAAK,OAAO,MAAM,IAAI,MAAM,MAAM,IAAI,GAAG,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM,EAAE,EAAE;AAAA,QACzF;AAAA,MACF;AACA,UAAI,UAAU,SAAS,GAAG;AACxB,cAAM,KAAK,cAAc;AACzB,mBAAW,KAAK,WAAW;AACzB,gBAAM,KAAK,OAAO,EAAE,IAAI,MAAM,EAAE,IAAI,GAAG,EAAE,QAAQ,KAAK,EAAE,KAAK,MAAM,EAAE,EAAE;AAAA,QACzE;AAAA,MACF;AAEA,aAAO;AAAA,QACL,UAAU,CAAC,EAAE,KAAK,IAAI,MAAM,MAAM,uBAAuB,OAAO,MAAM;AAAA;AAAA,EAAQ,MAAM,KAAK,IAAI,CAAC,IAAI,UAAU,gBAAgB,CAAC;AAAA,MAC/H;AAAA,IACF;AAAA,EACF;AACF;;;ACpUA,SAAS,KAAAC,WAAS;AAIX,SAAS,gBAAgBC,SAAmB;AACjD,EAAAA,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,QAAQC,IAAE,OAAO,EAAE,SAAS,iFAAiF,EAAE;AAAA,IACjH,OAAO,EAAE,OAAO,MAAM;AACpB,YAAM,UAAU,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,iBAAiB,CAAC;AAC/F,YAAM,QAAQ,QAAQ,OAAO,CAAC,MAAM,EAAE,MAAM,WAAW,MAAM;AAE7D,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO;AAAA,UACL,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MAAM,uCAAuC,MAAM;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAY,MACf;AAAA,QACC,CAAC,MACC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI;AAAA,UACtB,EAAE,MAAM,gBAAgB,EAAE,MAAM,YAAY,SAAS;AAAA,eAChD,EAAE,MAAM,eAAe,EAAE;AAAA,eACzB,EAAE,MAAM,cAAc,EAAE;AAAA,cACzB,EAAE,MAAM,aAAa,CAAC,GAAG,KAAK,IAAI,CAAC;AAAA,KACjD,EAAE,MAAM,eAAe,aAAa,EAAE,KAAK,aAAa,IAAI,WAAM,EAAE,KAAK,aAAa,MAAM;AAAA,IAAO;AAAA,MACxG,EACC,KAAK,WAAW;AAEnB,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE,mFAAmF,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKnE,SAAS;AAAA;AAAA;AAAA,YAEnC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,OAAOC,IAAE,OAAO,EAAE,SAAS,8FAA8F,EAAE;AAAA,IAC7H,OAAO,EAAE,MAAM,MAAM;AACnB,YAAM,QAAQ,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,WAAW,CAAC;AAEvF,YAAM,kBAAkB,MACrB;AAAA,QACC,CAAC,MACC,GAAG,EAAE,IAAI,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,aAAa,EAAE,MACvE,EAAE,MAAM,cAAc,SAAS,IAAI,gCAA2B,EAAE,KAAK,aAAa,KAAK,IAAI,CAAC,KAAK,OACjG,EAAE,MAAM,aAAa,SAAS,IAC3B;AAAA,mBAAsB,EAAE,KAAK,YAAY,IAAI,CAAC,MAAW,GAAG,EAAE,QAAQ,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,KAC/F;AAAA,MACR,EACC,KAAK,IAAI;AAEZ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,kBACmB,KAAK;AAAA;AAAA;AAAA,EACQ,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOnD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,EAAE,SAASC,IAAE,OAAO,EAAE,SAAS,yGAAyG,EAAE;AAAA,IAC1I,OAAO,EAAE,QAAQ,MAAM;AACrB,YAAM,kBAAkB,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,YAAY,CAAC;AAClG,YAAM,SAAS,CAAC,GAAG,eAAe,EAC/B,KAAK,CAAC,GAAG,OAAQ,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,EAAG,EACrE,MAAM,GAAG,CAAC;AAEb,YAAM,gBAAgB,OAAO,SAAS,IAClC,OAAO,IAAI,CAAC,MAAM,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,GAAG,EAAE,KAAK,IAAI,IACvF;AAEJ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,GACI,OAAO;AAAA;AAAA;AAAA,EACyB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAUrD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,MACE,aAAaC,IAAE,OAAO,EAAE,SAAS,2FAA2F;AAAA,MAC5H,QAAQA,IAAE,OAAO,EAAE,SAAS,yEAAyE;AAAA,IACvG;AAAA,IACA,OAAO,EAAE,aAAa,OAAO,MAAM;AACjC,YAAM,WAAW,MAAM,SAAgB,qBAAqB,EAAE,gBAAgB,iBAAiB,CAAC;AAChG,YAAM,gBAAgB,SAAS,OAAO,CAAC,MAAM,EAAE,MAAM,WAAW,MAAM;AAEtE,YAAM,kBACJ,cAAc,SAAS,IACnB,cAAc,IAAI,CAAC,MAAM,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,YAAO,EAAE,MAAM,eAAe,EAAE,EAAE,EAAE,KAAK,IAAI,IAChH;AAEN,YAAM,iBAAiB,SACpB,IAAI,CAAC,MAAM,UAAU,EAAE,WAAW,IAAI,QAAQ,YAAY,EAAE,GAAG,EAAE,CAAC,EAClE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EACvB,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK;AAC/B,YAAM,aAAa,OAAO,OAAO,iBAAiB,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAErE,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE;AAAA;AAAA,GACI,WAAW;AAAA;AAAA,UACJ,MAAM;AAAA,qBACK,UAAU;AAAA;AAAA;AAAA,EACG,eAAe;AAAA;AAAA;AAAA,kBAE/B,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAUjC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAAD,QAAO;AAAA,IACL;AAAA,IACA;AAAA,IAGA;AAAA,MACE,UAAUC,IAAE,OAAO,EAAE;AAAA,QACnB,oCACA,cAAc,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,KAAK,IAAI;AAAA,MAC/D;AAAA,MACA,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,OAAO,EAAE,UAAU,YAAY,QAAQ,MAAM;AAC3C,YAAM,KAAK,YAAY,UAAU;AAEjC,UAAI,CAAC,IAAI;AACP,cAAM,YAAY,cAAc,EAC7B,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,WAAM,EAAE,gBAAgB,EAAE,EAC7D,KAAK,IAAI;AACZ,eAAO;AAAA,UACL,UAAU;AAAA,YACR;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,MACE,aAAa,UAAU;AAAA;AAAA;AAAA,EACE,SAAS;AAAA;AAAA;AAAA,cAEtC;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,UAAI,YAAY;AAChB,UAAI;AACF,cAAM,kBAAkB,MAAM,SAAgB,qBAAqB;AAAA,UACjE,gBAAgB,GAAG;AAAA,QACrB,CAAC;AACD,cAAM,SAAS,CAAC,GAAG,eAAe,EAC/B,KAAK,CAAC,GAAG,OAAQ,EAAE,MAAM,QAAQ,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI,EAAG,EACrE,MAAM,GAAG,CAAC;AACb,YAAI,OAAO,SAAS,GAAG;AACrB,sBACE;AAAA,YAAe,GAAG,kBAAkB;AAAA,IACpC,OAAO,IAAI,CAAC,MAAM,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,QAChF;AAAA,MACF,QAAQ;AACN,oBAAY;AAAA,MACd;AAEA,YAAM,aAAa,GAAG,OACnB;AAAA,QAAI,CAAC,MACJ,aAAa,EAAE,GAAG,KAAK,EAAE,KAAK;AAAA,YACjB,EAAE,IAAI,qBAAqB,EAAE,mBAAmB,OAAO;AAAA,mBAChD,EAAE,WAAW;AAAA,4BACJ,EAAE,mBAAmB;AAAA,KACjD,EAAE,YACC,EAAE,UAAU;AAAA,UAAI,CAAC,MACf,iBAAiB,EAAE,MAAM;AAAA,KACxB,EAAE,UACC,EAAE,QAAQ,IAAI,CAAC,MAAM,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,IACzD;AAAA,QACN,EAAE,KAAK,IAAI,IACX,MACJ;AAAA,2BAA8B,EAAE,aAAa,KAAK,OAAO,EAAE,aAAa,MAAM;AAAA,MAChF,EACC,KAAK,aAAa;AAErB,YAAM,cAAc,UAChB;AAAA,0CAA6C,OAAO;AAAA;AAAA,IACpD;AAEJ,aAAO;AAAA,QACL,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,YACN,SAAS;AAAA,cACP,MAAM;AAAA,cACN,MACE,KAAK,GAAG,IAAI,IAAI,GAAG,IAAI;AAAA;AAAA,EACpB,GAAG,gBAAgB;AAAA,IACtB,cACA;AAAA;AAAA;AAAA;AAAA;AAAA,EACkC,GAAG,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAExC,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAEF,GAAG,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+CAGQ,GAAG,kBAAkB;AAAA,iBACnD,GAAG,iBAAiB,YAAY;AAAA,qBAC5B,GAAG,iBAAiB,gBAAgB;AAAA,IAC1D,YACA;AAAA;AAAA;AAAA;AAAA;AAAA,YAEJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AdnRA,IAAI,CAAC,QAAQ,IAAI,mBAAmB,CAAC,QAAQ,IAAI,sBAAsB;AACrE,MAAI;AACF,UAAM,UAAUC,SAAQ,QAAQ,IAAI,GAAG,UAAU;AACjD,eAAW,QAAQC,cAAa,SAAS,OAAO,EAAE,MAAM,IAAI,GAAG;AAC7D,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AACzC,YAAM,QAAQ,QAAQ,QAAQ,GAAG;AACjC,UAAI,UAAU,GAAI;AAClB,cAAQ,IAAI,QAAQ,MAAM,GAAG,KAAK,CAAC,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,IAClE;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,UAAU;AAEV,IAAM,iBAAiB;AAEvB,cAAc;AAEd,IAAM,SAAS,IAAIC;AAAA,EACjB;AAAA,IACE,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA;AAAA,IACE,cAAc,EAAE,SAAS,CAAC,EAAE;AAAA,IAC5B,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,IAAM,iBAAiB,IAAI;AAAA,GACxB,QAAQ,IAAI,cAAc,sBACxB,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC;AACjD;AAGA,qBAAqB,MAAM;AAC3B,uBAAuB,MAAM;AAC7B,mBAAmB,MAAM;AACzB,oBAAoB,MAAM;AAC1B,oBAAoB,MAAM;AAC1B,0BAA0B,MAAM;AAChC,sBAAsB,MAAM;AAG5B,IAAI,eAAe,IAAI,UAAU,EAAG,uBAAsB,MAAM;AAChE,IAAI,eAAe,IAAI,UAAU,EAAG,kBAAiB,MAAM;AAC3D,IAAI,eAAe,IAAI,MAAM,EAAG,2BAA0B,MAAM;AAChE,mBAAmB,MAAM;AAGzB,kBAAkB,MAAM;AACxB,gBAAgB,MAAM;AAEtB,IAAM,YAAY,IAAI,qBAAqB;AAC3C,MAAM,OAAO,QAAQ,SAAS;AAI9B,eAAe,EACZ,KAAK,OAAO,SAAS;AACpB,sBAAoB,MAAM,cAAc;AACxC,MAAI;AACF,UAAM,kBAAkB;AACxB,YAAQ,OAAO,MAAM,8CAA8C;AAAA,EACrE,SAAS,KAAU;AACjB,YAAQ,OAAO,MAAM,oCAAoC,IAAI,OAAO;AAAA,CAAgC;AAEpG,UAAM,oBAAoB;AAAA,EAC5B;AACF,CAAC,EACA,MAAM,MAAM;AACX,UAAQ,OAAO,MAAM,6EAAwE;AAC/F,CAAC;AAEH,eAAe,mBAAmB;AAChC,MAAI,kBAAkB,GAAG;AACvB,UAAM,mBAAmB;AAAA,EAC3B;AACA,QAAM,kBAAkB;AACxB,UAAQ,KAAK,CAAC;AAChB;AAEA,QAAQ,GAAG,UAAU,gBAAgB;AACrC,QAAQ,GAAG,WAAW,gBAAgB;AAEtC,QAAQ,MAAM,GAAG,OAAO,YAAY;AAClC,MAAI,kBAAkB,GAAG;AACvB,UAAM,mBAAmB;AAAA,EAC3B;AACA,QAAM,kBAAkB;AACxB,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":["readFileSync","resolve","McpServer","server","result","byCollection","lines","z","server","z","z","server","z","z","server","z","existsSync","readFileSync","resolve","z","server","z","resolveProjectRoot","resolve","existsSync","readFileSync","abs","z","server","z","server","z","server","z","z","server","z","z","server","z","server","z","server","z","resolve","readFileSync","McpServer"]}