@jun133/athlete 0.0.2

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.
Files changed (61) hide show
  1. package/README.md +146 -0
  2. package/dist/cli.js +22731 -0
  3. package/dist/cli.js.map +1 -0
  4. package/package.json +72 -0
  5. package/scripts/postinstall-playwright.mjs +79 -0
  6. package/spec/README.md +56 -0
  7. package/spec/adr/ADR-0001-/345/215/225/346/250/241/345/274/217/345/205/250/346/235/203/351/231/220.md +16 -0
  8. package/spec/adr/ADR-0002-/345/215/225agent/350/265/267/346/255/245/345/271/266/351/242/204/347/225/231/345/244/232agent/350/276/271/347/225/214.md +19 -0
  9. package/spec/adr/ADR-0003-openai-compatible/344/274/230/345/205/210.md +16 -0
  10. package/spec/architecture//346/200/273/344/275/223/346/236/266/346/236/204.md +111 -0
  11. package/spec/architecture//347/212/266/346/200/201/344/270/216/347/234/237/347/233/270/346/272/220.md +117 -0
  12. package/spec/architecture//350/277/220/350/241/214/346/227/266/345/276/252/347/216/257.md +82 -0
  13. package/spec/implementation/README.md +17 -0
  14. package/spec/implementation//346/250/241/345/235/227/347/272/247/345/274/200/345/217/221/344/273/273/345/212/241/345/215/225.md +55 -0
  15. package/spec/implementation//347/233/256/345/275/225/347/273/223/346/236/204/345/210/260/344/273/243/347/240/201/346/226/207/344/273/266/346/230/240/345/260/204/350/241/250.md +101 -0
  16. package/spec/interfaces/InteractionShell.md +85 -0
  17. package/spec/interfaces/ProviderAdapter.md +23 -0
  18. package/spec/interfaces/README.md +17 -0
  19. package/spec/interfaces/RuntimeLoop.md +28 -0
  20. package/spec/interfaces/SessionStore.md +22 -0
  21. package/spec/interfaces/ToolRegistry.md +21 -0
  22. package/spec/modules/config-system.md +51 -0
  23. package/spec/modules/interactive-terminal.md +112 -0
  24. package/spec/modules/lightweight-context-runtime.md +63 -0
  25. package/spec/modules/provider-adapter.md +20 -0
  26. package/spec/modules/runtime-metrics.md +132 -0
  27. package/spec/modules/runtime-rules.md +33 -0
  28. package/spec/modules/session-resume-compact.md +49 -0
  29. package/spec/modules/task-state.md +34 -0
  30. package/spec/modules/telegram-private-chat.md +290 -0
  31. package/spec/modules/tool-registry.md +79 -0
  32. package/spec/modules/weixin-private-chat.md +291 -0
  33. package/spec/modules/workspace-isolation.md +24 -0
  34. package/spec/modules//346/211/251/345/261/225/346/234/272/345/210/266.md +105 -0
  35. package/spec/overview/v0/350/214/203/345/233/264.md +54 -0
  36. package/spec/overview//344/272/247/345/223/201/345/256/232/344/271/211.md +59 -0
  37. package/spec/principles/P01-/344/270/200/344/270/252/345/276/252/347/216/257/344/270/200/344/270/252/346/231/272/350/203/275/344/275/223.md +31 -0
  38. package/spec/principles/P02-/345/212/240/344/270/200/344/270/252/345/267/245/345/205/267/345/217/252/345/212/240/344/270/200/344/270/252/345/244/204/347/220/206/345/231/250.md +28 -0
  39. package/spec/principles/P03-/345/205/210/350/256/241/345/210/222/345/206/215/345/212/250/346/211/213.md +25 -0
  40. package/spec/principles/P04-/345/244/247/344/273/273/345/212/241/346/213/206/347/273/231/345/255/220/346/231/272/350/203/275/344/275/223.md +26 -0
  41. package/spec/principles/P05-/347/237/245/350/257/206/346/214/211/351/234/200/345/212/240/350/275/275.md +29 -0
  42. package/spec/principles/P06-/344/270/212/344/270/213/346/226/207/350/246/201/350/203/275/345/216/213/347/274/251.md +23 -0
  43. package/spec/principles/P07-/344/273/273/345/212/241/345/233/276/350/246/201/350/220/275/347/233/230.md +20 -0
  44. package/spec/principles/P08-/346/205/242/346/223/215/344/275/234/346/224/276/345/220/216/345/217/260.md +23 -0
  45. package/spec/principles/P09-/344/273/273/345/212/241/345/244/252/345/244/247/345/260/261/345/210/206/347/273/231/351/230/237/345/217/213.md +21 -0
  46. package/spec/principles/P10-/351/230/237/345/217/213/344/271/213/351/227/264/350/246/201/346/234/211/347/273/237/344/270/200/345/215/217/350/256/256.md +23 -0
  47. package/spec/principles/P11-/351/230/237/345/217/213/350/207/252/345/267/261/350/256/244/351/242/206/344/273/273/345/212/241.md +25 -0
  48. package/spec/principles/P12-/345/267/245/344/275/234/345/214/272/345/222/214/344/273/273/345/212/241/350/246/201/351/232/224/347/246/273.md +20 -0
  49. package/spec/principles/P13-session/346/230/257/344/273/273/345/212/241/347/216/260/345/234/272.md +30 -0
  50. package/spec/principles/P14-/346/211/247/350/241/214/347/272/246/346/235/237/344/270/215/346/230/257/345/256/211/345/205/250/347/255/226/347/225/245.md +27 -0
  51. package/spec/principles/P15-provider/345/277/205/351/241/273/345/217/257/346/233/277/346/215/242.md +22 -0
  52. package/spec/principles/P16-/351/205/215/347/275/256/345/217/252/350/203/275/346/234/211/344/270/200/344/270/252/345/205/245/345/217/243.md +22 -0
  53. package/spec/principles/P17-/346/211/251/345/261/225/351/235/240/344/272/213/344/273/266/347/224/237/351/225/277.md +32 -0
  54. package/spec/principles/P18-/344/270/273/345/276/252/347/216/257/345/222/214/346/226/207/344/273/266/351/203/275/344/270/215/350/203/275/351/225/277/350/203/226.md +36 -0
  55. package/spec/principles/P19-/345/205/210/345/206/231/345/244/261/350/264/245/346/265/213/350/257/225/345/206/215/345/206/231/345/256/236/347/216/260.md +29 -0
  56. package/spec/principles/README.md +39 -0
  57. package/spec/repo//345/274/200/345/217/221/350/247/204/345/210/231.md +39 -0
  58. package/spec/repo//346/234/254/345/234/260/345/221/275/344/273/244/344/270/216/346/265/201/347/250/213.md +32 -0
  59. package/spec/testing/fail-first-/347/254/254/344/270/200/346/211/271/346/265/213/350/257/225/345/210/227/350/241/250.md +11 -0
  60. package/spec/testing/fixtures-/350/247/204/350/214/203.md +20 -0
  61. package/spec/testing//346/265/213/350/257/225/347/255/226/347/225/245.md +97 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/project/statePaths.ts","../src/team/types.ts","../src/team/messageBus.ts","../src/utils/fs.ts","../src/utils/commandRunner.ts","../src/background/store.ts","../src/agent/errors.ts","../src/agent/checkpoint/shared.ts","../src/agent/taskState.ts","../src/agent/verificationState.ts","../src/agent/checkpoint/derivation.ts","../src/agent/checkpoint/base.ts","../src/agent/checkpoint/state.ts","../src/agent/checkpoint/prompt.ts","../src/agent/checkpoint.ts","../src/agent/runtimeMetrics/state.ts","../src/agent/runtimeMetrics/summary.ts","../src/agent/runtimeMetrics.ts","../src/agent/todos.ts","../src/agent/sessionStore.ts","../src/changes/store.ts","../src/agent/messages.ts","../src/skills/prompt.ts","../src/agent/promptSections.ts","../src/agent/toolResultPreview.ts","../src/agent/contextBuilder.ts","../src/agent/closeout.ts","../src/agent/verificationSignals.ts","../src/agent/finalize.ts","../src/agent/responseNormalization.ts","../src/utils/abort.ts","../src/agent/recovery.ts","../src/agent/api.ts","../src/agent/loopGuard.ts","../src/utils/validation.ts","../src/utils/commandPolicy.ts","../src/agent/planGate.ts","../src/agent/retryPolicy.ts","../src/team/policyStore.ts","../src/team/requestStore.ts","../src/tasks/store.ts","../src/team/store.ts","../src/team/reconcile.ts","../src/background/reconcile.ts","../src/worktrees/store.ts","../src/agent/runtimeState.ts","../src/agent/systemPrompt.ts","../src/agent/turnPersistence.ts","../src/agent/toolResultStorage.ts","../src/agent/toolPriority.ts","../src/tools/errors.ts","../src/tools/changeTracking.ts","../src/tools/shared.ts","../src/tools/files/applyPatchTool.ts","../src/tools/background/backgroundCheckTool.ts","../src/background/spawn.ts","../src/tools/background/backgroundRunTool.ts","../src/tools/team/broadcastTool.ts","../src/tools/tasks/claimTaskTool.ts","../src/tools/team/coordinationPolicyTool.ts","../src/documents/docx/structure.ts","../src/documents/docx/template.ts","../src/documents/docx/read.ts","../src/documents/docx/markdown.ts","../src/documents/docx/index.ts","../src/tools/docxShared.ts","../src/utils/ignore.ts","../src/tools/pathSuggestions.ts","../src/tools/documents/editDocxTool.ts","../src/tools/files/editFileTool.ts","../src/tools/team/idleTool.ts","../src/tools/files/listFilesTool.ts","../src/tools/team/listTeammatesTool.ts","../src/skills/loading.ts","../src/tools/skills/loadSkillTool.ts","../src/integrations/mineru/constants.ts","../src/tools/documents/readDocxTool.ts","../src/integrations/mineru/archive.ts","../src/integrations/mineru/client.ts","../src/integrations/mineru/pageCount.ts","../src/tools/documents/mineruExecution.ts","../src/tools/documents/mineruDocReadTool.ts","../src/tools/documents/mineruImageReadTool.ts","../src/tools/documents/mineruPdfReadTool.ts","../src/tools/documents/mineruPptReadTool.ts","../src/tools/team/planApprovalTool.ts","../src/tools/fileIntrospection.ts","../src/tools/files/toolResultArtifact.ts","../src/tools/files/readFileTool.ts","../src/tools/team/readInboxTool.ts","../src/tools/documents/readSpreadsheetTool.ts","../src/tools/shell/runShellTool.ts","../src/tools/files/searchFilesTool.ts","../src/tools/team/sendMessageTool.ts","../src/tools/team/shutdownRequestTool.ts","../src/tools/team/shutdownResponseTool.ts","../src/team/spawn.ts","../src/tools/team/spawnTeammateTool.ts","../src/subagent/profiles.ts","../src/subagent/progress.ts","../src/subagent/run.ts","../src/tools/tasks/taskTool.ts","../src/tools/tasks/todoWriteTool.ts","../src/tools/tasks/taskCreateTool.ts","../src/tools/tasks/taskGetTool.ts","../src/tools/tasks/taskListTool.ts","../src/tools/tasks/taskUpdateTool.ts","../src/tools/files/undoLastChangeTool.ts","../src/tools/worktrees/worktreeCreateTool.ts","../src/tools/worktrees/worktreeEventsTool.ts","../src/tools/worktrees/worktreeGetTool.ts","../src/tools/worktrees/worktreeKeepTool.ts","../src/tools/worktrees/worktreeListTool.ts","../src/tools/worktrees/worktreeRemoveTool.ts","../src/tools/documents/writeDocxTool.ts","../src/tools/files/writeFileTool.ts","../src/tools/order.ts","../src/tools/registry.ts","../src/mcp/playwright/paths.ts","../src/mcp/playwright/config.ts","../src/mcp/config.ts","../src/mcp/playwright/artifacts.ts","../src/mcp/playwright/browserInstall.ts","../src/mcp/playwright/invoke.ts","../src/mcp/stdioClient.ts","../src/mcp/client.ts","../src/mcp/discovery.ts","../src/mcp/clientManager.ts","../src/mcp/toolAdapter.ts","../src/mcp/registryIntegration.ts","../src/tools/runtimeRegistry.ts","../src/tools/index.ts","../src/agent/toolExecutor.ts","../src/skills/matching.ts","../src/skills/state.ts","../src/agent/toollessTurn.ts","../src/agent/turnState.ts","../src/context/repoRoots.ts","../src/skills/types.ts","../src/skills/schema.ts","../src/skills/discovery.ts","../src/skills/catalog.ts","../src/context/projectContext.ts","../src/skills/workflowGuards.ts","../src/agent/runTurn.ts","../src/cli.ts","../src/background/worker.ts","../src/cli/support.ts","../src/agent/managedTurn.ts","../src/orchestrator/prepareLeadTurn.ts","../src/orchestrator/analyze.ts","../src/orchestrator/commandNormalization.ts","../src/orchestrator/intentLexicon.ts","../src/orchestrator/metadata.ts","../src/orchestrator/dispatch.ts","../src/orchestrator/progress.ts","../src/orchestrator/route.ts","../src/orchestrator/taskPlanning.ts","../src/config/store.ts","../src/config/env.ts","../src/config/paths.ts","../src/telegram/config.ts","../src/weixin/storage.ts","../src/weixin/credentialsStore.ts","../src/weixin/config.ts","../src/ui/streamRenderer.ts","../src/utils/json.ts","../src/utils/console.ts","../src/utils/stdio.ts","../src/config/init.ts","../src/team/worker.ts","../src/telegram/cli.ts","../src/telegram/botApiClient.ts","../src/telegram/deliveryQueue.ts","../src/telegram/storage.ts","../src/telegram/logger.ts","../src/telegram/offsetStore.ts","../src/telegram/processLock.ts","../src/telegram/proxy.ts","../src/telegram/sessionMapStore.ts","../src/telegram/service.ts","../src/telegram/commandQueue.ts","../src/telegram/attachmentStore.ts","../src/telegram/polling.ts","../src/telegram/messageChunking.ts","../src/telegram/turnRunner.ts","../src/telegram/inboundFiles.ts","../src/interaction/localCommands.ts","../src/project/reset.ts","../src/ui/runtimeSummary.ts","../src/telegram/helpText.zh.ts","../src/telegram/localCommands.ts","../src/telegram/outputPort.ts","../src/telegram/sendFileTool.ts","../src/chat/visibleEvents.ts","../src/chat/durableTurnDisplay.ts","../src/telegram/turnDisplay.ts","../src/telegram/turnLogging.ts","../src/telegram/updateFilter.ts","../src/interaction/sessionDriver.ts","../src/shell/cli/intro.ts","../src/shell/cli/output.ts","../src/shell/cli/readlineInput.ts","../src/ui/spinner.ts","../src/shell/cli/turnDisplay.ts","../src/shell/cli/shell.ts","../src/ui/interactive.ts","../src/weixin/cli.ts","../src/weixin/attachmentStore.ts","../src/weixin/client.ts","../src/weixin/contextTokenStore.ts","../src/weixin/deliveryQueue.ts","../src/weixin/logger.ts","../src/weixin/polling.ts","../src/weixin/processLock.ts","../src/weixin/sessionMapStore.ts","../src/weixin/service.ts","../src/weixin/commandQueue.ts","../src/weixin/messageChunking.ts","../src/weixin/messageClassifier.ts","../src/weixin/turnRunner.ts","../src/weixin/inboundFiles.ts","../src/weixin/helpText.zh.ts","../src/weixin/localCommands.ts","../src/weixin/outputPort.ts","../src/weixin/sendFileTool.ts","../src/weixin/turnDisplay.ts","../src/weixin/turnLogging.ts","../src/weixin/visibleReplyPackaging.ts","../src/weixin/syncBufStore.ts"],"sourcesContent":["import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport interface ProjectStatePaths {\r\n rootDir: string;\r\n athleteDir: string;\r\n teamDir: string;\r\n backgroundDir: string;\r\n inboxDir: string;\r\n messageLogFile: string;\r\n coordinationPolicyFile: string;\r\n teamConfigFile: string;\r\n requestsDir: string;\r\n tasksDir: string;\r\n toolResultsDir: string;\r\n worktreesDir: string;\r\n worktreeIndexFile: string;\r\n worktreeEventsFile: string;\r\n}\r\n\r\nexport function getProjectStatePaths(rootDir: string): ProjectStatePaths {\r\n const normalizedRoot = path.resolve(rootDir);\r\n const athleteDir = path.join(normalizedRoot, \".athlete\");\r\n const teamDir = path.join(athleteDir, \"team\");\r\n const worktreesDir = path.join(athleteDir, \"worktrees\");\r\n return {\r\n rootDir: normalizedRoot,\r\n athleteDir,\r\n teamDir,\r\n backgroundDir: path.join(teamDir, \"background\"),\r\n inboxDir: path.join(teamDir, \"inbox\"),\r\n messageLogFile: path.join(teamDir, \"messages.jsonl\"),\r\n coordinationPolicyFile: path.join(teamDir, \"policy.json\"),\r\n teamConfigFile: path.join(teamDir, \"config.json\"),\r\n requestsDir: path.join(teamDir, \"requests\"),\r\n tasksDir: path.join(athleteDir, \"tasks\"),\r\n toolResultsDir: path.join(athleteDir, \"tool-results\"),\r\n worktreesDir,\r\n worktreeIndexFile: path.join(worktreesDir, \"index.json\"),\r\n worktreeEventsFile: path.join(worktreesDir, \"events.jsonl\"),\r\n };\r\n}\r\n\r\nexport async function ensureProjectStateDirectories(rootDir: string): Promise<ProjectStatePaths> {\r\n const paths = getProjectStatePaths(rootDir);\r\n await fs.mkdir(paths.teamDir, { recursive: true });\r\n await fs.mkdir(paths.backgroundDir, { recursive: true });\r\n await fs.mkdir(paths.inboxDir, { recursive: true });\r\n await fs.mkdir(paths.requestsDir, { recursive: true });\r\n await fs.mkdir(paths.tasksDir, { recursive: true });\r\n await fs.mkdir(paths.toolResultsDir, { recursive: true });\r\n await fs.mkdir(paths.worktreesDir, { recursive: true });\r\n return paths;\r\n}\r\n","export type TeamMemberStatus = \"working\" | \"idle\" | \"shutdown\";\r\n\r\nexport const TEAM_PROTOCOL_VERSION = 2;\r\n\r\nexport const PROTOCOL_REQUEST_KINDS = [\"shutdown\", \"plan_approval\"] as const;\r\n\r\nexport type ProtocolRequestKind = (typeof PROTOCOL_REQUEST_KINDS)[number];\r\n\r\nexport type ProtocolRequestStatus = \"pending\" | \"approved\" | \"rejected\";\r\n\r\nexport interface ProtocolDecisionRecord {\r\n approve: boolean;\r\n feedback?: string;\r\n respondedBy: string;\r\n respondedAt: string;\r\n}\r\n\r\nexport interface ProtocolRequestRecord {\r\n id: string;\r\n kind: ProtocolRequestKind;\r\n from: string;\r\n to: string;\r\n subject: string;\r\n content: string;\r\n status: ProtocolRequestStatus;\r\n decision?: ProtocolDecisionRecord;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface TeamMemberRecord {\r\n name: string;\r\n role: string;\r\n status: TeamMemberStatus;\r\n sessionId?: string;\r\n pid?: number;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface TeamConfigRecord {\r\n teamName: string;\r\n members: TeamMemberRecord[];\r\n}\r\n\r\nexport interface CoordinationPolicyRecord {\r\n allowPlanDecisions: boolean;\r\n allowShutdownRequests: boolean;\r\n updatedAt: string;\r\n}\r\n\r\nexport type TeamMessageType =\r\n | \"message\"\r\n | \"broadcast\"\r\n | \"background_result\"\r\n | \"protocol_request\"\r\n | \"protocol_response\";\r\n\r\nexport interface TeamMessageRecord {\r\n protocolVersion: number;\r\n type: TeamMessageType;\r\n from: string;\r\n to?: string;\r\n content: string;\r\n timestamp: number;\r\n protocolKind?: ProtocolRequestKind;\r\n requestId?: string;\r\n subject?: string;\r\n approve?: boolean;\r\n feedback?: string;\r\n jobId?: string;\r\n jobStatus?: string;\r\n exitCode?: number;\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport { PROTOCOL_REQUEST_KINDS, TEAM_PROTOCOL_VERSION } from \"./types.js\";\r\nimport type { TeamMessageRecord, TeamMessageType } from \"./types.js\";\r\n\r\nconst VALID_MESSAGE_TYPES: TeamMessageType[] = [\r\n \"message\",\r\n \"broadcast\",\r\n \"background_result\",\r\n \"protocol_request\",\r\n \"protocol_response\",\r\n];\r\nconst REQUIRED_FIELDS_BY_TYPE: Record<TeamMessageType, readonly (keyof TeamMessageRecord)[]> = {\r\n message: [],\r\n broadcast: [],\r\n background_result: [\"jobId\", \"jobStatus\"],\r\n protocol_request: [\"protocolKind\", \"requestId\"],\r\n protocol_response: [\"protocolKind\", \"requestId\", \"approve\"],\r\n};\r\nconst MAX_PROTOCOL_ERROR_PREVIEW_CHARS = 800;\r\n\r\nexport class MessageBus {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async send(\r\n sender: string,\r\n to: string,\r\n content: string,\r\n type: TeamMessageType = \"message\",\r\n extra: Partial<TeamMessageRecord> = {},\r\n ): Promise<TeamMessageRecord> {\r\n if (!VALID_MESSAGE_TYPES.includes(type)) {\r\n throw new Error(`Invalid message type: ${type}`);\r\n }\r\n\r\n const normalizedTo = normalizeName(to);\r\n if (!normalizedTo) {\r\n throw new Error(\"Target teammate name is required.\");\r\n }\r\n\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const message: TeamMessageRecord = {\r\n protocolVersion: TEAM_PROTOCOL_VERSION,\r\n type,\r\n from: normalizeName(sender) || \"lead\",\r\n to: normalizedTo,\r\n content: String(content ?? \"\"),\r\n timestamp: Date.now(),\r\n protocolKind: typeof extra.protocolKind === \"string\" ? extra.protocolKind : undefined,\r\n requestId: typeof extra.requestId === \"string\" ? extra.requestId : undefined,\r\n subject: typeof extra.subject === \"string\" ? extra.subject : undefined,\r\n approve: typeof extra.approve === \"boolean\" ? extra.approve : undefined,\r\n feedback: typeof extra.feedback === \"string\" ? extra.feedback : undefined,\r\n jobId: typeof extra.jobId === \"string\" ? extra.jobId : undefined,\r\n jobStatus: typeof extra.jobStatus === \"string\" ? extra.jobStatus : undefined,\r\n exitCode: typeof extra.exitCode === \"number\" && Number.isFinite(extra.exitCode) ? Math.trunc(extra.exitCode) : undefined,\r\n };\r\n const validation = validateTeamMessage(message);\r\n if (!validation.ok) {\r\n throw new Error(`Invalid team protocol message: ${validation.error}`);\r\n }\r\n\r\n const inboxPath = path.join(paths.inboxDir, `${normalizedTo}.jsonl`);\r\n await fs.appendFile(paths.messageLogFile, `${JSON.stringify(message)}\\n`, \"utf8\");\r\n await fs.appendFile(inboxPath, `${JSON.stringify(message)}\\n`, \"utf8\");\r\n return message;\r\n }\r\n\r\n async readInbox(name: string): Promise<TeamMessageRecord[]> {\r\n const inboxPath = path.join(getProjectStatePaths(this.rootDir).inboxDir, `${normalizeName(name) || \"lead\"}.jsonl`);\r\n const messages = await this.peekInbox(name);\r\n if (messages.length === 0) {\r\n return [];\r\n }\r\n\r\n await fs.writeFile(inboxPath, \"\", \"utf8\");\r\n return messages;\r\n }\r\n\r\n async peekInbox(name: string): Promise<TeamMessageRecord[]> {\r\n const inboxPath = path.join(getProjectStatePaths(this.rootDir).inboxDir, `${normalizeName(name) || \"lead\"}.jsonl`);\r\n try {\r\n const raw = await fs.readFile(inboxPath, \"utf8\");\r\n const lines = raw\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter(Boolean);\r\n const messages: TeamMessageRecord[] = [];\r\n\r\n for (const line of lines) {\r\n const parsed = safeParseJson(line);\r\n if (!parsed.ok) {\r\n messages.push(buildProtocolErrorMessage(`Invalid JSON: ${parsed.error}`, line));\r\n continue;\r\n }\r\n\r\n const validation = validateTeamMessage(parsed.value);\r\n if (!validation.ok) {\r\n messages.push(buildProtocolErrorMessage(validation.error, parsed.value));\r\n continue;\r\n }\r\n\r\n messages.push(validation.message);\r\n }\r\n\r\n return messages;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return [];\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async broadcast(sender: string, content: string, recipients: string[]): Promise<number> {\r\n let count = 0;\r\n for (const recipient of recipients) {\r\n if (normalizeName(recipient) === normalizeName(sender)) {\r\n continue;\r\n }\r\n\r\n await this.send(sender, recipient, content, \"broadcast\");\r\n count += 1;\r\n }\r\n\r\n return count;\r\n }\r\n}\r\n\r\nfunction normalizeName(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \"-\").trim();\r\n}\r\n\r\nfunction validateTeamMessage(\r\n raw: unknown,\r\n): { ok: true; message: TeamMessageRecord } | { ok: false; error: string } {\r\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\r\n return { ok: false, error: \"Message payload must be an object.\" };\r\n }\r\n\r\n const message = raw as TeamMessageRecord;\r\n if (!Number.isInteger(message.protocolVersion)) {\r\n return { ok: false, error: \"Missing or invalid protocolVersion.\" };\r\n }\r\n if (message.protocolVersion !== TEAM_PROTOCOL_VERSION) {\r\n return {\r\n ok: false,\r\n error: `Unsupported protocolVersion ${message.protocolVersion}; expected ${TEAM_PROTOCOL_VERSION}.`,\r\n };\r\n }\r\n\r\n if (typeof message.type !== \"string\" || !VALID_MESSAGE_TYPES.includes(message.type as TeamMessageType)) {\r\n return { ok: false, error: `Invalid message type: ${String(message.type ?? \"\")}` };\r\n }\r\n\r\n if (typeof message.from !== \"string\" || !message.from.trim()) {\r\n return { ok: false, error: \"Missing or empty sender name.\" };\r\n }\r\n\r\n if (message.to !== undefined && (typeof message.to !== \"string\" || !message.to.trim())) {\r\n return { ok: false, error: \"Invalid recipient name.\" };\r\n }\r\n\r\n if (typeof message.content !== \"string\") {\r\n return { ok: false, error: \"Missing message content.\" };\r\n }\r\n\r\n if (typeof message.timestamp !== \"number\" || !Number.isFinite(message.timestamp)) {\r\n return { ok: false, error: \"Missing or invalid timestamp.\" };\r\n }\r\n\r\n const requiredFields = REQUIRED_FIELDS_BY_TYPE[message.type as TeamMessageType] ?? [];\r\n for (const field of requiredFields) {\r\n const value = (message as unknown as Record<string, unknown>)[field as string];\r\n if (field === \"approve\") {\r\n if (typeof value !== \"boolean\") {\r\n return { ok: false, error: \"Missing required boolean field: approve.\" };\r\n }\r\n continue;\r\n }\r\n\r\n if (typeof value !== \"string\" || !value.trim()) {\r\n return { ok: false, error: `Missing required field: ${String(field)}.` };\r\n }\r\n }\r\n\r\n if (message.protocolKind !== undefined) {\r\n if (typeof message.protocolKind !== \"string\" || !PROTOCOL_REQUEST_KINDS.includes(message.protocolKind)) {\r\n return { ok: false, error: `Invalid protocolKind: ${String(message.protocolKind ?? \"\")}` };\r\n }\r\n }\r\n if (message.requestId !== undefined && (typeof message.requestId !== \"string\" || !message.requestId.trim())) {\r\n return { ok: false, error: \"Invalid requestId.\" };\r\n }\r\n if (message.subject !== undefined && typeof message.subject !== \"string\") {\r\n return { ok: false, error: \"Invalid subject.\" };\r\n }\r\n if (message.feedback !== undefined && typeof message.feedback !== \"string\") {\r\n return { ok: false, error: \"Invalid feedback.\" };\r\n }\r\n if (message.jobId !== undefined && (typeof message.jobId !== \"string\" || !message.jobId.trim())) {\r\n return { ok: false, error: \"Invalid jobId.\" };\r\n }\r\n if (message.jobStatus !== undefined && (typeof message.jobStatus !== \"string\" || !message.jobStatus.trim())) {\r\n return { ok: false, error: \"Invalid jobStatus.\" };\r\n }\r\n if (message.exitCode !== undefined && (!Number.isFinite(message.exitCode) || !Number.isInteger(message.exitCode))) {\r\n return { ok: false, error: \"Invalid exitCode.\" };\r\n }\r\n\r\n return { ok: true, message };\r\n}\r\n\r\nfunction buildProtocolErrorMessage(error: string, raw: unknown): TeamMessageRecord {\r\n const rawPreview =\r\n typeof raw === \"string\"\r\n ? truncate(raw, MAX_PROTOCOL_ERROR_PREVIEW_CHARS)\r\n : truncate(safeStringify(raw), MAX_PROTOCOL_ERROR_PREVIEW_CHARS);\r\n\r\n return {\r\n protocolVersion: TEAM_PROTOCOL_VERSION,\r\n type: \"message\",\r\n from: \"system\",\r\n content: `Protocol error: ${error}\\nRaw: ${rawPreview}`,\r\n timestamp: Date.now(),\r\n };\r\n}\r\n\r\nfunction safeParseJson(line: string): { ok: true; value: unknown } | { ok: false; error: string } {\r\n try {\r\n return { ok: true, value: JSON.parse(line) as unknown };\r\n } catch (error) {\r\n return { ok: false, error: String((error as { message?: unknown }).message ?? error) };\r\n }\r\n}\r\n\r\nfunction safeStringify(value: unknown): string {\r\n try {\r\n return JSON.stringify(value);\r\n } catch {\r\n return String(value ?? \"\");\r\n }\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { RuntimeConfig } from \"../types.js\";\r\n\r\nexport async function fileExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await fs.access(targetPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport function resolveUserPath(inputPath: string, cwd: string): string {\r\n if (path.isAbsolute(inputPath)) {\r\n return path.normalize(inputPath);\r\n }\r\n\r\n return path.resolve(cwd, inputPath);\r\n}\r\n\r\nexport function assertPathAllowed(targetPath: string, cwd: string, config: RuntimeConfig): string {\r\n const resolved = resolveUserPath(targetPath, cwd);\r\n\r\n if (config.allowedRoots.includes(\"*\")) {\r\n return resolved;\r\n }\r\n\r\n const allowedRoots = config.allowedRoots.map((root) => resolveUserPath(root, cwd));\r\n\r\n for (const root of allowedRoots) {\r\n const relative = path.relative(root, resolved);\r\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\r\n return resolved;\r\n }\r\n }\r\n\r\n throw new Error(`Path not allowed by config.allowedRoots: ${resolved}`);\r\n}\r\n\r\nexport async function ensureParentDirectory(filePath: string): Promise<void> {\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n}\r\n\r\nexport function truncateText(input: string, maxChars: number): string {\r\n if (input.length <= maxChars) {\r\n return input;\r\n }\r\n\r\n return `${input.slice(0, maxChars)}\\n\\n... [truncated ${input.length - maxChars} chars]`;\r\n}\r\n\r\nexport function formatFileWithLineNumbers(content: string, startLine = 1): string {\r\n return content\r\n .split(/\\r?\\n/)\r\n .map((line, index) => `${String(startLine + index).padStart(4, \" \")} | ${line}`)\r\n .join(\"\\n\");\r\n}\r\n","import { execa } from \"execa\";\r\n\r\nimport { truncateText } from \"./fs.js\";\r\n\r\nexport interface CommandRunOptions {\r\n command: string;\r\n cwd: string;\r\n timeoutMs: number;\r\n stallTimeoutMs: number;\r\n abortSignal?: AbortSignal;\r\n maxRetries: number;\r\n retryBackoffMs: number;\r\n canRetry: boolean;\r\n}\r\n\r\nexport interface CommandRunResult {\r\n exitCode: number | null;\r\n output: string;\r\n timedOut: boolean;\r\n stalled: boolean;\r\n attempts: number;\r\n durationMs: number;\r\n}\r\n\r\nconst MAX_OUTPUT_CHARS = 12_000;\r\nconst STALL_KILL_TIMEOUT_MS = 5_000;\r\n\r\nexport async function runCommandWithPolicy(options: CommandRunOptions): Promise<CommandRunResult> {\r\n const attempts = Math.max(1, Math.trunc(options.maxRetries) + 1);\r\n let lastResult: CommandRunResult | null = null;\r\n const normalizedCommand = normalizeCommandForPlatform(options.command);\r\n\r\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\r\n lastResult = await runCommandOnce({\r\n ...options,\r\n command: normalizedCommand,\r\n });\r\n\r\n const success = lastResult.exitCode === 0 && !lastResult.timedOut && !lastResult.stalled;\r\n if (success) {\r\n return lastResult;\r\n }\r\n\r\n if (!options.canRetry || attempt >= attempts) {\r\n return lastResult;\r\n }\r\n\r\n await sleep(options.retryBackoffMs * attempt, options.abortSignal);\r\n }\r\n\r\n return lastResult ?? {\r\n exitCode: null,\r\n output: \"\",\r\n timedOut: false,\r\n stalled: false,\r\n attempts: 0,\r\n durationMs: 0,\r\n };\r\n}\r\n\r\nasync function runCommandOnce(options: CommandRunOptions): Promise<CommandRunResult> {\r\n const start = Date.now();\r\n let stalled = false;\r\n let stallTimer: NodeJS.Timeout | null = null;\r\n let forceKillTimer: NodeJS.Timeout | null = null;\r\n\r\n const subprocess = launchCommand(options.command, options.cwd, options.timeoutMs, options.abortSignal);\r\n\r\n const clearTimers = () => {\r\n if (stallTimer) {\r\n clearTimeout(stallTimer);\r\n stallTimer = null;\r\n }\r\n if (forceKillTimer) {\r\n clearTimeout(forceKillTimer);\r\n forceKillTimer = null;\r\n }\r\n };\r\n\r\n const resetStallTimer = () => {\r\n if (stalled) {\r\n return;\r\n }\r\n\r\n if (stallTimer) {\r\n clearTimeout(stallTimer);\r\n }\r\n\r\n if (options.stallTimeoutMs > 0) {\r\n stallTimer = setTimeout(() => {\r\n stalled = true;\r\n try {\r\n subprocess.kill(\"SIGTERM\");\r\n } catch {\r\n // ignore\r\n }\r\n if (STALL_KILL_TIMEOUT_MS > 0) {\r\n if (forceKillTimer) {\r\n clearTimeout(forceKillTimer);\r\n }\r\n forceKillTimer = setTimeout(() => {\r\n try {\r\n if (typeof subprocess.exitCode !== \"number\") {\r\n subprocess.kill(\"SIGKILL\");\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }, STALL_KILL_TIMEOUT_MS);\r\n }\r\n }, options.stallTimeoutMs);\r\n }\r\n };\r\n\r\n resetStallTimer();\r\n\r\n if (subprocess.all) {\r\n subprocess.all.on(\"data\", resetStallTimer);\r\n }\r\n\r\n try {\r\n const result = await subprocess;\r\n clearTimers();\r\n\r\n return {\r\n exitCode: typeof result.exitCode === \"number\" ? result.exitCode : null,\r\n output: truncateText(result.all ?? \"\", MAX_OUTPUT_CHARS),\r\n timedOut: Boolean((result as { timedOut?: unknown }).timedOut),\r\n stalled,\r\n attempts: 1,\r\n durationMs: Date.now() - start,\r\n };\r\n } catch (error) {\r\n clearTimers();\r\n\r\n return {\r\n exitCode: readExitCode(error),\r\n output: truncateText(readProcessOutput(error), MAX_OUTPUT_CHARS),\r\n timedOut: isTimedOutError(error),\r\n stalled,\r\n attempts: 1,\r\n durationMs: Date.now() - start,\r\n };\r\n }\r\n}\r\n\r\nfunction launchCommand(command: string, cwd: string, timeoutMs: number, abortSignal?: AbortSignal) {\r\n return process.platform === \"win32\"\r\n ? execa(\"powershell.exe\", [\"-NoLogo\", \"-NoProfile\", \"-EncodedCommand\", encodePowerShellCommand(command)], {\r\n cwd,\r\n timeout: timeoutMs,\r\n cancelSignal: abortSignal,\r\n all: true,\r\n reject: false,\r\n })\r\n : execa(\"/bin/bash\", [\"-lc\", command], {\r\n cwd,\r\n timeout: timeoutMs,\r\n cancelSignal: abortSignal,\r\n all: true,\r\n reject: false,\r\n });\r\n}\r\n\r\nfunction encodePowerShellCommand(command: string): string {\r\n const wrapped = [\r\n \"$ProgressPreference = 'SilentlyContinue'\",\r\n `& { ${command} }`,\r\n \"$code = if ($null -ne $LASTEXITCODE) { [int]$LASTEXITCODE } elseif ($?) { 0 } else { 1 }\",\r\n \"exit $code\",\r\n ].join(\"; \");\r\n return Buffer.from(wrapped, \"utf16le\").toString(\"base64\");\r\n}\r\n\r\nfunction normalizeCommandForPlatform(command: string): string {\r\n if (process.platform !== \"win32\") {\r\n return command;\r\n }\r\n\r\n const trimmed = command.trim();\r\n if (!trimmed) {\r\n return command;\r\n }\r\n\r\n const normalized = normalizeWindowsCommand(trimmed);\r\n return normalizeNpmShims(normalized);\r\n}\r\n\r\nfunction normalizeWindowsCommand(command: string): string {\r\n if (startsWithExplicitShell(command)) {\r\n return command;\r\n }\r\n\r\n const segments = splitByAndAnd(command);\r\n const normalizedSegments = segments.map((segment) => normalizeWindowsSegment(segment));\r\n return joinWithAndSemantics(normalizedSegments);\r\n}\r\n\r\nfunction startsWithExplicitShell(command: string): boolean {\r\n return /^\\s*(cmd(?:\\.exe)?\\s+\\/c|powershell(?:\\.exe)?\\b|pwsh\\b|bash\\b)/i.test(command);\r\n}\r\n\r\nfunction splitByAndAnd(command: string): string[] {\r\n const segments: string[] = [];\r\n let current = \"\";\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let index = 0; index < command.length; index += 1) {\r\n const char = command.charAt(index);\r\n if (char === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n current += char;\r\n continue;\r\n }\r\n if (char === \"\\\"\" && !inSingle) {\r\n inDouble = !inDouble;\r\n current += char;\r\n continue;\r\n }\r\n if (!inSingle && !inDouble && char === \"&\" && command.charAt(index + 1) === \"&\") {\r\n if (current.trim()) {\r\n segments.push(current.trim());\r\n }\r\n current = \"\";\r\n index += 1;\r\n continue;\r\n }\r\n current += char;\r\n }\r\n\r\n if (current.trim()) {\r\n segments.push(current.trim());\r\n }\r\n\r\n return segments.length > 0 ? segments : [command];\r\n}\r\n\r\nfunction joinWithAndSemantics(segments: string[]): string {\r\n if (segments.length <= 1) {\r\n return segments[0] ?? \"\";\r\n }\r\n\r\n let script = segments[0] ?? \"\";\r\n for (let index = 1; index < segments.length; index += 1) {\r\n const segment = segments[index];\r\n script += `; if ($?) { ${segment} }`;\r\n }\r\n\r\n return script;\r\n}\r\n\r\nfunction normalizeWindowsSegment(segment: string): string {\r\n const trimmed = segment.trim();\r\n if (!trimmed) {\r\n return segment;\r\n }\r\n\r\n const lowered = trimmed.toLowerCase();\r\n if (lowered.startsWith(\"get-childitem\") || lowered.startsWith(\"new-item\")) {\r\n return segment;\r\n }\r\n\r\n if (lowered.startsWith(\"ls\")) {\r\n return normalizeLsSegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"mkdir\") || lowered.startsWith(\"md \")) {\r\n return normalizeMkdirSegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"rm \")) {\r\n return normalizeRemoveSegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"cp \")) {\r\n return normalizeCopySegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"mv \")) {\r\n return normalizeMoveSegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"touch \")) {\r\n return normalizeTouchSegment(trimmed);\r\n }\r\n if (lowered.startsWith(\"cat \")) {\r\n return normalizeCatSegment(trimmed);\r\n }\r\n\r\n return segment;\r\n}\r\n\r\nfunction normalizeLsSegment(segment: string): string {\r\n const args = splitArgs(segment).slice(1);\r\n const flags = args.filter((arg) => arg.startsWith(\"-\"));\r\n const paths = args.filter((arg) => !arg.startsWith(\"-\"));\r\n const force = flags.some((flag) => flag.includes(\"a\"));\r\n const path = paths[0];\r\n\r\n let command = \"Get-ChildItem\";\r\n if (force) {\r\n command += \" -Force\";\r\n }\r\n if (path) {\r\n command += ` -LiteralPath ${quotePowerShell(normalizeWindowsPath(path))}`;\r\n }\r\n\r\n return command;\r\n}\r\n\r\nfunction normalizeMkdirSegment(segment: string): string {\r\n const args = splitArgs(segment);\r\n if (args.length <= 1) {\r\n return segment;\r\n }\r\n\r\n const rest = args.slice(1);\r\n let hasParents = false;\r\n const paths = rest.filter((arg) => {\r\n const lowered = arg.toLowerCase();\r\n if (lowered === \"-p\" || lowered === \"--parents\") {\r\n hasParents = true;\r\n return false;\r\n }\r\n return true;\r\n });\r\n\r\n const needsNormalization = hasParents || paths.some((path) => path.includes(\"{\"));\r\n if (!needsNormalization) {\r\n return segment;\r\n }\r\n\r\n const expanded = expandPaths(paths);\r\n if (expanded.length === 0) {\r\n return segment;\r\n }\r\n\r\n const normalizedPaths = expanded.map((path) => quotePowerShell(normalizeWindowsPath(path)));\r\n return `New-Item -ItemType Directory -Force -Path ${normalizedPaths.join(\", \")}`;\r\n}\r\n\r\nfunction normalizeRemoveSegment(segment: string): string {\r\n const args = splitArgs(segment);\r\n if (args.length <= 1) {\r\n return segment;\r\n }\r\n\r\n const flags = args.slice(1).filter((arg) => arg.startsWith(\"-\"));\r\n const paths = args.slice(1).filter((arg) => !arg.startsWith(\"-\"));\r\n if (paths.length === 0) {\r\n return segment;\r\n }\r\n\r\n const recurse = flags.some((flag) => /r/i.test(flag));\r\n const force = flags.some((flag) => /f/i.test(flag));\r\n\r\n let command = \"Remove-Item\";\r\n if (recurse) {\r\n command += \" -Recurse\";\r\n }\r\n if (force) {\r\n command += \" -Force\";\r\n }\r\n\r\n command += ` -LiteralPath ${paths.map((path) => quotePowerShell(normalizeWindowsPath(path))).join(\", \")}`;\r\n return command;\r\n}\r\n\r\nfunction normalizeCopySegment(segment: string): string {\r\n const args = splitArgs(segment);\r\n if (args.length < 3) {\r\n return segment;\r\n }\r\n\r\n const flags = args.slice(1).filter((arg) => arg.startsWith(\"-\"));\r\n const paths = args.slice(1).filter((arg) => !arg.startsWith(\"-\"));\r\n if (paths.length < 2) {\r\n return segment;\r\n }\r\n\r\n const recurse = flags.some((flag) => /r/i.test(flag));\r\n const force = flags.some((flag) => /f/i.test(flag));\r\n const destination = paths[paths.length - 1];\r\n if (!destination) {\r\n return segment;\r\n }\r\n const sources = paths.slice(0, -1);\r\n\r\n let command = \"Copy-Item\";\r\n if (recurse) {\r\n command += \" -Recurse\";\r\n }\r\n if (force) {\r\n command += \" -Force\";\r\n }\r\n\r\n command += ` -Path ${sources.map((path) => quotePowerShell(normalizeWindowsPath(path))).join(\", \")}`;\r\n command += ` -Destination ${quotePowerShell(normalizeWindowsPath(destination))}`;\r\n return command;\r\n}\r\n\r\nfunction normalizeMoveSegment(segment: string): string {\r\n const args = splitArgs(segment);\r\n if (args.length < 3) {\r\n return segment;\r\n }\r\n\r\n const flags = args.slice(1).filter((arg) => arg.startsWith(\"-\"));\r\n const paths = args.slice(1).filter((arg) => !arg.startsWith(\"-\"));\r\n if (paths.length < 2) {\r\n return segment;\r\n }\r\n\r\n const force = flags.some((flag) => /f/i.test(flag));\r\n const destination = paths[paths.length - 1];\r\n if (!destination) {\r\n return segment;\r\n }\r\n const sources = paths.slice(0, -1);\r\n\r\n let command = \"Move-Item\";\r\n if (force) {\r\n command += \" -Force\";\r\n }\r\n\r\n command += ` -Path ${sources.map((path) => quotePowerShell(normalizeWindowsPath(path))).join(\", \")}`;\r\n command += ` -Destination ${quotePowerShell(normalizeWindowsPath(destination))}`;\r\n return command;\r\n}\r\n\r\nfunction normalizeTouchSegment(segment: string): string {\r\n const args = splitArgs(segment).slice(1);\r\n if (args.length === 0) {\r\n return segment;\r\n }\r\n\r\n const expanded = expandPaths(args);\r\n if (expanded.length === 0) {\r\n return segment;\r\n }\r\n\r\n const paths = expanded.map((path) => quotePowerShell(normalizeWindowsPath(path)));\r\n return `New-Item -ItemType File -Force -Path ${paths.join(\", \")}`;\r\n}\r\n\r\nfunction normalizeCatSegment(segment: string): string {\r\n const args = splitArgs(segment).slice(1);\r\n if (args.length === 0) {\r\n return segment;\r\n }\r\n\r\n const path = args[0];\r\n if (!path) {\r\n return segment;\r\n }\r\n return `Get-Content -LiteralPath ${quotePowerShell(normalizeWindowsPath(path))}`;\r\n}\r\n\r\nfunction normalizeNpmShims(command: string): string {\r\n const shims: Record<string, string> = {\r\n npm: \"npm.cmd\",\r\n npx: \"npx.cmd\",\r\n pnpm: \"pnpm.cmd\",\r\n yarn: \"yarn.cmd\",\r\n };\r\n\r\n const pattern = /(^|[;&|]|\\&\\&)\\s*(npm|npx|pnpm|yarn)(?=\\s|$)/gi;\r\n return command.replace(pattern, (match, prefix, tool) => {\r\n const replacement = shims[String(tool).toLowerCase()];\r\n if (!replacement) {\r\n return match;\r\n }\r\n if (!prefix) {\r\n return replacement;\r\n }\r\n return `${prefix} ${replacement}`;\r\n });\r\n}\r\n\r\nfunction splitArgs(command: string): string[] {\r\n const args: string[] = [];\r\n let current = \"\";\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let index = 0; index < command.length; index += 1) {\r\n const char = command.charAt(index);\r\n if (char === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (char === \"\\\"\" && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (!inSingle && !inDouble && /\\s/.test(char)) {\r\n if (current) {\r\n args.push(current);\r\n current = \"\";\r\n }\r\n continue;\r\n }\r\n current += char;\r\n }\r\n\r\n if (current) {\r\n args.push(current);\r\n }\r\n\r\n return args;\r\n}\r\n\r\nfunction expandPaths(paths: string[]): string[] {\r\n return paths.flatMap((path) => expandBraces(path));\r\n}\r\n\r\nfunction expandBraces(input: string): string[] {\r\n const start = findBraceStart(input);\r\n if (start === -1) {\r\n return [input];\r\n }\r\n\r\n const end = findMatchingBrace(input, start);\r\n if (end === -1) {\r\n return [input];\r\n }\r\n\r\n const prefix = input.slice(0, start);\r\n const suffix = input.slice(end + 1);\r\n const body = input.slice(start + 1, end);\r\n const parts = splitBraceParts(body);\r\n const expandedSuffix = expandBraces(suffix);\r\n\r\n const results: string[] = [];\r\n for (const part of parts) {\r\n for (const expandedPart of expandBraces(part)) {\r\n for (const tail of expandedSuffix) {\r\n results.push(`${prefix}${expandedPart}${tail}`);\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction findBraceStart(input: string): number {\r\n let inSingle = false;\r\n let inDouble = false;\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input.charAt(index);\r\n if (char === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (char === \"\\\"\" && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (!inSingle && !inDouble && char === \"{\") {\r\n return index;\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\nfunction findMatchingBrace(input: string, start: number): number {\r\n let depth = 0;\r\n let inSingle = false;\r\n let inDouble = false;\r\n\r\n for (let index = start; index < input.length; index += 1) {\r\n const char = input.charAt(index);\r\n if (char === \"'\" && !inDouble) {\r\n inSingle = !inSingle;\r\n continue;\r\n }\r\n if (char === \"\\\"\" && !inSingle) {\r\n inDouble = !inDouble;\r\n continue;\r\n }\r\n if (inSingle || inDouble) {\r\n continue;\r\n }\r\n if (char === \"{\") {\r\n depth += 1;\r\n } else if (char === \"}\") {\r\n depth -= 1;\r\n if (depth === 0) {\r\n return index;\r\n }\r\n }\r\n }\r\n\r\n return -1;\r\n}\r\n\r\nfunction splitBraceParts(input: string): string[] {\r\n const parts: string[] = [];\r\n let current = \"\";\r\n let depth = 0;\r\n\r\n for (let index = 0; index < input.length; index += 1) {\r\n const char = input.charAt(index);\r\n if (char === \"{\") {\r\n depth += 1;\r\n current += char;\r\n continue;\r\n }\r\n if (char === \"}\") {\r\n depth -= 1;\r\n current += char;\r\n continue;\r\n }\r\n if (char === \",\" && depth === 0) {\r\n parts.push(current);\r\n current = \"\";\r\n continue;\r\n }\r\n current += char;\r\n }\r\n\r\n if (current) {\r\n parts.push(current);\r\n }\r\n\r\n return parts.length > 0 ? parts : [input];\r\n}\r\n\r\nfunction normalizeWindowsPath(value: string): string {\r\n if (value.includes(\"://\")) {\r\n return value;\r\n }\r\n return value.replace(/\\//g, \"\\\\\");\r\n}\r\n\r\nfunction quotePowerShell(value: string): string {\r\n const escaped = value.replace(/'/g, \"''\");\r\n return `'${escaped}'`;\r\n}\r\n\r\nfunction isTimedOutError(error: unknown): boolean {\r\n return Boolean((error as { timedOut?: unknown }).timedOut);\r\n}\r\n\r\nfunction readExitCode(error: unknown): number | null {\r\n const exitCode = (error as { exitCode?: unknown }).exitCode;\r\n return typeof exitCode === \"number\" && Number.isFinite(exitCode) ? Math.trunc(exitCode) : null;\r\n}\r\n\r\nfunction readProcessOutput(error: unknown): string {\r\n const all = (error as { all?: unknown }).all;\r\n if (typeof all === \"string\" && all.length > 0) {\r\n return all;\r\n }\r\n\r\n const message = (error as { message?: unknown }).message;\r\n return typeof message === \"string\" && message.length > 0 ? message : \"Command failed.\";\r\n}\r\n\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(resolve, ms);\r\n if (signal) {\r\n signal.addEventListener(\r\n \"abort\",\r\n () => {\r\n clearTimeout(timer);\r\n reject(signal.reason ?? new Error(\"Command retry aborted.\"));\r\n },\r\n { once: true },\r\n );\r\n }\r\n });\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport type { BackgroundJobRecord, BackgroundJobStatus } from \"./types.js\";\r\n\r\nexport class BackgroundJobStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async create(input: {\r\n command: string;\r\n cwd: string;\r\n requestedBy: string;\r\n timeoutMs: number;\r\n stallTimeoutMs?: number;\r\n }): Promise<BackgroundJobRecord> {\r\n const now = new Date().toISOString();\r\n const job = normalizeJob({\r\n id: createJobId(),\r\n command: input.command,\r\n cwd: input.cwd,\r\n requestedBy: input.requestedBy,\r\n status: \"running\",\r\n timeoutMs: input.timeoutMs,\r\n stallTimeoutMs: input.stallTimeoutMs,\r\n createdAt: now,\r\n updatedAt: now,\r\n });\r\n await this.save(job);\r\n return job;\r\n }\r\n\r\n async load(jobId: string): Promise<BackgroundJobRecord> {\r\n const filePath = this.getJobPath(jobId);\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n return normalizeJob(JSON.parse(raw) as BackgroundJobRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n throw new Error(`Background job ${jobId} not found.`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async save(job: BackgroundJobRecord): Promise<BackgroundJobRecord> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const normalized = normalizeJob(job);\r\n await fs.writeFile(path.join(paths.backgroundDir, `job_${normalized.id}.json`), `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n return normalized;\r\n }\r\n\r\n async setPid(jobId: string, pid: number): Promise<BackgroundJobRecord> {\r\n const job = await this.load(jobId);\r\n return this.save({\r\n ...job,\r\n pid: Number.isFinite(pid) ? Math.trunc(pid) : undefined,\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n async complete(\r\n jobId: string,\r\n input: {\r\n status: BackgroundJobStatus;\r\n exitCode?: number;\r\n output?: string;\r\n },\r\n ): Promise<BackgroundJobRecord> {\r\n const job = await this.load(jobId);\r\n const now = new Date().toISOString();\r\n return this.save({\r\n ...job,\r\n status: input.status,\r\n exitCode: typeof input.exitCode === \"number\" && Number.isFinite(input.exitCode) ? Math.trunc(input.exitCode) : undefined,\r\n output: typeof input.output === \"string\" ? input.output : job.output,\r\n updatedAt: now,\r\n finishedAt: now,\r\n });\r\n }\r\n\r\n async list(): Promise<BackgroundJobRecord[]> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const entries = await fs.readdir(paths.backgroundDir, { withFileTypes: true });\r\n const jobs = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && /^job_[a-z0-9]+\\.json$/i.test(entry.name))\r\n .map(async (entry) => {\r\n const raw = await fs.readFile(path.join(paths.backgroundDir, entry.name), \"utf8\");\r\n return normalizeJob(JSON.parse(raw) as BackgroundJobRecord);\r\n }),\r\n );\r\n return jobs.sort((left, right) => right.createdAt.localeCompare(left.createdAt));\r\n }\r\n\r\n async listRelevant(options: {\r\n cwd?: string;\r\n requestedBy?: string;\r\n } = {}): Promise<BackgroundJobRecord[]> {\r\n const jobs = await this.list();\r\n return jobs.filter((job) => isRelevantJob(job, options));\r\n }\r\n\r\n async summarize(options: {\r\n cwd?: string;\r\n requestedBy?: string;\r\n } = {}): Promise<string> {\r\n const jobs = await this.listRelevant(options);\r\n if (jobs.length === 0) {\r\n return \"No background jobs.\";\r\n }\r\n\r\n return jobs\r\n .slice(0, 12)\r\n .map((job) => {\r\n const marker = formatMarker(job.status);\r\n const exit = typeof job.exitCode === \"number\" ? ` exit=${job.exitCode}` : \"\";\r\n return `${marker} ${job.id} @${job.requestedBy} ${job.command}${exit}`;\r\n })\r\n .join(\"\\n\");\r\n }\r\n\r\n private getJobPath(jobId: string): string {\r\n return path.join(getProjectStatePaths(this.rootDir).backgroundDir, `job_${normalizeId(jobId)}.json`);\r\n }\r\n}\r\n\r\nfunction isRelevantJob(\r\n job: BackgroundJobRecord,\r\n options: {\r\n cwd?: string;\r\n requestedBy?: string;\r\n },\r\n): boolean {\r\n if (options.requestedBy && normalizeText(job.requestedBy) !== normalizeText(options.requestedBy)) {\r\n return false;\r\n }\r\n\r\n if (!options.cwd) {\r\n return true;\r\n }\r\n\r\n const scope = path.resolve(options.cwd);\r\n const jobCwd = path.resolve(job.cwd);\r\n return isSameOrDescendant(scope, jobCwd) || isSameOrDescendant(jobCwd, scope);\r\n}\r\n\r\nfunction isSameOrDescendant(targetPath: string, possibleAncestor: string): boolean {\r\n const relative = path.relative(possibleAncestor, targetPath);\r\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\r\n}\r\n\r\nfunction normalizeJob(job: BackgroundJobRecord): BackgroundJobRecord {\r\n const now = new Date().toISOString();\r\n return {\r\n id: normalizeId(job.id) || createJobId(),\r\n command: normalizeText(job.command),\r\n cwd: normalizeText(job.cwd),\r\n requestedBy: normalizeText(job.requestedBy) || \"lead\",\r\n status: normalizeStatus(job.status),\r\n timeoutMs: normalizeTimeout(job.timeoutMs),\r\n stallTimeoutMs: normalizeTimeout(job.stallTimeoutMs ?? job.timeoutMs),\r\n pid: typeof job.pid === \"number\" && Number.isFinite(job.pid) ? Math.trunc(job.pid) : undefined,\r\n exitCode: typeof job.exitCode === \"number\" && Number.isFinite(job.exitCode) ? Math.trunc(job.exitCode) : undefined,\r\n output: typeof job.output === \"string\" && job.output.length > 0 ? job.output : undefined,\r\n createdAt: typeof job.createdAt === \"string\" && job.createdAt ? job.createdAt : now,\r\n updatedAt: typeof job.updatedAt === \"string\" && job.updatedAt ? job.updatedAt : now,\r\n finishedAt: typeof job.finishedAt === \"string\" && job.finishedAt ? job.finishedAt : undefined,\r\n };\r\n}\r\n\r\nfunction normalizeStatus(value: string): BackgroundJobStatus {\r\n switch (value) {\r\n case \"completed\":\r\n case \"failed\":\r\n case \"timed_out\":\r\n return value;\r\n default:\r\n return \"running\";\r\n }\r\n}\r\n\r\nfunction normalizeTimeout(value: unknown): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return 120_000;\r\n }\r\n\r\n return Math.max(1_000, Math.min(600_000, Math.trunc(value)));\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction normalizeId(value: unknown): string {\r\n return String(value ?? \"\").trim().toLowerCase().replace(/[^a-z0-9_-]/g, \"\");\r\n}\r\n\r\nfunction createJobId(): string {\r\n return crypto.randomUUID().replace(/-/g, \"\").slice(0, 8);\r\n}\r\n\r\nfunction formatMarker(status: BackgroundJobStatus): string {\r\n switch (status) {\r\n case \"completed\":\r\n return \"[x]\";\r\n case \"failed\":\r\n return \"[!]\";\r\n case \"timed_out\":\r\n return \"[t]\";\r\n default:\r\n return \"[>]\";\r\n }\r\n}\r\n","import type { SessionRecord } from \"../types.js\";\r\n\r\nexport class AgentTurnError extends Error {\r\n readonly session: SessionRecord;\r\n\r\n constructor(message: string, session: SessionRecord, options?: { cause?: unknown }) {\r\n super(message);\r\n this.name = \"AgentTurnError\";\r\n this.session = session;\r\n\r\n if (options && \"cause\" in options) {\r\n this.cause = options.cause;\r\n }\r\n }\r\n}\r\n\r\nexport function getErrorMessage(error: unknown): string {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const status = (error as { status?: unknown }).status;\r\n const lower = message.toLowerCase();\r\n\r\n if (\r\n status === 401 ||\r\n lower.includes(\"authentication fails\") ||\r\n lower.includes(\"authentication failed\") ||\r\n lower.includes(\"invalid api key\") ||\r\n lower.includes(\"api key is invalid\")\r\n ) {\r\n return \"API 认证失败。请检查当前目录的 .env 里的 ATHLETE_API_KEY 是否正确。\";\r\n }\r\n\r\n return message;\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport path from \"node:path\";\r\n\r\nimport type {\r\n SessionCheckpoint,\r\n SessionCheckpointArtifact,\r\n SessionCheckpointFlow,\r\n SessionCheckpointPhase,\r\n SessionCheckpointToolBatch,\r\n} from \"../../types.js\";\r\n\r\nexport const MAX_COMPLETED_STEPS = 8;\r\nexport const MAX_ARTIFACTS = 6;\r\nexport const MAX_BATCH_TOOLS = 6;\r\nexport const MAX_BATCH_PATHS = 6;\r\nexport const MAX_LABEL_CHARS = 160;\r\nexport const MAX_PREVIEW_CHARS = 240;\r\nexport const MAX_SUMMARY_CHARS = 220;\r\n\r\nexport function fingerprintObjective(objective: string): string {\r\n return crypto.createHash(\"sha1\").update(objective.trim().toLowerCase()).digest(\"hex\");\r\n}\r\n\r\nexport function normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nexport function oneLine(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nexport function truncate(value: string | undefined, maxChars: number): string | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n return value.length <= maxChars ? value : `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\nexport function takeLastUnique(values: string[], limit: number): string[] {\r\n const seen = new Set<string>();\r\n const result: string[] = [];\r\n\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n const normalized = normalizeText(values[index]);\r\n if (!normalized || seen.has(normalized)) {\r\n continue;\r\n }\r\n\r\n seen.add(normalized);\r\n result.unshift(normalized);\r\n if (result.length >= limit) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function normalizeTimestamp(value: unknown, fallback: string): string {\r\n return typeof value === \"string\" && value.trim().length > 0 ? value : fallback;\r\n}\r\n\r\nexport function safeParseObject(raw: string | null | undefined): Record<string, unknown> | null {\r\n if (typeof raw !== \"string\" || raw.trim().length === 0) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(raw) as unknown;\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n return null;\r\n }\r\n\r\n return parsed as Record<string, unknown>;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function readString(value: unknown): string | undefined {\r\n const normalized = normalizeText(value);\r\n return normalized || undefined;\r\n}\r\n\r\nexport function displayPath(cwd: string, candidate: string): string {\r\n if (!path.isAbsolute(candidate)) {\r\n return candidate;\r\n }\r\n\r\n const relative = path.relative(cwd, candidate);\r\n return relative && !relative.startsWith(\"..\") ? relative : candidate;\r\n}\r\n\r\nexport function formatList(values: string[]): string {\r\n return values.length > 0 ? values.join(\" | \") : \"none\";\r\n}\r\n\r\nexport function normalizeArtifacts(artifacts: SessionCheckpointArtifact[]): SessionCheckpointArtifact[] {\r\n const result: SessionCheckpointArtifact[] = [];\r\n const seen = new Set<string>();\r\n\r\n for (const artifact of artifacts) {\r\n const normalized = normalizeArtifact(artifact);\r\n if (!normalized) {\r\n continue;\r\n }\r\n\r\n const key = [\r\n normalized.kind,\r\n normalized.toolName ?? \"\",\r\n normalized.storagePath ?? \"\",\r\n normalized.path ?? \"\",\r\n normalized.label,\r\n ].join(\"|\");\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n result.push(normalized);\r\n if (result.length >= MAX_ARTIFACTS) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function normalizeToolBatch(\r\n toolBatch: SessionCheckpointToolBatch | undefined,\r\n): SessionCheckpointToolBatch | undefined {\r\n if (!toolBatch) {\r\n return undefined;\r\n }\r\n\r\n const tools = takeLastUnique(toolBatch.tools ?? [], MAX_BATCH_TOOLS);\r\n if (tools.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n tools,\r\n summary: truncate(normalizeText(toolBatch.summary) || `Ran ${tools.join(\", \")}`, MAX_SUMMARY_CHARS)!,\r\n changedPaths: takeLastUnique(toolBatch.changedPaths ?? [], MAX_BATCH_PATHS),\r\n artifacts: normalizeArtifacts(toolBatch.artifacts ?? []),\r\n recordedAt: normalizeTimestamp(toolBatch.recordedAt, new Date().toISOString()),\r\n };\r\n}\r\n\r\nexport function normalizeFlow(\r\n flow: SessionCheckpointFlow | undefined,\r\n status: SessionCheckpoint[\"status\"],\r\n timestamp: string,\r\n): SessionCheckpointFlow {\r\n const phase = normalizePhase(flow?.phase, status);\r\n return {\r\n phase,\r\n reason: normalizeText(flow?.reason) || undefined,\r\n recoveryFailures:\r\n phase === \"recovery\" &&\r\n typeof flow?.recoveryFailures === \"number\" &&\r\n Number.isFinite(flow.recoveryFailures)\r\n ? Math.max(1, Math.trunc(flow.recoveryFailures))\r\n : undefined,\r\n updatedAt: normalizeTimestamp(flow?.updatedAt, timestamp),\r\n };\r\n}\r\n\r\nexport function mergeArtifacts(...groups: SessionCheckpointArtifact[][]): SessionCheckpointArtifact[] {\r\n return normalizeArtifacts(groups.flat());\r\n}\r\n\r\nfunction normalizeArtifact(artifact: SessionCheckpointArtifact | undefined): SessionCheckpointArtifact | null {\r\n if (!artifact) {\r\n return null;\r\n }\r\n\r\n const kind = artifact.kind;\r\n if (kind !== \"externalized_tool_result\" && kind !== \"tool_preview\" && kind !== \"pending_path\") {\r\n return null;\r\n }\r\n\r\n const label = normalizeText(artifact.label) || normalizeText(artifact.path) || normalizeText(artifact.storagePath);\r\n if (!label) {\r\n return null;\r\n }\r\n\r\n return {\r\n kind,\r\n label: truncate(label, MAX_LABEL_CHARS)!,\r\n toolName: normalizeText(artifact.toolName) || undefined,\r\n path: normalizeText(artifact.path) || undefined,\r\n storagePath: normalizeText(artifact.storagePath) || undefined,\r\n preview: truncate(normalizeText(artifact.preview), MAX_PREVIEW_CHARS) || undefined,\r\n summary: truncate(normalizeText(artifact.summary), MAX_SUMMARY_CHARS) || undefined,\r\n sha256: normalizeText(artifact.sha256) || undefined,\r\n };\r\n}\r\n\r\nfunction normalizePhase(\r\n value: SessionCheckpointPhase | undefined,\r\n status: SessionCheckpoint[\"status\"],\r\n): SessionCheckpointPhase {\r\n if (status === \"completed\") {\r\n return \"active\";\r\n }\r\n\r\n return value === \"continuation\" || value === \"resume\" || value === \"recovery\" ? value : \"active\";\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { SessionRecord, StoredMessage, TaskState } from \"../types.js\";\r\n\r\nconst MAX_ACTIVE_FILES = 12;\r\nconst MAX_PLANNED_ACTIONS = 8;\r\nconst MAX_COMPLETED_ACTIONS = 12;\r\nconst MAX_BLOCKERS = 8;\r\nconst INTERNAL_PREFIX = \"[internal]\";\r\n\r\nexport function createEmptyTaskState(timestamp = new Date().toISOString()): TaskState {\r\n return {\r\n activeFiles: [],\r\n plannedActions: [],\r\n completedActions: [],\r\n blockers: [],\r\n lastUpdatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function deriveTaskState(messages: StoredMessage[], previous?: TaskState): TaskState {\r\n const now = new Date().toISOString();\r\n const objective = findObjective(messages) ?? previous?.objective;\r\n const objectiveChanged =\r\n typeof previous?.objective === \"string\" &&\r\n typeof objective === \"string\" &&\r\n oneLine(previous.objective).toLowerCase() !== oneLine(objective).toLowerCase();\r\n\r\n if (objectiveChanged) {\r\n return {\r\n objective,\r\n activeFiles: [],\r\n plannedActions: [],\r\n completedActions: [],\r\n blockers: [],\r\n lastUpdatedAt: now,\r\n };\r\n }\r\n\r\n return {\r\n objective,\r\n activeFiles: takeLastUnique(collectActiveFiles(messages), MAX_ACTIVE_FILES),\r\n plannedActions: takeLastUnique(collectPlannedActions(messages), MAX_PLANNED_ACTIONS),\r\n completedActions: takeLastUnique(collectCompletedActions(messages), MAX_COMPLETED_ACTIONS),\r\n blockers: takeLastUnique(collectBlockers(messages), MAX_BLOCKERS),\r\n lastUpdatedAt: now,\r\n };\r\n}\r\n\r\nexport function normalizeTaskState(taskState: TaskState | undefined): TaskState | undefined {\r\n if (!taskState) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n objective: typeof taskState.objective === \"string\" ? taskState.objective : undefined,\r\n activeFiles: takeLastUnique(taskState.activeFiles ?? [], MAX_ACTIVE_FILES),\r\n plannedActions: takeLastUnique(taskState.plannedActions ?? [], MAX_PLANNED_ACTIONS),\r\n completedActions: takeLastUnique(taskState.completedActions ?? [], MAX_COMPLETED_ACTIONS),\r\n blockers: takeLastUnique(taskState.blockers ?? [], MAX_BLOCKERS),\r\n lastUpdatedAt:\r\n typeof taskState.lastUpdatedAt === \"string\" && taskState.lastUpdatedAt.length > 0\r\n ? taskState.lastUpdatedAt\r\n : new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function formatTaskStateBlock(taskState: TaskState | undefined): string {\r\n if (!taskState) {\r\n return \"- none\";\r\n }\r\n\r\n const parts = [\r\n taskState.objective ? `- Objective: ${taskState.objective}` : \"- Objective: none\",\r\n `- Active files: ${formatList(taskState.activeFiles)}`,\r\n `- Planned actions: ${formatList(taskState.plannedActions)}`,\r\n `- Completed actions: ${formatList(taskState.completedActions)}`,\r\n `- Blockers: ${formatList(taskState.blockers)}`,\r\n `- Updated at: ${taskState.lastUpdatedAt}`,\r\n ];\r\n\r\n return parts.join(\"\\n\");\r\n}\r\n\r\nexport function isInternalMessage(content: string | null | undefined): boolean {\r\n return typeof content === \"string\" && content.trim().toLowerCase().startsWith(INTERNAL_PREFIX);\r\n}\r\n\r\nexport function isContinuationDirective(content: string | null | undefined): boolean {\r\n if (typeof content !== \"string\") {\r\n return false;\r\n }\r\n\r\n const normalized = oneLine(content).toLowerCase();\r\n if (!normalized || isInternalMessage(normalized)) {\r\n return false;\r\n }\r\n\r\n return (\r\n /^(continue|resume|go on|keep going|carry on|proceed|continue please|resume please)$/.test(normalized) ||\r\n /^(continue|resume)\\b.*\\b(current|same|existing|task|checkpoint|where you left off)\\b/.test(normalized) ||\r\n /^(继续|继续吧|接着|接着做|继续做|继续处理|继续执行|恢复)$/.test(normalized)\r\n );\r\n}\r\n\r\nexport function createInternalReminder(text: string): string {\r\n return `${INTERNAL_PREFIX} ${text}`.trim();\r\n}\r\n\r\nexport function normalizeSessionRecord(session: SessionRecord): SessionRecord {\r\n return {\r\n ...session,\r\n messageCount: Array.isArray(session.messages) ? session.messages.length : 0,\r\n messages: Array.isArray(session.messages) ? session.messages : [],\r\n taskState: normalizeTaskState(\r\n session.taskState ?? deriveTaskState(Array.isArray(session.messages) ? session.messages : []),\r\n ),\r\n };\r\n}\r\n\r\nfunction findObjective(messages: StoredMessage[]): string | undefined {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const message = messages[index];\r\n if (message?.role !== \"user\" || isInternalMessage(message.content) || isContinuationDirective(message.content)) {\r\n continue;\r\n }\r\n\r\n const normalized = oneLine(message.content ?? \"\");\r\n if (normalized) {\r\n return truncate(normalized, 240);\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction collectActiveFiles(messages: StoredMessage[]): string[] {\r\n const files: string[] = [];\r\n\r\n for (const message of messages) {\r\n if (!message) {\r\n continue;\r\n }\r\n\r\n if (message.role === \"assistant\" && message.tool_calls?.length) {\r\n for (const toolCall of message.tool_calls) {\r\n const parsed = safeParseObject(toolCall.function.arguments);\r\n collectPathsFromValue(parsed, files);\r\n }\r\n continue;\r\n }\r\n\r\n if (message.role === \"tool\") {\r\n const parsed = safeParseObject(message.content ?? \"\");\r\n collectPathsFromValue(parsed, files);\r\n }\r\n }\r\n\r\n return files\r\n .map((value) => normalizeFilePath(value))\r\n .filter(Boolean) as string[];\r\n}\r\n\r\nfunction collectPlannedActions(messages: StoredMessage[]): string[] {\r\n const actions: string[] = [];\r\n\r\n for (const message of messages) {\r\n if (message?.role !== \"assistant\" || !message.tool_calls?.length) {\r\n continue;\r\n }\r\n\r\n const names = message.tool_calls.map((toolCall) => toolCall.function.name).join(\", \");\r\n if (names) {\r\n actions.push(`plan ${names}`);\r\n }\r\n }\r\n\r\n return actions;\r\n}\r\n\r\nfunction collectCompletedActions(messages: StoredMessage[]): string[] {\r\n const actions: string[] = [];\r\n\r\n for (const message of messages) {\r\n if (message?.role !== \"tool\" || !message.name) {\r\n continue;\r\n }\r\n\r\n const parsed = safeParseObject(message.content ?? \"\");\r\n if (parsed && typeof parsed.error === \"string\" && parsed.error.length > 0) {\r\n continue;\r\n }\r\n\r\n actions.push(formatCompletedAction(message.name, parsed));\r\n }\r\n\r\n return actions.filter(Boolean);\r\n}\r\n\r\nfunction collectBlockers(messages: StoredMessage[]): string[] {\r\n const blockers: string[] = [];\r\n\r\n for (const message of messages) {\r\n if (message?.role !== \"tool\") {\r\n continue;\r\n }\r\n\r\n const parsed = safeParseObject(message.content ?? \"\");\r\n if (!parsed || typeof parsed.error !== \"string\" || parsed.error.length === 0) {\r\n continue;\r\n }\r\n\r\n blockers.push(`${message.name ?? \"tool\"}: ${truncate(oneLine(parsed.error), 180)}`);\r\n }\r\n\r\n return blockers;\r\n}\r\n\r\nfunction formatCompletedAction(toolName: string, payload: Record<string, unknown> | null): string {\r\n const pathValue = normalizeFilePath(readPath(payload?.path));\r\n\r\n if (toolName === \"run_shell\") {\r\n const command = typeof payload?.command === \"string\" ? payload.command : \"command\";\r\n const exitCode = typeof payload?.exitCode === \"number\" ? payload.exitCode : \"unknown\";\r\n return `run_shell ${truncate(oneLine(command), 120)} (exit ${exitCode})`;\r\n }\r\n\r\n if (toolName === \"search_files\") {\r\n const count = Array.isArray(payload?.matches) ? payload.matches.length : 0;\r\n return `search_files ${count} match(es)`;\r\n }\r\n\r\n if (toolName === \"list_files\") {\r\n const count = Array.isArray(payload?.entries) ? payload.entries.length : 0;\r\n return `list_files ${count} entr${count === 1 ? \"y\" : \"ies\"}`;\r\n }\r\n\r\n if (toolName === \"apply_patch\") {\r\n const count = Array.isArray(payload?.applied) ? payload.applied.length : 0;\r\n return `apply_patch ${count} file(s)`;\r\n }\r\n\r\n if (toolName === \"load_skill\") {\r\n return \"load_skill\";\r\n }\r\n\r\n if (pathValue) {\r\n return `${toolName} ${truncate(pathValue, 160)}`;\r\n }\r\n\r\n return toolName;\r\n}\r\n\r\nfunction collectPathsFromValue(value: unknown, bucket: string[]): void {\r\n if (!value || typeof value !== \"object\") {\r\n return;\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n for (const item of value) {\r\n collectPathsFromValue(item, bucket);\r\n }\r\n return;\r\n }\r\n\r\n for (const [key, item] of Object.entries(value)) {\r\n if (typeof item === \"string\" && isPathLikeKey(key)) {\r\n bucket.push(item);\r\n continue;\r\n }\r\n\r\n if (Array.isArray(item)) {\r\n for (const nested of item) {\r\n collectPathsFromValue(nested, bucket);\r\n }\r\n continue;\r\n }\r\n\r\n if (item && typeof item === \"object\") {\r\n collectPathsFromValue(item, bucket);\r\n }\r\n }\r\n}\r\n\r\nfunction isPathLikeKey(key: string): boolean {\r\n return key === \"path\" || key === \"cwd\" || key.endsWith(\"Path\");\r\n}\r\n\r\nfunction readPath(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\r\n}\r\n\r\nfunction safeParseObject(raw: string): Record<string, unknown> | null {\r\n try {\r\n const parsed = JSON.parse(raw) as unknown;\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n return null;\r\n }\r\n\r\n return parsed as Record<string, unknown>;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction normalizeFilePath(value: string | undefined): string | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n const trimmed = value.trim();\r\n if (!trimmed || trimmed.startsWith(\"<\") || trimmed.includes(\"\\n\")) {\r\n return undefined;\r\n }\r\n\r\n if (trimmed.length > 260) {\r\n return truncate(trimmed, 260);\r\n }\r\n\r\n return trimmed.includes(path.sep) || trimmed.includes(\"/\") || trimmed.includes(\".\")\r\n ? trimmed\r\n : undefined;\r\n}\r\n\r\nfunction takeLastUnique(values: string[], limit: number): string[] {\r\n const seen = new Set<string>();\r\n const result: string[] = [];\r\n\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n const value = values[index]?.trim();\r\n if (!value || seen.has(value)) {\r\n continue;\r\n }\r\n\r\n seen.add(value);\r\n result.unshift(value);\r\n if (result.length >= limit) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction oneLine(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\nfunction formatList(values: string[]): string {\r\n return values.length > 0 ? values.join(\" | \") : \"none\";\r\n}\r\n","import type { SessionRecord, VerificationAttempt, VerificationState, VerificationStatus } from \"../types.js\";\r\n\r\nconst MAX_PENDING_PATHS = 12;\r\nconst DEFAULT_MAX_ATTEMPTS = 3;\r\nconst DEFAULT_MAX_NO_PROGRESS = 2;\r\nconst DEFAULT_MAX_REMINDERS = 3;\r\n\r\nexport function createEmptyVerificationState(timestamp = new Date().toISOString()): VerificationState {\r\n return {\r\n status: \"idle\",\r\n attempts: 0,\r\n reminderCount: 0,\r\n noProgressCount: 0,\r\n maxAttempts: DEFAULT_MAX_ATTEMPTS,\r\n maxNoProgress: DEFAULT_MAX_NO_PROGRESS,\r\n maxReminders: DEFAULT_MAX_REMINDERS,\r\n pendingPaths: [],\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function normalizeVerificationState(state: VerificationState | undefined): VerificationState | undefined {\r\n if (!state) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n status: normalizeStatus(state.status),\r\n attempts: clampWholeNumber(state.attempts, 0, 50, 0),\r\n reminderCount: clampWholeNumber(state.reminderCount, 0, 50, 0),\r\n noProgressCount: clampWholeNumber(state.noProgressCount, 0, 50, 0),\r\n maxAttempts: clampWholeNumber(state.maxAttempts, 1, 10, DEFAULT_MAX_ATTEMPTS),\r\n maxNoProgress: clampWholeNumber(state.maxNoProgress, 1, 10, DEFAULT_MAX_NO_PROGRESS),\r\n maxReminders: clampWholeNumber(state.maxReminders, 1, 10, DEFAULT_MAX_REMINDERS),\r\n pendingPaths: takeLastUniquePaths(state.pendingPaths ?? [], MAX_PENDING_PATHS),\r\n lastCommand: normalizeText(state.lastCommand) || undefined,\r\n lastKind: normalizeText(state.lastKind) || undefined,\r\n lastExitCode: typeof state.lastExitCode === \"number\" && Number.isFinite(state.lastExitCode)\r\n ? Math.trunc(state.lastExitCode)\r\n : state.lastExitCode === null\r\n ? null\r\n : undefined,\r\n lastFailureSignature: normalizeText(state.lastFailureSignature) || undefined,\r\n pauseReason: normalizeText(state.pauseReason) || undefined,\r\n updatedAt: typeof state.updatedAt === \"string\" && state.updatedAt ? state.updatedAt : new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function normalizeSessionVerificationState(session: SessionRecord): SessionRecord {\r\n return {\r\n ...session,\r\n verificationState: normalizeVerificationState(session.verificationState) ?? createEmptyVerificationState(),\r\n };\r\n}\r\n\r\nexport function markVerificationRequired(\r\n state: VerificationState | undefined,\r\n input: {\r\n pendingPaths?: string[];\r\n } = {},\r\n timestamp = new Date().toISOString(),\r\n): VerificationState {\r\n const current = normalizeVerificationState(state) ?? createEmptyVerificationState(timestamp);\r\n const pendingPaths = takeLastUniquePaths([\r\n ...(input.pendingPaths ?? []),\r\n ...current.pendingPaths,\r\n ], MAX_PENDING_PATHS);\r\n\r\n return {\r\n ...current,\r\n status: \"required\",\r\n attempts: 0,\r\n reminderCount: 0,\r\n noProgressCount: 0,\r\n lastCommand: undefined,\r\n lastKind: undefined,\r\n lastExitCode: undefined,\r\n lastFailureSignature: undefined,\r\n pauseReason: undefined,\r\n pendingPaths,\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function recordVerificationAttempt(\r\n state: VerificationState | undefined,\r\n attempt: VerificationAttempt,\r\n timestamp = new Date().toISOString(),\r\n): VerificationState {\r\n const current = normalizeVerificationState(state) ?? createEmptyVerificationState(timestamp);\r\n const command = normalizeText(attempt.command) || \"verification\";\r\n const kind = normalizeText(attempt.kind) || \"verification\";\r\n const exitCode = typeof attempt.exitCode === \"number\" && Number.isFinite(attempt.exitCode)\r\n ? Math.trunc(attempt.exitCode)\r\n : attempt.exitCode === null\r\n ? null\r\n : null;\r\n const passed = Boolean(attempt.passed ?? (typeof exitCode === \"number\" && exitCode === 0));\r\n\r\n if (passed) {\r\n return {\r\n ...current,\r\n status: \"passed\",\r\n attempts: current.attempts + 1,\r\n reminderCount: 0,\r\n noProgressCount: 0,\r\n pendingPaths: [],\r\n lastCommand: command,\r\n lastKind: kind,\r\n lastExitCode: exitCode,\r\n lastFailureSignature: undefined,\r\n pauseReason: undefined,\r\n updatedAt: timestamp,\r\n };\r\n }\r\n\r\n const signature = `${kind}|${String(exitCode)}|${command.toLowerCase()}`;\r\n const noProgressCount = current.lastFailureSignature === signature ? current.noProgressCount + 1 : 1;\r\n const attempts = current.attempts + 1;\r\n const awaitingUser = attempts >= current.maxAttempts || noProgressCount >= current.maxNoProgress;\r\n\r\n return {\r\n ...current,\r\n status: awaitingUser ? \"awaiting_user\" : \"required\",\r\n attempts,\r\n noProgressCount,\r\n lastCommand: command,\r\n lastKind: kind,\r\n lastExitCode: exitCode,\r\n lastFailureSignature: signature,\r\n pauseReason: awaitingUser\r\n ? buildPauseReason(command, kind, exitCode, attempts, noProgressCount)\r\n : undefined,\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function noteVerificationReminder(\r\n state: VerificationState | undefined,\r\n timestamp = new Date().toISOString(),\r\n): VerificationState {\r\n const current = normalizeVerificationState(state) ?? createEmptyVerificationState(timestamp);\r\n const reminderCount = current.reminderCount + 1;\r\n const awaitingUser = current.attempts === 0 && reminderCount >= current.maxReminders;\r\n\r\n return {\r\n ...current,\r\n status: awaitingUser ? \"awaiting_user\" : current.status === \"idle\" ? \"required\" : current.status,\r\n reminderCount,\r\n pauseReason: awaitingUser\r\n ? \"Verification was requested repeatedly, but no targeted verification command was produced. Pause and wait for the user to clarify the desired check.\"\r\n : current.pauseReason,\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function clearVerificationPause(\r\n state: VerificationState | undefined,\r\n timestamp = new Date().toISOString(),\r\n): VerificationState {\r\n const current = normalizeVerificationState(state) ?? createEmptyVerificationState(timestamp);\r\n return {\r\n ...current,\r\n status: current.pendingPaths.length > 0 ? \"required\" : \"idle\",\r\n pauseReason: undefined,\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function isVerificationRequired(state: VerificationState | undefined): boolean {\r\n const status = normalizeVerificationState(state)?.status;\r\n return status === \"required\" || status === \"awaiting_user\";\r\n}\r\n\r\nexport function isVerificationAwaitingUser(state: VerificationState | undefined): boolean {\r\n return normalizeVerificationState(state)?.status === \"awaiting_user\";\r\n}\r\n\r\nexport function formatVerificationStateBlock(state: VerificationState | undefined): string {\r\n const normalized = normalizeVerificationState(state) ?? createEmptyVerificationState();\r\n const pending = normalized.pendingPaths.length > 0 ? normalized.pendingPaths.join(\" | \") : \"none\";\r\n const last = normalized.lastCommand\r\n ? `${normalized.lastKind ?? \"verification\"}: ${normalized.lastCommand} (exit ${String(normalized.lastExitCode ?? \"unknown\")})`\r\n : \"none\";\r\n const pause = normalized.pauseReason || \"none\";\r\n\r\n return [\r\n `- Status: ${normalized.status}`,\r\n `- Pending paths: ${pending}`,\r\n `- Attempts: ${normalized.attempts}/${normalized.maxAttempts}`,\r\n `- No-progress: ${normalized.noProgressCount}/${normalized.maxNoProgress}`,\r\n `- Reminders: ${normalized.reminderCount}/${normalized.maxReminders}`,\r\n `- Last attempt: ${last}`,\r\n `- Pause reason: ${pause}`,\r\n `- Updated at: ${normalized.updatedAt}`,\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction buildPauseReason(\r\n command: string,\r\n kind: string,\r\n exitCode: number | null,\r\n attempts: number,\r\n noProgressCount: number,\r\n): string {\r\n return `Verification is paused after ${attempts} failed attempt(s) and ${noProgressCount} repeated no-progress result(s). Latest check was ${kind} (${String(exitCode ?? \"unknown\")}): ${command}`;\r\n}\r\n\r\nfunction normalizeStatus(value: unknown): VerificationStatus {\r\n const normalized = normalizeText(value);\r\n return normalized === \"required\" || normalized === \"passed\" || normalized === \"awaiting_user\" ? normalized : \"idle\";\r\n}\r\n\r\nfunction takeLastUniquePaths(values: string[], limit: number): string[] {\r\n const seen = new Set<string>();\r\n const result: string[] = [];\r\n\r\n for (let index = values.length - 1; index >= 0; index -= 1) {\r\n const value = normalizeText(values[index]);\r\n if (!value || seen.has(value)) {\r\n continue;\r\n }\r\n\r\n seen.add(value);\r\n result.unshift(value);\r\n if (result.length >= limit) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction clampWholeNumber(value: unknown, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n return Math.max(min, Math.min(max, Math.trunc(value)));\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { isVerificationRequired } from \"../verificationState.js\";\r\nimport type { ExternalizedToolResultReference, SessionCheckpoint, SessionCheckpointArtifact, SessionCheckpointToolBatch, SessionRecord, StoredMessage } from \"../../types.js\";\r\nimport { displayPath, MAX_ARTIFACTS, MAX_BATCH_PATHS, MAX_BATCH_TOOLS, MAX_COMPLETED_STEPS, MAX_LABEL_CHARS, MAX_PREVIEW_CHARS, MAX_SUMMARY_CHARS, normalizeArtifacts, normalizeText, normalizeTimestamp, oneLine, readString, safeParseObject, takeLastUnique, truncate } from \"./shared.js\";\r\n\r\nexport function deriveCompletedSteps(session: SessionRecord): string[] {\r\n const completedTodos = (session.todoItems ?? [])\r\n .filter((item) => item.status === \"completed\")\r\n .map((item) => normalizeText(item.text))\r\n .filter(Boolean) as string[];\r\n if (completedTodos.length > 0) {\r\n return takeLastUnique(completedTodos, MAX_COMPLETED_STEPS);\r\n }\r\n const completedActions = session.taskState?.completedActions ?? [];\r\n return takeLastUnique(completedActions, MAX_COMPLETED_STEPS);\r\n}\r\n\r\nexport function deriveCurrentStep(\r\n session: SessionRecord,\r\n checkpoint: Pick<SessionCheckpoint, \"status\" | \"recentToolBatch\" | \"flow\" | \"nextStep\">,\r\n): string | undefined {\r\n if (checkpoint.status === \"completed\") {\r\n return undefined;\r\n }\r\n\r\n const inProgressTodo = (session.todoItems ?? []).find((item) => item.status === \"in_progress\");\r\n if (inProgressTodo?.text) {\r\n return normalizeText(inProgressTodo.text) || undefined;\r\n }\r\n if (checkpoint.flow.phase === \"recovery\") {\r\n return checkpoint.nextStep ?? \"Recover the next unresolved step from the latest checkpoint.\";\r\n }\r\n if (checkpoint.recentToolBatch?.summary) {\r\n return checkpoint.recentToolBatch.summary;\r\n }\r\n const firstPlannedAction = session.taskState?.plannedActions?.[0];\r\n return normalizeText(firstPlannedAction) || undefined;\r\n}\r\n\r\nexport function deriveNextStep(\r\n session: SessionRecord,\r\n checkpoint: Pick<SessionCheckpoint, \"status\" | \"recentToolBatch\" | \"completedSteps\">,\r\n): string | undefined {\r\n if (checkpoint.status === \"completed\") {\r\n return undefined;\r\n }\r\n\r\n const pendingTodo = (session.todoItems ?? []).find((item) => item.status === \"pending\");\r\n if (pendingTodo?.text) {\r\n return normalizeText(pendingTodo.text) || undefined;\r\n }\r\n if (isVerificationRequired(session.verificationState) && (session.verificationState?.pendingPaths?.length ?? 0) > 0) {\r\n return `Run targeted verification for ${session.verificationState?.pendingPaths?.slice(0, 3).join(\" | \")}`;\r\n }\r\n\r\n const completedSet = new Set((checkpoint.completedSteps ?? []).map((step) => step.toLowerCase()));\r\n const firstPlannedAction = (session.taskState?.plannedActions ?? []).find((action) => {\r\n const normalized = normalizeText(action);\r\n return normalized && !completedSet.has(normalized.toLowerCase());\r\n });\r\n if (firstPlannedAction) {\r\n return normalizeText(firstPlannedAction) || undefined;\r\n }\r\n if ((checkpoint.recentToolBatch?.artifacts.length ?? 0) > 0) {\r\n return \"Use the stored artifact previews from the recent tool batch before rereading full outputs.\";\r\n }\r\n if ((checkpoint.recentToolBatch?.tools.length ?? 0) > 0) {\r\n return `Continue from the recent tool batch without repeating ${checkpoint.recentToolBatch?.tools.join(\", \")}.`;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function derivePendingPathArtifacts(session: SessionRecord): SessionCheckpointArtifact[] {\r\n return takeLastUnique(session.verificationState?.pendingPaths ?? [], MAX_ARTIFACTS).map((pendingPath) => ({\r\n kind: \"pending_path\",\r\n label: truncate(displayPath(session.cwd, pendingPath), MAX_LABEL_CHARS)!,\r\n path: pendingPath,\r\n }));\r\n}\r\n\r\nexport function deriveRecentToolBatchFromMessages(\r\n messages: StoredMessage[],\r\n timestamp: string,\r\n): SessionCheckpointToolBatch | undefined {\r\n let lastToolIndex = messages.length - 1;\r\n while (lastToolIndex >= 0 && messages[lastToolIndex]?.role !== \"tool\") {\r\n lastToolIndex -= 1;\r\n }\r\n\r\n if (lastToolIndex < 0) {\r\n return undefined;\r\n }\r\n let startIndex = lastToolIndex;\r\n while (startIndex >= 0 && messages[startIndex]?.role === \"tool\") {\r\n startIndex -= 1;\r\n }\r\n\r\n const toolMessages = messages\r\n .slice(startIndex + 1, lastToolIndex + 1)\r\n .filter((message) => message.role === \"tool\");\r\n const toolNames = toolMessages\r\n .map((message) => normalizeText(message.name))\r\n .filter(Boolean) as string[];\r\n\r\n return buildToolBatch(toolNames, toolMessages, undefined, timestamp);\r\n}\r\n\r\nexport function buildToolBatch(\r\n toolNames: string[],\r\n toolMessages: StoredMessage[],\r\n changedPaths: string[] | undefined,\r\n timestamp: string,\r\n): SessionCheckpointToolBatch | undefined {\r\n const tools = takeLastUnique(toolNames, MAX_BATCH_TOOLS);\r\n if (tools.length === 0) {\r\n return undefined;\r\n }\r\n const artifacts = normalizeArtifacts(\r\n toolMessages.flatMap((message) => createArtifactsFromMessage(message)),\r\n );\r\n const batchChangedPaths = takeLastUnique(\r\n [\r\n ...(changedPaths ?? []),\r\n ...toolMessages\r\n .map((message) => readPathFromMessage(message))\r\n .filter(Boolean) as string[],\r\n ],\r\n MAX_BATCH_PATHS,\r\n );\r\n const recordedAt = normalizeTimestamp(\r\n toolMessages[toolMessages.length - 1]?.createdAt,\r\n timestamp,\r\n );\r\n\r\n return {\r\n tools,\r\n summary: buildToolBatchSummary(tools, batchChangedPaths, artifacts),\r\n changedPaths: batchChangedPaths,\r\n artifacts,\r\n recordedAt,\r\n };\r\n}\r\n\r\nfunction createArtifactsFromMessage(message: StoredMessage): SessionCheckpointArtifact[] {\r\n const payload = safeParseObject(message.content);\r\n const artifacts: SessionCheckpointArtifact[] = [];\r\n\r\n const externalized = message.externalizedToolResult ?? readExternalizedResult(payload);\r\n if (externalized) {\r\n artifacts.push({\r\n kind: \"externalized_tool_result\",\r\n label: buildArtifactLabel(message.name, payload, externalized.storagePath),\r\n toolName: normalizeText(message.name) || undefined,\r\n path: readString(payload?.path),\r\n storagePath: externalized.storagePath,\r\n preview: truncate(readString(payload?.preview) ?? externalized.preview, MAX_PREVIEW_CHARS),\r\n summary: truncate(readString(payload?.summary), MAX_SUMMARY_CHARS),\r\n sha256: externalized.sha256,\r\n });\r\n } else if (payload && (readString(payload.preview) || readString(payload.path))) {\r\n artifacts.push({\r\n kind: \"tool_preview\",\r\n label: buildArtifactLabel(message.name, payload, readString(payload.path)),\r\n toolName: normalizeText(message.name) || undefined,\r\n path: readString(payload.path),\r\n preview: truncate(readString(payload.preview), MAX_PREVIEW_CHARS),\r\n summary: truncate(readString(payload.summary), MAX_SUMMARY_CHARS),\r\n });\r\n }\r\n\r\n return artifacts;\r\n}\r\n\r\nfunction readPathFromMessage(message: StoredMessage): string | undefined {\r\n const payload = safeParseObject(message.content);\r\n return readString(payload?.path) ?? readString(payload?.requestedPath);\r\n}\r\n\r\nfunction buildToolBatchSummary(\r\n toolNames: string[],\r\n changedPaths: string[],\r\n artifacts: SessionCheckpointArtifact[],\r\n): string {\r\n const fragments = [`Ran ${toolNames.join(\", \")}`];\r\n\r\n if (changedPaths.length > 0) {\r\n fragments.push(`changed ${changedPaths.join(\" | \")}`);\r\n }\r\n if (artifacts.length > 0) {\r\n fragments.push(`artifacts ${artifacts.map((artifact) => artifact.label).join(\" | \")}`);\r\n }\r\n return truncate(fragments.join(\"; \"), MAX_SUMMARY_CHARS)!;\r\n}\r\n\r\nfunction buildArtifactLabel(\r\n toolName: string | undefined,\r\n payload: Record<string, unknown> | null,\r\n fallbackPath: string | undefined,\r\n): string {\r\n const primary =\r\n readString(payload?.path) ??\r\n readString(payload?.title) ??\r\n readString(payload?.summary) ??\r\n fallbackPath ??\r\n toolName ??\r\n \"tool artifact\";\r\n\r\n return truncate(oneLine(primary), MAX_LABEL_CHARS)!;\r\n}\r\n\r\nfunction readExternalizedResult(\r\n payload: Record<string, unknown> | null,\r\n): ExternalizedToolResultReference | undefined {\r\n if (!payload) {\r\n return undefined;\r\n }\r\n const storagePath = readString(payload.storagePath);\r\n if (!storagePath) {\r\n return undefined;\r\n }\r\n\r\n return {\r\n scope: \"project_state_root\",\r\n storagePath,\r\n byteLength:\r\n typeof payload.byteLength === \"number\" && Number.isFinite(payload.byteLength)\r\n ? Math.trunc(payload.byteLength)\r\n : 0,\r\n charLength:\r\n typeof payload.charLength === \"number\" && Number.isFinite(payload.charLength)\r\n ? Math.trunc(payload.charLength)\r\n : 0,\r\n preview: readString(payload.preview) ?? \"\",\r\n sha256: readString(payload.sha256) ?? \"\",\r\n };\r\n}\r\n","import type { SessionCheckpoint, SessionRecord } from \"../../types.js\";\r\nimport {\r\n deriveCompletedSteps,\r\n deriveCurrentStep,\r\n deriveNextStep,\r\n derivePendingPathArtifacts,\r\n deriveRecentToolBatchFromMessages,\r\n} from \"./derivation.js\";\r\nimport { fingerprintObjective, mergeArtifacts, normalizeText } from \"./shared.js\";\r\n\r\nexport function createEmptyCheckpoint(timestamp = new Date().toISOString()): SessionCheckpoint {\r\n return {\r\n version: 1,\r\n status: \"active\",\r\n completedSteps: [],\r\n flow: {\r\n phase: \"active\",\r\n updatedAt: timestamp,\r\n },\r\n priorityArtifacts: [],\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function createCheckpointForObjective(\r\n objective: string | undefined,\r\n timestamp: string,\r\n): SessionCheckpoint {\r\n return {\r\n ...createEmptyCheckpoint(timestamp),\r\n objective,\r\n objectiveFingerprint: objective ? fingerprintObjective(objective) : undefined,\r\n };\r\n}\r\n\r\nexport function deriveCheckpointFromSession(\r\n session: SessionRecord,\r\n timestamp: string,\r\n): SessionCheckpoint {\r\n const recentToolBatch = deriveRecentToolBatchFromMessages(session.messages, timestamp);\r\n\r\n return {\r\n ...createCheckpointForObjective(normalizeText(session.taskState?.objective) || undefined, timestamp),\r\n completedSteps: deriveCompletedSteps(session),\r\n currentStep: deriveCurrentStep(session, {\r\n ...createEmptyCheckpoint(timestamp),\r\n recentToolBatch,\r\n }),\r\n nextStep: deriveNextStep(session, {\r\n ...createEmptyCheckpoint(timestamp),\r\n recentToolBatch,\r\n }),\r\n recentToolBatch,\r\n priorityArtifacts: mergeArtifacts(\r\n recentToolBatch?.artifacts ?? [],\r\n derivePendingPathArtifacts(session),\r\n ),\r\n };\r\n}\r\n","import { isContinuationDirective, isInternalMessage } from \"../taskState.js\";\r\nimport type { SessionCheckpoint, SessionCheckpointPhase, SessionRecord, StoredMessage } from \"../../types.js\";\r\nimport { createCheckpointForObjective, createEmptyCheckpoint, deriveCheckpointFromSession } from \"./base.js\";\r\nimport {\r\n buildToolBatch,\r\n deriveCompletedSteps,\r\n deriveCurrentStep,\r\n deriveNextStep,\r\n derivePendingPathArtifacts,\r\n} from \"./derivation.js\";\r\nimport {\r\n fingerprintObjective,\r\n mergeArtifacts,\r\n normalizeArtifacts,\r\n normalizeFlow,\r\n normalizeText,\r\n normalizeTimestamp,\r\n normalizeToolBatch,\r\n takeLastUnique,\r\n} from \"./shared.js\";\r\n\r\nexport { createEmptyCheckpoint } from \"./base.js\";\r\n\r\ninterface ToolBatchUpdateInput {\r\n toolNames: string[];\r\n toolMessages: StoredMessage[];\r\n changedPaths?: string[];\r\n}\r\n\r\nexport function normalizeCheckpoint(\r\n checkpoint: SessionCheckpoint | undefined,\r\n timestamp = new Date().toISOString(),\r\n): SessionCheckpoint | undefined {\r\n if (!checkpoint) {\r\n return undefined;\r\n }\r\n\r\n const objective = normalizeText(checkpoint.objective) || undefined;\r\n const status = checkpoint.status === \"completed\" ? \"completed\" : \"active\";\r\n\r\n return {\r\n version: 1,\r\n objective,\r\n objectiveFingerprint:\r\n normalizeText(checkpoint.objectiveFingerprint) || (objective ? fingerprintObjective(objective) : undefined),\r\n status,\r\n completedSteps: takeLastUnique(checkpoint.completedSteps ?? [], 8),\r\n currentStep: status === \"completed\" ? undefined : normalizeText(checkpoint.currentStep) || undefined,\r\n nextStep: status === \"completed\" ? undefined : normalizeText(checkpoint.nextStep) || undefined,\r\n recentToolBatch: normalizeToolBatch(checkpoint.recentToolBatch),\r\n flow: normalizeFlow(checkpoint.flow, status, timestamp),\r\n priorityArtifacts:\r\n status === \"completed\"\r\n ? []\r\n : normalizeArtifacts(checkpoint.priorityArtifacts ?? []),\r\n updatedAt: normalizeTimestamp(checkpoint.updatedAt, timestamp),\r\n };\r\n}\r\n\r\nexport function normalizeSessionCheckpoint(session: SessionRecord): SessionRecord {\r\n const timestamp = new Date().toISOString();\r\n const objective = normalizeText(session.taskState?.objective) || undefined;\r\n const fingerprint = objective ? fingerprintObjective(objective) : undefined;\r\n const normalized = normalizeCheckpoint(session.checkpoint, timestamp);\r\n const objectiveChanged =\r\n Boolean(normalized?.objectiveFingerprint && fingerprint) && normalized?.objectiveFingerprint !== fingerprint;\r\n\r\n let checkpoint = objectiveChanged\r\n ? createCheckpointForObjective(objective, timestamp)\r\n : normalized ?? deriveCheckpointFromSession(session, timestamp);\r\n\r\n if (objective) {\r\n checkpoint.objective = objective;\r\n checkpoint.objectiveFingerprint = fingerprint;\r\n } else {\r\n checkpoint.objective = undefined;\r\n checkpoint.objectiveFingerprint = undefined;\r\n }\r\n\r\n if (!objectiveChanged && checkpoint.completedSteps.length === 0) {\r\n checkpoint.completedSteps = deriveCompletedSteps(session);\r\n }\r\n\r\n if (checkpoint.status !== \"completed\" && !objectiveChanged) {\r\n checkpoint.currentStep = checkpoint.currentStep ?? deriveCurrentStep(session, checkpoint);\r\n checkpoint.nextStep = checkpoint.nextStep ?? deriveNextStep(session, checkpoint);\r\n checkpoint.priorityArtifacts = mergeArtifacts(\r\n checkpoint.priorityArtifacts,\r\n checkpoint.recentToolBatch?.artifacts ?? [],\r\n derivePendingPathArtifacts(session),\r\n );\r\n }\r\n\r\n if (objectiveChanged) {\r\n checkpoint.status = \"active\";\r\n checkpoint.currentStep = undefined;\r\n checkpoint.nextStep = undefined;\r\n checkpoint.recentToolBatch = undefined;\r\n checkpoint.priorityArtifacts = [];\r\n }\r\n\r\n checkpoint.flow = normalizeFlow(checkpoint.flow, checkpoint.status, timestamp);\r\n checkpoint.updatedAt = normalizeTimestamp(checkpoint.updatedAt, timestamp);\r\n\r\n return {\r\n ...session,\r\n checkpoint,\r\n };\r\n}\r\n\r\nexport function noteCheckpointTurnInput(\r\n session: SessionRecord,\r\n input: string,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const checkpoint = normalizeSessionCheckpoint(session).checkpoint ?? createEmptyCheckpoint(timestamp);\r\n const phase: SessionCheckpointPhase =\r\n isInternalMessage(input)\r\n ? \"continuation\"\r\n : isContinuationDirective(input)\r\n ? \"resume\"\r\n : \"active\";\r\n\r\n return {\r\n ...session,\r\n checkpoint: {\r\n ...checkpoint,\r\n flow: {\r\n phase,\r\n reason:\r\n phase === \"continuation\"\r\n ? \"managed continuation\"\r\n : phase === \"resume\"\r\n ? \"session resume\"\r\n : undefined,\r\n updatedAt: timestamp,\r\n },\r\n currentStep:\r\n checkpoint.status === \"completed\"\r\n ? undefined\r\n : checkpoint.currentStep ?? deriveCurrentStep(session, checkpoint),\r\n nextStep:\r\n checkpoint.status === \"completed\"\r\n ? undefined\r\n : checkpoint.nextStep ?? deriveNextStep(session, checkpoint),\r\n updatedAt: timestamp,\r\n },\r\n };\r\n}\r\n\r\nexport function noteCheckpointRecovery(\r\n session: SessionRecord,\r\n consecutiveFailures: number,\r\n error: unknown,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const checkpoint = normalizeSessionCheckpoint(session).checkpoint ?? createEmptyCheckpoint(timestamp);\r\n\r\n if (checkpoint.status === \"completed\") {\r\n return {\r\n ...session,\r\n checkpoint,\r\n };\r\n }\r\n\r\n return {\r\n ...session,\r\n checkpoint: {\r\n ...checkpoint,\r\n currentStep: checkpoint.currentStep ?? deriveCurrentStep(session, checkpoint) ?? checkpoint.nextStep,\r\n nextStep:\r\n checkpoint.nextStep ??\r\n deriveNextStep(session, checkpoint) ??\r\n \"Retry the next unresolved step from the latest checkpoint instead of restarting.\",\r\n flow: {\r\n phase: \"recovery\",\r\n reason: normalizeText((error as { message?: unknown })?.message ?? error) || undefined,\r\n recoveryFailures: consecutiveFailures,\r\n updatedAt: timestamp,\r\n },\r\n updatedAt: timestamp,\r\n },\r\n };\r\n}\r\n\r\nexport function noteCheckpointYield(\r\n session: SessionRecord,\r\n yieldReason: string | undefined,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const checkpoint = normalizeSessionCheckpoint(session).checkpoint ?? createEmptyCheckpoint(timestamp);\r\n\r\n if (checkpoint.status === \"completed\") {\r\n return {\r\n ...session,\r\n checkpoint,\r\n };\r\n }\r\n\r\n return {\r\n ...session,\r\n checkpoint: {\r\n ...checkpoint,\r\n currentStep:\r\n checkpoint.currentStep ??\r\n deriveCurrentStep(session, checkpoint) ??\r\n \"Paused between tool batches\",\r\n nextStep:\r\n checkpoint.nextStep ??\r\n deriveNextStep(session, checkpoint) ??\r\n \"Continue from the latest checkpoint without repeating completed work.\",\r\n flow: {\r\n phase: \"continuation\",\r\n reason: normalizeText(yieldReason) || \"yielded between tool batches\",\r\n updatedAt: timestamp,\r\n },\r\n updatedAt: timestamp,\r\n },\r\n };\r\n}\r\n\r\nexport function noteCheckpointToolBatch(\r\n session: SessionRecord,\r\n input: ToolBatchUpdateInput,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const checkpoint = normalizeSessionCheckpoint(session).checkpoint ?? createEmptyCheckpoint(timestamp);\r\n const recentToolBatch = buildToolBatch(input.toolNames, input.toolMessages, input.changedPaths, timestamp);\r\n const phase = checkpoint.flow.phase === \"recovery\" ? \"active\" : checkpoint.flow.phase;\r\n\r\n return {\r\n ...session,\r\n checkpoint: {\r\n ...checkpoint,\r\n completedSteps: deriveCompletedSteps(session),\r\n currentStep:\r\n checkpoint.status === \"completed\"\r\n ? undefined\r\n : deriveCurrentStep(session, {\r\n ...checkpoint,\r\n recentToolBatch,\r\n }),\r\n nextStep:\r\n checkpoint.status === \"completed\"\r\n ? undefined\r\n : deriveNextStep(session, {\r\n ...checkpoint,\r\n recentToolBatch,\r\n }),\r\n recentToolBatch,\r\n priorityArtifacts:\r\n checkpoint.status === \"completed\"\r\n ? []\r\n : mergeArtifacts(\r\n recentToolBatch?.artifacts ?? [],\r\n checkpoint.priorityArtifacts,\r\n derivePendingPathArtifacts(session),\r\n ),\r\n flow: {\r\n phase,\r\n reason:\r\n phase === \"active\"\r\n ? undefined\r\n : checkpoint.flow.reason,\r\n updatedAt: timestamp,\r\n },\r\n updatedAt: timestamp,\r\n },\r\n };\r\n}\r\n\r\nexport function noteCheckpointCompleted(\r\n session: SessionRecord,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const checkpoint = normalizeSessionCheckpoint(session).checkpoint ?? createEmptyCheckpoint(timestamp);\r\n\r\n return {\r\n ...session,\r\n checkpoint: {\r\n ...checkpoint,\r\n status: \"completed\",\r\n completedSteps:\r\n checkpoint.completedSteps.length > 0 ? checkpoint.completedSteps : deriveCompletedSteps(session),\r\n currentStep: undefined,\r\n nextStep: undefined,\r\n priorityArtifacts: [],\r\n flow: {\r\n phase: \"active\",\r\n updatedAt: timestamp,\r\n },\r\n updatedAt: timestamp,\r\n },\r\n };\r\n}\r\n","import type { AgentIdentity } from \"../types.js\";\r\nimport type { SessionCheckpoint, SessionCheckpointArtifact, SessionCheckpointFlow } from \"../../types.js\";\r\nimport { formatList } from \"./shared.js\";\r\nimport { normalizeCheckpoint } from \"./state.js\";\r\n\r\nexport function buildCheckpointContinuationInput(\r\n identity: AgentIdentity | undefined,\r\n checkpoint: SessionCheckpoint | undefined,\r\n): string {\r\n const fallback = buildGenericContinuationInput(identity);\r\n const normalized = normalizeCheckpoint(checkpoint);\r\n\r\n if (!normalized?.objective) {\r\n return fallback;\r\n }\r\n\r\n const subject =\r\n identity?.kind === \"teammate\"\r\n ? \"teammate task\"\r\n : identity?.kind === \"subagent\"\r\n ? \"delegated subtask\"\r\n : \"task\";\r\n const lines = [\r\n `[internal] Resume the current ${subject} from the persisted checkpoint. Continue without restarting.`,\r\n `Objective: ${normalized.objective}`,\r\n ];\r\n\r\n if (normalized.completedSteps.length > 0) {\r\n lines.push(`Completed steps: ${normalized.completedSteps.join(\" | \")}`);\r\n }\r\n if (normalized.currentStep) {\r\n lines.push(`Current step: ${normalized.currentStep}`);\r\n }\r\n if (normalized.nextStep) {\r\n lines.push(`Next best step: ${normalized.nextStep}`);\r\n }\r\n if (normalized.recentToolBatch?.summary) {\r\n lines.push(`Recent tool batch: ${normalized.recentToolBatch.summary}`);\r\n }\r\n if (normalized.priorityArtifacts.length > 0) {\r\n lines.push(\r\n `Priority artifacts: ${normalized.priorityArtifacts\r\n .slice(0, 3)\r\n .map(formatArtifactReminder)\r\n .join(\" | \")}`,\r\n );\r\n }\r\n\r\n lines.push(\r\n \"Reuse finished work, stored artifacts, previews, and pending paths before calling tools again.\",\r\n );\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport function formatCheckpointBlock(checkpoint: SessionCheckpoint | undefined): string {\r\n const normalized = normalizeCheckpoint(checkpoint);\r\n if (!normalized) {\r\n return \"- none\";\r\n }\r\n\r\n return [\r\n `- Objective: ${normalized.objective ?? \"none\"}`,\r\n `- Status: ${normalized.status}`,\r\n `- Runtime phase: ${formatRuntimePhase(normalized.flow)}`,\r\n `- Completed steps: ${formatList(normalized.completedSteps)}`,\r\n `- Current step: ${normalized.currentStep ?? \"none\"}`,\r\n `- Next step: ${normalized.nextStep ?? \"none\"}`,\r\n `- Recent tool batch: ${normalized.recentToolBatch?.summary ?? \"none\"}`,\r\n `- Priority artifacts: ${formatArtifacts(normalized.priorityArtifacts)}`,\r\n `- Updated at: ${normalized.updatedAt}`,\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function buildGenericContinuationInput(identity: AgentIdentity | undefined): string {\r\n switch (identity?.kind) {\r\n case \"teammate\":\r\n return \"[internal] Resume the current teammate task from the latest progress. Continue without restarting.\";\r\n case \"subagent\":\r\n return \"[internal] Resume the delegated subtask from the latest progress. Continue without restarting.\";\r\n default:\r\n return \"[internal] Resume the current task from the latest progress. Continue without restarting.\";\r\n }\r\n}\r\n\r\nfunction formatRuntimePhase(flow: SessionCheckpointFlow): string {\r\n const recoveryFailures =\r\n typeof flow.recoveryFailures === \"number\" && Number.isFinite(flow.recoveryFailures)\r\n ? `, failures=${flow.recoveryFailures}`\r\n : \"\";\r\n\r\n return flow.reason ? `${flow.phase}${recoveryFailures} (${flow.reason})` : `${flow.phase}${recoveryFailures}`;\r\n}\r\n\r\nfunction formatArtifacts(artifacts: SessionCheckpointArtifact[]): string {\r\n if (artifacts.length === 0) {\r\n return \"none\";\r\n }\r\n\r\n return artifacts.map(formatArtifactReminder).join(\" | \");\r\n}\r\n\r\nfunction formatArtifactReminder(artifact: SessionCheckpointArtifact): string {\r\n const detail = artifact.storagePath ?? artifact.path ?? artifact.label;\r\n return `${artifact.kind}: ${detail}`;\r\n}\r\n","export {\r\n buildCheckpointContinuationInput,\r\n buildGenericContinuationInput,\r\n formatCheckpointBlock,\r\n} from \"./checkpoint/prompt.js\";\r\n\r\nexport {\r\n createEmptyCheckpoint,\r\n normalizeCheckpoint,\r\n normalizeSessionCheckpoint,\r\n noteCheckpointCompleted,\r\n noteCheckpointRecovery,\r\n noteCheckpointToolBatch,\r\n noteCheckpointTurnInput,\r\n noteCheckpointYield,\r\n} from \"./checkpoint/state.js\";\r\n","import { isContinuationDirective, isInternalMessage } from \"../taskState.js\";\r\nimport type {\r\n ExternalizedToolResultReference,\r\n SessionRecord,\r\n SessionRuntimeStats,\r\n SessionRuntimeToolStats,\r\n} from \"../../types.js\";\r\n\r\nexport interface ProviderUsageSnapshot {\r\n inputTokens?: number;\r\n outputTokens?: number;\r\n totalTokens?: number;\r\n reasoningTokens?: number;\r\n}\r\n\r\nexport interface ModelRequestMetric {\r\n durationMs: number;\r\n usage?: ProviderUsageSnapshot;\r\n}\r\n\r\nexport interface ToolExecutionMetric {\r\n toolName: string;\r\n durationMs: number;\r\n ok: boolean;\r\n externalizedToolResult?: ExternalizedToolResultReference;\r\n}\r\n\r\nexport function createEmptyRuntimeStats(timestamp = new Date().toISOString()): SessionRuntimeStats {\r\n return {\r\n version: 1,\r\n model: {\r\n requestCount: 0,\r\n waitDurationMsTotal: 0,\r\n usage: {\r\n requestsWithUsage: 0,\r\n requestsWithoutUsage: 0,\r\n inputTokensTotal: 0,\r\n outputTokensTotal: 0,\r\n totalTokensTotal: 0,\r\n reasoningTokensTotal: 0,\r\n },\r\n },\r\n tools: {\r\n callCount: 0,\r\n durationMsTotal: 0,\r\n byName: {},\r\n },\r\n events: {\r\n continuationCount: 0,\r\n yieldCount: 0,\r\n recoveryCount: 0,\r\n compressionCount: 0,\r\n },\r\n externalizedToolResults: {\r\n count: 0,\r\n byteLengthTotal: 0,\r\n },\r\n updatedAt: timestamp,\r\n };\r\n}\r\n\r\nexport function normalizeRuntimeStats(\r\n runtimeStats: SessionRuntimeStats | undefined,\r\n timestamp = new Date().toISOString(),\r\n): SessionRuntimeStats {\r\n const base = createEmptyRuntimeStats(timestamp);\r\n const usage = runtimeStats?.model?.usage;\r\n\r\n return {\r\n version: 1,\r\n model: {\r\n requestCount: normalizeNumber(runtimeStats?.model?.requestCount),\r\n waitDurationMsTotal: normalizeNumber(runtimeStats?.model?.waitDurationMsTotal),\r\n usage: {\r\n requestsWithUsage: normalizeNumber(usage?.requestsWithUsage),\r\n requestsWithoutUsage: normalizeNumber(usage?.requestsWithoutUsage),\r\n inputTokensTotal: normalizeNumber(usage?.inputTokensTotal),\r\n outputTokensTotal: normalizeNumber(usage?.outputTokensTotal),\r\n totalTokensTotal: normalizeNumber(usage?.totalTokensTotal),\r\n reasoningTokensTotal: normalizeNumber(usage?.reasoningTokensTotal),\r\n },\r\n },\r\n tools: {\r\n callCount: normalizeNumber(runtimeStats?.tools?.callCount),\r\n durationMsTotal: normalizeNumber(runtimeStats?.tools?.durationMsTotal),\r\n byName: normalizeToolMap(runtimeStats?.tools?.byName),\r\n },\r\n events: {\r\n continuationCount: normalizeNumber(runtimeStats?.events?.continuationCount),\r\n yieldCount: normalizeNumber(runtimeStats?.events?.yieldCount),\r\n recoveryCount: normalizeNumber(runtimeStats?.events?.recoveryCount),\r\n compressionCount: normalizeNumber(runtimeStats?.events?.compressionCount),\r\n },\r\n externalizedToolResults: {\r\n count: normalizeNumber(runtimeStats?.externalizedToolResults?.count),\r\n byteLengthTotal: normalizeNumber(runtimeStats?.externalizedToolResults?.byteLengthTotal),\r\n },\r\n updatedAt: normalizeTimestamp(runtimeStats?.updatedAt, base.updatedAt),\r\n };\r\n}\r\n\r\nexport function normalizeSessionRuntimeStats(session: SessionRecord): SessionRecord {\r\n return { ...session, runtimeStats: normalizeRuntimeStats(session.runtimeStats) };\r\n}\r\n\r\nexport function noteRuntimeTurnInput(\r\n session: SessionRecord,\r\n input: string,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n if (!isInternalMessage(input) && !isContinuationDirective(input)) {\r\n return withRuntimeStats(session, normalizeRuntimeStats(session.runtimeStats, timestamp));\r\n }\r\n\r\n return bumpRuntimeEvent(session, \"continuationCount\", timestamp);\r\n}\r\n\r\nexport function noteRuntimeYield(session: SessionRecord, timestamp = new Date().toISOString()): SessionRecord {\r\n return bumpRuntimeEvent(session, \"yieldCount\", timestamp);\r\n}\r\n\r\nexport function noteRuntimeRecovery(\r\n session: SessionRecord,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n return bumpRuntimeEvent(session, \"recoveryCount\", timestamp);\r\n}\r\n\r\nexport function noteRuntimeCompression(\r\n session: SessionRecord,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n return bumpRuntimeEvent(session, \"compressionCount\", timestamp);\r\n}\r\n\r\nexport function noteRuntimeModelRequests(\r\n session: SessionRecord,\r\n metrics: ModelRequestMetric[],\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n if (metrics.length === 0) {\r\n return withRuntimeStats(session, normalizeRuntimeStats(session.runtimeStats, timestamp));\r\n }\r\n\r\n const runtimeStats = normalizeRuntimeStats(session.runtimeStats, timestamp);\r\n for (const metric of metrics) {\r\n runtimeStats.model.requestCount += 1;\r\n runtimeStats.model.waitDurationMsTotal += normalizeNumber(metric.durationMs);\r\n\r\n if (hasUsage(metric.usage)) {\r\n runtimeStats.model.usage.requestsWithUsage += 1;\r\n runtimeStats.model.usage.inputTokensTotal += normalizeNumber(metric.usage?.inputTokens);\r\n runtimeStats.model.usage.outputTokensTotal += normalizeNumber(metric.usage?.outputTokens);\r\n runtimeStats.model.usage.totalTokensTotal += normalizeNumber(metric.usage?.totalTokens);\r\n runtimeStats.model.usage.reasoningTokensTotal += normalizeNumber(metric.usage?.reasoningTokens);\r\n } else {\r\n runtimeStats.model.usage.requestsWithoutUsage += 1;\r\n }\r\n }\r\n\r\n runtimeStats.updatedAt = timestamp;\r\n return withRuntimeStats(session, runtimeStats);\r\n}\r\n\r\nexport function noteRuntimeToolExecution(\r\n session: SessionRecord,\r\n metric: ToolExecutionMetric,\r\n timestamp = new Date().toISOString(),\r\n): SessionRecord {\r\n const runtimeStats = normalizeRuntimeStats(session.runtimeStats, timestamp);\r\n const toolName = normalizeToolName(metric.toolName);\r\n const toolStats = runtimeStats.tools.byName[toolName] ?? createEmptyToolStats();\r\n\r\n runtimeStats.tools.callCount += 1;\r\n runtimeStats.tools.durationMsTotal += normalizeNumber(metric.durationMs);\r\n toolStats.callCount += 1;\r\n toolStats.durationMsTotal += normalizeNumber(metric.durationMs);\r\n if (metric.ok) {\r\n toolStats.okCount += 1;\r\n } else {\r\n toolStats.errorCount += 1;\r\n }\r\n runtimeStats.tools.byName[toolName] = toolStats;\r\n\r\n if (metric.externalizedToolResult) {\r\n runtimeStats.externalizedToolResults.count += 1;\r\n runtimeStats.externalizedToolResults.byteLengthTotal += normalizeNumber(metric.externalizedToolResult.byteLength);\r\n }\r\n\r\n runtimeStats.updatedAt = timestamp;\r\n return withRuntimeStats(session, runtimeStats);\r\n}\r\n\r\nfunction normalizeToolMap(\r\n value: Record<string, SessionRuntimeToolStats> | undefined,\r\n): Record<string, SessionRuntimeToolStats> {\r\n const entries = Object.entries(value ?? {});\r\n return Object.fromEntries(entries.map(([key, stats]) => [normalizeToolName(key), normalizeToolStats(stats)]));\r\n}\r\n\r\nfunction normalizeToolStats(value: SessionRuntimeToolStats | undefined): SessionRuntimeToolStats {\r\n return {\r\n callCount: normalizeNumber(value?.callCount),\r\n durationMsTotal: normalizeNumber(value?.durationMsTotal),\r\n okCount: normalizeNumber(value?.okCount),\r\n errorCount: normalizeNumber(value?.errorCount),\r\n };\r\n}\r\n\r\nfunction bumpRuntimeEvent(\r\n session: SessionRecord,\r\n field: keyof SessionRuntimeStats[\"events\"],\r\n timestamp: string,\r\n): SessionRecord {\r\n const runtimeStats = normalizeRuntimeStats(session.runtimeStats, timestamp);\r\n runtimeStats.events[field] += 1;\r\n runtimeStats.updatedAt = timestamp;\r\n return withRuntimeStats(session, runtimeStats);\r\n}\r\n\r\nfunction withRuntimeStats(session: SessionRecord, runtimeStats: SessionRuntimeStats): SessionRecord {\r\n return {\r\n ...session,\r\n runtimeStats,\r\n };\r\n}\r\n\r\nfunction createEmptyToolStats(): SessionRuntimeToolStats {\r\n return {\r\n callCount: 0,\r\n durationMsTotal: 0,\r\n okCount: 0,\r\n errorCount: 0,\r\n };\r\n}\r\n\r\nfunction hasUsage(usage: ProviderUsageSnapshot | undefined): boolean {\r\n return [\r\n usage?.inputTokens,\r\n usage?.outputTokens,\r\n usage?.totalTokens,\r\n usage?.reasoningTokens,\r\n ].some((value) => typeof value === \"number\" && Number.isFinite(value));\r\n}\r\n\r\nfunction normalizeNumber(value: unknown): number {\r\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? Math.round(value) : 0;\r\n}\r\n\r\nfunction normalizeTimestamp(value: unknown, fallback: string): string {\r\n return typeof value === \"string\" && value.trim().length > 0 ? value : fallback;\r\n}\r\n\r\nfunction normalizeToolName(value: string): string {\r\n const normalized = String(value ?? \"\").trim();\r\n return normalized.length > 0 ? normalized : \"unknown_tool\";\r\n}\r\n","import type { SessionRecord, SessionRuntimeToolStats } from \"../../types.js\";\r\nimport { normalizeRuntimeStats } from \"./state.js\";\r\n\r\nexport type RuntimeUsageAvailability = \"available\" | \"partial\" | \"unavailable\";\r\nexport type RuntimeHealthStatus = \"healthy\" | \"warning\" | \"recovering\";\r\n\r\nexport interface SessionRuntimeSummary {\r\n health: {\r\n status: RuntimeHealthStatus;\r\n reasons: string[];\r\n };\r\n usage: {\r\n availability: RuntimeUsageAvailability;\r\n requestsWithUsage: number;\r\n requestsWithoutUsage: number;\r\n inputTokensTotal: number;\r\n outputTokensTotal: number;\r\n totalTokensTotal: number;\r\n reasoningTokensTotal: number;\r\n };\r\n modelRequests: number;\r\n modelWaitDurationMsTotal: number;\r\n toolCalls: number;\r\n toolDurationMsTotal: number;\r\n yields: number;\r\n continuations: number;\r\n recoveries: number;\r\n compressions: number;\r\n externalizedResults: {\r\n count: number;\r\n byteLengthTotal: number;\r\n };\r\n topTools: Array<{\r\n name: string;\r\n callCount: number;\r\n durationMsTotal: number;\r\n okCount: number;\r\n errorCount: number;\r\n }>;\r\n slowestStep: {\r\n key: string;\r\n label: string;\r\n durationMsTotal: number;\r\n };\r\n}\r\n\r\nexport function buildSessionRuntimeSummary(\r\n session: Pick<SessionRecord, \"runtimeStats\" | \"checkpoint\" | \"verificationState\">,\r\n): SessionRuntimeSummary {\r\n const stats = normalizeRuntimeStats(session.runtimeStats);\r\n const topTools = Object.entries(stats.tools.byName)\r\n .map(([name, toolStats]) => ({\r\n name,\r\n ...normalizeToolStats(toolStats),\r\n }))\r\n .sort((left, right) =>\r\n right.durationMsTotal - left.durationMsTotal ||\r\n right.callCount - left.callCount ||\r\n left.name.localeCompare(right.name),\r\n );\r\n\r\n const usageAvailability = getUsageAvailability(\r\n stats.model.usage.requestsWithUsage,\r\n stats.model.usage.requestsWithoutUsage,\r\n );\r\n\r\n return {\r\n health: buildHealth(session, stats.events.recoveryCount),\r\n usage: {\r\n availability: usageAvailability,\r\n requestsWithUsage: stats.model.usage.requestsWithUsage,\r\n requestsWithoutUsage: stats.model.usage.requestsWithoutUsage,\r\n inputTokensTotal: stats.model.usage.inputTokensTotal,\r\n outputTokensTotal: stats.model.usage.outputTokensTotal,\r\n totalTokensTotal: stats.model.usage.totalTokensTotal,\r\n reasoningTokensTotal: stats.model.usage.reasoningTokensTotal,\r\n },\r\n modelRequests: stats.model.requestCount,\r\n modelWaitDurationMsTotal: stats.model.waitDurationMsTotal,\r\n toolCalls: stats.tools.callCount,\r\n toolDurationMsTotal: stats.tools.durationMsTotal,\r\n yields: stats.events.yieldCount,\r\n continuations: stats.events.continuationCount,\r\n recoveries: stats.events.recoveryCount,\r\n compressions: stats.events.compressionCount,\r\n externalizedResults: {\r\n count: stats.externalizedToolResults.count,\r\n byteLengthTotal: stats.externalizedToolResults.byteLengthTotal,\r\n },\r\n topTools,\r\n slowestStep: pickSlowestStep(stats.model.waitDurationMsTotal, topTools),\r\n };\r\n}\r\n\r\nfunction buildHealth(\r\n session: Pick<SessionRecord, \"checkpoint\" | \"verificationState\">,\r\n recoveryCount: number,\r\n): SessionRuntimeSummary[\"health\"] {\r\n const reasons: string[] = [];\r\n const recovering = session.checkpoint?.flow?.phase === \"recovery\";\r\n\r\n if (recovering) {\r\n reasons.push(\"checkpoint is currently in recovery\");\r\n }\r\n if (session.verificationState?.status === \"awaiting_user\") {\r\n reasons.push(\"verification is waiting on user input\");\r\n } else if (session.verificationState?.status === \"required\") {\r\n reasons.push(\"verification is still required\");\r\n }\r\n if (recoveryCount > 0) {\r\n reasons.push(`provider recovery triggered ${recoveryCount} time(s)`);\r\n }\r\n\r\n if (recovering) {\r\n return { status: \"recovering\", reasons };\r\n }\r\n if (reasons.length > 0) {\r\n return { status: \"warning\", reasons };\r\n }\r\n\r\n return { status: \"healthy\", reasons: [] };\r\n}\r\n\r\nfunction getUsageAvailability(\r\n requestsWithUsage: number,\r\n requestsWithoutUsage: number,\r\n): RuntimeUsageAvailability {\r\n if (requestsWithUsage === 0) {\r\n return \"unavailable\";\r\n }\r\n if (requestsWithoutUsage === 0) {\r\n return \"available\";\r\n }\r\n return \"partial\";\r\n}\r\n\r\nfunction normalizeToolStats(toolStats: SessionRuntimeToolStats): SessionRuntimeToolStats {\r\n return {\r\n callCount: toolStats.callCount,\r\n durationMsTotal: toolStats.durationMsTotal,\r\n okCount: toolStats.okCount,\r\n errorCount: toolStats.errorCount,\r\n };\r\n}\r\n\r\nfunction pickSlowestStep(\r\n modelWaitDurationMsTotal: number,\r\n topTools: SessionRuntimeSummary[\"topTools\"],\r\n): SessionRuntimeSummary[\"slowestStep\"] {\r\n const topTool = topTools[0];\r\n if (!topTool && modelWaitDurationMsTotal <= 0) {\r\n return {\r\n key: \"none\",\r\n label: \"no timed runtime activity yet\",\r\n durationMsTotal: 0,\r\n };\r\n }\r\n\r\n if (!topTool || modelWaitDurationMsTotal >= topTool.durationMsTotal) {\r\n return {\r\n key: \"model_wait\",\r\n label: \"model wait\",\r\n durationMsTotal: modelWaitDurationMsTotal,\r\n };\r\n }\r\n\r\n return {\r\n key: `tool:${topTool.name}`,\r\n label: `tool ${topTool.name}`,\r\n durationMsTotal: topTool.durationMsTotal,\r\n };\r\n}\r\n","export {\r\n createEmptyRuntimeStats,\r\n normalizeRuntimeStats,\r\n normalizeSessionRuntimeStats,\r\n noteRuntimeCompression,\r\n noteRuntimeModelRequests,\r\n noteRuntimeRecovery,\r\n noteRuntimeToolExecution,\r\n noteRuntimeTurnInput,\r\n noteRuntimeYield,\r\n} from \"./runtimeMetrics/state.js\";\r\n\r\nexport type {\r\n ModelRequestMetric,\r\n ProviderUsageSnapshot,\r\n ToolExecutionMetric,\r\n} from \"./runtimeMetrics/state.js\";\r\n\r\nexport {\r\n buildSessionRuntimeSummary,\r\n} from \"./runtimeMetrics/summary.js\";\r\n\r\nexport type {\r\n RuntimeHealthStatus,\r\n RuntimeUsageAvailability,\r\n SessionRuntimeSummary,\r\n} from \"./runtimeMetrics/summary.js\";\r\n","import type { SessionRecord, StoredMessage, TodoItem, TodoStatus } from \"../types.js\";\r\n\r\nconst MAX_TODO_ITEMS = 20;\r\nconst MAX_TODO_TEXT_CHARS = 240;\r\n\r\nexport function deriveTodoItems(messages: StoredMessage[], previous: TodoItem[] = []): TodoItem[] {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const message = messages[index];\r\n if (message?.role !== \"tool\" || message.name !== \"todo_write\" || typeof message.content !== \"string\") {\r\n continue;\r\n }\r\n\r\n const parsed = safeParseJson(message.content);\r\n if (!parsed || typeof parsed !== \"object\" || !(\"items\" in parsed)) {\r\n continue;\r\n }\r\n\r\n try {\r\n return normalizeTodoItems((parsed as { items?: unknown }).items);\r\n } catch {\r\n continue;\r\n }\r\n }\r\n\r\n return normalizeTodoItems(previous);\r\n}\r\n\r\nexport function normalizeTodoItems(value: unknown): TodoItem[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n if (value.length > MAX_TODO_ITEMS) {\r\n throw new Error(`Too many todo items: max ${MAX_TODO_ITEMS}.`);\r\n }\r\n\r\n const normalized: TodoItem[] = [];\r\n const seenIds = new Set<string>();\r\n let inProgressCount = 0;\r\n\r\n for (const entry of value) {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\r\n throw new Error(\"Each todo item must be an object.\");\r\n }\r\n\r\n const record = entry as Record<string, unknown>;\r\n const id = String(record.id ?? \"\").trim();\r\n const text = compactTodoText(record.text);\r\n const status = normalizeTodoStatus(record.status);\r\n\r\n if (!id) {\r\n throw new Error(\"Todo item id is required.\");\r\n }\r\n\r\n if (!text) {\r\n throw new Error(`Todo item ${id} text is required.`);\r\n }\r\n\r\n if (seenIds.has(id)) {\r\n throw new Error(`Duplicate todo item id: ${id}.`);\r\n }\r\n\r\n seenIds.add(id);\r\n\r\n if (status === \"in_progress\") {\r\n inProgressCount += 1;\r\n if (inProgressCount > 1) {\r\n throw new Error(\"Only one todo item can be in_progress.\");\r\n }\r\n }\r\n\r\n normalized.push({\r\n id,\r\n text,\r\n status,\r\n });\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nexport function formatTodoBlock(items: TodoItem[] | undefined): string {\r\n const todos = normalizeTodoItems(items);\r\n if (todos.length === 0) {\r\n return \"- none\";\r\n }\r\n\r\n const lines = todos.map((item) => `${statusMarker(item.status)} #${item.id}: ${item.text}`);\r\n const completed = todos.filter((item) => item.status === \"completed\").length;\r\n lines.push(`- Progress: ${completed}/${todos.length} completed`);\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport function summarizeTodoItems(items: TodoItem[] | undefined): string {\r\n const todos = normalizeTodoItems(items);\r\n if (todos.length === 0) {\r\n return \"No todos.\";\r\n }\r\n\r\n const completed = todos.filter((item) => item.status === \"completed\").length;\r\n return `${completed}/${todos.length} completed`;\r\n}\r\n\r\nexport function hasIncompleteTodos(items: TodoItem[] | undefined): boolean {\r\n return normalizeTodoItems(items).some((item) => item.status !== \"completed\");\r\n}\r\n\r\nexport function normalizeSessionTodos(session: SessionRecord): SessionRecord {\r\n return {\r\n ...session,\r\n todoItems: deriveTodoItems(session.messages ?? [], session.todoItems ?? []),\r\n };\r\n}\r\n\r\nfunction normalizeTodoStatus(value: unknown): TodoStatus {\r\n const normalized = String(value ?? \"\").trim().toLowerCase();\r\n if (normalized === \"pending\" || normalized === \"in_progress\" || normalized === \"completed\") {\r\n return normalized;\r\n }\r\n\r\n throw new Error(`Invalid todo status: ${String(value ?? \"\")}.`);\r\n}\r\n\r\nfunction compactTodoText(value: unknown): string {\r\n const normalized = String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n if (normalized.length <= MAX_TODO_TEXT_CHARS) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, MAX_TODO_TEXT_CHARS)}...`;\r\n}\r\n\r\nfunction statusMarker(status: TodoStatus): string {\r\n switch (status) {\r\n case \"completed\":\r\n return \"[x]\";\r\n case \"in_progress\":\r\n return \"[>]\";\r\n default:\r\n return \"[ ]\";\r\n }\r\n}\r\n\r\nfunction safeParseJson(raw: string): unknown {\r\n try {\r\n return JSON.parse(raw) as unknown;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { SessionRecord, StoredMessage } from \"../types.js\";\r\nimport { createEmptyCheckpoint, normalizeSessionCheckpoint } from \"./checkpoint.js\";\r\nimport { createEmptyRuntimeStats, normalizeSessionRuntimeStats } from \"./runtimeMetrics.js\";\r\nimport { createEmptyTaskState, deriveTaskState, normalizeSessionRecord as normalizeTaskStateSessionRecord } from \"./taskState.js\";\r\nimport { deriveTodoItems } from \"./todos.js\";\r\nimport { createEmptyVerificationState, normalizeSessionVerificationState } from \"./verificationState.js\";\r\n\r\nexport interface SessionStoreLike {\r\n create(cwd: string): Promise<SessionRecord>;\r\n save(session: SessionRecord): Promise<SessionRecord>;\r\n load(id: string): Promise<SessionRecord>;\r\n loadLatest(): Promise<SessionRecord | null>;\r\n list(limit?: number): Promise<SessionRecord[]>;\r\n appendMessages(session: SessionRecord, messages: StoredMessage[]): Promise<SessionRecord>;\r\n}\r\n\r\nexport class SessionStore implements SessionStoreLike {\r\n constructor(private readonly sessionsDir: string) {}\r\n\r\n async create(cwd: string): Promise<SessionRecord> {\r\n return createSessionRecord(cwd);\r\n }\r\n\r\n async save(session: SessionRecord): Promise<SessionRecord> {\r\n const updated = prepareSessionRecord(session);\r\n await fs.mkdir(this.sessionsDir, { recursive: true });\r\n await fs.writeFile(this.getPath(updated.id), `${JSON.stringify(updated, null, 2)}\\n`, \"utf8\");\r\n return updated;\r\n }\r\n\r\n async load(id: string): Promise<SessionRecord> {\r\n const raw = await fs.readFile(this.getPath(id), \"utf8\");\r\n return normalizeStoredSessionRecord(JSON.parse(raw) as SessionRecord);\r\n }\r\n\r\n async loadLatest(): Promise<SessionRecord | null> {\r\n const sessions = await this.list(1);\r\n return sessions[0] ?? null;\r\n }\r\n\r\n async list(limit = 20): Promise<SessionRecord[]> {\r\n await fs.mkdir(this.sessionsDir, { recursive: true });\r\n const entries = await fs.readdir(this.sessionsDir, { withFileTypes: true });\r\n\r\n const sessions = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\r\n .map(async (entry) => {\r\n const raw = await fs.readFile(path.join(this.sessionsDir, entry.name), \"utf8\");\r\n return normalizeStoredSessionRecord(JSON.parse(raw) as SessionRecord);\r\n }),\r\n );\r\n\r\n return sessions\r\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))\r\n .slice(0, limit);\r\n }\r\n\r\n async appendMessages(session: SessionRecord, messages: StoredMessage[]): Promise<SessionRecord> {\r\n const next = prepareSessionRecord({\r\n ...session,\r\n messages: [...session.messages, ...messages],\r\n });\r\n return this.save(next);\r\n }\r\n\r\n private getPath(id: string): string {\r\n return path.join(this.sessionsDir, `${id}.json`);\r\n }\r\n}\r\n\r\nexport class MemorySessionStore implements SessionStoreLike {\r\n private readonly sessions = new Map<string, SessionRecord>();\r\n\r\n async create(cwd: string): Promise<SessionRecord> {\r\n return createSessionRecord(cwd);\r\n }\r\n\r\n async save(session: SessionRecord): Promise<SessionRecord> {\r\n const prepared = prepareSessionRecord(session);\r\n this.sessions.set(prepared.id, prepared);\r\n return prepared;\r\n }\r\n\r\n async load(id: string): Promise<SessionRecord> {\r\n const session = this.sessions.get(id);\r\n if (!session) {\r\n throw new Error(`Unknown session: ${id}`);\r\n }\r\n\r\n return session;\r\n }\r\n\r\n async loadLatest(): Promise<SessionRecord | null> {\r\n const sessions = await this.list(1);\r\n return sessions[0] ?? null;\r\n }\r\n\r\n async list(limit = 20): Promise<SessionRecord[]> {\r\n return [...this.sessions.values()]\r\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))\r\n .slice(0, limit);\r\n }\r\n\r\n async appendMessages(session: SessionRecord, messages: StoredMessage[]): Promise<SessionRecord> {\r\n return this.save({\r\n ...session,\r\n messages: [...session.messages, ...messages],\r\n });\r\n }\r\n}\r\n\r\nexport async function createSessionRecord(cwd: string): Promise<SessionRecord> {\r\n const timestamp = new Date().toISOString();\r\n return prepareSessionRecord({\r\n id: createSessionId(),\r\n createdAt: timestamp,\r\n updatedAt: timestamp,\r\n cwd,\r\n messageCount: 0,\r\n messages: [],\r\n todoItems: [],\r\n taskState: createEmptyTaskState(timestamp),\r\n checkpoint: createEmptyCheckpoint(timestamp),\r\n verificationState: createEmptyVerificationState(timestamp),\r\n runtimeStats: createEmptyRuntimeStats(timestamp),\r\n });\r\n}\r\n\r\nfunction prepareSessionRecord(session: SessionRecord): SessionRecord {\r\n const normalizedMessages = Array.isArray(session.messages) ? session.messages : [];\r\n const verificationNormalized = normalizeSessionVerificationState(session).verificationState;\r\n const prepared = {\r\n ...session,\r\n updatedAt: new Date().toISOString(),\r\n title: session.title ?? deriveSessionTitle(normalizedMessages),\r\n messageCount: normalizedMessages.length,\r\n messages: normalizedMessages,\r\n todoItems: deriveTodoItems(normalizedMessages, session.todoItems ?? []),\r\n taskState: deriveTaskState(normalizedMessages, session.taskState),\r\n verificationState: verificationNormalized,\r\n };\r\n\r\n return normalizeSessionRuntimeStats(normalizeSessionCheckpoint(prepared));\r\n}\r\n\r\nfunction normalizeStoredSessionRecord(session: SessionRecord): SessionRecord {\r\n const normalized = normalizeSessionRuntimeStats(normalizeSessionCheckpoint(\r\n normalizeSessionVerificationState(normalizeTaskStateSessionRecord(session)),\r\n ));\r\n return {\r\n ...normalized,\r\n todoItems: deriveTodoItems(normalized.messages ?? [], normalized.todoItems ?? []),\r\n };\r\n}\r\n\r\nfunction createSessionId(): string {\r\n const date = new Date().toISOString().replace(/[-:.TZ]/g, \"\").slice(0, 14);\r\n const random = crypto.randomUUID().slice(0, 8);\r\n return `${date}-${random}`;\r\n}\r\n\r\nfunction deriveSessionTitle(messages: StoredMessage[]): string | undefined {\r\n const firstUserMessage = messages.find((message) => message.role === \"user\" && message.content);\r\n if (!firstUserMessage?.content) {\r\n return undefined;\r\n }\r\n\r\n const normalized = firstUserMessage.content.replace(/\\s+/g, \" \").trim();\r\n return normalized.slice(0, 80);\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ChangeOperationRecord, ChangeRecord } from \"../types.js\";\r\n\r\nexport interface RecordChangeOperation {\r\n path: string;\r\n kind: \"create\" | \"update\" | \"delete\";\r\n beforeData?: Buffer;\r\n afterData?: Buffer;\r\n binary: boolean;\r\n preview?: string;\r\n}\r\n\r\nexport interface RecordChangeInput {\r\n sessionId?: string;\r\n cwd: string;\r\n toolName: string;\r\n summary: string;\r\n preview?: string;\r\n operations: RecordChangeOperation[];\r\n}\r\n\r\nexport interface UndoChangeResult {\r\n record: ChangeRecord;\r\n restoredPaths: string[];\r\n}\r\n\r\nexport class ChangeStore {\r\n constructor(private readonly changesDir: string) {}\r\n\r\n async record(input: RecordChangeInput): Promise<ChangeRecord> {\r\n const id = createChangeId();\r\n const timestamp = new Date().toISOString();\r\n const blobDir = path.join(this.changesDir, id);\r\n\r\n await fs.mkdir(blobDir, { recursive: true });\r\n\r\n const operations = await Promise.all(\r\n input.operations.map(async (operation, index) => {\r\n const beforeSnapshotPath = await this.writeSnapshot(\r\n blobDir,\r\n `${index}.before`,\r\n operation.beforeData,\r\n );\r\n const afterSnapshotPath = await this.writeSnapshot(\r\n blobDir,\r\n `${index}.after`,\r\n operation.afterData,\r\n );\r\n\r\n const record: ChangeOperationRecord = {\r\n path: operation.path,\r\n kind: operation.kind,\r\n binary: operation.binary,\r\n preview: operation.preview,\r\n };\r\n\r\n if (beforeSnapshotPath) {\r\n record.beforeSnapshotPath = beforeSnapshotPath;\r\n record.beforeBytes = operation.beforeData?.byteLength;\r\n }\r\n\r\n if (afterSnapshotPath) {\r\n record.afterSnapshotPath = afterSnapshotPath;\r\n record.afterBytes = operation.afterData?.byteLength;\r\n }\r\n\r\n return record;\r\n }),\r\n );\r\n\r\n const record: ChangeRecord = {\r\n id,\r\n createdAt: timestamp,\r\n sessionId: input.sessionId,\r\n cwd: input.cwd,\r\n toolName: input.toolName,\r\n summary: input.summary,\r\n preview: input.preview,\r\n operations,\r\n };\r\n\r\n await fs.mkdir(this.changesDir, { recursive: true });\r\n await fs.writeFile(this.getMetadataPath(id), `${JSON.stringify(record, null, 2)}\\n`, \"utf8\");\r\n return record;\r\n }\r\n\r\n async list(limit = 20): Promise<ChangeRecord[]> {\r\n await fs.mkdir(this.changesDir, { recursive: true });\r\n const entries = await fs.readdir(this.changesDir, { withFileTypes: true });\r\n\r\n const changes = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\r\n .map(async (entry) => this.load(path.basename(entry.name, \".json\"))),\r\n );\r\n\r\n return changes\r\n .sort((left, right) => right.createdAt.localeCompare(left.createdAt))\r\n .slice(0, limit);\r\n }\r\n\r\n async load(id: string): Promise<ChangeRecord> {\r\n const raw = await fs.readFile(this.getMetadataPath(id), \"utf8\");\r\n return JSON.parse(raw) as ChangeRecord;\r\n }\r\n\r\n async loadLatestUndoable(): Promise<ChangeRecord | null> {\r\n const changes = await this.list(200);\r\n return changes.find((record) => !record.undoneAt) ?? null;\r\n }\r\n\r\n async undo(changeId?: string): Promise<UndoChangeResult> {\r\n const record = changeId ? await this.load(changeId) : await this.loadLatestUndoable();\r\n if (!record) {\r\n throw new Error(\"No recorded change is available to undo.\");\r\n }\r\n\r\n if (record.undoneAt) {\r\n throw new Error(`Change ${record.id} was already undone at ${record.undoneAt}.`);\r\n }\r\n\r\n const restoredPaths: string[] = [];\r\n\r\n for (let index = record.operations.length - 1; index >= 0; index -= 1) {\r\n const operation = record.operations[index];\r\n if (!operation) {\r\n continue;\r\n }\r\n\r\n restoredPaths.push(operation.path);\r\n\r\n if (operation.beforeSnapshotPath) {\r\n const buffer = await this.readSnapshot(operation.beforeSnapshotPath);\r\n await fs.mkdir(path.dirname(operation.path), { recursive: true });\r\n await fs.writeFile(operation.path, buffer);\r\n continue;\r\n }\r\n\r\n await fs.rm(operation.path, { force: true });\r\n }\r\n\r\n const updated: ChangeRecord = {\r\n ...record,\r\n undoneAt: new Date().toISOString(),\r\n };\r\n await fs.writeFile(this.getMetadataPath(updated.id), `${JSON.stringify(updated, null, 2)}\\n`, \"utf8\");\r\n\r\n return {\r\n record: updated,\r\n restoredPaths: restoredPaths.reverse(),\r\n };\r\n }\r\n\r\n private getMetadataPath(id: string): string {\r\n return path.join(this.changesDir, `${id}.json`);\r\n }\r\n\r\n private async writeSnapshot(\r\n blobDir: string,\r\n label: string,\r\n buffer: Buffer | undefined,\r\n ): Promise<string | undefined> {\r\n if (!buffer) {\r\n return undefined;\r\n }\r\n\r\n const fileName = `${label}.bin`;\r\n const absolutePath = path.join(blobDir, fileName);\r\n await fs.writeFile(absolutePath, buffer);\r\n return path.relative(this.changesDir, absolutePath);\r\n }\r\n\r\n private async readSnapshot(relativePath: string): Promise<Buffer> {\r\n return fs.readFile(path.join(this.changesDir, relativePath));\r\n }\r\n}\r\n\r\nfunction createChangeId(): string {\r\n const date = new Date().toISOString().replace(/[-:.TZ]/g, \"\").slice(0, 14);\r\n const random = crypto.randomUUID().slice(0, 8);\r\n return `${date}-${random}`;\r\n}\r\n","import type { ChatCompletionMessageParam } from \"openai/resources/chat/completions\";\r\n\r\nimport type { ExternalizedToolResultReference, StoredMessage, ToolCallRecord } from \"../types.js\";\r\n\r\nexport function buildChatMessages(\r\n systemPrompt: string,\r\n messages: StoredMessage[],\r\n contextWindowMessages: number,\r\n model: string,\r\n): ChatCompletionMessageParam[] {\r\n const recentMessages = messages.slice(-contextWindowMessages);\r\n\r\n return [\r\n {\r\n role: \"system\",\r\n content: systemPrompt,\r\n },\r\n ...recentMessages.map((message, index) =>\r\n toChatMessage(message, {\r\n includeReasoning: shouldIncludeStoredAssistantReasoning(recentMessages, index, model),\r\n }),\r\n ),\r\n ];\r\n}\r\n\r\nexport function createMessage(\r\n role: StoredMessage[\"role\"],\r\n content: string | null,\r\n options: {\r\n reasoningContent?: string;\r\n toolCalls?: ToolCallRecord[];\r\n name?: string;\r\n } = {},\r\n): StoredMessage {\r\n return {\r\n role,\r\n content,\r\n name: options.name,\r\n tool_calls: options.toolCalls,\r\n reasoningContent: options.reasoningContent,\r\n createdAt: new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function createToolMessage(\r\n toolCallId: string,\r\n content: string,\r\n name: string,\r\n options: {\r\n externalizedToolResult?: ExternalizedToolResultReference;\r\n } = {},\r\n): StoredMessage {\r\n return {\r\n role: \"tool\",\r\n content,\r\n tool_call_id: toolCallId,\r\n name,\r\n externalizedToolResult: options.externalizedToolResult,\r\n createdAt: new Date().toISOString(),\r\n };\r\n}\r\n\r\nexport function readReasoningContent(message: unknown): string | undefined {\r\n const candidate = (message as { reasoning_content?: unknown }).reasoning_content;\r\n return typeof candidate === \"string\" && candidate.length > 0 ? candidate : undefined;\r\n}\r\n\r\nexport function collapseContentParts(content: unknown): string | null {\r\n if (!Array.isArray(content)) {\r\n return null;\r\n }\r\n\r\n const fragments = content\r\n .map((part) => {\r\n if (part && typeof part === \"object\" && \"text\" in part && typeof part.text === \"string\") {\r\n return part.text;\r\n }\r\n\r\n return \"\";\r\n })\r\n .filter(Boolean);\r\n\r\n return fragments.length > 0 ? fragments.join(\"\") : null;\r\n}\r\n\r\nexport function toChatMessage(\r\n message: StoredMessage,\r\n options: { includeReasoning: boolean },\r\n): ChatCompletionMessageParam {\r\n if (message.role === \"tool\") {\r\n return {\r\n role: \"tool\",\r\n content: message.content ?? \"\",\r\n tool_call_id: message.tool_call_id ?? \"\",\r\n };\r\n }\r\n\r\n if (message.role === \"assistant\" && message.tool_calls?.length) {\r\n const assistantMessage: Record<string, unknown> = {\r\n role: \"assistant\",\r\n content: message.content,\r\n tool_calls: message.tool_calls,\r\n };\r\n\r\n if (options.includeReasoning && message.reasoningContent) {\r\n assistantMessage.reasoning_content = message.reasoningContent;\r\n }\r\n\r\n return assistantMessage as unknown as ChatCompletionMessageParam;\r\n }\r\n\r\n const baseMessage: Record<string, unknown> = {\r\n role: message.role,\r\n content: message.content ?? \"\",\r\n name: message.name,\r\n };\r\n\r\n if (message.role === \"assistant\" && options.includeReasoning && message.reasoningContent) {\r\n baseMessage.reasoning_content = message.reasoningContent;\r\n }\r\n\r\n return baseMessage as unknown as ChatCompletionMessageParam;\r\n}\r\n\r\nexport function findLatestUserIndex<T extends { role: string }>(messages: T[]): number {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n if (messages[index]?.role === \"user\") {\r\n return index;\r\n }\r\n }\r\n\r\n return -1;\r\n}\r\n\r\nexport function expandStartToToolBoundary<T extends { role: string; tool_calls?: unknown }>(\r\n messages: T[],\r\n startIndex: number,\r\n): number {\r\n let index = Math.max(0, Math.min(startIndex, messages.length - 1));\r\n\r\n while (index > 0 && messages[index]?.role === \"tool\") {\r\n index -= 1;\r\n }\r\n\r\n return index;\r\n}\r\n\r\nexport function modelUsesReasoningContent(model: string): boolean {\r\n return model === \"deepseek-reasoner\" || model === \"deepseek-chat\";\r\n}\r\n\r\nexport function isAssistantMessageInLatestTurn<T extends { role: string }>(\r\n messages: T[],\r\n index: number,\r\n): boolean {\r\n return messages[index]?.role === \"assistant\" && index > findLatestUserIndex(messages);\r\n}\r\n\r\nexport function shouldIncludeStoredAssistantReasoning(\r\n messages: StoredMessage[],\r\n index: number,\r\n model: string,\r\n): boolean {\r\n return (\r\n modelUsesReasoningContent(model) &&\r\n isAssistantMessageInLatestTurn(messages, index) &&\r\n Boolean(messages[index]?.reasoningContent)\r\n );\r\n}\r\n","import type { LoadedSkill, SkillRuntimeState } from \"./types.js\";\r\n\r\nexport function formatSkillPromptBlock(\r\n discoveredSkills: LoadedSkill[],\r\n runtimeState: SkillRuntimeState,\r\n): string {\r\n const lines = [\r\n \"Loaded skills:\",\r\n formatSkillLines(runtimeState.loadedSkills, \"loaded\"),\r\n \"\",\r\n \"Selected skills for this turn:\",\r\n formatSkillLines(\r\n [...runtimeState.requiredSkills, ...runtimeState.suggestedSkills, ...runtimeState.namedSkills],\r\n \"selected\",\r\n ),\r\n \"\",\r\n \"Required skills still missing:\",\r\n runtimeState.missingRequiredSkills.length > 0\r\n ? runtimeState.missingRequiredSkills.map((skill) => `- ${skill.name}`).join(\"\\n\")\r\n : \"- none\",\r\n \"\",\r\n \"Discovered project skill catalog:\",\r\n formatSkillLines(discoveredSkills, \"catalog\"),\r\n ];\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction formatSkillLines(skills: LoadedSkill[], mode: \"loaded\" | \"selected\" | \"catalog\"): string {\r\n if (skills.length === 0) {\r\n return \"- none\";\r\n }\r\n\r\n return skills.map((skill) => formatSkillLine(skill, mode)).join(\"\\n\");\r\n}\r\n\r\nfunction formatSkillLine(skill: LoadedSkill, mode: \"loaded\" | \"selected\" | \"catalog\"): string {\r\n const scopes = [\r\n `load=${skill.loadMode}`,\r\n skill.agentKinds.length > 0 ? `agents=${skill.agentKinds.join(\"/\")}` : \"\",\r\n skill.roles.length > 0 ? `roles=${skill.roles.join(\"/\")}` : \"\",\r\n skill.taskTypes.length > 0 ? `tasks=${skill.taskTypes.join(\"/\")}` : \"\",\r\n skill.scenes.length > 0 ? `scenes=${skill.scenes.join(\"/\")}` : \"\",\r\n skill.tools.required.length > 0 ? `requires=${skill.tools.required.join(\"/\")}` : \"\",\r\n skill.tools.incompatible.length > 0 ? `incompatible=${skill.tools.incompatible.join(\"/\")}` : \"\",\r\n ].filter(Boolean);\r\n const triggerText =\r\n skill.triggers.keywords.length > 0 ? ` triggers=${skill.triggers.keywords.join(\"/\")}` : \"\";\r\n const prefix = mode === \"loaded\" ? \"- [loaded]\" : mode === \"selected\" ? \"- [turn]\" : \"-\";\r\n\r\n return `${prefix} ${skill.name}: ${skill.description} (${scopes.join(\", \")})${triggerText}`;\r\n}\r\n","import { formatCheckpointBlock } from \"./checkpoint.js\";\r\nimport { formatTaskStateBlock } from \"./taskState.js\";\r\nimport { formatTodoBlock } from \"./todos.js\";\r\nimport { formatVerificationStateBlock } from \"./verificationState.js\";\r\nimport { formatSkillPromptBlock } from \"../skills/prompt.js\";\r\nimport type { AgentIdentity } from \"./types.js\";\r\nimport type {\r\n ProjectContext,\r\n RuntimeConfig,\r\n SessionCheckpoint,\r\n SkillRuntimeState,\r\n TaskState,\r\n TodoItem,\r\n VerificationState,\r\n} from \"../types.js\";\r\n\r\nexport interface PromptRuntimeState {\r\n identity?: AgentIdentity;\r\n taskSummary?: string;\r\n teamSummary?: string;\r\n worktreeSummary?: string;\r\n backgroundSummary?: string;\r\n protocolSummary?: string;\r\n coordinationPolicySummary?: string;\r\n}\r\n\r\nexport interface PromptLayers {\r\n staticBlocks: string[];\r\n dynamicBlocks: string[];\r\n memoryBlocks?: string[];\r\n}\r\n\r\nexport function buildSystemPromptLayers(\r\n cwd: string,\r\n config: RuntimeConfig,\r\n projectContext: ProjectContext,\r\n taskState?: TaskState,\r\n todoItems?: TodoItem[],\r\n verificationState?: VerificationState,\r\n runtimeState: PromptRuntimeState = {},\r\n skillRuntimeState?: SkillRuntimeState,\r\n checkpoint?: SessionCheckpoint,\r\n): PromptLayers {\r\n const allowedRoots = config.allowedRoots.join(\", \");\r\n const skillSummary = formatSkillPromptBlock(\r\n projectContext.skills,\r\n skillRuntimeState ?? {\r\n matches: [],\r\n namedSkills: [],\r\n applicableSkills: [],\r\n suggestedSkills: [],\r\n requiredSkills: [],\r\n missingRequiredSkills: [],\r\n loadedSkills: [],\r\n loadedSkillNames: new Set<string>(),\r\n },\r\n );\r\n const instructionsBlock =\r\n projectContext.instructionText.trim().length > 0\r\n ? projectContext.instructionText\r\n : \"No AGENTS.md instructions found for this project.\";\r\n const taskStateBlock = formatTaskStateBlock(taskState);\r\n const todoBlock = formatTodoBlock(todoItems);\r\n const verificationBlock = formatVerificationStateBlock(verificationState);\r\n const checkpointBlock = formatCheckpointBlock(checkpoint);\r\n const identity = runtimeState.identity;\r\n const isSubagent = identity?.kind === \"subagent\";\r\n const taskBoardBlock = runtimeState.taskSummary?.trim() || \"No tasks.\";\r\n const teamBlock = runtimeState.teamSummary?.trim() || \"No teammates.\";\r\n const worktreeBlock = runtimeState.worktreeSummary?.trim() || \"No worktrees.\";\r\n const backgroundBlock = runtimeState.backgroundSummary?.trim() || \"No background jobs.\";\r\n const protocolBlock = runtimeState.protocolSummary?.trim() || \"No protocol requests.\";\r\n const coordinationPolicyBlock = runtimeState.coordinationPolicySummary?.trim() || \"- plan decisions: locked\\n- shutdown requests: locked\";\r\n const commonRules = [\r\n \"- Never claim a file changed unless a write/edit tool succeeded.\",\r\n \"- Show concise progress updates and use streaming output naturally.\",\r\n \"- Respect AGENTS.md instructions discovered in the project.\",\r\n \"- If a relevant skill exists, call load_skill before following that specialized workflow. This is especially important for web-research and browser-automation turns.\",\r\n \"- Use send_message and broadcast for informational chat only; any approval or graceful-shutdown negotiation must go through the protocol-backed tools so the request state is persisted.\",\r\n \"- Lead coordination gates are machine-enforced. Use coordination_policy to inspect or change whether plan decisions and shutdown requests are currently allowed.\",\r\n \"- If a tool fails, inspect the error, retry with a safer path, and try alternative tools before giving up.\",\r\n \"- When browser automation tools are available via MCP, prefer them for webpage navigation, content inspection, and interaction instead of local file exploration or shell-based fetching.\",\r\n \"- Verification is a bounded state machine, not an infinite loop: run targeted checks, avoid inventing unrelated verification artifacts, and pause for the user when repeated checks make no progress.\",\r\n \"- If the user asks for an exact final string or exact output format, follow that instruction literally and do not add extra text before or after it.\",\r\n ...(isSubagent\r\n ? []\r\n : [\r\n \"- For non-trivial tasks, use todo_write early, keep exactly one item in_progress, and update completed items as soon as they are done.\",\r\n \"- If a task is meant for a specific teammate, record that assignment on the persistent task board instead of relying on prompt text alone.\",\r\n ]),\r\n \"- When a path is wrong, use list_files, search_files, suggestions, or metadata and retry instead of stopping.\",\r\n \"- If context is compressed or a long task spans many tool steps, continue from previous progress instead of restarting the task.\",\r\n \"- When a tool result is externalized, use its summary and preview first. Only read the storagePath if you still need a specific missing detail, and avoid rereading the same artifact unchanged.\",\r\n ...(isSubagent\r\n ? []\r\n : [\r\n \"- For long-running installs, builds, or tests, prefer background_run so work can continue while the command executes.\",\r\n \"- For concurrent coding tasks inside a git repo, prefer worktree_create and task-bound isolated worktrees over editing everything in the shared root.\",\r\n ]),\r\n \"- For .doc and .docx files, use mineru_doc_read first. If MinerU is unavailable for a .docx file, read_docx is the explicit fallback.\",\r\n \"- For png/jpg/jpeg/jp2/webp/gif/bmp files, use mineru_image_read instead of read_file.\",\r\n \"- For xlsx/xls/csv/tsv/ods files, use read_spreadsheet instead of read_file.\",\r\n \"- For PDFs, use mineru_pdf_read instead of read_file so the document can be extracted into Markdown artifacts first.\",\r\n \"- For .ppt and .pptx files, use mineru_ppt_read instead of read_file.\",\r\n \"- MinerU document limits are strict: reject files over 200 MB or over 600 pages. Do not split or auto-split them.\",\r\n \"- For large directory analysis, inspect structure and metadata first. Read only the minimum useful subset of files.\",\r\n \"- Avoid quoting risky or sensitive raw content verbatim. Prefer safe summaries and high-level observations.\",\r\n \"- Summarize what you changed or inspected.\",\r\n \"- If a command fails, explain the failure and propose the next step.\",\r\n \"- After any mutating command or file change, run verification (build/test) and do not finalize until checks pass.\",\r\n ];\r\n const modeSpecificRules =\r\n config.mode === \"agent\"\r\n ? [\r\n \"- Current mode is agent. You may use the full toolset, including edits, undo, and shell commands, but stay inside allowed roots.\",\r\n \"- Prefer apply_patch for precise multi-line edits and refactors.\",\r\n \"- Prefer surgical edits over overwriting whole files when possible.\",\r\n \"- Read files before editing them unless the user explicitly wants a brand new file.\",\r\n \"- If you modify files, run a targeted validation command before finalizing whenever feasible.\",\r\n \"- If you need to revert the latest recorded edit, use undo_last_change instead of guessing how to restore files.\",\r\n \"- For .docx files, use write_docx to create new Word documents and edit_docx for section-aware updates.\",\r\n ]\r\n : [\r\n \"- Current mode is read-only. Inspect and analyze with read tools only. Do not attempt edits, patching, undo, or shell commands.\",\r\n ];\r\n const identityRules =\r\n identity?.kind === \"subagent\"\r\n ? [\r\n `- You are subagent '${identity.name}' with specialty '${identity.role ?? \"general\"}'.`,\r\n \"- You are handling one delegated subtask with fresh isolated context. Keep your work narrowly scoped to that request.\",\r\n \"- Do not manage teammates, background jobs, task-board coordination, or spawn additional subagents.\",\r\n \"- Finish with a direct, concise handoff summary for the parent agent.\",\r\n ]\r\n : identity?.kind === \"teammate\"\r\n ? [\r\n `- You are teammate '${identity.name}' with role '${identity.role ?? \"generalist\"}'.`,\r\n `- Team name: ${identity.teamName ?? \"default\"}. Coordinate via send_message, read_inbox, claim_task, and the protocol-backed tools plan_approval / shutdown_response when useful.`,\r\n \"- Claim only tasks assigned to you or tasks with no assignee; do not take work reserved for another teammate.\",\r\n \"- After claim_task, if the tool returns a worktree path, use that returned worktree path for subsequent file edits and shell commands.\",\r\n \"- Approval and shutdown handshakes arrive as protocol_request inbox messages and complete as protocol_response messages with the same request_id.\",\r\n \"- Background job results can arrive through the inbox; treat them as fresh runtime facts.\",\r\n \"- If you own a task with a bound worktree, do implementation work inside that isolated directory.\",\r\n \"- If you finish current work and there is no immediate next step, use idle or clearly transition back to waiting state.\",\r\n ]\r\n : [\r\n \"- You are the lead agent. Coordinate teammates, review protocol-backed approvals, inspect inbox updates, use the task board to keep long work organized, reserve teammate-specific tasks on the board before parallel work starts, explicitly manage coordination gates with coordination_policy, use background_run/background_check for slow commands, and use worktree tools when parallel changes should be isolated.\",\r\n ];\r\n\r\n const staticBlocks = [\r\n [\r\n \"You are Athlete, a terminal-first AI assistant for coding and general problem solving.\",\r\n \"You can converse naturally, but when the user asks for filesystem or command-line work, use the provided tools instead of pretending.\",\r\n ].join(\"\\n\"),\r\n formatPromptBlock(\"Operating rules\", [\"Rules:\", ...commonRules, ...modeSpecificRules, ...identityRules].join(\"\\n\")),\r\n formatPromptBlock(\"Project instructions\", instructionsBlock),\r\n ];\r\n\r\n const dynamicBlocks = [\r\n formatPromptBlock(\r\n \"Runtime facts\",\r\n [\r\n `Current working directory: ${cwd}`,\r\n `Project root: ${projectContext.rootDir}`,\r\n `Project state root: ${projectContext.stateRootDir}`,\r\n `Allowed roots: ${allowedRoots}`,\r\n `Mode: ${config.mode}`,\r\n `Model: ${config.model}`,\r\n `Date: ${new Date().toISOString()}`,\r\n ].join(\"\\n\"),\r\n ),\r\n !isSubagent\r\n ? formatPromptBlock(\"Remembered task state\", taskStateBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Current todo state\", todoBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Verification state\", verificationBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Session checkpoint\", checkpointBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Persistent task board\", taskBoardBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Team state\", teamBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Worktree state\", worktreeBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Protocol requests\", protocolBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Coordination policy\", coordinationPolicyBlock)\r\n : undefined,\r\n !isSubagent\r\n ? formatPromptBlock(\"Background jobs\", backgroundBlock)\r\n : undefined,\r\n formatPromptBlock(\"Project skill state\", skillSummary),\r\n ].filter((block): block is string => Boolean(block));\r\n\r\n return {\r\n staticBlocks,\r\n dynamicBlocks,\r\n };\r\n}\r\n\r\nexport function appendPromptMemory(\r\n promptLayers: PromptLayers,\r\n summary: string | undefined,\r\n): PromptLayers {\r\n if (!summary) {\r\n return promptLayers;\r\n }\r\n\r\n return {\r\n ...promptLayers,\r\n memoryBlocks: [...(promptLayers.memoryBlocks ?? []), summary],\r\n };\r\n}\r\n\r\nexport function renderPromptLayers(promptLayers: PromptLayers): string {\r\n const sections = [\r\n \"Static operating layer:\",\r\n joinBlocks(promptLayers.staticBlocks),\r\n \"\",\r\n \"Dynamic runtime layer:\",\r\n joinBlocks(promptLayers.dynamicBlocks),\r\n ];\r\n\r\n if ((promptLayers.memoryBlocks ?? []).length > 0) {\r\n sections.push(\"\", \"Compressed conversation memory:\", joinBlocks(promptLayers.memoryBlocks ?? []));\r\n }\r\n\r\n return sections.join(\"\\n\").trim();\r\n}\r\n\r\nfunction formatPromptBlock(title: string, content: string): string {\r\n return `${title}:\\n${content}`;\r\n}\r\n\r\nfunction joinBlocks(blocks: string[]): string {\r\n return blocks.filter((block) => block.trim().length > 0).join(\"\\n\\n\");\r\n}\r\n","const PRIMARY_PREVIEW_KEYS = [\"preview\", \"markdownPreview\", \"content\", \"output\"] as const;\r\n\r\nexport function compactToolPayload(\r\n toolName: string | undefined,\r\n raw: string,\r\n maxChars: number,\r\n): string {\r\n try {\r\n const parsed = JSON.parse(raw) as Record<string, unknown>;\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n const fragments: string[] = [];\r\n\r\n pushFragment(fragments, \"ok\", readScalar(parsed.ok));\r\n pushFragment(fragments, \"tool\", readScalar(parsed.tool));\r\n pushFragment(fragments, \"externalized\", readBooleanFlag(parsed.externalized));\r\n pushFragment(fragments, \"storagePath\", readScalar(parsed.storagePath));\r\n pushFragment(fragments, \"path\", readScalar(parsed.path));\r\n pushFragment(fragments, \"requestedPath\", readScalar(parsed.requestedPath));\r\n pushFragment(fragments, \"format\", readScalar(parsed.format));\r\n pushFragment(fragments, \"title\", readScalar(parsed.title));\r\n pushFragment(fragments, \"readable\", readScalar(parsed.readable));\r\n pushFragment(fragments, \"reason\", readScalar(parsed.reason));\r\n pushFragment(fragments, \"action\", readScalar(parsed.action));\r\n pushFragment(fragments, \"suggestedTool\", readScalar(parsed.suggestedTool));\r\n pushFragment(fragments, \"suggestedPath\", readScalar(parsed.suggestedPath));\r\n pushFragment(fragments, \"code\", readScalar(parsed.code));\r\n pushFragment(fragments, \"error\", readScalar(parsed.error));\r\n pushFragment(fragments, \"hint\", readScalar(parsed.hint));\r\n pushFragment(fragments, \"next_step\", readScalar(parsed.next_step));\r\n pushFragment(fragments, \"entries\", readCollectionCount(parsed.entries) ?? readScalar(parsed.entriesCount));\r\n pushFragment(fragments, \"matches\", readCollectionCount(parsed.matches) ?? readScalar(parsed.matchesCount));\r\n pushFragment(fragments, \"sheets\", readCollectionCount(parsed.sheets) ?? readScalar(parsed.sheetsCount));\r\n pushFragment(fragments, \"searched\", readScalar(parsed.searched));\r\n pushFragment(fragments, \"total\", readScalar(parsed.total));\r\n pushFragment(fragments, \"bytes\", readScalar(parsed.bytes) ?? readScalar(parsed.byteLength));\r\n pushFragment(fragments, \"chars\", readScalar(parsed.chars) ?? readScalar(parsed.charLength));\r\n pushFragment(fragments, \"changeId\", readScalar(parsed.changeId));\r\n pushFragment(fragments, \"undoneChangeId\", readScalar(parsed.undoneChangeId));\r\n pushFragment(fragments, \"changeHistoryWarning\", readScalar(parsed.changeHistoryWarning));\r\n pushFragment(fragments, \"exitCode\", readScalar(parsed.exitCode));\r\n pushFragment(fragments, \"jobId\", readScalar(parsed.jobId));\r\n pushFragment(fragments, \"jobStatus\", readScalar(parsed.jobStatus));\r\n pushFragment(fragments, \"taskId\", readScalar(parsed.taskId));\r\n pushFragment(fragments, \"task\", readScalar(parsed.task));\r\n pushFragment(fragments, \"member\", readScalar(parsed.member));\r\n pushFragment(fragments, \"worktree\", readScalar(parsed.worktree));\r\n pushFragment(fragments, \"tasks\", readCollectionCount(parsed.tasks));\r\n pushFragment(fragments, \"members\", readCollectionCount(parsed.members));\r\n pushFragment(fragments, \"messages\", readCollectionCount(parsed.messages));\r\n pushFragment(fragments, \"jobs\", readCollectionCount(parsed.jobs));\r\n pushFragment(fragments, \"events\", readCollectionCount(parsed.events));\r\n pushFragment(fragments, \"worktrees\", readCollectionCount(parsed.worktrees));\r\n pushFragment(fragments, \"summary\", truncate(oneLine(readScalar(parsed.summary) ?? \"\"), 120));\r\n pushFragment(fragments, \"preview\", truncate(oneLine(readScalar(parsed.preview) ?? \"\"), 120));\r\n pushFragment(fragments, \"content\", truncate(oneLine(readScalar(parsed.content) ?? \"\"), 120));\r\n pushFragment(fragments, \"restoredPaths\", readCollectionCount(parsed.restoredPaths));\r\n\r\n const summary = fragments.filter(Boolean).join(\"; \");\r\n if (summary.length > 0) {\r\n return truncate(summary, maxChars);\r\n }\r\n }\r\n } catch {\r\n if (toolName && raw.trim().startsWith(\"[\")) {\r\n return truncate(`${toolName} returned structured array data`, maxChars);\r\n }\r\n }\r\n\r\n return truncate(oneLine(raw), maxChars);\r\n}\r\n\r\nexport function buildToolPayloadPreview(raw: string, maxChars: number): string {\r\n try {\r\n const parsed = JSON.parse(raw) as unknown;\r\n\r\n if (Array.isArray(parsed)) {\r\n return truncate(parsed.slice(0, 6).map((item) => oneLine(JSON.stringify(item))).join(\"\\n\"), maxChars);\r\n }\r\n\r\n if (parsed && typeof parsed === \"object\") {\r\n const record = parsed as Record<string, unknown>;\r\n\r\n const matchesPreview = formatMatchesPreview(record.matches);\r\n if (matchesPreview) {\r\n return truncate(matchesPreview, maxChars);\r\n }\r\n\r\n const entriesPreview = formatEntriesPreview(record.entries);\r\n if (entriesPreview) {\r\n return truncate(entriesPreview, maxChars);\r\n }\r\n\r\n for (const key of PRIMARY_PREVIEW_KEYS) {\r\n const value = record[key];\r\n if (typeof value === \"string\" && value.trim().length > 0) {\r\n return truncate(normalizeBlock(value), maxChars);\r\n }\r\n }\r\n\r\n const objectPreview = oneLine(JSON.stringify(record));\r\n if (objectPreview.length > 0) {\r\n return truncate(objectPreview, maxChars);\r\n }\r\n }\r\n } catch {\r\n // fall through\r\n }\r\n\r\n return truncate(normalizeBlock(raw), maxChars);\r\n}\r\n\r\nexport function compactToolPayloadForTransport(raw: string, maxChars: number): string {\r\n try {\r\n const parsed = JSON.parse(raw) as Record<string, unknown>;\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed) && typeof parsed.storagePath === \"string\") {\r\n const compacted: Record<string, unknown> = {};\r\n\r\n copyScalar(compacted, parsed, \"externalized\");\r\n copyScalar(compacted, parsed, \"tool\");\r\n copyScalar(compacted, parsed, \"storagePath\");\r\n copyScalar(compacted, parsed, \"byteLength\");\r\n copyScalar(compacted, parsed, \"charLength\");\r\n copyScalar(compacted, parsed, \"ok\");\r\n copyScalar(compacted, parsed, \"path\");\r\n copyScalar(compacted, parsed, \"requestedPath\");\r\n copyScalar(compacted, parsed, \"format\");\r\n copyScalar(compacted, parsed, \"title\");\r\n copyScalar(compacted, parsed, \"entriesCount\");\r\n copyScalar(compacted, parsed, \"matchesCount\");\r\n copyScalar(compacted, parsed, \"sheetsCount\");\r\n copyScalar(compacted, parsed, \"searched\");\r\n copyScalar(compacted, parsed, \"total\");\r\n copyScalar(compacted, parsed, \"jobId\");\r\n copyScalar(compacted, parsed, \"jobStatus\");\r\n copyScalar(compacted, parsed, \"taskId\");\r\n copyScalar(compacted, parsed, \"task\");\r\n copyScalar(compacted, parsed, \"member\");\r\n copyScalar(compacted, parsed, \"worktree\");\r\n copyScalar(compacted, parsed, \"sha256\");\r\n\r\n const summary = readScalar(parsed.summary);\r\n if (summary) {\r\n compacted.summary = truncate(oneLine(summary), Math.max(120, Math.floor(maxChars * 0.35)));\r\n }\r\n\r\n const preview = readScalar(parsed.preview);\r\n if (preview) {\r\n compacted.preview = truncate(\r\n normalizeBlock(preview),\r\n Math.max(80, Math.floor(maxChars * 0.35)),\r\n );\r\n }\r\n\r\n let compactedJson = JSON.stringify(compacted, null, 2);\r\n if (compactedJson.length <= maxChars) {\r\n return compactedJson;\r\n }\r\n\r\n delete compacted.preview;\r\n compactedJson = JSON.stringify(compacted, null, 2);\r\n if (compactedJson.length <= maxChars) {\r\n return compactedJson;\r\n }\r\n\r\n delete compacted.summary;\r\n compactedJson = JSON.stringify(compacted, null, 2);\r\n if (compactedJson.length <= maxChars) {\r\n return compactedJson;\r\n }\r\n\r\n return JSON.stringify(\r\n {\r\n externalized: parsed.externalized === true,\r\n storagePath: parsed.storagePath,\r\n summary: truncate(oneLine(readScalar(parsed.summary) ?? \"\"), Math.max(48, maxChars - 80)),\r\n },\r\n null,\r\n 2,\r\n );\r\n }\r\n } catch {\r\n // fall back to a plain-text summary\r\n }\r\n\r\n return compactToolPayload(undefined, raw, maxChars);\r\n}\r\n\r\nfunction formatMatchesPreview(value: unknown): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lines = value\r\n .slice(0, 6)\r\n .map((entry) => {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\r\n return null;\r\n }\r\n\r\n const record = entry as Record<string, unknown>;\r\n const targetPath = readScalar(record.path);\r\n const line = typeof record.line === \"number\" ? Math.trunc(record.line) : undefined;\r\n const text = readScalar(record.text);\r\n if (!targetPath && !text) {\r\n return null;\r\n }\r\n\r\n return `${targetPath ?? \"(match)\"}${line ? `:${line}` : \"\"} ${text ?? \"\"}`.trim();\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return lines.length > 0 ? lines.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction formatEntriesPreview(value: unknown): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lines = value\r\n .slice(0, 10)\r\n .map((entry) => {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\r\n return null;\r\n }\r\n\r\n const record = entry as Record<string, unknown>;\r\n const targetPath = readScalar(record.path);\r\n const type = readScalar(record.type);\r\n if (!targetPath) {\r\n return null;\r\n }\r\n\r\n return type ? `${type} ${targetPath}` : targetPath;\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return lines.length > 0 ? lines.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction normalizeBlock(value: string): string {\r\n return value.replace(/\\r\\n/g, \"\\n\").trim();\r\n}\r\n\r\nfunction oneLine(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\nfunction readScalar(value: unknown): string | undefined {\r\n if (value === null || value === undefined) {\r\n return undefined;\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"number\" || typeof value === \"boolean\") {\r\n return String(value);\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction readBooleanFlag(value: unknown): string | undefined {\r\n if (typeof value !== \"boolean\") {\r\n return undefined;\r\n }\r\n\r\n return value ? \"true\" : \"false\";\r\n}\r\n\r\nfunction readCollectionCount(value: unknown): string | undefined {\r\n if (!Array.isArray(value)) {\r\n return undefined;\r\n }\r\n\r\n return String(value.length);\r\n}\r\n\r\nfunction pushFragment(fragments: string[], key: string, value: string | undefined): void {\r\n if (!value) {\r\n return;\r\n }\r\n\r\n fragments.push(`${key}=${value}`);\r\n}\r\n\r\nfunction copyScalar(\r\n target: Record<string, unknown>,\r\n source: Record<string, unknown>,\r\n key: string,\r\n): void {\r\n const value = source[key];\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n target[key] = value;\r\n }\r\n}\r\n","import type { ChatCompletionMessageParam } from \"openai/resources/chat/completions\";\r\n\r\nimport {\r\n expandStartToToolBoundary,\r\n isAssistantMessageInLatestTurn,\r\n shouldIncludeStoredAssistantReasoning,\r\n toChatMessage,\r\n} from \"./messages.js\";\r\nimport { appendPromptMemory, renderPromptLayers } from \"./promptSections.js\";\r\nimport { compactToolPayload } from \"./toolResultPreview.js\";\r\nimport type { PromptLayers } from \"./promptSections.js\";\r\nimport type { RuntimeConfig, StoredMessage } from \"../types.js\";\r\n\r\nconst MIN_TAIL_MESSAGES = 8;\r\nconst DETAILED_RECENT_MESSAGES = 8;\r\nconst MAX_SUMMARY_MESSAGE_COUNT = 48;\r\n\r\nexport interface BuiltRequestContext {\r\n messages: ChatCompletionMessageParam[];\r\n compressed: boolean;\r\n estimatedChars: number;\r\n summary?: string;\r\n}\r\n\r\nexport function buildRequestContext(\r\n systemPrompt: string | PromptLayers,\r\n messages: StoredMessage[],\r\n config: Pick<\r\n RuntimeConfig,\r\n \"contextWindowMessages\" | \"model\" | \"maxContextChars\" | \"contextSummaryChars\"\r\n >,\r\n): BuiltRequestContext {\r\n const safeMaxChars = Math.max(8_000, config.maxContextChars);\r\n let tailCount = Math.max(1, Math.min(messages.length, config.contextWindowMessages));\r\n\r\n while (true) {\r\n const tailMessages = sliceTailMessages(messages, tailCount);\r\n const olderMessages = messages.slice(0, Math.max(0, messages.length - tailMessages.length));\r\n const summary =\r\n olderMessages.length > 0\r\n ? summarizeConversation(olderMessages, config.contextSummaryChars)\r\n : undefined;\r\n const summaryPrompt = appendSummary(systemPrompt, summary);\r\n\r\n let workingTail = compactTailMessages(tailMessages, false);\r\n let requestMessages = composeChatMessages(summaryPrompt, workingTail, config.model);\r\n let estimatedChars = estimateChatMessagesChars(requestMessages);\r\n\r\n if (estimatedChars <= safeMaxChars) {\r\n return {\r\n messages: requestMessages,\r\n compressed: Boolean(summary),\r\n estimatedChars,\r\n summary,\r\n };\r\n }\r\n\r\n workingTail = compactTailMessages(tailMessages, true);\r\n requestMessages = composeChatMessages(summaryPrompt, workingTail, config.model);\r\n estimatedChars = estimateChatMessagesChars(requestMessages);\r\n\r\n if (estimatedChars <= safeMaxChars) {\r\n return {\r\n messages: requestMessages,\r\n compressed: true,\r\n estimatedChars,\r\n summary,\r\n };\r\n }\r\n\r\n if (tailCount > MIN_TAIL_MESSAGES) {\r\n tailCount = Math.max(MIN_TAIL_MESSAGES, tailCount - 4);\r\n continue;\r\n }\r\n\r\n const fallbackSummary = summary\r\n ? truncate(summary, Math.max(1_200, Math.floor(config.contextSummaryChars * 0.6)))\r\n : undefined;\r\n const fallbackTail = sliceTailMessages(messages, MIN_TAIL_MESSAGES);\r\n const fallbackMessages = composeChatMessages(\r\n appendSummary(systemPrompt, fallbackSummary),\r\n compactTailMessages(fallbackTail, true),\r\n config.model,\r\n );\r\n\r\n return {\r\n messages: fallbackMessages,\r\n compressed: true,\r\n estimatedChars: estimateChatMessagesChars(fallbackMessages),\r\n summary: fallbackSummary,\r\n };\r\n }\r\n}\r\n\r\nfunction sliceTailMessages(messages: StoredMessage[], tailCount: number): StoredMessage[] {\r\n if (messages.length === 0) {\r\n return [];\r\n }\r\n\r\n const startIndex = Math.max(0, messages.length - tailCount);\r\n const safeStartIndex = expandStartToToolBoundary(messages, startIndex);\r\n return messages.slice(safeStartIndex);\r\n}\r\n\r\nfunction composeChatMessages(\r\n systemPrompt: string | PromptLayers,\r\n messages: StoredMessage[],\r\n model: string,\r\n): ChatCompletionMessageParam[] {\r\n return [\r\n {\r\n role: \"system\",\r\n content: renderSystemPrompt(systemPrompt),\r\n },\r\n ...messages.map((message, index) =>\r\n toChatMessage(message, {\r\n includeReasoning: shouldIncludeStoredAssistantReasoning(messages, index, model),\r\n }),\r\n ),\r\n ];\r\n}\r\n\r\nfunction compactTailMessages(messages: StoredMessage[], aggressive: boolean): StoredMessage[] {\r\n const protectedStart = Math.max(0, messages.length - DETAILED_RECENT_MESSAGES);\r\n\r\n return messages.map((message, index) => {\r\n if (index >= protectedStart) {\r\n return message;\r\n }\r\n\r\n if (message.role === \"tool\") {\r\n return {\r\n ...message,\r\n content: compactToolPayload(message.name, message.content ?? \"\", aggressive ? 320 : 700),\r\n };\r\n }\r\n\r\n if (message.role === \"assistant\") {\r\n return {\r\n ...message,\r\n content: truncate(message.content ?? \"\", aggressive ? 300 : 700),\r\n reasoningContent: isAssistantMessageInLatestTurn(messages, index)\r\n ? message.reasoningContent\r\n : undefined,\r\n };\r\n }\r\n\r\n if (message.role === \"user\") {\r\n return {\r\n ...message,\r\n content: truncate(message.content ?? \"\", aggressive ? 320 : 800),\r\n };\r\n }\r\n\r\n return message;\r\n });\r\n}\r\n\r\nfunction summarizeConversation(messages: StoredMessage[], maxChars: number): string {\r\n const summaryLines: string[] = [];\r\n const candidates = pickSummaryCandidates(messages);\r\n let totalChars = 0;\r\n\r\n for (const message of candidates) {\r\n const line = summarizeStoredMessage(message);\r\n if (!line) {\r\n continue;\r\n }\r\n\r\n const nextLine = `- ${line}`;\r\n if (summaryLines.includes(nextLine)) {\r\n continue;\r\n }\r\n\r\n const nextChars = totalChars + nextLine.length + 1;\r\n if (nextChars > maxChars) {\r\n break;\r\n }\r\n\r\n summaryLines.push(nextLine);\r\n totalChars = nextChars;\r\n }\r\n\r\n if (summaryLines.length === 0) {\r\n return \"No earlier context summary was available.\";\r\n }\r\n\r\n return summaryLines.join(\"\\n\");\r\n}\r\n\r\nfunction pickSummaryCandidates(messages: StoredMessage[]): StoredMessage[] {\r\n const firstUser = messages.find((message) => message.role === \"user\");\r\n const recent = messages.slice(-MAX_SUMMARY_MESSAGE_COUNT);\r\n\r\n if (!firstUser) {\r\n return recent;\r\n }\r\n\r\n return [firstUser, ...recent.filter((message) => message !== firstUser)];\r\n}\r\n\r\nfunction summarizeStoredMessage(message: StoredMessage): string {\r\n if (message.role === \"user\") {\r\n return `User asked: ${truncate(oneLine(message.content ?? \"\"), 240)}`;\r\n }\r\n\r\n if (message.role === \"assistant\" && message.tool_calls?.length) {\r\n const names = message.tool_calls.map((toolCall) => toolCall.function.name).join(\", \");\r\n const content = truncate(oneLine(message.content ?? \"\"), 140);\r\n return content\r\n ? `Assistant planned tools (${names}) and said: ${content}`\r\n : `Assistant planned tools: ${names}`;\r\n }\r\n\r\n if (message.role === \"assistant\") {\r\n return `Assistant said: ${truncate(oneLine(message.content ?? \"\"), 220)}`;\r\n }\r\n\r\n if (message.role === \"tool\") {\r\n return `Tool ${message.name ?? \"unknown\"} returned: ${compactToolPayload(\r\n message.name,\r\n message.content ?? \"\",\r\n 220,\r\n )}`;\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nfunction estimateChatMessagesChars(messages: ChatCompletionMessageParam[]): number {\r\n return messages.reduce((total, message) => total + JSON.stringify(message).length, 0);\r\n}\r\n\r\nfunction appendSummary(systemPrompt: string | PromptLayers, summary: string | undefined): string | PromptLayers {\r\n if (!summary) {\r\n return systemPrompt;\r\n }\r\n\r\n if (typeof systemPrompt === \"string\") {\r\n return `${systemPrompt}\\n\\nCompressed conversation memory:\\n${summary}`;\r\n }\r\n\r\n return appendPromptMemory(systemPrompt, summary);\r\n}\r\n\r\nfunction renderSystemPrompt(systemPrompt: string | PromptLayers): string {\r\n return typeof systemPrompt === \"string\" ? systemPrompt : renderPromptLayers(systemPrompt);\r\n}\r\n\r\nfunction oneLine(value: string): string {\r\n return value.replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\n","import { hasIncompleteTodos } from \"./todos.js\";\r\nimport { isVerificationRequired } from \"./verificationState.js\";\r\nimport type { AgentIdentity } from \"./types.js\";\r\nimport type { FunctionToolDefinition } from \"../tools/index.js\";\r\nimport type { SessionRecord, VerificationState } from \"../types.js\";\r\n\r\nconst TASK_CLOSEOUT_TOOL_NAMES = new Set([\"task_list\", \"task_get\", \"task_update\"]);\r\nconst CLOSEOUT_TOOL_NAMES = new Set([...TASK_CLOSEOUT_TOOL_NAMES, \"todo_write\"]);\r\n\r\ninterface CloseoutParams {\r\n identity: AgentIdentity;\r\n session: SessionRecord;\r\n changedPaths: Set<string>;\r\n hadIncompleteTodosAtStart: boolean;\r\n hasSubstantiveToolActivity: boolean;\r\n verificationState?: VerificationState;\r\n}\r\n\r\nexport function noteSubstantiveToolActivity(hasActivity: boolean, toolName: string): boolean {\r\n return hasActivity || !CLOSEOUT_TOOL_NAMES.has(toolName);\r\n}\r\n\r\nexport function canFinishWithPlanningTodos(params: Pick<CloseoutParams, \"changedPaths\" | \"hadIncompleteTodosAtStart\" | \"hasSubstantiveToolActivity\">): boolean {\r\n return !params.hadIncompleteTodosAtStart && !params.hasSubstantiveToolActivity && params.changedPaths.size === 0;\r\n}\r\n\r\nexport function shouldIgnoreIncompleteTodosForCloseout(params: CloseoutParams): boolean {\r\n return (\r\n params.identity.kind === \"lead\" &&\r\n hasIncompleteTodos(params.session.todoItems) &&\r\n !canFinishWithPlanningTodos(params) &&\r\n shouldPreferCloseout(params)\r\n );\r\n}\r\n\r\nexport function filterToolDefinitionsForCloseout(\r\n definitions: FunctionToolDefinition[],\r\n params: Pick<CloseoutParams, \"session\" | \"changedPaths\" | \"hasSubstantiveToolActivity\" | \"verificationState\">,\r\n): FunctionToolDefinition[] {\r\n if (!shouldHideTaskBoardTools(params)) {\r\n return definitions;\r\n }\r\n\r\n const shouldHideTodoWrite = !hasIncompleteTodos(params.session.todoItems);\r\n return definitions.filter((tool) => {\r\n const name = tool.function.name;\r\n if (TASK_CLOSEOUT_TOOL_NAMES.has(name)) {\r\n return false;\r\n }\r\n\r\n if (name === \"todo_write\" && shouldHideTodoWrite) {\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n}\r\n\r\nfunction shouldHideTaskBoardTools(\r\n params: Pick<CloseoutParams, \"changedPaths\" | \"verificationState\">,\r\n): boolean {\r\n return (\r\n params.changedPaths.size > 0 ||\r\n (params.verificationState?.pendingPaths?.length ?? 0) > 0 ||\r\n (params.verificationState?.attempts ?? 0) > 0\r\n );\r\n}\r\n\r\nfunction shouldPreferCloseout(\r\n params: Pick<CloseoutParams, \"changedPaths\" | \"hasSubstantiveToolActivity\" | \"verificationState\">,\r\n): boolean {\r\n const verificationSatisfied = !isVerificationRequired(params.verificationState);\r\n const hasCompletedWorkEvidence =\r\n params.hasSubstantiveToolActivity ||\r\n params.changedPaths.size > 0 ||\r\n (params.verificationState?.attempts ?? 0) > 0;\r\n\r\n return verificationSatisfied && hasCompletedWorkEvidence;\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { isVerificationRequired } from \"./verificationState.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\nimport type { VerificationAttempt } from \"../types.js\";\r\n\r\nconst LIGHTWEIGHT_VERIFICATION_EXTENSIONS = new Set([\".md\", \".txt\"]);\r\nconst DISALLOWED_LIGHTWEIGHT_ROOTS = new Set([\".athlete\", \".test-build\", \"dist\", \"scripts\", \"src\", \"tests\"]);\r\n\r\nexport function getLightweightVerificationAttempt(input: {\r\n toolName: string;\r\n rawArgs: string;\r\n pendingPaths: string[];\r\n resultOk: boolean;\r\n}): VerificationAttempt | null {\r\n if (!input.resultOk || input.toolName !== \"read_file\") {\r\n return null;\r\n }\r\n\r\n const targetPath = readPathArg(input.rawArgs);\r\n const normalizedTargetPath = normalizePath(targetPath);\r\n const normalizedPendingPaths = input.pendingPaths.map(normalizePath);\r\n if (!normalizedTargetPath || !matchesPendingPath(normalizedTargetPath, normalizedPendingPaths)) {\r\n return null;\r\n }\r\n\r\n if (!isLightweightVerificationPath(normalizedTargetPath)) {\r\n return null;\r\n }\r\n\r\n return {\r\n attempted: true,\r\n command: `read_file ${targetPath}`,\r\n exitCode: 0,\r\n kind: \"read_file\",\r\n passed: true,\r\n };\r\n}\r\n\r\nexport function readVerificationProgress(session: Pick<SessionRecord, \"verificationState\">): {\r\n validationAttempted: boolean;\r\n validationPassed: boolean;\r\n requiresVerification: boolean;\r\n} {\r\n return {\r\n validationAttempted: (session.verificationState?.attempts ?? 0) > 0,\r\n validationPassed: session.verificationState?.status === \"passed\",\r\n requiresVerification: isVerificationRequired(session.verificationState),\r\n };\r\n}\r\n\r\nexport async function getAutoVerificationAttempt(input: {\r\n cwd: string;\r\n pendingPaths: string[];\r\n}): Promise<VerificationAttempt | null> {\r\n if (input.pendingPaths.length === 0) {\r\n return null;\r\n }\r\n\r\n for (const pendingPath of input.pendingPaths) {\r\n const normalizedPath = normalizePath(pendingPath);\r\n if (!isLightweightVerificationPath(normalizedPath)) {\r\n return null;\r\n }\r\n\r\n const resolvedPath = path.isAbsolute(pendingPath) ? pendingPath : path.resolve(input.cwd, pendingPath);\r\n try {\r\n const stat = await fs.stat(resolvedPath);\r\n if (!stat.isFile() || stat.size <= 0) {\r\n return null;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n return {\r\n attempted: true,\r\n command: `auto_readback ${input.pendingPaths.join(\", \")}`,\r\n exitCode: 0,\r\n kind: \"auto_readback\",\r\n passed: true,\r\n };\r\n}\r\n\r\nfunction readPathArg(rawArgs: string): string | null {\r\n try {\r\n const parsed = JSON.parse(rawArgs) as Record<string, unknown>;\r\n return typeof parsed.path === \"string\" ? parsed.path : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction normalizePath(value: string | null): string {\r\n return String(value ?? \"\").replace(/\\\\/g, \"/\").replace(/^\\.\\/+/, \"\").trim().toLowerCase();\r\n}\r\n\r\nfunction matchesPendingPath(targetPath: string, pendingPaths: string[]): boolean {\r\n return pendingPaths.some((pendingPath) => pendingPath === targetPath || pendingPath.endsWith(`/${targetPath}`));\r\n}\r\n\r\nfunction isLightweightVerificationPath(value: string): boolean {\r\n const extension = path.posix.extname(value);\r\n if (!LIGHTWEIGHT_VERIFICATION_EXTENSIONS.has(extension)) {\r\n return false;\r\n }\r\n\r\n const firstSegment = value.split(\"/\").find(Boolean);\r\n return !firstSegment || !DISALLOWED_LIGHTWEIGHT_ROOTS.has(firstSegment);\r\n}\r\n","import { noteCheckpointCompleted } from \"./checkpoint.js\";\r\nimport { canFinishWithPlanningTodos, shouldIgnoreIncompleteTodosForCloseout } from \"./closeout.js\";\r\nimport { createMessage } from \"./messages.js\";\r\nimport { createInternalReminder } from \"./taskState.js\";\r\nimport { hasIncompleteTodos } from \"./todos.js\";\r\nimport { getAutoVerificationAttempt } from \"./verificationSignals.js\";\r\nimport { isVerificationAwaitingUser, isVerificationRequired, noteVerificationReminder, recordVerificationAttempt } from \"./verificationState.js\";\r\nimport type { AgentIdentity, AssistantResponse, RunTurnOptions, RunTurnResult } from \"./types.js\";\r\nimport type { SessionRecord, ToolCallRecord, VerificationState } from \"../types.js\";\r\n\r\ninterface HandleCompletedAssistantResponseParams {\r\n session: SessionRecord;\r\n response: AssistantResponse;\r\n identity: AgentIdentity;\r\n changedPaths: Set<string>;\r\n hadIncompleteTodosAtStart: boolean;\r\n hasSubstantiveToolActivity: boolean;\r\n verificationState?: VerificationState;\r\n validationReminderInjected: boolean;\r\n options: RunTurnOptions;\r\n}\r\n\r\nexport async function handleCompletedAssistantResponse(\r\n params: HandleCompletedAssistantResponseParams,\r\n): Promise<\r\n | {\r\n kind: \"continue\";\r\n session: SessionRecord;\r\n validationReminderInjected: boolean;\r\n }\r\n | {\r\n kind: \"return\";\r\n result: RunTurnResult;\r\n }\r\n> {\r\n const assistantMessage = createMessage(\"assistant\", params.response.content ?? \"\", {\r\n reasoningContent: params.response.reasoningContent,\r\n });\r\n const requiresVerification = isVerificationRequired(params.verificationState);\r\n const verificationAwaitingUser = isVerificationAwaitingUser(params.verificationState);\r\n const validationAttempted = (params.verificationState?.attempts ?? 0) > 0;\r\n const validationPassed = params.verificationState?.status === \"passed\";\r\n const planningTodosAllowed = canFinishWithPlanningTodos({\r\n changedPaths: params.changedPaths,\r\n hadIncompleteTodosAtStart: params.hadIncompleteTodosAtStart,\r\n hasSubstantiveToolActivity: params.hasSubstantiveToolActivity,\r\n });\r\n const ignoreIncompleteTodos = shouldIgnoreIncompleteTodosForCloseout({\r\n identity: params.identity,\r\n session: params.session,\r\n changedPaths: params.changedPaths,\r\n hadIncompleteTodosAtStart: params.hadIncompleteTodosAtStart,\r\n hasSubstantiveToolActivity: params.hasSubstantiveToolActivity,\r\n verificationState: params.verificationState,\r\n });\r\n\r\n if (requiresVerification && !validationAttempted) {\r\n const autoVerification = await getAutoVerificationAttempt({\r\n cwd: params.options.cwd,\r\n pendingPaths: params.verificationState?.pendingPaths ?? [],\r\n });\r\n if (autoVerification) {\r\n const session = await params.options.sessionStore.save({\r\n ...params.session,\r\n verificationState: recordVerificationAttempt(params.session.verificationState, autoVerification),\r\n });\r\n return handleCompletedAssistantResponse({\r\n ...params,\r\n session,\r\n verificationState: session.verificationState,\r\n });\r\n }\r\n }\r\n\r\n if (verificationAwaitingUser) {\r\n const session = await params.options.sessionStore.appendMessages(params.session, [assistantMessage]);\r\n return {\r\n kind: \"return\",\r\n result: {\r\n session,\r\n changedPaths: [...params.changedPaths],\r\n verificationAttempted: validationAttempted,\r\n verificationPassed: validationPassed,\r\n yielded: false,\r\n paused: true,\r\n pauseReason: params.verificationState?.pauseReason,\r\n },\r\n };\r\n }\r\n\r\n if (\r\n params.identity.kind === \"lead\" &&\r\n hasIncompleteTodos(params.session.todoItems) &&\r\n !planningTodosAllowed &&\r\n !ignoreIncompleteTodos\r\n ) {\r\n const session = await params.options.sessionStore.appendMessages(params.session, [\r\n assistantMessage,\r\n createMessage(\r\n \"user\",\r\n createInternalReminder(\r\n \"Your todo list still has incomplete items. Do not finalize yet. Either continue the work, or call todo_write to update the list so it accurately reflects what is done and what remains.\",\r\n ),\r\n ),\r\n ]);\r\n params.options.callbacks?.onStatus?.(\"Todo list still has open items. Asking the model to continue...\");\r\n return {\r\n kind: \"continue\",\r\n session,\r\n validationReminderInjected: params.validationReminderInjected,\r\n };\r\n }\r\n\r\n if (requiresVerification && !validationAttempted) {\r\n const changedSummary = params.changedPaths.size > 0\r\n ? ` (${[...params.changedPaths].slice(0, 6).join(\", \")})`\r\n : \"\";\r\n const reminder = params.validationReminderInjected\r\n ? `Still waiting on verification${changedSummary}. Run a targeted build/test before finalizing.`\r\n : `Verification required${changedSummary}. Run at least one targeted verification command before finalizing (for example a build or test).`;\r\n const verificationState = noteVerificationReminder(params.session.verificationState);\r\n const baseSession = await params.options.sessionStore.save({\r\n ...params.session,\r\n verificationState,\r\n });\r\n if (isVerificationAwaitingUser(verificationState)) {\r\n const session = await params.options.sessionStore.appendMessages(baseSession, [assistantMessage]);\r\n return {\r\n kind: \"return\",\r\n result: {\r\n session,\r\n changedPaths: [...params.changedPaths],\r\n verificationAttempted: false,\r\n verificationPassed: false,\r\n yielded: false,\r\n paused: true,\r\n pauseReason: verificationState.pauseReason,\r\n },\r\n };\r\n }\r\n\r\n const session = await params.options.sessionStore.appendMessages(baseSession, [\r\n assistantMessage,\r\n createMessage(\"user\", createInternalReminder(reminder)),\r\n ]);\r\n params.options.callbacks?.onStatus?.(\"Verification required before finishing. Asking the model to verify...\");\r\n return {\r\n kind: \"continue\",\r\n session,\r\n validationReminderInjected: true,\r\n };\r\n }\r\n\r\n if (requiresVerification && validationAttempted && !validationPassed) {\r\n const session = await params.options.sessionStore.appendMessages(params.session, [\r\n assistantMessage,\r\n createMessage(\r\n \"user\",\r\n createInternalReminder(\r\n \"Verification failed. Fix the issues and rerun verification before finalizing. Do not finish with known failing checks.\",\r\n ),\r\n ),\r\n ]);\r\n params.options.callbacks?.onStatus?.(\"Verification failed. Asking the model to fix and re-verify...\");\r\n return {\r\n kind: \"continue\",\r\n session,\r\n validationReminderInjected: true,\r\n };\r\n }\r\n\r\n const session = await params.options.sessionStore.save(\r\n noteCheckpointCompleted(\r\n await params.options.sessionStore.appendMessages(params.session, [assistantMessage]),\r\n ),\r\n );\r\n return {\r\n kind: \"return\",\r\n result: {\r\n session,\r\n changedPaths: [...params.changedPaths],\r\n verificationAttempted: validationAttempted,\r\n verificationPassed: validationPassed,\r\n yielded: false,\r\n paused: false,\r\n },\r\n };\r\n}\r\n\r\nexport function shouldInjectTodoReminder(roundsSinceTodoWrite: number, toolCalls: ToolCallRecord[]): boolean {\r\n return toolCalls.length > 0 && roundsSinceTodoWrite >= 3 && roundsSinceTodoWrite % 3 === 0;\r\n}\r\n\r\nexport function emitAssistantReasoning(response: AssistantResponse, options: RunTurnOptions): void {\r\n if (response.reasoningContent && options.config.showReasoning && !response.streamedReasoningContent) {\r\n options.callbacks?.onReasoning?.(response.reasoningContent);\r\n }\r\n}\r\n\r\nexport function emitAssistantFinalOutput(response: AssistantResponse, options: RunTurnOptions): void {\r\n if (response.content && !response.streamedAssistantContent) {\r\n options.callbacks?.onAssistantText?.(response.content);\r\n }\r\n\r\n if (response.content) {\r\n options.callbacks?.onAssistantDone?.(response.content);\r\n }\r\n}\r\n","import type { AssistantResponse } from \"./types.js\";\r\n\r\nconst MAX_PROMOTED_REASONING_CHARS = 240;\r\n\r\nexport function normalizeAssistantResponse(response: AssistantResponse): AssistantResponse {\r\n const normalizedContent = normalizeText(response.content);\r\n if (normalizedContent) {\r\n return {\r\n ...response,\r\n content: normalizedContent,\r\n };\r\n }\r\n\r\n if (response.toolCalls.length > 0) {\r\n return {\r\n ...response,\r\n content: null,\r\n };\r\n }\r\n\r\n const recoveredContent = recoverVisibleContent(response.reasoningContent);\r\n if (!recoveredContent) {\r\n return {\r\n ...response,\r\n content: null,\r\n };\r\n }\r\n\r\n return {\r\n ...response,\r\n content: recoveredContent,\r\n streamedAssistantContent: false,\r\n };\r\n}\r\n\r\nfunction recoverVisibleContent(reasoningContent: string | undefined): string | null {\r\n const normalizedReasoning = normalizeText(reasoningContent);\r\n if (!normalizedReasoning) {\r\n return null;\r\n }\r\n\r\n if (normalizedReasoning.length <= MAX_PROMOTED_REASONING_CHARS && isSingleVisibleAnswer(normalizedReasoning)) {\r\n return normalizedReasoning;\r\n }\r\n\r\n const lastLine = normalizedReasoning\r\n .split(\"\\n\")\r\n .map((line) => line.trim())\r\n .filter(Boolean)\r\n .at(-1);\r\n\r\n if (!lastLine) {\r\n return null;\r\n }\r\n\r\n if (lastLine.length <= MAX_PROMOTED_REASONING_CHARS && isSingleVisibleAnswer(lastLine)) {\r\n return lastLine;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction isSingleVisibleAnswer(value: string): boolean {\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n const lower = value.toLowerCase();\r\n if (\r\n lower.startsWith(\"i need to \") ||\r\n lower.startsWith(\"i should \") ||\r\n lower.startsWith(\"let me \") ||\r\n lower.startsWith(\"first, \") ||\r\n lower.startsWith(\"now \") ||\r\n lower.includes(\"tool\") ||\r\n lower.includes(\"reasoning\")\r\n ) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction normalizeText(value: string | null | undefined): string | null {\r\n if (typeof value !== \"string\") {\r\n return null;\r\n }\r\n\r\n const normalized = value.replace(/\\r\\n/g, \"\\n\").trim();\r\n return normalized.length > 0 ? normalized : null;\r\n}\r\n","export function createAbortError(message = \"Operation aborted\"): Error {\r\n const error = new Error(message);\r\n error.name = \"AbortError\";\r\n (error as { code?: string }).code = \"ABORT_ERR\";\r\n return error;\r\n}\r\n\r\nexport function isAbortError(error: unknown): boolean {\r\n if (!error) {\r\n return false;\r\n }\r\n\r\n if (error instanceof Error) {\r\n if (error.name === \"AbortError\") {\r\n return true;\r\n }\r\n\r\n const code = String((error as { code?: unknown }).code ?? \"\");\r\n if (code === \"ABORT_ERR\" || code === \"ERR_ABORTED\" || code === \"ABORTED\") {\r\n return true;\r\n }\r\n\r\n const message = error.message.toLowerCase();\r\n if (message.includes(\"abort\") || message.includes(\"aborted\") || message.includes(\"cancelled\") || message.includes(\"canceled\")) {\r\n return true;\r\n }\r\n }\r\n\r\n if (typeof error === \"object\" && error && \"cause\" in error) {\r\n return isAbortError((error as { cause?: unknown }).cause);\r\n }\r\n\r\n return false;\r\n}\r\n\r\nexport function throwIfAborted(signal: AbortSignal | undefined, message?: string): void {\r\n if (signal?.aborted) {\r\n throw createAbortError(message ?? \"Operation aborted\");\r\n }\r\n}\r\n\r\nexport function sleepWithSignal(ms: number, signal?: AbortSignal): Promise<void> {\r\n if (!signal) {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n }\r\n\r\n if (signal.aborted) {\r\n return Promise.reject(createAbortError(\"Sleep aborted\"));\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n signal.removeEventListener(\"abort\", onAbort);\r\n resolve();\r\n }, ms);\r\n\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n signal.removeEventListener(\"abort\", onAbort);\r\n reject(createAbortError(\"Sleep aborted\"));\r\n };\r\n\r\n signal.addEventListener(\"abort\", onAbort);\r\n });\r\n}\r\n","import type { ChatCompletionMessageParam } from \"openai/resources/chat/completions\";\r\n\r\nimport { expandStartToToolBoundary, findLatestUserIndex } from \"./messages.js\";\r\nimport { compactToolPayloadForTransport } from \"./toolResultPreview.js\";\r\nimport { isAbortError, sleepWithSignal } from \"../utils/abort.js\";\r\n\r\nconst API_MAX_RETRIES = 3;\r\nconst API_RETRY_BASE_DELAY_MS = 1200;\r\n\r\nexport async function withApiRetries<T>(operation: () => Promise<T>, abortSignal?: AbortSignal): Promise<T> {\r\n let lastError: unknown;\r\n\r\n for (let attempt = 1; attempt <= API_MAX_RETRIES; attempt += 1) {\r\n try {\r\n return await operation();\r\n } catch (error) {\r\n if (isAbortError(error)) {\r\n throw error;\r\n }\r\n\r\n lastError = error;\r\n if (!isRetryableApiError(error) || attempt === API_MAX_RETRIES) {\r\n break;\r\n }\r\n\r\n await sleepWithSignal(API_RETRY_BASE_DELAY_MS * attempt, abortSignal);\r\n }\r\n }\r\n\r\n throw lastError;\r\n}\r\n\r\nexport function isRetryableApiError(error: unknown): boolean {\r\n const status = (error as { status?: number }).status;\r\n if (typeof status === \"number\") {\r\n return status === 408 || status === 409 || status === 429 || status >= 500;\r\n }\r\n\r\n const message = String((error as { message?: unknown }).message ?? error).toLowerCase();\r\n return (\r\n message.includes(\"timeout\") ||\r\n message.includes(\"network\") ||\r\n message.includes(\"connection error\") ||\r\n message.includes(\"connection reset\") ||\r\n message.includes(\"econnreset\") ||\r\n message.includes(\"econnrefused\") ||\r\n message.includes(\"connect timeout\") ||\r\n message.includes(\"temporarily\") ||\r\n message.includes(\"rate limit\") ||\r\n message.includes(\"overloaded\")\r\n );\r\n}\r\n\r\nexport function isContentPolicyError(error: unknown): boolean {\r\n const status = (error as { status?: number }).status;\r\n const message = String((error as { message?: unknown }).message ?? error).toLowerCase();\r\n\r\n return (\r\n status === 400 &&\r\n (message.includes(\"content exists risk\") ||\r\n message.includes(\"content policy\") ||\r\n message.includes(\"unsafe content\") ||\r\n message.includes(\"risk\"))\r\n );\r\n}\r\n\r\nexport function isContextLengthError(error: unknown): boolean {\r\n const status = (error as { status?: number }).status;\r\n const message = String((error as { message?: unknown }).message ?? error).toLowerCase();\r\n\r\n return (\r\n status === 400 &&\r\n (message.includes(\"context length\") ||\r\n message.includes(\"maximum context length\") ||\r\n message.includes(\"context window\") ||\r\n message.includes(\"too many tokens\") ||\r\n message.includes(\"prompt is too long\") ||\r\n message.includes(\"max tokens\"))\r\n );\r\n}\r\n\r\nexport function isToolCompatibilityError(error: unknown): boolean {\r\n const message = String((error as { message?: unknown }).message ?? error).toLowerCase();\r\n\r\n return (\r\n message.includes(\"function calling\") ||\r\n message.includes(\"tool call\") ||\r\n message.includes(\"tools are not supported\") ||\r\n message.includes(\"tool is not supported\") ||\r\n message.includes(\"does not support tools\")\r\n );\r\n}\r\n\r\nexport function sanitizeMessagesForContentPolicy(\r\n messages: ChatCompletionMessageParam[],\r\n): ChatCompletionMessageParam[] {\r\n return messages.map((message, index) => {\r\n if (index === 0 && message.role === \"system\") {\r\n const content = typeof message.content === \"string\" ? message.content : \"\";\r\n return {\r\n ...message,\r\n content:\r\n `${content}\\n\\nProvider safety fallback: if some tool outputs are redacted, continue using filenames, metadata, paths, and summaries instead of raw content.` +\r\n \"\\nDo not echo sensitive raw text. Prefer high-level summaries, structural observations, and safe paraphrases.\",\r\n };\r\n }\r\n\r\n if (message.role !== \"tool\" || typeof message.content !== \"string\") {\r\n return message;\r\n }\r\n\r\n return {\r\n ...message,\r\n content: redactToolPayload(message.content),\r\n };\r\n });\r\n}\r\n\r\nexport function shrinkMessagesForContextLimit(\r\n messages: ChatCompletionMessageParam[],\r\n): ChatCompletionMessageParam[] {\r\n const systemMessage = messages[0];\r\n const rest = messages.slice(1);\r\n const latestUserIndex = findLatestUserIndex(rest);\r\n const tailStart = expandStartToToolBoundary(rest, Math.max(0, rest.length - 14));\r\n const trimmedTail = rest.slice(tailStart).map((message, index, array) => {\r\n const globalIndex = tailStart + index;\r\n const detailed = index >= Math.max(0, array.length - 6);\r\n\r\n if (message.role === \"tool\" && typeof message.content === \"string\") {\r\n return {\r\n ...message,\r\n content: compactToolPayloadForTransport(message.content, detailed ? 800 : 260),\r\n };\r\n }\r\n\r\n if (message.role === \"assistant\") {\r\n const cloned: Record<string, unknown> = {\r\n ...message,\r\n };\r\n\r\n if (typeof cloned.content === \"string\") {\r\n cloned.content = compactText(cloned.content, detailed ? 1_200 : 400);\r\n }\r\n\r\n if (globalIndex <= latestUserIndex) {\r\n delete cloned.reasoning_content;\r\n }\r\n\r\n return cloned as unknown as ChatCompletionMessageParam;\r\n }\r\n\r\n if ((message.role === \"user\" || message.role === \"system\") && typeof message.content === \"string\") {\r\n return {\r\n ...message,\r\n content: compactText(message.content, detailed ? 2_000 : 600),\r\n };\r\n }\r\n\r\n return message;\r\n });\r\n\r\n if (!systemMessage || systemMessage.role !== \"system\") {\r\n return trimmedTail;\r\n }\r\n\r\n return [\r\n {\r\n ...systemMessage,\r\n content:\r\n typeof systemMessage.content === \"string\"\r\n ? compactText(systemMessage.content, 12_000)\r\n : systemMessage.content,\r\n },\r\n ...trimmedTail,\r\n ];\r\n}\r\n\r\nfunction redactToolPayload(raw: string): string {\r\n try {\r\n const parsed = JSON.parse(raw) as Record<string, unknown>;\r\n const redacted = { ...parsed };\r\n\r\n if (\"content\" in redacted) {\r\n redacted.content = \"[redacted due to provider safety policy]\";\r\n }\r\n if (\"preview\" in redacted) {\r\n redacted.preview = \"[redacted due to provider safety policy]\";\r\n }\r\n if (\"output\" in redacted) {\r\n redacted.output = \"[redacted due to provider safety policy]\";\r\n }\r\n if (Array.isArray(redacted.matches)) {\r\n redacted.matches = redacted.matches.map((item) => {\r\n if (!item || typeof item !== \"object\") {\r\n return item;\r\n }\r\n\r\n const match = { ...(item as Record<string, unknown>) };\r\n if (\"text\" in match) {\r\n match.text = \"[redacted]\";\r\n }\r\n return match;\r\n });\r\n }\r\n\r\n redacted.redaction = \"tool content removed after provider content-policy rejection\";\r\n return JSON.stringify(redacted, null, 2);\r\n } catch {\r\n return JSON.stringify(\r\n {\r\n redaction: \"tool content removed after provider content-policy rejection\",\r\n },\r\n null,\r\n 2,\r\n );\r\n }\r\n}\r\n\r\nfunction compactText(value: string, maxChars: number): string {\r\n return value.length <= maxChars ? value : `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\n","import OpenAI from \"openai\";\r\nimport type {\r\n ChatCompletionMessageFunctionToolCall,\r\n ChatCompletionMessageParam,\r\n} from \"openai/resources/chat/completions\";\r\n\r\nimport { collapseContentParts, readReasoningContent } from \"./messages.js\";\r\nimport { normalizeAssistantResponse } from \"./responseNormalization.js\";\r\nimport {\r\n isContentPolicyError,\r\n isContextLengthError,\r\n isToolCompatibilityError,\r\n sanitizeMessagesForContentPolicy,\r\n shrinkMessagesForContextLimit,\r\n withApiRetries,\r\n} from \"./recovery.js\";\r\nimport type { ModelRequestMetric, ProviderUsageSnapshot } from \"./runtimeMetrics.js\";\r\nimport { createAbortError, isAbortError, throwIfAborted } from \"../utils/abort.js\";\r\nimport type { AssistantResponse, AgentCallbacks } from \"./types.js\";\r\nimport type { FunctionToolDefinition } from \"../tools/index.js\";\r\n\r\nexport async function fetchAssistantResponse(\r\n client: OpenAI,\r\n messages: ChatCompletionMessageParam[],\r\n model: string,\r\n tools: FunctionToolDefinition[] | undefined,\r\n callbacks: AgentCallbacks | undefined,\r\n abortSignal?: AbortSignal,\r\n onRequestMetric?: (metric: ModelRequestMetric) => void,\r\n): Promise<AssistantResponse> {\r\n try {\r\n return await tryFetch(client, messages, model, tools, callbacks, false, abortSignal, onRequestMetric);\r\n } catch (error) {\r\n if (isAbortError(error)) {\r\n throw error;\r\n }\r\n\r\n if (model === \"deepseek-reasoner\" && tools?.length && isToolCompatibilityError(error)) {\r\n return tryFetch(client, messages, \"deepseek-chat\", tools, callbacks, true, abortSignal, onRequestMetric);\r\n }\r\n\r\n if (isContextLengthError(error)) {\r\n const compactedMessages = shrinkMessagesForContextLimit(messages);\r\n return tryFetch(client, compactedMessages, model, tools, callbacks, false, abortSignal, onRequestMetric);\r\n }\r\n\r\n if (!isContentPolicyError(error)) {\r\n throw error;\r\n }\r\n\r\n const sanitizedMessages = sanitizeMessagesForContentPolicy(messages);\r\n return tryFetch(client, sanitizedMessages, model, tools, callbacks, false, abortSignal, onRequestMetric);\r\n }\r\n}\r\n\r\nasync function tryFetch(\r\n client: OpenAI,\r\n messages: ChatCompletionMessageParam[],\r\n model: string,\r\n tools: FunctionToolDefinition[] | undefined,\r\n callbacks: AgentCallbacks | undefined,\r\n forceThinking: boolean,\r\n abortSignal?: AbortSignal,\r\n onRequestMetric?: (metric: ModelRequestMetric) => void,\r\n): Promise<AssistantResponse> {\r\n try {\r\n return normalizeAssistantResponse(await withApiRetries(\r\n () => fetchAssistantResponseStreaming(client, messages, model, tools, callbacks, forceThinking, abortSignal, onRequestMetric),\r\n abortSignal,\r\n ));\r\n } catch (error) {\r\n if (isAbortError(error)) {\r\n throw error;\r\n }\r\n\r\n return normalizeAssistantResponse(await withApiRetries(\r\n () => fetchAssistantResponseNonStreaming(client, messages, model, tools, forceThinking, abortSignal, onRequestMetric),\r\n abortSignal,\r\n ));\r\n }\r\n}\r\n\r\nasync function fetchAssistantResponseStreaming(\r\n client: OpenAI,\r\n messages: ChatCompletionMessageParam[],\r\n model: string,\r\n tools: FunctionToolDefinition[] | undefined,\r\n callbacks: AgentCallbacks | undefined,\r\n forceThinking: boolean,\r\n abortSignal?: AbortSignal,\r\n onRequestMetric?: (metric: ModelRequestMetric) => void,\r\n): Promise<AssistantResponse> {\r\n const startedAt = Date.now();\r\n let usage: ProviderUsageSnapshot | undefined;\r\n throwIfAborted(abortSignal, \"Streaming request aborted\");\r\n try {\r\n const stream = await client.chat.completions.create(\r\n {\r\n ...buildRequestBody(model, messages, tools, true, forceThinking),\r\n signal: abortSignal,\r\n } as never,\r\n );\r\n\r\n if (abortSignal?.aborted) {\r\n abortStream(stream as { controller?: AbortController });\r\n throw createAbortError(\"Streaming aborted\");\r\n }\r\n\r\n let content = \"\";\r\n let reasoningContent = \"\";\r\n const toolCallParts = new Map<number, { id: string; name: string; arguments: string }>();\r\n\r\n for await (const chunk of stream as unknown as AsyncIterable<{\r\n usage?: unknown;\r\n choices?: Array<{\r\n delta?: {\r\n content?: string | null;\r\n reasoning_content?: string | null;\r\n tool_calls?: Array<{\r\n index?: number;\r\n id?: string;\r\n function?: {\r\n name?: string;\r\n arguments?: string;\r\n };\r\n }>;\r\n };\r\n }>;\r\n }>) {\r\n if (abortSignal?.aborted) {\r\n abortStream(stream as { controller?: AbortController });\r\n throw createAbortError(\"Streaming aborted\");\r\n }\r\n\r\n usage = extractProviderUsage(chunk.usage) ?? usage;\r\n const delta = chunk.choices?.[0]?.delta;\r\n if (!delta) {\r\n continue;\r\n }\r\n\r\n if (typeof delta.content === \"string\" && delta.content.length > 0) {\r\n content += delta.content;\r\n callbacks?.onAssistantDelta?.(delta.content);\r\n }\r\n\r\n if (typeof delta.reasoning_content === \"string\" && delta.reasoning_content.length > 0) {\r\n reasoningContent += delta.reasoning_content;\r\n callbacks?.onReasoningDelta?.(delta.reasoning_content);\r\n }\r\n\r\n if (Array.isArray(delta.tool_calls)) {\r\n for (const toolCall of delta.tool_calls) {\r\n const index = typeof toolCall.index === \"number\" ? toolCall.index : 0;\r\n const existing = toolCallParts.get(index) ?? {\r\n id: toolCall.id ?? `tool-${index}`,\r\n name: \"\",\r\n arguments: \"\",\r\n };\r\n\r\n if (toolCall.id) {\r\n existing.id = toolCall.id;\r\n }\r\n\r\n if (toolCall.function?.name) {\r\n existing.name += toolCall.function.name;\r\n }\r\n\r\n if (toolCall.function?.arguments) {\r\n existing.arguments += toolCall.function.arguments;\r\n }\r\n\r\n toolCallParts.set(index, existing);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n content: content.length > 0 ? content : null,\r\n reasoningContent: reasoningContent.length > 0 ? reasoningContent : undefined,\r\n streamedAssistantContent: content.length > 0,\r\n streamedReasoningContent: reasoningContent.length > 0,\r\n toolCalls: [...toolCallParts.entries()]\r\n .sort((left, right) => left[0] - right[0])\r\n .map(([, toolCall]) => ({\r\n id: toolCall.id,\r\n type: \"function\",\r\n function: {\r\n name: toolCall.name,\r\n arguments: toolCall.arguments,\r\n },\r\n })),\r\n };\r\n } finally {\r\n onRequestMetric?.({\r\n durationMs: Date.now() - startedAt,\r\n usage,\r\n });\r\n }\r\n}\r\n\r\nasync function fetchAssistantResponseNonStreaming(\r\n client: OpenAI,\r\n messages: ChatCompletionMessageParam[],\r\n model: string,\r\n tools?: FunctionToolDefinition[],\r\n forceThinking = false,\r\n abortSignal?: AbortSignal,\r\n onRequestMetric?: (metric: ModelRequestMetric) => void,\r\n): Promise<AssistantResponse> {\r\n const startedAt = Date.now();\r\n let usage: ProviderUsageSnapshot | undefined;\r\n throwIfAborted(abortSignal, \"Request aborted\");\r\n try {\r\n const completion = await client.chat.completions.create(\r\n {\r\n ...buildRequestBody(model, messages, tools, false, forceThinking),\r\n signal: abortSignal,\r\n } as never,\r\n );\r\n usage = extractProviderUsage((completion as { usage?: unknown }).usage);\r\n\r\n const message = completion.choices[0]?.message;\r\n if (!message) {\r\n throw new Error(\"API returned no message.\");\r\n }\r\n\r\n return {\r\n content:\r\n typeof message.content === \"string\" ? message.content : collapseContentParts(message.content),\r\n reasoningContent: readReasoningContent(message),\r\n streamedAssistantContent: false,\r\n streamedReasoningContent: false,\r\n toolCalls: (message.tool_calls ?? [])\r\n .filter((call): call is ChatCompletionMessageFunctionToolCall => call.type === \"function\")\r\n .map((call) => ({\r\n id: call.id,\r\n type: \"function\",\r\n function: {\r\n name: call.function.name,\r\n arguments: call.function.arguments,\r\n },\r\n })),\r\n };\r\n } finally {\r\n onRequestMetric?.({\r\n durationMs: Date.now() - startedAt,\r\n usage,\r\n });\r\n }\r\n}\r\n\r\nfunction buildRequestBody(\r\n model: string,\r\n messages: ChatCompletionMessageParam[],\r\n tools: FunctionToolDefinition[] | undefined,\r\n stream: boolean,\r\n forceThinking: boolean,\r\n): Record<string, unknown> {\r\n const body: Record<string, unknown> = {\r\n model,\r\n messages,\r\n tools,\r\n tool_choice: tools?.length ? \"auto\" : undefined,\r\n stream,\r\n };\r\n\r\n if (forceThinking || model === \"deepseek-chat\") {\r\n body.thinking = { type: \"enabled\" };\r\n }\r\n\r\n return body;\r\n}\r\n\r\nfunction abortStream(stream: { controller?: AbortController } | undefined): void {\r\n try {\r\n stream?.controller?.abort();\r\n } catch {\r\n // best-effort abort\r\n }\r\n}\r\n\r\nfunction extractProviderUsage(usage: unknown): ProviderUsageSnapshot | undefined {\r\n if (!usage || typeof usage !== \"object\") {\r\n return undefined;\r\n }\r\n\r\n const record = usage as {\r\n prompt_tokens?: unknown;\r\n input_tokens?: unknown;\r\n completion_tokens?: unknown;\r\n output_tokens?: unknown;\r\n total_tokens?: unknown;\r\n completion_tokens_details?: { reasoning_tokens?: unknown };\r\n output_tokens_details?: { reasoning_tokens?: unknown };\r\n };\r\n\r\n const snapshot: ProviderUsageSnapshot = {\r\n inputTokens: readUsageNumber(record.prompt_tokens ?? record.input_tokens),\r\n outputTokens: readUsageNumber(record.completion_tokens ?? record.output_tokens),\r\n totalTokens: readUsageNumber(record.total_tokens),\r\n reasoningTokens: readUsageNumber(\r\n record.completion_tokens_details?.reasoning_tokens ??\r\n record.output_tokens_details?.reasoning_tokens,\r\n ),\r\n };\r\n\r\n return Object.values(snapshot).some((value) => typeof value === \"number\") ? snapshot : undefined;\r\n}\r\n\r\nfunction readUsageNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? Math.round(value) : undefined;\r\n}\r\n","import type { ToolCallRecord, ToolExecutionResult } from \"../types.js\";\r\n\r\nconst MAX_IDENTICAL_TOOL_CALLS = 2;\r\n\r\nexport class ToolLoopGuard {\r\n private readonly counts = new Map<string, number>();\r\n\r\n reset(): void {\r\n this.counts.clear();\r\n }\r\n\r\n getBlockedResult(toolCall: ToolCallRecord): ToolExecutionResult | null {\r\n const signature = buildToolCallSignature(toolCall);\r\n const nextCount = (this.counts.get(signature) ?? 0) + 1;\r\n this.counts.set(signature, nextCount);\r\n\r\n if (nextCount <= MAX_IDENTICAL_TOOL_CALLS) {\r\n return null;\r\n }\r\n\r\n return {\r\n ok: false,\r\n output: JSON.stringify(\r\n {\r\n ok: false,\r\n error: `Loop guard blocked repeated ${toolCall.function.name} calls with identical arguments.`,\r\n code: \"LOOP_GUARD_BLOCKED\",\r\n hint: \"Do not retry the same tool call again. Re-read recent results, change the path or arguments, or choose a different tool.\",\r\n repeatedCount: nextCount,\r\n },\r\n null,\r\n 2,\r\n ),\r\n };\r\n }\r\n}\r\n\r\nfunction buildToolCallSignature(toolCall: ToolCallRecord): string {\r\n return `${toolCall.function.name}:${normalizeJsonLike(toolCall.function.arguments)}`;\r\n}\r\n\r\nfunction normalizeJsonLike(raw: string): string {\r\n try {\r\n const parsed = JSON.parse(raw) as unknown;\r\n return JSON.stringify(sortJsonValue(parsed));\r\n } catch {\r\n return raw.trim().replace(/\\s+/g, \" \");\r\n }\r\n}\r\n\r\nfunction sortJsonValue(value: unknown): unknown {\r\n if (Array.isArray(value)) {\r\n return value.map((item) => sortJsonValue(item));\r\n }\r\n\r\n if (!value || typeof value !== \"object\") {\r\n return value;\r\n }\r\n\r\n return Object.fromEntries(\r\n Object.entries(value)\r\n .sort(([left], [right]) => left.localeCompare(right))\r\n .map(([key, nested]) => [key, sortJsonValue(nested)]),\r\n );\r\n}\r\n","const VALIDATION_PATTERNS: Array<{\r\n kind: string;\r\n match: RegExp;\r\n}> = [\r\n { kind: \"node-eval\", match: /\\bnode(?:\\.exe)?\\b.*(?:^|\\s)(?:-e|--eval)(?:\\s|$)/i },\r\n { kind: \"node-test\", match: /\\bnode(?:\\.exe)?\\b.*(?:^|\\s)--test(?:\\s|$)/i },\r\n { kind: \"node-script-check\", match: /\\bnode(?:\\.exe)?\\b.*\\b[^\\s\"']*(?:test|spec|verify|verification)[^\\s\"']*\\.(?:[cm]?js|ts)\\b/i },\r\n { kind: \"python-inline\", match: /\\bpython(?:\\.exe)?\\b.*(?:\\s|^)-c\\b/i },\r\n { kind: \"typescript\", match: /\\btsc(?:\\.cmd)?\\b.*\\b--noEmit\\b/i },\r\n { kind: \"npm-build\", match: /\\bnpm(?:\\.cmd)?\\b.*\\brun\\s+build\\b/i },\r\n { kind: \"npm-test\", match: /\\bnpm(?:\\.cmd)?\\b.*\\btest\\b/i },\r\n { kind: \"pnpm-build\", match: /\\bpnpm(?:\\.cmd)?\\b.*\\brun\\s+build\\b/i },\r\n { kind: \"pnpm-test\", match: /\\bpnpm(?:\\.cmd)?\\b.*\\btest\\b/i },\r\n { kind: \"yarn-build\", match: /\\byarn(?:\\.cmd)?\\b.*\\bbuild\\b/i },\r\n { kind: \"yarn-test\", match: /\\byarn(?:\\.cmd)?\\b.*\\btest\\b/i },\r\n { kind: \"pytest\", match: /\\bpytest\\b/i },\r\n { kind: \"go-test\", match: /\\bgo\\b.*\\btest\\b/i },\r\n { kind: \"cargo-test\", match: /\\bcargo\\b.*\\btest\\b/i },\r\n];\r\n\r\nexport function classifyValidationCommand(command: string): string | undefined {\r\n const normalized = command.trim();\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n return VALIDATION_PATTERNS.find((entry) => entry.match.test(normalized))?.kind;\r\n}\r\n","import { classifyValidationCommand } from \"./validation.js\";\r\n\r\nexport type CommandKind = \"read_only\" | \"mutating\" | \"long_running\" | \"validation\" | \"unknown\";\r\n\r\nexport interface CommandClassification {\r\n kind: CommandKind;\r\n validationKind?: string;\r\n isReadOnly: boolean;\r\n isMutating: boolean;\r\n isLongRunning: boolean;\r\n requiresPlan: boolean;\r\n preferBackground: boolean;\r\n retryable: boolean;\r\n}\r\n\r\nconst READ_ONLY_PATTERNS: RegExp[] = [\r\n /^\\s*(ls|dir|pwd|cd)\\b/i,\r\n /^\\s*(cat|type|more|less)\\b/i,\r\n /^\\s*(rg|grep|find)\\b/i,\r\n /^\\s*git\\s+(status|diff|log|show|branch)\\b/i,\r\n /^\\s*(whoami|where|which)\\b/i,\r\n /^\\s*(node|python|pip|java|go|rustc|cargo|npm|pnpm|yarn)\\b.*--version\\b/i,\r\n /^\\s*(node|python|pip|java|go|rustc|cargo|npm|pnpm|yarn)\\b.*-v\\b/i,\r\n];\r\n\r\nconst MUTATING_PATTERNS: RegExp[] = [\r\n /^\\s*(rm|del|erase)\\b/i,\r\n /^\\s*(mv|move|ren|rename|copy|cp)\\b/i,\r\n /^\\s*(mkdir|rmdir|rd)\\b/i,\r\n /^\\s*touch\\b/i,\r\n /^\\s*git\\s+(checkout|switch|add|reset|clean|commit|merge|rebase|cherry-pick|stash)\\b/i,\r\n /^\\s*(npm|pnpm|yarn)\\b.*\\b(init|install|ci)\\b/i,\r\n /^\\s*(pip|poetry|conda)\\b.*\\binstall\\b/i,\r\n /^\\s*(brew|apt-get|apt|yum|dnf)\\b.*\\binstall\\b/i,\r\n];\r\n\r\nconst LONG_RUNNING_PATTERNS: RegExp[] = [\r\n /^\\s*(npm|pnpm|yarn)\\b.*\\b(install|ci|run\\s+build|run\\s+test)\\b/i,\r\n /^\\s*(pip|poetry|conda)\\b.*\\binstall\\b/i,\r\n /^\\s*(pytest|go\\s+test|cargo\\s+test|cargo\\s+build|mvn|gradle)\\b/i,\r\n /^\\s*(docker\\s+build|docker\\s+pull)\\b/i,\r\n /^\\s*git\\s+clone\\b/i,\r\n];\r\n\r\nexport function classifyCommand(command: string): CommandClassification {\r\n const normalized = command.trim();\r\n const validationKind = classifyValidationCommand(normalized);\r\n const isReadOnly = READ_ONLY_PATTERNS.some((pattern) => pattern.test(normalized));\r\n const isMutating = MUTATING_PATTERNS.some((pattern) => pattern.test(normalized));\r\n const isLongRunning =\r\n Boolean(validationKind) || LONG_RUNNING_PATTERNS.some((pattern) => pattern.test(normalized));\r\n\r\n let kind: CommandKind = \"unknown\";\r\n if (validationKind) {\r\n kind = \"validation\";\r\n } else if (isReadOnly) {\r\n kind = \"read_only\";\r\n } else if (isMutating) {\r\n kind = \"mutating\";\r\n } else if (isLongRunning) {\r\n kind = \"long_running\";\r\n }\r\n\r\n return {\r\n kind,\r\n validationKind,\r\n isReadOnly,\r\n isMutating,\r\n isLongRunning,\r\n requiresPlan: !isReadOnly && !validationKind,\r\n preferBackground: isLongRunning && !validationKind,\r\n retryable: isReadOnly || Boolean(validationKind),\r\n };\r\n}\r\n","import { hasIncompleteTodos } from \"./todos.js\";\r\nimport type { AgentIdentity } from \"./types.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\nimport { classifyCommand } from \"../utils/commandPolicy.js\";\r\n\r\nconst PLAN_REQUIRED_TOOLS = new Set([\r\n \"write_file\",\r\n \"edit_file\",\r\n \"apply_patch\",\r\n \"write_docx\",\r\n \"edit_docx\",\r\n \"run_shell\",\r\n \"background_run\",\r\n]);\r\n\r\nexport function getPlanBlockedResult(\r\n toolName: string,\r\n rawArgs: string,\r\n session: SessionRecord,\r\n identity: AgentIdentity,\r\n): { ok: false; output: string } | null {\r\n if (identity.kind === \"subagent\") {\r\n return null;\r\n }\r\n\r\n if (!PLAN_REQUIRED_TOOLS.has(toolName)) {\r\n return null;\r\n }\r\n\r\n if (toolName === \"run_shell\" || toolName === \"background_run\") {\r\n const command = readCommandFromArgs(rawArgs);\r\n if (command) {\r\n const classification = classifyCommand(command);\r\n if (classification.isReadOnly || classification.validationKind) {\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n if (hasIncompleteTodos(session.todoItems)) {\r\n return null;\r\n }\r\n\r\n return {\r\n ok: false,\r\n output: JSON.stringify(\r\n {\r\n ok: false,\r\n error: \"Plan required before executing a mutating tool.\",\r\n code: \"PLAN_REQUIRED\",\r\n hint: \"Call todo_write first with a short plan (keep one item in_progress), then retry the tool call.\",\r\n suggestedTool: \"todo_write\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n };\r\n}\r\n\r\nexport function readCommandFromArgs(rawArgs: string): string | null {\r\n try {\r\n const parsed = JSON.parse(rawArgs) as Record<string, unknown>;\r\n return typeof parsed.command === \"string\" ? parsed.command : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n","import { getErrorMessage } from \"./errors.js\";\r\nimport { isRetryableApiError } from \"./recovery.js\";\r\nimport { sleepWithSignal, throwIfAborted } from \"../utils/abort.js\";\r\nimport type { RuntimeConfig } from \"../types.js\";\r\n\r\nexport type RecoveryRequestConfig = Pick<\r\n RuntimeConfig,\r\n \"contextWindowMessages\" | \"model\" | \"maxContextChars\" | \"contextSummaryChars\"\r\n>;\r\n\r\nexport function isRecoverableTurnError(error: unknown): boolean {\r\n if (isRetryableApiError(error)) {\r\n return true;\r\n }\r\n\r\n const code = String((error as { code?: unknown }).code ?? \"\");\r\n const message = String((error as { message?: unknown }).message ?? error).toLowerCase();\r\n\r\n return (\r\n code === \"ECONNRESET\" ||\r\n code === \"ECONNREFUSED\" ||\r\n code === \"ETIMEDOUT\" ||\r\n code === \"UND_ERR_CONNECT_TIMEOUT\" ||\r\n code === \"UND_ERR_HEADERS_TIMEOUT\" ||\r\n code === \"UND_ERR_SOCKET\" ||\r\n message.includes(\"connection error\") ||\r\n message.includes(\"socket hang up\") ||\r\n message.includes(\"connection reset\") ||\r\n message.includes(\"connection refused\") ||\r\n message.includes(\"connect timeout\") ||\r\n message.includes(\"headers timeout\") ||\r\n message.includes(\"timed out\") ||\r\n message.includes(\"temporarily unavailable\") ||\r\n message.includes(\"stream ended unexpectedly\")\r\n );\r\n}\r\n\r\nexport function pickRequestModel(configuredModel: string, consecutiveFailures: number): string {\r\n if (configuredModel === \"deepseek-reasoner\" && consecutiveFailures >= 6) {\r\n return \"deepseek-chat\";\r\n }\r\n\r\n return configuredModel;\r\n}\r\n\r\nexport function buildRecoveryRequestConfig(\r\n config: RuntimeConfig,\r\n model: string,\r\n consecutiveFailures: number,\r\n): RecoveryRequestConfig {\r\n const shrinkStep = Math.min(4, Math.floor(consecutiveFailures / 2));\r\n const factors = [1, 0.85, 0.7, 0.55, 0.4];\r\n const factor = factors[shrinkStep] ?? 0.4;\r\n\r\n return {\r\n model,\r\n contextWindowMessages: Math.max(6, Math.floor(config.contextWindowMessages * factor)),\r\n maxContextChars: Math.max(8_000, Math.floor(config.maxContextChars * factor)),\r\n contextSummaryChars: Math.max(1_000, Math.floor(config.contextSummaryChars * Math.max(0.5, factor))),\r\n };\r\n}\r\n\r\nexport function buildRecoveryStatus(\r\n error: unknown,\r\n consecutiveFailures: number,\r\n delayMs: number,\r\n configuredModel: string,\r\n requestModel: string,\r\n requestConfig: RecoveryRequestConfig,\r\n): string {\r\n const fragments = [\r\n `Model request failed (${truncateForStatus(getErrorMessage(error), 160)}).`,\r\n `Auto-retrying in ${formatDelay(delayMs)}.`,\r\n `streak=${consecutiveFailures}`,\r\n ];\r\n\r\n if (requestModel !== configuredModel) {\r\n fragments.push(`modelFallback=${requestModel}`);\r\n }\r\n\r\n if (consecutiveFailures > 0) {\r\n fragments.push(\r\n `reducedContext=${requestConfig.contextWindowMessages}/${requestConfig.maxContextChars}/${requestConfig.contextSummaryChars}`,\r\n );\r\n }\r\n\r\n return fragments.join(\" \");\r\n}\r\n\r\nexport function computeRecoveryDelayMs(consecutiveFailures: number): number {\r\n const exponent = Math.min(6, Math.max(0, consecutiveFailures - 1));\r\n return Math.min(30_000, 1_000 * (2 ** exponent));\r\n}\r\n\r\nexport async function sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n throwIfAborted(signal, \"Retry delay aborted\");\r\n await sleepWithSignal(ms, signal);\r\n}\r\n\r\nfunction formatDelay(ms: number): string {\r\n if (ms % 1_000 === 0) {\r\n return `${ms / 1_000}s`;\r\n }\r\n\r\n return `${ms}ms`;\r\n}\r\n\r\nfunction truncateForStatus(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport type { CoordinationPolicyRecord } from \"./types.js\";\r\n\r\nexport class CoordinationPolicyStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async load(): Promise<CoordinationPolicyRecord> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n try {\r\n const raw = await fs.readFile(paths.coordinationPolicyFile, \"utf8\");\r\n return normalizePolicy(JSON.parse(raw) as CoordinationPolicyRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n const initial = createDefaultPolicy();\r\n await this.save(initial);\r\n return initial;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async save(policy: CoordinationPolicyRecord): Promise<CoordinationPolicyRecord> {\r\n const normalized = normalizePolicy(policy);\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n await fs.writeFile(paths.coordinationPolicyFile, `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n return normalized;\r\n }\r\n\r\n async update(updates: Partial<Pick<CoordinationPolicyRecord, \"allowPlanDecisions\" | \"allowShutdownRequests\">>): Promise<CoordinationPolicyRecord> {\r\n const current = await this.load();\r\n return this.save({\r\n ...current,\r\n ...updates,\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n async summarize(): Promise<string> {\r\n const policy = await this.load();\r\n return [\r\n `- plan decisions: ${policy.allowPlanDecisions ? \"allowed\" : \"locked\"}`,\r\n `- shutdown requests: ${policy.allowShutdownRequests ? \"allowed\" : \"locked\"}`,\r\n `- updated at: ${policy.updatedAt}`,\r\n ].join(\"\\n\");\r\n }\r\n}\r\n\r\nfunction createDefaultPolicy(): CoordinationPolicyRecord {\r\n return {\r\n allowPlanDecisions: false,\r\n allowShutdownRequests: false,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n}\r\n\r\nfunction normalizePolicy(policy: CoordinationPolicyRecord): CoordinationPolicyRecord {\r\n return {\r\n allowPlanDecisions: Boolean(policy.allowPlanDecisions),\r\n allowShutdownRequests: Boolean(policy.allowShutdownRequests),\r\n updatedAt: typeof policy.updatedAt === \"string\" && policy.updatedAt ? policy.updatedAt : new Date().toISOString(),\r\n };\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport { PROTOCOL_REQUEST_KINDS } from \"./types.js\";\r\nimport type {\r\n ProtocolDecisionRecord,\r\n ProtocolRequestKind,\r\n ProtocolRequestRecord,\r\n ProtocolRequestStatus,\r\n} from \"./types.js\";\r\n\r\nexport class ProtocolRequestStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async create(input: {\r\n kind: ProtocolRequestKind;\r\n from: string;\r\n to: string;\r\n subject: string;\r\n content: string;\r\n }): Promise<ProtocolRequestRecord> {\r\n const timestamp = new Date().toISOString();\r\n const record = normalizeProtocolRequest({\r\n id: createRequestId(),\r\n kind: input.kind,\r\n from: input.from,\r\n to: input.to,\r\n subject: input.subject,\r\n content: input.content,\r\n status: \"pending\",\r\n createdAt: timestamp,\r\n updatedAt: timestamp,\r\n });\r\n await this.save(record);\r\n return record;\r\n }\r\n\r\n async load(requestId: string): Promise<ProtocolRequestRecord | null> {\r\n const filePath = this.getRequestPath(requestId);\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n return normalizeProtocolRequest(JSON.parse(raw) as ProtocolRequestRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return null;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async loadOrThrow(requestId: string): Promise<ProtocolRequestRecord> {\r\n const request = await this.load(requestId);\r\n if (!request) {\r\n throw new Error(`Unknown protocol request: ${requestId}`);\r\n }\r\n\r\n return request;\r\n }\r\n\r\n async resolve(\r\n requestId: string,\r\n input: {\r\n approve: boolean;\r\n feedback?: string;\r\n respondedBy: string;\r\n },\r\n ): Promise<ProtocolRequestRecord> {\r\n const current = await this.loadOrThrow(requestId);\r\n if (current.status !== \"pending\") {\r\n throw new Error(`Protocol request ${requestId} is already ${current.status}.`);\r\n }\r\n\r\n const timestamp = new Date().toISOString();\r\n const next = normalizeProtocolRequest({\r\n ...current,\r\n status: input.approve ? \"approved\" : \"rejected\",\r\n decision: {\r\n approve: input.approve,\r\n feedback: input.feedback,\r\n respondedBy: input.respondedBy,\r\n respondedAt: timestamp,\r\n },\r\n updatedAt: timestamp,\r\n });\r\n await this.save(next);\r\n return next;\r\n }\r\n\r\n async list(): Promise<ProtocolRequestRecord[]> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const entries = await fs.readdir(paths.requestsDir, { withFileTypes: true });\r\n const requests = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && /^request_[a-z0-9_-]+\\.json$/i.test(entry.name))\r\n .map(async (entry) => {\r\n const raw = await fs.readFile(path.join(paths.requestsDir, entry.name), \"utf8\");\r\n return normalizeProtocolRequest(JSON.parse(raw) as ProtocolRequestRecord);\r\n }),\r\n );\r\n\r\n return requests.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\r\n }\r\n\r\n async summarize(limit = 12): Promise<string> {\r\n const requests = await this.list();\r\n if (requests.length === 0) {\r\n return \"No protocol requests.\";\r\n }\r\n\r\n return requests\r\n .slice(0, Math.max(1, Math.trunc(limit)))\r\n .map((request) => {\r\n const status = formatStatus(request.status);\r\n const route = `${request.from} -> ${request.to}`;\r\n return `${status} ${request.kind} ${request.id} ${route} ${truncate(request.subject, 80)}`;\r\n })\r\n .join(\"\\n\");\r\n }\r\n\r\n private async save(request: ProtocolRequestRecord): Promise<void> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n await fs.writeFile(this.getRequestPath(request.id, paths.requestsDir), `${JSON.stringify(request, null, 2)}\\n`, \"utf8\");\r\n }\r\n\r\n private getRequestPath(requestId: string, baseDir = getProjectStatePaths(this.rootDir).requestsDir): string {\r\n return path.join(baseDir, `request_${normalizeId(requestId)}.json`);\r\n }\r\n}\r\n\r\nfunction normalizeProtocolRequest(record: ProtocolRequestRecord): ProtocolRequestRecord {\r\n const now = new Date().toISOString();\r\n return {\r\n id: normalizeId(record.id) || createRequestId(),\r\n kind: normalizeKind(record.kind),\r\n from: normalizeName(record.from) || \"lead\",\r\n to: normalizeName(record.to) || \"lead\",\r\n subject: normalizeText(record.subject) || \"Request\",\r\n content: normalizeText(record.content),\r\n status: normalizeStatus(record.status),\r\n decision: normalizeDecision(record.decision),\r\n createdAt: typeof record.createdAt === \"string\" && record.createdAt ? record.createdAt : now,\r\n updatedAt: typeof record.updatedAt === \"string\" && record.updatedAt ? record.updatedAt : now,\r\n };\r\n}\r\n\r\nfunction normalizeKind(value: unknown): ProtocolRequestKind {\r\n const normalized = normalizeText(value);\r\n const kind = PROTOCOL_REQUEST_KINDS.find((entry) => entry === normalized);\r\n if (!kind) {\r\n throw new Error(`Invalid protocol request kind: ${String(value ?? \"\")}`);\r\n }\r\n\r\n return kind;\r\n}\r\n\r\nfunction normalizeStatus(value: unknown): ProtocolRequestStatus {\r\n const normalized = normalizeText(value);\r\n if (normalized === \"pending\" || normalized === \"approved\" || normalized === \"rejected\") {\r\n return normalized;\r\n }\r\n\r\n return \"pending\";\r\n}\r\n\r\nfunction normalizeDecision(value: unknown): ProtocolDecisionRecord | undefined {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n return undefined;\r\n }\r\n\r\n const record = value as Partial<ProtocolDecisionRecord>;\r\n if (typeof record.approve !== \"boolean\") {\r\n return undefined;\r\n }\r\n\r\n const respondedAt = typeof record.respondedAt === \"string\" && record.respondedAt ? record.respondedAt : new Date().toISOString();\r\n return {\r\n approve: record.approve,\r\n feedback: normalizeText(record.feedback),\r\n respondedBy: normalizeName(record.respondedBy) || \"lead\",\r\n respondedAt,\r\n };\r\n}\r\n\r\nfunction createRequestId(): string {\r\n return crypto.randomUUID().slice(0, 8);\r\n}\r\n\r\nfunction normalizeId(value: unknown): string {\r\n return String(value ?? \"\").trim().toLowerCase().replace(/[^a-z0-9_-]/g, \"\");\r\n}\r\n\r\nfunction normalizeName(value: unknown): string {\r\n return normalizeText(value).replace(/\\s+/g, \"-\");\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction formatStatus(status: ProtocolRequestStatus): string {\r\n switch (status) {\r\n case \"approved\":\r\n return \"[x]\";\r\n case \"rejected\":\r\n return \"[!]\";\r\n default:\r\n return \"[>]\";\r\n }\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { normalizeTodoItems } from \"../agent/todos.js\";\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport type { TaskRecord, TaskStatus } from \"./types.js\";\r\nimport type { TodoItem } from \"../types.js\";\r\n\r\nexport class TaskStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async create(\r\n subject: string,\r\n description = \"\",\r\n options: {\r\n assignee?: string;\r\n } = {},\r\n ): Promise<TaskRecord> {\r\n const normalizedSubject = normalizeText(subject);\r\n if (!normalizedSubject) {\r\n throw new Error(\"Task subject is required.\");\r\n }\r\n\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const nextId = (await this.getMaxId(paths.tasksDir)) + 1;\r\n const now = new Date().toISOString();\r\n const task: TaskRecord = {\r\n id: nextId,\r\n subject: normalizedSubject,\r\n description: normalizeText(description),\r\n status: \"pending\",\r\n blockedBy: [],\r\n blocks: [],\r\n assignee: normalizeText(options.assignee),\r\n owner: \"\",\r\n worktree: \"\",\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n await this.save(task);\r\n return task;\r\n }\r\n\r\n async load(taskId: number): Promise<TaskRecord> {\r\n const filePath = this.getTaskPath(taskId);\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n return normalizeTaskRecord(JSON.parse(raw) as TaskRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n throw new Error(`Task ${taskId} not found.`);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async save(task: TaskRecord): Promise<TaskRecord> {\r\n await ensureProjectStateDirectories(this.rootDir);\r\n const normalized = normalizeTaskRecord(task);\r\n await fs.writeFile(this.getTaskPath(normalized.id), `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n return normalized;\r\n }\r\n\r\n async update(\r\n taskId: number,\r\n updates: {\r\n status?: TaskStatus;\r\n addBlockedBy?: number[];\r\n addBlocks?: number[];\r\n assignee?: string;\r\n owner?: string;\r\n worktree?: string;\r\n },\r\n ): Promise<TaskRecord> {\r\n const task = await this.load(taskId);\r\n const addBlockedBy = uniqueNumbers(updates.addBlockedBy ?? []);\r\n const addBlocks = uniqueNumbers(updates.addBlocks ?? []);\r\n await this.assertDependencyUpdateIsValid(taskId, addBlockedBy, addBlocks);\r\n\r\n const nextStatus = updates.status ?? task.status;\r\n const nextBlockedBy = uniqueNumbers([...task.blockedBy, ...addBlockedBy]);\r\n const nextBlocks = uniqueNumbers([...task.blocks, ...addBlocks]);\r\n const nextChecklist =\r\n nextStatus === \"completed\"\r\n ? completeChecklist(task.checklist)\r\n : normalizeTaskChecklist(task.checklist);\r\n const nextAssignee = typeof updates.assignee === \"string\" ? normalizeText(updates.assignee) : task.assignee;\r\n const nextOwner = typeof updates.owner === \"string\" ? normalizeText(updates.owner) : task.owner;\r\n const nextWorktree = typeof updates.worktree === \"string\" ? normalizeText(updates.worktree) : task.worktree;\r\n\r\n if (task.status === \"completed\" && nextStatus !== \"completed\") {\r\n throw new Error(`Task ${taskId} is already completed and cannot be reopened.`);\r\n }\r\n\r\n if (nextStatus === \"in_progress\" && nextBlockedBy.length > 0) {\r\n throw new Error(`Task ${taskId} is blocked by ${nextBlockedBy.join(\", \")} and cannot start.`);\r\n }\r\n\r\n if (nextOwner && nextBlockedBy.length > 0) {\r\n throw new Error(`Task ${taskId} is blocked by ${nextBlockedBy.join(\", \")} and cannot be owned.`);\r\n }\r\n\r\n if (nextStatus === \"completed\" && nextBlockedBy.length > 0) {\r\n throw new Error(`Task ${taskId} is still blocked by ${nextBlockedBy.join(\", \")}.`);\r\n }\r\n\r\n if (nextAssignee && nextOwner && nextOwner !== nextAssignee) {\r\n throw new Error(`Task ${taskId} is assigned to ${nextAssignee}, not ${nextOwner}.`);\r\n }\r\n\r\n const next: TaskRecord = {\r\n ...task,\r\n status: nextStatus,\r\n blockedBy: nextBlockedBy,\r\n blocks: nextBlocks,\r\n checklist: nextChecklist,\r\n assignee: nextAssignee,\r\n owner: nextOwner,\r\n worktree: nextWorktree,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n\r\n await this.save(next);\r\n await Promise.all([\r\n ...addBlockedBy.map(async (blockerId) => this.addBlockLink(blockerId, taskId)),\r\n ...addBlocks.map(async (blockedTaskId) => this.addBlockedByLink(blockedTaskId, taskId)),\r\n ]);\r\n\r\n if (next.status === \"completed\" && task.status !== \"completed\") {\r\n await this.clearDependency(taskId);\r\n }\r\n\r\n return this.load(taskId);\r\n }\r\n\r\n async claim(taskId: number, owner: string): Promise<TaskRecord> {\r\n const normalizedOwner = normalizeText(owner);\r\n if (!normalizedOwner) {\r\n throw new Error(\"Task owner is required.\");\r\n }\r\n\r\n const task = await this.load(taskId);\r\n if (task.status === \"completed\") {\r\n throw new Error(`Task ${taskId} is already completed.`);\r\n }\r\n\r\n if (task.blockedBy.length > 0) {\r\n throw new Error(`Task ${taskId} is blocked by ${task.blockedBy.join(\", \")}.`);\r\n }\r\n\r\n if (task.assignee && task.assignee !== normalizedOwner) {\r\n throw new Error(`Task ${taskId} is assigned to ${task.assignee}.`);\r\n }\r\n\r\n if (task.owner && task.owner !== normalizedOwner) {\r\n throw new Error(`Task ${taskId} is already claimed by ${task.owner}.`);\r\n }\r\n\r\n return this.update(taskId, {\r\n owner: normalizedOwner,\r\n status: \"in_progress\",\r\n });\r\n }\r\n\r\n async setChecklist(taskId: number, checklist: TodoItem[]): Promise<TaskRecord> {\r\n const task = await this.load(taskId);\r\n return this.save({\r\n ...task,\r\n checklist: normalizeTaskChecklist(checklist),\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n async findOwnedActive(owner: string): Promise<TaskRecord | undefined> {\r\n const normalizedOwner = normalizeText(owner);\r\n if (!normalizedOwner) {\r\n return undefined;\r\n }\r\n\r\n const tasks = await this.list();\r\n return tasks\r\n .filter((task) => task.owner === normalizedOwner && task.status !== \"completed\")\r\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))[0];\r\n }\r\n\r\n async assign(taskId: number, assignee: string): Promise<TaskRecord> {\r\n const normalizedAssignee = normalizeText(assignee);\r\n if (!normalizedAssignee) {\r\n throw new Error(\"Task assignee is required.\");\r\n }\r\n\r\n const task = await this.load(taskId);\r\n if (task.status === \"completed\") {\r\n throw new Error(`Task ${taskId} is already completed.`);\r\n }\r\n\r\n if (task.owner && task.owner !== normalizedAssignee) {\r\n throw new Error(`Task ${taskId} is already claimed by ${task.owner}.`);\r\n }\r\n\r\n return this.update(taskId, {\r\n assignee: normalizedAssignee,\r\n });\r\n }\r\n\r\n async releaseOwner(owner: string): Promise<TaskRecord[]> {\r\n const normalizedOwner = normalizeText(owner);\r\n if (!normalizedOwner) {\r\n return [];\r\n }\r\n\r\n const tasks = await this.list();\r\n const affected = tasks.filter((task) => task.owner === normalizedOwner && task.status !== \"completed\");\r\n const now = new Date().toISOString();\r\n\r\n await Promise.all(\r\n affected.map((task) =>\r\n this.save({\r\n ...task,\r\n owner: \"\",\r\n status: \"pending\",\r\n updatedAt: now,\r\n })),\r\n );\r\n\r\n return Promise.all(affected.map((task) => this.load(task.id)));\r\n }\r\n\r\n async bindWorktree(taskId: number, worktree: string): Promise<TaskRecord> {\r\n const task = await this.load(taskId);\r\n return this.save({\r\n ...task,\r\n worktree: normalizeText(worktree),\r\n status: task.status === \"pending\" ? \"in_progress\" : task.status,\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n async unbindWorktree(taskId: number): Promise<TaskRecord> {\r\n const task = await this.load(taskId);\r\n return this.save({\r\n ...task,\r\n worktree: \"\",\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n async list(): Promise<TaskRecord[]> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const entries = await fs.readdir(paths.tasksDir, { withFileTypes: true });\r\n const tasks = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && /^task_\\d+\\.json$/i.test(entry.name))\r\n .map(async (entry) => {\r\n const raw = await fs.readFile(path.join(paths.tasksDir, entry.name), \"utf8\");\r\n return normalizeTaskRecord(JSON.parse(raw) as TaskRecord);\r\n }),\r\n );\r\n return tasks.sort((left, right) => left.id - right.id);\r\n }\r\n\r\n async listClaimable(owner?: string): Promise<TaskRecord[]> {\r\n const tasks = await this.list();\r\n const normalizedOwner = normalizeText(owner);\r\n const claimable = tasks.filter(\r\n (task) =>\r\n task.status !== \"completed\" &&\r\n task.blockedBy.length === 0 &&\r\n !task.owner &&\r\n (!normalizedOwner || !task.assignee || task.assignee === normalizedOwner),\r\n );\r\n\r\n if (!normalizedOwner) {\r\n return claimable;\r\n }\r\n\r\n return claimable.sort((left, right) => {\r\n const leftPriority = left.assignee === normalizedOwner ? 0 : 1;\r\n const rightPriority = right.assignee === normalizedOwner ? 0 : 1;\r\n if (leftPriority !== rightPriority) {\r\n return leftPriority - rightPriority;\r\n }\r\n\r\n return left.id - right.id;\r\n });\r\n }\r\n\r\n async summarize(): Promise<string> {\r\n const tasks = await this.list();\r\n if (tasks.length === 0) {\r\n return \"No tasks.\";\r\n }\r\n\r\n return tasks\r\n .map((task) => {\r\n const marker = task.status === \"completed\" ? \"[x]\" : task.status === \"in_progress\" ? \"[>]\" : \"[ ]\";\r\n const blocked = task.blockedBy.length > 0 ? ` blockedBy=${task.blockedBy.join(\",\")}` : \"\";\r\n const blocks = task.blocks.length > 0 ? ` blocks=${task.blocks.join(\",\")}` : \"\";\r\n const checklist = task.checklist && task.checklist.length > 0\r\n ? ` plan=${task.checklist.filter((item) => item.status === \"completed\").length}/${task.checklist.length}`\r\n : \"\";\r\n const assignee = task.assignee ? ` ->${task.assignee}` : \"\";\r\n const owner = task.owner ? ` @${task.owner}` : \"\";\r\n const worktree = task.worktree ? ` wt=${task.worktree}` : \"\";\r\n return `${marker} #${task.id}: ${task.subject}${blocked}${blocks}${checklist}${assignee}${owner}${worktree}`;\r\n })\r\n .join(\"\\n\");\r\n }\r\n\r\n private async assertDependencyUpdateIsValid(\r\n taskId: number,\r\n addBlockedBy: number[],\r\n addBlocks: number[],\r\n ): Promise<void> {\r\n const newEdges = [\r\n ...addBlockedBy.map((blockerId) => [blockerId, taskId] as const),\r\n ...addBlocks.map((blockedTaskId) => [taskId, blockedTaskId] as const),\r\n ];\r\n\r\n if (newEdges.length === 0) {\r\n return;\r\n }\r\n\r\n for (const [blockerId, blockedTaskId] of newEdges) {\r\n if (blockerId === blockedTaskId) {\r\n throw new Error(`Task ${taskId} cannot depend on itself.`);\r\n }\r\n }\r\n\r\n await Promise.all(\r\n uniqueNumbers(newEdges.flatMap(([blockerId, blockedTaskId]) => [blockerId, blockedTaskId])).map((id) => this.load(id)),\r\n );\r\n\r\n const graph = buildGraph(await this.list());\r\n for (const [blockerId, blockedTaskId] of newEdges) {\r\n if (pathExists(graph, blockedTaskId, blockerId)) {\r\n throw new Error(\r\n `Task dependency cycle detected: adding ${blockerId} -> ${blockedTaskId} would create a loop.`,\r\n );\r\n }\r\n\r\n if (!graph.has(blockerId)) {\r\n graph.set(blockerId, new Set());\r\n }\r\n graph.get(blockerId)?.add(blockedTaskId);\r\n }\r\n }\r\n\r\n private async addBlockedByLink(taskId: number, blockerId: number): Promise<void> {\r\n const task = await this.load(taskId);\r\n if (task.blockedBy.includes(blockerId)) {\r\n return;\r\n }\r\n\r\n await this.save({\r\n ...task,\r\n blockedBy: uniqueNumbers([...task.blockedBy, blockerId]),\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n private async addBlockLink(taskId: number, blockedTaskId: number): Promise<void> {\r\n const task = await this.load(taskId);\r\n if (task.blocks.includes(blockedTaskId)) {\r\n return;\r\n }\r\n\r\n await this.save({\r\n ...task,\r\n blocks: uniqueNumbers([...task.blocks, blockedTaskId]),\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n private async clearDependency(completedId: number): Promise<void> {\r\n const tasks = await this.list();\r\n await Promise.all(\r\n tasks\r\n .filter((task) => task.blockedBy.includes(completedId))\r\n .map((task) =>\r\n this.save({\r\n ...task,\r\n blockedBy: task.blockedBy.filter((id) => id !== completedId),\r\n updatedAt: new Date().toISOString(),\r\n })),\r\n );\r\n }\r\n\r\n private getTaskPath(taskId: number): string {\r\n const paths = getProjectStatePaths(this.rootDir);\r\n return path.join(paths.tasksDir, `task_${taskId}.json`);\r\n }\r\n\r\n private async getMaxId(tasksDir: string): Promise<number> {\r\n const entries = await fs.readdir(tasksDir, { withFileTypes: true });\r\n const ids = entries\r\n .filter((entry) => entry.isFile())\r\n .map((entry) => entry.name.match(/^task_(\\d+)\\.json$/i)?.[1])\r\n .filter((value): value is string => Boolean(value))\r\n .map((value) => Number.parseInt(value, 10))\r\n .filter((value) => Number.isFinite(value));\r\n return ids.length > 0 ? Math.max(...ids) : 0;\r\n }\r\n}\r\n\r\nfunction normalizeTaskRecord(task: TaskRecord): TaskRecord {\r\n const now = new Date().toISOString();\r\n const status = normalizeStatus(task.status);\r\n\r\n return {\r\n id: Math.max(1, Math.trunc(task.id)),\r\n subject: normalizeText(task.subject),\r\n description: normalizeText(task.description),\r\n status,\r\n blockedBy: uniqueNumbers(task.blockedBy ?? []),\r\n blocks: uniqueNumbers(task.blocks ?? []),\r\n checklist: normalizeTaskChecklist(task.checklist),\r\n assignee: normalizeText(task.assignee),\r\n owner: normalizeText(task.owner),\r\n worktree: normalizeText(task.worktree),\r\n createdAt: typeof task.createdAt === \"string\" && task.createdAt ? task.createdAt : now,\r\n updatedAt: typeof task.updatedAt === \"string\" && task.updatedAt ? task.updatedAt : now,\r\n };\r\n}\r\n\r\nfunction normalizeStatus(value: string): TaskStatus {\r\n if (value === \"pending\" || value === \"in_progress\" || value === \"completed\") {\r\n return value;\r\n }\r\n\r\n return \"pending\";\r\n}\r\n\r\nfunction uniqueNumbers(values: number[]): number[] {\r\n return [...new Set(values.filter((value) => Number.isFinite(value)).map((value) => Math.trunc(value)))]\r\n .filter((value) => value > 0)\r\n .sort((left, right) => left - right);\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction normalizeTaskChecklist(value: unknown): TodoItem[] {\r\n return normalizeTodoItems(value);\r\n}\r\n\r\nfunction completeChecklist(value: unknown): TodoItem[] {\r\n return normalizeTaskChecklist(value).map((item) => ({\r\n ...item,\r\n status: \"completed\",\r\n }));\r\n}\r\n\r\nfunction buildGraph(tasks: TaskRecord[]): Map<number, Set<number>> {\r\n const graph = new Map<number, Set<number>>();\r\n for (const task of tasks) {\r\n if (!graph.has(task.id)) {\r\n graph.set(task.id, new Set());\r\n }\r\n\r\n for (const blockedTaskId of task.blocks) {\r\n graph.get(task.id)?.add(blockedTaskId);\r\n }\r\n }\r\n return graph;\r\n}\r\n\r\nfunction pathExists(graph: Map<number, Set<number>>, start: number, target: number): boolean {\r\n const queue = [start];\r\n const visited = new Set<number>();\r\n\r\n while (queue.length > 0) {\r\n const current = queue.shift();\r\n if (typeof current !== \"number\" || visited.has(current)) {\r\n continue;\r\n }\r\n\r\n if (current === target) {\r\n return true;\r\n }\r\n\r\n visited.add(current);\r\n for (const next of graph.get(current) ?? []) {\r\n if (!visited.has(next)) {\r\n queue.push(next);\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { ensureProjectStateDirectories } from \"../project/statePaths.js\";\r\nimport type {\r\n TeamConfigRecord,\r\n TeamMemberRecord,\r\n TeamMemberStatus,\r\n} from \"./types.js\";\r\n\r\nexport class TeamStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async loadConfig(): Promise<TeamConfigRecord> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n try {\r\n const raw = await fs.readFile(paths.teamConfigFile, \"utf8\");\r\n return normalizeConfig(JSON.parse(raw) as TeamConfigRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n const initial = normalizeConfig({\r\n teamName: \"default\",\r\n members: [],\r\n });\r\n await this.saveConfig(initial);\r\n return initial;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async saveConfig(config: TeamConfigRecord): Promise<TeamConfigRecord> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const normalized = normalizeConfig(config);\r\n await fs.writeFile(paths.teamConfigFile, `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n return normalized;\r\n }\r\n\r\n async listMembers(): Promise<TeamMemberRecord[]> {\r\n return (await this.loadConfig()).members;\r\n }\r\n\r\n async findMember(name: string): Promise<TeamMemberRecord | undefined> {\r\n const normalizedName = normalizeName(name);\r\n return (await this.loadConfig()).members.find((member) => member.name === normalizedName);\r\n }\r\n\r\n async upsertMember(\r\n name: string,\r\n role: string,\r\n status: TeamMemberStatus,\r\n options: {\r\n sessionId?: string;\r\n pid?: number;\r\n } = {},\r\n ): Promise<TeamMemberRecord> {\r\n const config = await this.loadConfig();\r\n const normalizedName = normalizeName(name);\r\n const now = new Date().toISOString();\r\n const existing = config.members.find((member) => member.name === normalizedName);\r\n const nextMember = normalizeMember({\r\n name: normalizedName,\r\n role,\r\n status,\r\n sessionId: options.sessionId ?? existing?.sessionId,\r\n pid: typeof options.pid === \"number\" ? options.pid : existing?.pid,\r\n createdAt: existing?.createdAt ?? now,\r\n updatedAt: now,\r\n });\r\n\r\n const nextMembers = existing\r\n ? config.members.map((member) => (member.name === normalizedName ? nextMember : member))\r\n : [...config.members, nextMember];\r\n\r\n await this.saveConfig({\r\n ...config,\r\n members: nextMembers,\r\n });\r\n return nextMember;\r\n }\r\n\r\n async updateMemberStatus(name: string, status: TeamMemberStatus, pid?: number): Promise<TeamMemberRecord> {\r\n const member = await this.findMember(name);\r\n if (!member) {\r\n throw new Error(`Unknown teammate: ${name}`);\r\n }\r\n\r\n if (member.status === \"shutdown\" && status !== \"shutdown\") {\r\n return member;\r\n }\r\n\r\n return this.upsertMember(member.name, member.role, status, {\r\n sessionId: member.sessionId,\r\n pid: typeof pid === \"number\" ? pid : member.pid,\r\n });\r\n }\r\n\r\n async setMemberSession(name: string, sessionId: string): Promise<TeamMemberRecord> {\r\n const member = await this.findMember(name);\r\n if (!member) {\r\n throw new Error(`Unknown teammate: ${name}`);\r\n }\r\n\r\n return this.upsertMember(member.name, member.role, member.status, {\r\n sessionId,\r\n pid: member.pid,\r\n });\r\n }\r\n\r\n async summarizeMembers(): Promise<string> {\r\n const members = await this.listMembers();\r\n if (members.length === 0) {\r\n return \"No teammates.\";\r\n }\r\n\r\n const config = await this.loadConfig();\r\n return [\r\n `Team: ${config.teamName}`,\r\n ...members.map((member) => ` ${member.name} (${member.role}): ${member.status}`),\r\n ].join(\"\\n\");\r\n }\r\n}\r\n\r\nfunction normalizeConfig(config: TeamConfigRecord): TeamConfigRecord {\r\n const members = Array.isArray(config.members) ? config.members.map((member) => normalizeMember(member)) : [];\r\n return {\r\n teamName: normalizeText(config.teamName) || \"default\",\r\n members: members.sort((left, right) => left.name.localeCompare(right.name)),\r\n };\r\n}\r\n\r\nfunction normalizeMember(member: TeamMemberRecord): TeamMemberRecord {\r\n const now = new Date().toISOString();\r\n return {\r\n name: normalizeName(member.name),\r\n role: normalizeText(member.role) || \"generalist\",\r\n status: normalizeMemberStatus(member.status),\r\n sessionId: typeof member.sessionId === \"string\" && member.sessionId ? member.sessionId : undefined,\r\n pid: typeof member.pid === \"number\" && Number.isFinite(member.pid) ? Math.trunc(member.pid) : undefined,\r\n createdAt: typeof member.createdAt === \"string\" && member.createdAt ? member.createdAt : now,\r\n updatedAt: typeof member.updatedAt === \"string\" && member.updatedAt ? member.updatedAt : now,\r\n };\r\n}\r\n\r\nfunction normalizeMemberStatus(value: string): TeamMemberStatus {\r\n return value === \"working\" || value === \"idle\" || value === \"shutdown\" ? value : \"idle\";\r\n}\r\n\r\nfunction normalizeName(value: unknown): string {\r\n return normalizeText(value).replace(/\\s+/g, \"-\");\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n","import process from \"node:process\";\r\n\r\nimport type { TaskRecord } from \"../tasks/types.js\";\r\nimport type { TeamMemberRecord } from \"./types.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { TeamStore } from \"./store.js\";\r\n\r\nexport interface TeamReconcileResult {\r\n staleMembers: TeamMemberRecord[];\r\n releasedTasks: TaskRecord[];\r\n}\r\n\r\nexport async function reconcileTeamState(rootDir: string): Promise<TeamReconcileResult> {\r\n const teamStore = new TeamStore(rootDir);\r\n const taskStore = new TaskStore(rootDir);\r\n const members = await teamStore.listMembers();\r\n const staleMembers: TeamMemberRecord[] = [];\r\n const releasedTasks: TaskRecord[] = [];\r\n\r\n for (const member of members) {\r\n if (member.status === \"shutdown\" || typeof member.pid !== \"number\") {\r\n continue;\r\n }\r\n\r\n if (isProcessAlive(member.pid)) {\r\n continue;\r\n }\r\n\r\n staleMembers.push(await teamStore.updateMemberStatus(member.name, \"shutdown\"));\r\n }\r\n\r\n for (const member of staleMembers) {\r\n releasedTasks.push(...(await taskStore.releaseOwner(member.name)));\r\n }\r\n\r\n return {\r\n staleMembers,\r\n releasedTasks,\r\n };\r\n}\r\n\r\nfunction isProcessAlive(pid: number): boolean {\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import process from \"node:process\";\r\n\r\nimport type { BackgroundJobRecord } from \"./types.js\";\r\nimport { BackgroundJobStore } from \"./store.js\";\r\n\r\nexport interface BackgroundReconcileResult {\r\n staleJobs: BackgroundJobRecord[];\r\n}\r\n\r\nexport async function reconcileBackgroundJobs(rootDir: string): Promise<BackgroundReconcileResult> {\r\n const store = new BackgroundJobStore(rootDir);\r\n const jobs = await store.list();\r\n const staleJobs: BackgroundJobRecord[] = [];\r\n\r\n for (const job of jobs) {\r\n if (job.status !== \"running\" || typeof job.pid !== \"number\") {\r\n continue;\r\n }\r\n\r\n if (isProcessAlive(job.pid)) {\r\n continue;\r\n }\r\n\r\n staleJobs.push(\r\n await store.complete(job.id, {\r\n status: \"failed\",\r\n exitCode: job.exitCode,\r\n output: job.output ?? \"Background worker exited unexpectedly before reporting completion.\",\r\n }),\r\n );\r\n }\r\n\r\n return {\r\n staleJobs,\r\n };\r\n}\r\n\r\nfunction isProcessAlive(pid: number): boolean {\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { execa } from \"execa\";\r\n\r\nimport { ensureProjectStateDirectories, getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport type { TaskRecord } from \"../tasks/types.js\";\r\nimport type { WorktreeEventRecord, WorktreeIndexRecord, WorktreeRecord, WorktreeStatus } from \"./types.js\";\r\n\r\nexport class WorktreeStore {\r\n constructor(private readonly rootDir: string) {}\r\n\r\n async create(name: string, taskId?: number): Promise<WorktreeRecord> {\r\n await this.ensureGitRepo();\r\n await this.reconcile();\r\n\r\n const normalizedName = normalizeName(name);\r\n if (!normalizedName) {\r\n throw new Error(\"Worktree name is required.\");\r\n }\r\n\r\n const existing = await this.find(normalizedName);\r\n if (existing && existing.status !== \"removed\") {\r\n if (typeof taskId === \"number\") {\r\n await this.bindTask(existing.name, taskId);\r\n }\r\n return (await this.find(normalizedName)) ?? existing;\r\n }\r\n\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const record: WorktreeRecord = normalizeWorktree({\r\n name: normalizedName,\r\n path: path.join(paths.worktreesDir, normalizedName),\r\n branch: existing?.branch || `wt/${normalizedName}`,\r\n status: \"active\",\r\n taskId,\r\n createdAt: existing?.createdAt ?? new Date().toISOString(),\r\n updatedAt: new Date().toISOString(),\r\n });\r\n\r\n await this.emit({\r\n event: \"worktree.create.before\",\r\n ts: Date.now(),\r\n task: typeof taskId === \"number\" ? { id: taskId } : undefined,\r\n worktree: {\r\n name: record.name,\r\n status: record.status,\r\n path: record.path,\r\n branch: record.branch,\r\n },\r\n });\r\n\r\n try {\r\n const branchExists = await this.branchExists(record.branch);\r\n await this.runGit(\r\n branchExists\r\n ? [\"worktree\", \"add\", record.path, record.branch]\r\n : [\"worktree\", \"add\", \"-b\", record.branch, record.path, \"HEAD\"],\r\n );\r\n await this.upsertRecord(record);\r\n if (typeof taskId === \"number\") {\r\n await this.bindTask(record.name, taskId);\r\n }\r\n const next = await this.get(record.name);\r\n await this.emit({\r\n event: \"worktree.create.after\",\r\n ts: Date.now(),\r\n task: typeof taskId === \"number\" ? { id: taskId, worktree: record.name } : undefined,\r\n worktree: {\r\n name: next.name,\r\n status: next.status,\r\n path: next.path,\r\n branch: next.branch,\r\n },\r\n });\r\n return next;\r\n } catch (error) {\r\n await this.emit({\r\n event: \"worktree.create.failed\",\r\n ts: Date.now(),\r\n task: typeof taskId === \"number\" ? { id: taskId } : undefined,\r\n worktree: {\r\n name: record.name,\r\n status: record.status,\r\n path: record.path,\r\n branch: record.branch,\r\n },\r\n error: readError(error),\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n async ensureForTask(taskId: number, preferredName?: string): Promise<WorktreeRecord> {\r\n const taskStore = new TaskStore(this.rootDir);\r\n const task = await taskStore.load(taskId);\r\n if (task.worktree) {\r\n const bound = await this.find(task.worktree);\r\n if (bound && bound.status !== \"removed\") {\r\n return bound;\r\n }\r\n\r\n await taskStore.unbindWorktree(taskId);\r\n }\r\n\r\n const baseName = normalizeName(preferredName || task.subject || `task-${taskId}`);\r\n const name = await this.reserveAvailableName(baseName || `task-${taskId}`);\r\n return this.create(name, taskId);\r\n }\r\n\r\n async get(name: string): Promise<WorktreeRecord> {\r\n const existing = await this.find(name);\r\n if (!existing) {\r\n throw new Error(`Unknown worktree: ${name}`);\r\n }\r\n return existing;\r\n }\r\n\r\n async find(name: string): Promise<WorktreeRecord | undefined> {\r\n const normalizedName = normalizeName(name);\r\n if (!normalizedName) {\r\n return undefined;\r\n }\r\n const index = await this.loadIndex();\r\n return index.items.find((item) => item.name === normalizedName);\r\n }\r\n\r\n async list(): Promise<WorktreeRecord[]> {\r\n await this.reconcile();\r\n return (await this.loadIndex()).items\r\n .slice()\r\n .sort((left, right) => left.name.localeCompare(right.name));\r\n }\r\n\r\n async findByPath(cwd: string): Promise<WorktreeRecord | undefined> {\r\n const resolvedCwd = path.resolve(cwd);\r\n const worktrees = await this.list();\r\n return worktrees.find((worktree) => {\r\n if (worktree.status === \"removed\") {\r\n return false;\r\n }\r\n\r\n const relative = path.relative(worktree.path, resolvedCwd);\r\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\r\n });\r\n }\r\n\r\n async keep(name: string): Promise<WorktreeRecord> {\r\n const worktree = await this.get(name);\r\n const next = await this.upsertRecord({\r\n ...worktree,\r\n status: \"kept\",\r\n updatedAt: new Date().toISOString(),\r\n });\r\n await this.emit({\r\n event: \"worktree.keep\",\r\n ts: Date.now(),\r\n task: typeof next.taskId === \"number\" ? { id: next.taskId, worktree: next.name } : undefined,\r\n worktree: {\r\n name: next.name,\r\n status: next.status,\r\n path: next.path,\r\n branch: next.branch,\r\n },\r\n });\r\n return next;\r\n }\r\n\r\n async remove(\r\n name: string,\r\n options: {\r\n force?: boolean;\r\n completeTask?: boolean;\r\n } = {},\r\n ): Promise<WorktreeRecord> {\r\n await this.ensureGitRepo();\r\n const worktree = await this.get(name);\r\n await this.emit({\r\n event: \"worktree.remove.before\",\r\n ts: Date.now(),\r\n task: typeof worktree.taskId === \"number\" ? { id: worktree.taskId, worktree: worktree.name } : undefined,\r\n worktree: {\r\n name: worktree.name,\r\n status: worktree.status,\r\n path: worktree.path,\r\n branch: worktree.branch,\r\n },\r\n });\r\n\r\n try {\r\n const args = [\"worktree\", \"remove\"];\r\n if (options.force) {\r\n args.push(\"--force\");\r\n }\r\n args.push(worktree.path);\r\n await this.runGit(args);\r\n await this.runGit([\"worktree\", \"prune\"]).catch(() => null);\r\n\r\n if (typeof worktree.taskId === \"number\") {\r\n const taskStore = new TaskStore(this.rootDir);\r\n if (options.completeTask) {\r\n await taskStore.update(worktree.taskId, { status: \"completed\" });\r\n }\r\n await taskStore.unbindWorktree(worktree.taskId);\r\n }\r\n\r\n const next = await this.upsertRecord({\r\n ...worktree,\r\n status: \"removed\",\r\n updatedAt: new Date().toISOString(),\r\n });\r\n await this.emit({\r\n event: \"worktree.remove.after\",\r\n ts: Date.now(),\r\n task:\r\n typeof worktree.taskId === \"number\"\r\n ? {\r\n id: worktree.taskId,\r\n status: options.completeTask ? \"completed\" : undefined,\r\n }\r\n : undefined,\r\n worktree: {\r\n name: next.name,\r\n status: next.status,\r\n path: next.path,\r\n branch: next.branch,\r\n },\r\n });\r\n return next;\r\n } catch (error) {\r\n await this.emit({\r\n event: \"worktree.remove.failed\",\r\n ts: Date.now(),\r\n task: typeof worktree.taskId === \"number\" ? { id: worktree.taskId, worktree: worktree.name } : undefined,\r\n worktree: {\r\n name: worktree.name,\r\n status: worktree.status,\r\n path: worktree.path,\r\n branch: worktree.branch,\r\n },\r\n error: readError(error),\r\n });\r\n throw error;\r\n }\r\n }\r\n\r\n async summarize(): Promise<string> {\r\n const worktrees = await this.list();\r\n if (worktrees.length === 0) {\r\n return \"No worktrees.\";\r\n }\r\n\r\n return worktrees\r\n .map((worktree) => {\r\n const marker = formatMarker(worktree.status);\r\n const task = typeof worktree.taskId === \"number\" ? ` task=${worktree.taskId}` : \"\";\r\n return `${marker} ${worktree.name}${task} branch=${worktree.branch}`;\r\n })\r\n .join(\"\\n\");\r\n }\r\n\r\n async readEvents(limit = 20): Promise<WorktreeEventRecord[]> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n try {\r\n const raw = await fs.readFile(paths.worktreeEventsFile, \"utf8\");\r\n return raw\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .filter(Boolean)\r\n .map((line) => JSON.parse(line) as WorktreeEventRecord)\r\n .slice(-Math.max(1, Math.trunc(limit)));\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return [];\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n async reconcile(): Promise<void> {\r\n const index = await this.loadIndex();\r\n const nextItems: WorktreeRecord[] = [];\r\n\r\n for (const record of index.items) {\r\n const exists = await pathExists(record.path);\r\n const nextStatus: WorktreeStatus =\r\n record.status === \"removed\"\r\n ? \"removed\"\r\n : exists\r\n ? record.status\r\n : \"removed\";\r\n nextItems.push({\r\n ...record,\r\n status: nextStatus,\r\n });\r\n }\r\n\r\n const taskStore = new TaskStore(this.rootDir);\r\n const tasks = await taskStore.list();\r\n for (const task of tasks) {\r\n if (!task.worktree) {\r\n continue;\r\n }\r\n\r\n const bound = nextItems.find((item) => item.name === task.worktree && item.status !== \"removed\");\r\n if (!bound) {\r\n await taskStore.unbindWorktree(task.id);\r\n }\r\n }\r\n\r\n await this.saveIndex({ items: nextItems });\r\n }\r\n\r\n async resolveTaskCwd(taskId: number): Promise<string> {\r\n const task = await new TaskStore(this.rootDir).load(taskId);\r\n if (!task.worktree) {\r\n return this.rootDir;\r\n }\r\n\r\n const worktree = await this.find(task.worktree);\r\n if (!worktree || worktree.status === \"removed\") {\r\n return this.rootDir;\r\n }\r\n\r\n return worktree.path;\r\n }\r\n\r\n private async bindTask(worktreeName: string, taskId: number): Promise<void> {\r\n const worktree = await this.get(worktreeName);\r\n await new TaskStore(this.rootDir).bindWorktree(taskId, worktree.name);\r\n await this.upsertRecord({\r\n ...worktree,\r\n taskId,\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n private async reserveAvailableName(baseName: string): Promise<string> {\r\n const normalizedBase = normalizeName(baseName) || \"task\";\r\n const existing = new Set((await this.loadIndex()).items.map((item) => item.name));\r\n if (!existing.has(normalizedBase)) {\r\n return normalizedBase;\r\n }\r\n\r\n for (let suffix = 2; suffix < 10_000; suffix += 1) {\r\n const candidate = `${normalizedBase}-${suffix}`;\r\n if (!existing.has(candidate)) {\r\n return candidate;\r\n }\r\n }\r\n\r\n throw new Error(`Unable to reserve a worktree name from '${baseName}'.`);\r\n }\r\n\r\n private async loadIndex(): Promise<WorktreeIndexRecord> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n try {\r\n const raw = await fs.readFile(paths.worktreeIndexFile, \"utf8\");\r\n return normalizeIndex(JSON.parse(raw) as WorktreeIndexRecord);\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n const empty = normalizeIndex({ items: [] });\r\n await this.saveIndex(empty);\r\n return empty;\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n private async saveIndex(index: WorktreeIndexRecord): Promise<void> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n const normalized = normalizeIndex(index);\r\n await fs.writeFile(paths.worktreeIndexFile, `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n }\r\n\r\n private async upsertRecord(record: WorktreeRecord): Promise<WorktreeRecord> {\r\n const index = await this.loadIndex();\r\n const normalized = normalizeWorktree(record);\r\n const nextItems = index.items.some((item) => item.name === normalized.name)\r\n ? index.items.map((item) => (item.name === normalized.name ? normalized : item))\r\n : [...index.items, normalized];\r\n await this.saveIndex({ items: nextItems });\r\n return normalized;\r\n }\r\n\r\n private async emit(event: WorktreeEventRecord): Promise<void> {\r\n const paths = await ensureProjectStateDirectories(this.rootDir);\r\n await fs.appendFile(paths.worktreeEventsFile, `${JSON.stringify(event)}\\n`, \"utf8\");\r\n }\r\n\r\n private async ensureGitRepo(): Promise<void> {\r\n try {\r\n await this.runGit([\"rev-parse\", \"--show-toplevel\"]);\r\n } catch {\r\n throw new Error(\"Worktree support requires a git repository.\");\r\n }\r\n }\r\n\r\n private async branchExists(branch: string): Promise<boolean> {\r\n try {\r\n await this.runGit([\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branch}`]);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private async runGit(args: string[]): Promise<void> {\r\n await execa(\"git\", [\"-C\", this.rootDir, ...args], {\r\n reject: true,\r\n timeout: 120_000,\r\n all: true,\r\n windowsHide: true,\r\n });\r\n }\r\n}\r\n\r\nfunction normalizeIndex(index: WorktreeIndexRecord): WorktreeIndexRecord {\r\n return {\r\n items: Array.isArray(index.items)\r\n ? index.items.map((item) => normalizeWorktree(item)).sort((left, right) => left.name.localeCompare(right.name))\r\n : [],\r\n };\r\n}\r\n\r\nfunction normalizeWorktree(record: WorktreeRecord): WorktreeRecord {\r\n const now = new Date().toISOString();\r\n return {\r\n name: normalizeName(record.name),\r\n path: path.resolve(String(record.path ?? \"\")),\r\n branch: String(record.branch ?? \"\").trim() || `wt/${normalizeName(record.name) || \"task\"}`,\r\n status: normalizeStatus(record.status),\r\n taskId: typeof record.taskId === \"number\" && Number.isFinite(record.taskId) ? Math.trunc(record.taskId) : undefined,\r\n createdAt: typeof record.createdAt === \"string\" && record.createdAt ? record.createdAt : now,\r\n updatedAt: typeof record.updatedAt === \"string\" && record.updatedAt ? record.updatedAt : now,\r\n };\r\n}\r\n\r\nfunction normalizeStatus(value: string): WorktreeStatus {\r\n switch (value) {\r\n case \"kept\":\r\n case \"removed\":\r\n return value;\r\n default:\r\n return \"active\";\r\n }\r\n}\r\n\r\nfunction normalizeName(value: unknown): string {\r\n return String(value ?? \"\")\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\")\r\n .slice(0, 64);\r\n}\r\n\r\nfunction formatMarker(status: WorktreeStatus): string {\r\n switch (status) {\r\n case \"kept\":\r\n return \"[k]\";\r\n case \"removed\":\r\n return \"[x]\";\r\n default:\r\n return \"[>]\";\r\n }\r\n}\r\n\r\nfunction readError(error: unknown): string {\r\n return String((error as { all?: unknown; stderr?: unknown; message?: unknown }).all ??\r\n (error as { stderr?: unknown }).stderr ??\r\n (error as { message?: unknown }).message ??\r\n error);\r\n}\r\n\r\nasync function pathExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await fs.access(targetPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { createMessage } from \"./messages.js\";\r\nimport { createInternalReminder } from \"./taskState.js\";\r\nimport type { PromptRuntimeState } from \"./systemPrompt.js\";\r\nimport type { AgentIdentity, RunTurnOptions } from \"./types.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\nimport { getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport { MessageBus } from \"../team/messageBus.js\";\r\nimport { CoordinationPolicyStore } from \"../team/policyStore.js\";\r\nimport { ProtocolRequestStore } from \"../team/requestStore.js\";\r\nimport { reconcileTeamState } from \"../team/reconcile.js\";\r\nimport { TeamStore } from \"../team/store.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { BackgroundJobStore } from \"../background/store.js\";\r\nimport { reconcileBackgroundJobs } from \"../background/reconcile.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\n\r\nexport function shouldYieldTurn(yieldAfterToolSteps: number | undefined, iteration: number): boolean {\r\n return typeof yieldAfterToolSteps === \"number\" && Number.isFinite(yieldAfterToolSteps) && yieldAfterToolSteps > 0\r\n ? iteration > 0 && iteration % Math.trunc(yieldAfterToolSteps) === 0\r\n : false;\r\n}\r\n\r\nexport async function injectInboxMessagesIfNeeded(\r\n session: SessionRecord,\r\n options: RunTurnOptions,\r\n identity: AgentIdentity,\r\n rootDir: string,\r\n): Promise<SessionRecord> {\r\n if (identity.kind === \"subagent\") {\r\n return session;\r\n }\r\n\r\n const bus = new MessageBus(getProjectStatePaths(rootDir).rootDir);\r\n const inbox = await bus.readInbox(identity.name);\r\n if (inbox.length === 0) {\r\n return session;\r\n }\r\n\r\n const reminder =\r\n identity.kind === \"lead\"\r\n ? `Inbox updates arrived from teammates. Review and handle them.\\n<inbox>${JSON.stringify(inbox, null, 2)}</inbox>`\r\n : `Inbox updates arrived while you were working. Review and handle them before continuing.\\n<inbox>${JSON.stringify(inbox, null, 2)}</inbox>`;\r\n\r\n return options.sessionStore.appendMessages(session, [\r\n createMessage(\r\n \"user\",\r\n createInternalReminder(reminder),\r\n ),\r\n ]);\r\n}\r\n\r\nexport async function loadPromptRuntimeState(\r\n rootDir: string,\r\n identity: AgentIdentity,\r\n cwd?: string,\r\n): Promise<PromptRuntimeState> {\r\n await reconcileTeamState(rootDir).catch(() => null);\r\n await reconcileBackgroundJobs(rootDir).catch(() => null);\r\n const [taskSummary, teamSummary, worktreeSummary, backgroundSummary, protocolSummary, coordinationPolicySummary] = await Promise.all([\r\n new TaskStore(rootDir).summarize().catch(() => \"No tasks.\"),\r\n new TeamStore(rootDir).summarizeMembers().catch(() => \"No teammates.\"),\r\n new WorktreeStore(rootDir).summarize().catch(() => \"No worktrees.\"),\r\n new BackgroundJobStore(rootDir).summarize({\r\n cwd,\r\n requestedBy: identity.name,\r\n }).catch(() => \"No background jobs.\"),\r\n new ProtocolRequestStore(rootDir).summarize().catch(() => \"No protocol requests.\"),\r\n new CoordinationPolicyStore(rootDir).summarize().catch(() => \"- plan decisions: locked\\n- shutdown requests: locked\"),\r\n ]);\r\n\r\n return {\r\n identity,\r\n taskSummary,\r\n teamSummary,\r\n worktreeSummary,\r\n backgroundSummary,\r\n protocolSummary,\r\n coordinationPolicySummary,\r\n };\r\n}\r\n","import {\r\n buildSystemPromptLayers,\r\n renderPromptLayers,\r\n} from \"./promptSections.js\";\r\n\r\nexport type {\r\n PromptLayers,\r\n PromptRuntimeState,\r\n} from \"./promptSections.js\";\r\n\r\nexport {\r\n appendPromptMemory,\r\n buildSystemPromptLayers,\r\n renderPromptLayers,\r\n} from \"./promptSections.js\";\r\n\r\nexport function buildSystemPrompt(...args: Parameters<typeof buildSystemPromptLayers>): string {\r\n return renderPromptLayers(buildSystemPromptLayers(...args));\r\n}\r\n","import {\r\n noteCheckpointRecovery,\r\n noteCheckpointToolBatch,\r\n noteCheckpointTurnInput,\r\n noteCheckpointYield,\r\n} from \"./checkpoint.js\";\r\nimport { createMessage } from \"./messages.js\";\r\nimport { noteRuntimeRecovery, noteRuntimeTurnInput, noteRuntimeYield } from \"./runtimeMetrics.js\";\r\nimport { clearVerificationPause } from \"./verificationState.js\";\r\nimport type { SessionStoreLike } from \"./sessionStore.js\";\r\nimport type { SessionRecord, StoredMessage } from \"../types.js\";\r\n\r\ninterface PersistToolBatchInput {\r\n session: SessionRecord;\r\n sessionStore: SessionStoreLike;\r\n toolNames: string[];\r\n toolMessages: StoredMessage[];\r\n changedPaths: string[];\r\n}\r\n\r\nexport async function initializeTurnSession(\r\n session: SessionRecord,\r\n input: string,\r\n sessionStore: SessionStoreLike,\r\n): Promise<SessionRecord> {\r\n const appended = await sessionStore.appendMessages(session, [\r\n createMessage(\"user\", input),\r\n ]);\r\n\r\n return sessionStore.save(\r\n noteRuntimeTurnInput(noteCheckpointTurnInput(\r\n {\r\n ...appended,\r\n verificationState: clearVerificationPause(appended.verificationState),\r\n },\r\n input,\r\n ), input),\r\n );\r\n}\r\n\r\nexport async function persistYieldedTurn(\r\n session: SessionRecord,\r\n sessionStore: SessionStoreLike,\r\n iteration: number,\r\n): Promise<SessionRecord> {\r\n return sessionStore.save(noteRuntimeYield(noteCheckpointYield(session, `tool_steps_${iteration}`)));\r\n}\r\n\r\nexport async function persistRecoveryTurn(\r\n session: SessionRecord,\r\n sessionStore: SessionStoreLike,\r\n consecutiveFailures: number,\r\n error: unknown,\r\n): Promise<SessionRecord> {\r\n return sessionStore.save(noteRuntimeRecovery(noteCheckpointRecovery(session, consecutiveFailures, error)));\r\n}\r\n\r\nexport async function persistToolBatchCheckpoint(\r\n input: PersistToolBatchInput,\r\n): Promise<SessionRecord> {\r\n return input.sessionStore.save(\r\n noteCheckpointToolBatch(input.session, {\r\n toolNames: input.toolNames,\r\n toolMessages: input.toolMessages,\r\n changedPaths: input.changedPaths,\r\n }),\r\n );\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { createToolMessage } from \"./messages.js\";\r\nimport { buildToolPayloadPreview, compactToolPayload } from \"./toolResultPreview.js\";\r\nimport { getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport type { ExternalizedToolResultReference, ProjectContext, StoredMessage } from \"../types.js\";\r\n\r\nconst LARGE_TOOL_RESULT_CHAR_THRESHOLD = 12_000;\r\nconst LARGE_TOOL_RESULT_BYTE_THRESHOLD = 16_000;\r\nconst TOOL_RESULT_PREVIEW_MAX_CHARS = 1_600;\r\n\r\ninterface CreateStoredToolMessageParams {\r\n toolCallId: string;\r\n toolName: string;\r\n rawOutput: string;\r\n sessionId: string;\r\n projectContext: Pick<ProjectContext, \"stateRootDir\">;\r\n}\r\n\r\nexport async function createStoredToolMessage(\r\n params: CreateStoredToolMessageParams,\r\n): Promise<StoredMessage> {\r\n if (!shouldExternalizeToolResult(params.rawOutput)) {\r\n return createToolMessage(params.toolCallId, params.rawOutput, params.toolName);\r\n }\r\n\r\n const externalizedToolResult = await externalizeToolResult(params);\r\n return createToolMessage(\r\n params.toolCallId,\r\n JSON.stringify(buildExternalizedToolPayload(params.toolName, params.rawOutput, externalizedToolResult), null, 2),\r\n params.toolName,\r\n {\r\n externalizedToolResult,\r\n },\r\n );\r\n}\r\n\r\nexport function shouldExternalizeToolResult(rawOutput: string): boolean {\r\n return (\r\n rawOutput.length > LARGE_TOOL_RESULT_CHAR_THRESHOLD ||\r\n Buffer.byteLength(rawOutput, \"utf8\") > LARGE_TOOL_RESULT_BYTE_THRESHOLD\r\n );\r\n}\r\n\r\nasync function externalizeToolResult(\r\n params: CreateStoredToolMessageParams,\r\n): Promise<ExternalizedToolResultReference> {\r\n const statePaths = getProjectStatePaths(params.projectContext.stateRootDir);\r\n const sessionDir = path.join(statePaths.toolResultsDir, params.sessionId);\r\n const extension = detectStorageExtension(params.rawOutput);\r\n const slug = slugify(params.toolName);\r\n const hash = crypto.createHash(\"sha256\").update(params.rawOutput).digest(\"hex\");\r\n const filename = `${Date.now()}-${slug}-${hash.slice(0, 12)}.${extension}`;\r\n const absoluteStoragePath = path.join(sessionDir, filename);\r\n const storagePath = path.relative(params.projectContext.stateRootDir, absoluteStoragePath) || filename;\r\n\r\n await fs.mkdir(sessionDir, { recursive: true });\r\n await fs.writeFile(absoluteStoragePath, params.rawOutput, \"utf8\");\r\n\r\n return {\r\n scope: \"project_state_root\",\r\n storagePath,\r\n byteLength: Buffer.byteLength(params.rawOutput, \"utf8\"),\r\n charLength: params.rawOutput.length,\r\n preview: buildToolPayloadPreview(params.rawOutput, TOOL_RESULT_PREVIEW_MAX_CHARS),\r\n sha256: hash,\r\n };\r\n}\r\n\r\nfunction buildExternalizedToolPayload(\r\n toolName: string,\r\n rawOutput: string,\r\n externalizedToolResult: ExternalizedToolResultReference,\r\n): Record<string, unknown> {\r\n const payload: Record<string, unknown> = {\r\n externalized: true,\r\n tool: toolName,\r\n storagePath: externalizedToolResult.storagePath,\r\n byteLength: externalizedToolResult.byteLength,\r\n charLength: externalizedToolResult.charLength,\r\n summary: buildExternalizedSummary(toolName, rawOutput),\r\n preview: externalizedToolResult.preview,\r\n sha256: externalizedToolResult.sha256,\r\n };\r\n\r\n try {\r\n const parsed = JSON.parse(rawOutput) as Record<string, unknown>;\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n copyScalarField(payload, parsed, \"ok\");\r\n copyScalarField(payload, parsed, \"path\");\r\n copyScalarField(payload, parsed, \"requestedPath\");\r\n copyScalarField(payload, parsed, \"format\");\r\n copyScalarField(payload, parsed, \"title\");\r\n copyCountField(payload, parsed, \"entries\");\r\n copyCountField(payload, parsed, \"matches\");\r\n copyCountField(payload, parsed, \"sheets\");\r\n copyScalarField(payload, parsed, \"searched\");\r\n copyScalarField(payload, parsed, \"total\");\r\n copyScalarField(payload, parsed, \"jobId\");\r\n copyScalarField(payload, parsed, \"jobStatus\");\r\n copyScalarField(payload, parsed, \"taskId\");\r\n copyScalarField(payload, parsed, \"task\");\r\n copyScalarField(payload, parsed, \"member\");\r\n copyScalarField(payload, parsed, \"worktree\");\r\n }\r\n } catch {\r\n // keep generic payload\r\n }\r\n\r\n return payload;\r\n}\r\n\r\nfunction buildExternalizedSummary(toolName: string, rawOutput: string): string {\r\n try {\r\n const parsed = JSON.parse(rawOutput) as Record<string, unknown>;\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n const fragments = [\r\n describeScalar(\"ok\", parsed.ok),\r\n describeScalar(\"path\", parsed.path),\r\n describeScalar(\"requestedPath\", parsed.requestedPath),\r\n describeScalar(\"format\", parsed.format),\r\n describeScalar(\"title\", parsed.title),\r\n describeArrayCount(\"entries\", parsed.entries),\r\n describeArrayCount(\"matches\", parsed.matches),\r\n describeArrayCount(\"sheets\", parsed.sheets),\r\n describeScalar(\"searched\", parsed.searched),\r\n describeScalar(\"total\", parsed.total),\r\n describeScalar(\"jobId\", parsed.jobId),\r\n describeScalar(\"jobStatus\", parsed.jobStatus),\r\n describeScalar(\"taskId\", parsed.taskId),\r\n describeScalar(\"task\", parsed.task),\r\n describeScalar(\"member\", parsed.member),\r\n describeScalar(\"worktree\", parsed.worktree),\r\n ].filter((fragment): fragment is string => Boolean(fragment));\r\n\r\n if (fragments.length > 0) {\r\n return fragments.join(\"; \");\r\n }\r\n }\r\n } catch {\r\n // fall through\r\n }\r\n\r\n return compactToolPayload(toolName, rawOutput, 320);\r\n}\r\n\r\nfunction detectStorageExtension(rawOutput: string): string {\r\n try {\r\n JSON.parse(rawOutput);\r\n return \"json\";\r\n } catch {\r\n return \"txt\";\r\n }\r\n}\r\n\r\nfunction slugify(value: string): string {\r\n return value\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\")\r\n .slice(0, 40) || \"tool-result\";\r\n}\r\n\r\nfunction copyScalarField(\r\n target: Record<string, unknown>,\r\n source: Record<string, unknown>,\r\n key: string,\r\n): void {\r\n const value = source[key];\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n target[key] = value;\r\n }\r\n}\r\n\r\nfunction copyCountField(\r\n target: Record<string, unknown>,\r\n source: Record<string, unknown>,\r\n key: string,\r\n): void {\r\n const value = source[key];\r\n if (!Array.isArray(value)) {\r\n return;\r\n }\r\n\r\n target[`${key}Count`] = value.length;\r\n}\r\n\r\nfunction describeScalar(key: string, value: unknown): string | undefined {\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n return `${key}=${String(value)}`;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction describeArrayCount(key: string, value: unknown): string | undefined {\r\n if (!Array.isArray(value)) {\r\n return undefined;\r\n }\r\n\r\n return `${key}=${value.length}`;\r\n}\r\n","import type { FunctionToolDefinition } from \"../tools/index.js\";\r\n\r\nexport interface ToolPriorityOptions {\r\n input?: string;\r\n objective?: string;\r\n taskSummary?: string;\r\n missingRequiredSkillNames?: string[];\r\n}\r\n\r\nconst WEB_INTENT_PATTERNS = [\r\n /\\b(web|website|webpage|browser|site|url|online|internet)\\b/i,\r\n /\\b(latest news|latest updates|public info|public information|open the page|open the website)\\b/i,\r\n /https?:\\/\\//i,\r\n /上网|网上|网页|网站|浏览器|打开网页|打开网站|网页上|网站上|最新公开消息|最新消息/,\r\n];\r\n\r\nconst WEB_WORKFLOW_SKILLS = new Set([\"web-research\", \"browser-automation\"]);\r\nconst LOCAL_FILE_TOOLS = new Set([\"list_files\", \"read_file\", \"search_files\"]);\r\nconst SHELL_FALLBACK_TOOLS = new Set([\"run_shell\", \"background_run\"]);\r\n\r\nexport function prioritizeToolDefinitionsForTurn(\r\n definitions: FunctionToolDefinition[],\r\n options: ToolPriorityOptions,\r\n): FunctionToolDefinition[] {\r\n if (!shouldPrioritizeBrowserTools(definitions, options)) {\r\n return definitions;\r\n }\r\n\r\n const missingSkillNames = new Set(\r\n (options.missingRequiredSkillNames ?? []).map((name) => name.trim().toLowerCase()).filter(Boolean),\r\n );\r\n const shouldPreferLoadSkill =\r\n definitions.some((tool) => tool.function.name === \"load_skill\") &&\r\n [...missingSkillNames].some((name) => WEB_WORKFLOW_SKILLS.has(name));\r\n\r\n return definitions\r\n .map((definition, index) => ({\r\n definition,\r\n index,\r\n rank: getToolPriorityRank(definition.function.name, shouldPreferLoadSkill),\r\n }))\r\n .sort((left, right) => {\r\n if (left.rank !== right.rank) {\r\n return left.rank - right.rank;\r\n }\r\n\r\n return left.index - right.index;\r\n })\r\n .map((entry) => entry.definition);\r\n}\r\n\r\nfunction shouldPrioritizeBrowserTools(\r\n definitions: FunctionToolDefinition[],\r\n options: ToolPriorityOptions,\r\n): boolean {\r\n return hasPlaywrightBrowserTool(definitions) && matchesWebIntent(options);\r\n}\r\n\r\nfunction hasPlaywrightBrowserTool(definitions: FunctionToolDefinition[]): boolean {\r\n return definitions.some((tool) => isPlaywrightBrowserToolName(tool.function.name));\r\n}\r\n\r\nfunction matchesWebIntent(options: ToolPriorityOptions): boolean {\r\n const combinedText = [options.input, options.objective, options.taskSummary]\r\n .filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\r\n .join(\"\\n\")\r\n .trim();\r\n\r\n if (!combinedText) {\r\n return false;\r\n }\r\n\r\n return WEB_INTENT_PATTERNS.some((pattern) => pattern.test(combinedText));\r\n}\r\n\r\nfunction getToolPriorityRank(name: string, shouldPreferLoadSkill: boolean): number {\r\n if (shouldPreferLoadSkill && name === \"load_skill\") {\r\n return 0;\r\n }\r\n\r\n if (isPlaywrightBrowserToolName(name)) {\r\n return 10 + getPlaywrightBrowserToolOrder(name);\r\n }\r\n\r\n if (LOCAL_FILE_TOOLS.has(name)) {\r\n return 200;\r\n }\r\n\r\n if (SHELL_FALLBACK_TOOLS.has(name)) {\r\n return 300;\r\n }\r\n\r\n return 150;\r\n}\r\n\r\nfunction getPlaywrightBrowserToolOrder(name: string): number {\r\n if (name.endsWith(\"_browser_navigate\")) {\r\n return 0;\r\n }\r\n\r\n if (name.endsWith(\"_browser_snapshot\")) {\r\n return 1;\r\n }\r\n\r\n if (name.endsWith(\"_browser_take_screenshot\")) {\r\n return 2;\r\n }\r\n\r\n if (name.endsWith(\"_browser_click\")) {\r\n return 3;\r\n }\r\n\r\n if (name.endsWith(\"_browser_type\")) {\r\n return 4;\r\n }\r\n\r\n return 20;\r\n}\r\n\r\nfunction isPlaywrightBrowserToolName(name: string): boolean {\r\n return /^mcp_playwright_browser_/i.test(name);\r\n}\r\n","export class ToolExecutionError extends Error {\r\n readonly code: string;\r\n readonly details?: Record<string, unknown>;\r\n\r\n constructor(message: string, options: { code: string; details?: Record<string, unknown> }) {\r\n super(message);\r\n this.name = \"ToolExecutionError\";\r\n this.code = options.code;\r\n this.details = options.details;\r\n }\r\n}\r\n","import type { ChangeRecord } from \"../types.js\";\r\nimport type { RecordChangeInput, RecordChangeOperation } from \"../changes/store.js\";\r\nimport type { ToolContext } from \"./types.js\";\r\n\r\nexport interface PendingChangeOperation {\r\n path: string;\r\n kind: \"create\" | \"update\" | \"delete\";\r\n binary: boolean;\r\n preview?: string;\r\n beforeText?: string;\r\n afterText?: string;\r\n beforeData?: Buffer;\r\n afterData?: Buffer;\r\n}\r\n\r\nexport interface RecordedToolChange {\r\n change: ChangeRecord | null;\r\n warning?: string;\r\n}\r\n\r\nexport async function recordToolChange(\r\n context: ToolContext,\r\n input: {\r\n toolName: string;\r\n summary: string;\r\n preview?: string;\r\n operations: PendingChangeOperation[];\r\n },\r\n): Promise<RecordedToolChange> {\r\n const payload: RecordChangeInput = {\r\n sessionId: context.sessionId,\r\n cwd: context.cwd,\r\n toolName: input.toolName,\r\n summary: input.summary,\r\n preview: input.preview,\r\n operations: input.operations.map((operation) => toRecordOperation(operation)),\r\n };\r\n\r\n try {\r\n return {\r\n change: await context.changeStore.record(payload),\r\n };\r\n } catch (error) {\r\n return {\r\n change: null,\r\n warning: `Change history unavailable: ${error instanceof Error ? error.message : String(error)}`,\r\n };\r\n }\r\n}\r\n\r\nfunction toRecordOperation(operation: PendingChangeOperation): RecordChangeOperation {\r\n return {\r\n path: operation.path,\r\n kind: operation.kind,\r\n binary: operation.binary,\r\n preview: operation.preview,\r\n beforeData: operation.beforeData ?? encodeUtf8(operation.beforeText),\r\n afterData: operation.afterData ?? encodeUtf8(operation.afterText),\r\n };\r\n}\r\n\r\nfunction encodeUtf8(value: string | undefined): Buffer | undefined {\r\n if (typeof value !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n return Buffer.from(value, \"utf8\");\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { diffLines } from \"diff\";\r\n\r\nimport { truncateText } from \"../utils/fs.js\";\r\nimport type { RegisteredTool } from \"./types.js\";\r\nimport type { ToolExecutionMetadata, ToolExecutionResult } from \"../types.js\";\r\n\r\nexport function register(\r\n registry: Map<string, RegisteredTool>,\r\n tool: RegisteredTool,\r\n): void {\r\n registry.set(tool.definition.function.name, tool);\r\n}\r\n\r\nexport function parseArgs(rawArgs: string): Record<string, unknown> {\r\n try {\r\n const parsed = JSON.parse(rawArgs) as unknown;\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n throw new Error(\"Arguments must be a JSON object.\");\r\n }\r\n\r\n return parsed as Record<string, unknown>;\r\n } catch (error) {\r\n throw new Error(`Invalid tool arguments: ${(error as Error).message}`);\r\n }\r\n}\r\n\r\nexport function readString(value: unknown, field: string): string {\r\n if (typeof value !== \"string\" || value.length === 0) {\r\n throw new Error(`Tool argument \"${field}\" must be a non-empty string.`);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function readBoolean(value: unknown, fallback: boolean): boolean {\r\n return typeof value === \"boolean\" ? value : fallback;\r\n}\r\n\r\nexport function readRequiredBoolean(value: unknown, field: string): boolean {\r\n if (typeof value !== \"boolean\") {\r\n throw new Error(`Tool argument \"${field}\" must be a boolean.`);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function readOptionalNumber(value: unknown): number | undefined {\r\n return typeof value === \"number\" && Number.isFinite(value) ? Math.trunc(value) : undefined;\r\n}\r\n\r\nexport function clampNumber(value: unknown, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n return Math.max(min, Math.min(max, Math.trunc(value)));\r\n}\r\n\r\nexport function okResult(output: string, metadata?: ToolExecutionMetadata): ToolExecutionResult {\r\n return {\r\n ok: true,\r\n output,\r\n metadata,\r\n };\r\n}\r\n\r\nexport function buildDiffPreview(before: string, after: string): string {\r\n const lines: string[] = [];\r\n\r\n for (const part of diffLines(before, after)) {\r\n const marker = part.added ? \"+\" : part.removed ? \"-\" : \" \";\r\n for (const line of part.value.split(/\\r?\\n/)) {\r\n if (line.length === 0 && marker === \" \") {\r\n continue;\r\n }\r\n\r\n lines.push(`${marker} ${line}`);\r\n if (lines.length >= 200) {\r\n return `${lines.join(\"\\n\")}\\n... [diff truncated]`;\r\n }\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nexport async function walkDirectory(\r\n targetPath: string,\r\n recursive: boolean,\r\n maxEntries: number,\r\n options: {\r\n shouldIgnore?: (targetPath: string, isDirectory: boolean) => boolean;\r\n } = {},\r\n): Promise<Array<{\r\n path: string;\r\n type: \"file\" | \"directory\";\r\n size?: number;\r\n extension?: string;\r\n modifiedAt?: string;\r\n}>> {\r\n const results: Array<{\r\n path: string;\r\n type: \"file\" | \"directory\";\r\n size?: number;\r\n extension?: string;\r\n modifiedAt?: string;\r\n }> = [];\r\n const queue = [targetPath];\r\n\r\n while (queue.length > 0 && results.length < maxEntries) {\r\n const currentPath = queue.shift();\r\n if (!currentPath) {\r\n break;\r\n }\r\n\r\n const entries = await fs.readdir(currentPath, { withFileTypes: true });\r\n entries.sort((left, right) => left.name.localeCompare(right.name));\r\n\r\n for (const entry of entries) {\r\n if (results.length >= maxEntries) {\r\n break;\r\n }\r\n\r\n const entryPath = path.join(currentPath, entry.name);\r\n if (options.shouldIgnore?.(entryPath, entry.isDirectory())) {\r\n continue;\r\n }\r\n\r\n const stat = await fs.stat(entryPath);\r\n if (entry.isDirectory()) {\r\n results.push({\r\n path: entryPath,\r\n type: \"directory\",\r\n modifiedAt: stat.mtime.toISOString(),\r\n });\r\n if (recursive) {\r\n queue.push(entryPath);\r\n }\r\n } else {\r\n results.push({\r\n path: entryPath,\r\n type: \"file\",\r\n size: stat.size,\r\n extension: path.extname(entryPath).toLowerCase(),\r\n modifiedAt: stat.mtime.toISOString(),\r\n });\r\n }\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nexport async function tryReadTextFile(filePath: string, maxBytes: number): Promise<string | null> {\r\n try {\r\n const buffer = await fs.readFile(filePath);\r\n if (buffer.includes(0)) {\r\n return null;\r\n }\r\n\r\n return truncateText(buffer.toString(\"utf8\"), maxBytes);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function buildSearchPattern(pattern: string, caseSensitive: boolean): RegExp {\r\n try {\r\n return new RegExp(pattern, caseSensitive ? \"g\" : \"gi\");\r\n } catch {\r\n return new RegExp(escapeRegex(pattern), caseSensitive ? \"g\" : \"gi\");\r\n }\r\n}\r\n\r\nexport function countOccurrences(input: string, search: string): number {\r\n if (search.length === 0) {\r\n return 0;\r\n }\r\n\r\n let count = 0;\r\n let offset = 0;\r\n while (offset <= input.length) {\r\n const index = input.indexOf(search, offset);\r\n if (index === -1) {\r\n break;\r\n }\r\n\r\n count += 1;\r\n offset = index + search.length;\r\n }\r\n\r\n return count;\r\n}\r\n\r\nexport function normalizeDiffPath(fileName: string | undefined): string | null {\r\n if (!fileName || fileName === \"/dev/null\") {\r\n return null;\r\n }\r\n\r\n return fileName.replace(/^([ab])\\//, \"\");\r\n}\r\n\r\nfunction escapeRegex(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { assertPathAllowed, ensureParentDirectory, fileExists, truncateText } from \"../../utils/fs.js\";\r\nimport { recordToolChange } from \"../changeTracking.js\";\r\nimport { buildDiffPreview, normalizeDiffPath, okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\ninterface PatchLike {\r\n oldFileName?: string;\r\n newFileName?: string;\r\n hunks: Array<{\r\n oldStart: number;\r\n newStart: number;\r\n lines: string[];\r\n }>;\r\n}\r\n\r\nexport const applyPatchTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"apply_patch\",\r\n description: \"Apply a unified diff patch. Prefer this for precise multi-line or multi-file edits.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n patch: {\r\n type: \"string\",\r\n description: \"Unified diff patch text.\",\r\n },\r\n },\r\n required: [\"patch\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const patchText = readString(args.patch, \"patch\");\r\n const parsedPatches = parseUnifiedPatchLoosely(patchText);\r\n\r\n if (parsedPatches.length === 0) {\r\n throw new Error(\"No valid file patch was found.\");\r\n }\r\n\r\n const operations: Array<{\r\n path: string;\r\n type: \"create\" | \"update\" | \"delete\";\r\n before: string;\r\n content?: string;\r\n preview: string;\r\n }> = [];\r\n\r\n for (const patch of parsedPatches) {\r\n const oldPath = normalizeDiffPath(patch.oldFileName);\r\n const newPath = normalizeDiffPath(patch.newFileName);\r\n\r\n if (oldPath && newPath && oldPath !== newPath) {\r\n throw new Error(`Rename patches are not supported yet: ${oldPath} -> ${newPath}`);\r\n }\r\n\r\n const targetPath = newPath ?? oldPath;\r\n if (!targetPath) {\r\n throw new Error(\"Patch target path is missing.\");\r\n }\r\n\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const exists = await fileExists(resolved);\r\n const before = exists ? await fs.readFile(resolved, \"utf8\") : \"\";\r\n const source = oldPath === null ? \"\" : before;\r\n const after = applyPatchLoosely(source, patch);\r\n\r\n if (after === false) {\r\n throw new Error(`Failed to apply patch for ${targetPath}`);\r\n }\r\n\r\n operations.push({\r\n path: resolved,\r\n type: newPath === null ? \"delete\" : exists ? \"update\" : \"create\",\r\n before,\r\n content: newPath === null ? undefined : after,\r\n preview: buildDiffPreview(before, newPath === null ? \"\" : after),\r\n });\r\n }\r\n\r\n for (const operation of operations) {\r\n if (operation.type === \"delete\") {\r\n await fs.rm(operation.path, { force: true });\r\n continue;\r\n }\r\n\r\n await ensureParentDirectory(operation.path);\r\n await fs.writeFile(operation.path, operation.content ?? \"\", \"utf8\");\r\n }\r\n const changeRecord = await recordToolChange(context, {\r\n toolName: \"apply_patch\",\r\n summary: `apply_patch ${operations.length} file(s)`,\r\n preview: truncateText(patchText, 8_000),\r\n operations: operations.map((operation) => ({\r\n path: operation.path,\r\n kind: operation.type,\r\n binary: false,\r\n preview: operation.preview,\r\n beforeText: operation.type === \"create\" ? undefined : operation.before,\r\n afterText: operation.type === \"delete\" ? undefined : operation.content ?? \"\",\r\n })),\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n applied: operations.map((operation) => ({\r\n path: operation.path,\r\n type: operation.type,\r\n })),\r\n changeId: changeRecord.change?.id,\r\n changeHistoryWarning: changeRecord.warning,\r\n preview: truncateText(patchText, 8_000),\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: operations.map((operation) => operation.path),\r\n changeId: changeRecord.change?.id,\r\n },\r\n );\r\n },\r\n};\r\n\r\nfunction parseUnifiedPatchLoosely(patchText: string): PatchLike[] {\r\n const lines = patchText.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\r\n const patches: PatchLike[] = [];\r\n let index = 0;\r\n\r\n while (index < lines.length) {\r\n while (index < lines.length && !lines[index]?.startsWith(\"--- \")) {\r\n index += 1;\r\n }\r\n\r\n if (index >= lines.length) {\r\n break;\r\n }\r\n\r\n const oldFileName = lines[index]?.slice(4).trim();\r\n index += 1;\r\n\r\n if (!lines[index]?.startsWith(\"+++ \")) {\r\n throw new Error(\"Patch is missing the +++ file header.\");\r\n }\r\n\r\n const newFileName = lines[index]?.slice(4).trim();\r\n index += 1;\r\n\r\n const hunks: PatchLike[\"hunks\"] = [];\r\n\r\n while (index < lines.length && !lines[index]?.startsWith(\"--- \")) {\r\n const header = lines[index];\r\n if (!header) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n if (!header.startsWith(\"@@ \")) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const match = header.match(/^@@ -(\\d+)(?:,(\\d+))? \\+(\\d+)(?:,(\\d+))? @@/);\r\n if (!match) {\r\n throw new Error(`Invalid hunk header: ${header}`);\r\n }\r\n\r\n const oldStart = Number.parseInt(match[1] ?? \"1\", 10);\r\n const newStart = Number.parseInt(match[3] ?? \"1\", 10);\r\n index += 1;\r\n\r\n const hunkLines: string[] = [];\r\n while (index < lines.length) {\r\n const line = lines[index] ?? \"\";\r\n if (line.startsWith(\"@@ \") || line.startsWith(\"--- \")) {\r\n break;\r\n }\r\n\r\n if (line.length === 0) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const marker = line[0];\r\n if (marker !== \" \" && marker !== \"+\" && marker !== \"-\" && marker !== \"\\\\\") {\r\n throw new Error(`Hunk at line ${index + 1} contained invalid line ${line}`);\r\n }\r\n\r\n hunkLines.push(line);\r\n index += 1;\r\n }\r\n\r\n hunks.push({\r\n oldStart,\r\n newStart,\r\n lines: hunkLines,\r\n });\r\n }\r\n\r\n patches.push({\r\n oldFileName,\r\n newFileName,\r\n hunks,\r\n });\r\n }\r\n\r\n return patches;\r\n}\r\n\r\nfunction applyPatchLoosely(source: string, patch: PatchLike): string | false {\r\n const hasBom = source.startsWith(\"\\uFEFF\");\r\n const normalizedSource = hasBom ? source.slice(1) : source;\r\n const lineEnding = normalizedSource.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\r\n const sourceLines = normalizedSource.length > 0 ? normalizedSource.split(/\\r?\\n/) : [];\r\n let offset = 0;\r\n\r\n for (const hunk of patch.hunks) {\r\n let cursor = Math.max(0, hunk.oldStart - 1 + offset);\r\n cursor = normalizeCursor(sourceLines, cursor, hunk);\r\n\r\n for (const rawLine of hunk.lines) {\r\n const marker = rawLine[0];\r\n const lineText = rawLine.slice(1);\r\n\r\n if (marker === \"\\\\\") {\r\n continue;\r\n }\r\n\r\n if (marker === \" \") {\r\n if ((sourceLines[cursor] ?? \"\") !== lineText) {\r\n return false;\r\n }\r\n\r\n cursor += 1;\r\n continue;\r\n }\r\n\r\n if (marker === \"-\") {\r\n if ((sourceLines[cursor] ?? \"\") !== lineText) {\r\n return false;\r\n }\r\n\r\n sourceLines.splice(cursor, 1);\r\n offset -= 1;\r\n continue;\r\n }\r\n\r\n if (marker === \"+\") {\r\n sourceLines.splice(cursor, 0, lineText);\r\n cursor += 1;\r\n offset += 1;\r\n }\r\n }\r\n }\r\n\r\n const result = sourceLines.join(lineEnding);\r\n return hasBom ? `\\uFEFF${result}` : result;\r\n}\r\n\r\nfunction normalizeCursor(\r\n sourceLines: string[],\r\n cursor: number,\r\n hunk: PatchLike[\"hunks\"][number],\r\n): number {\r\n const firstAnchor = hunk.lines.find((line) => line.startsWith(\" \") || line.startsWith(\"-\"));\r\n if (!firstAnchor) {\r\n return cursor;\r\n }\r\n\r\n const expected = firstAnchor.slice(1);\r\n if ((sourceLines[cursor] ?? \"\") === expected) {\r\n return cursor;\r\n }\r\n\r\n const nearby = findNearbyLine(sourceLines, cursor, expected);\r\n return nearby === -1 ? cursor : nearby;\r\n}\r\n\r\nfunction findNearbyLine(lines: string[], start: number, expected: string): number {\r\n const searchWindow = 4;\r\n\r\n for (\r\n let index = Math.max(0, start - searchWindow);\r\n index <= Math.min(lines.length - 1, start + searchWindow);\r\n index += 1\r\n ) {\r\n if ((lines[index] ?? \"\") === expected) {\r\n return index;\r\n }\r\n }\r\n\r\n return -1;\r\n}\r\n","import { BackgroundJobStore } from \"../../background/store.js\";\r\nimport { reconcileBackgroundJobs } from \"../../background/reconcile.js\";\r\nimport { classifyCommand } from \"../../utils/commandPolicy.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const backgroundCheckTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"background_check\",\r\n description: \"Inspect a background job by id, or list recent background jobs.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n job_id: {\r\n type: \"string\",\r\n description: \"Optional background job id.\",\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n await reconcileBackgroundJobs(context.projectContext.stateRootDir).catch(() => null);\r\n const store = new BackgroundJobStore(context.projectContext.stateRootDir);\r\n const jobId = typeof args.job_id === \"string\" ? readString(args.job_id, \"job_id\") : undefined;\r\n\r\n if (jobId) {\r\n const job = await store.load(jobId);\r\n const classification = classifyCommand(job.command);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n job,\r\n preview: await store.summarize({\r\n cwd: context.cwd,\r\n requestedBy: context.identity.name,\r\n }),\r\n },\r\n null,\r\n 2,\r\n ),\r\n classification.validationKind && job.status !== \"running\"\r\n ? {\r\n verification: {\r\n attempted: true,\r\n command: job.command,\r\n exitCode: typeof job.exitCode === \"number\" ? job.exitCode : null,\r\n kind: classification.validationKind,\r\n passed: job.exitCode === 0 && job.status === \"completed\",\r\n },\r\n }\r\n : undefined,\r\n );\r\n }\r\n\r\n const jobs = await store.list();\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n jobs: await store.listRelevant({\r\n cwd: context.cwd,\r\n requestedBy: context.identity.name,\r\n }),\r\n preview: await store.summarize({\r\n cwd: context.cwd,\r\n requestedBy: context.identity.name,\r\n }),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import path from \"node:path\";\r\nimport { spawn } from \"node:child_process\";\r\n\r\nexport interface SpawnBackgroundProcessOptions {\r\n rootDir: string;\r\n jobId: string;\r\n}\r\n\r\nexport function spawnBackgroundProcess(options: SpawnBackgroundProcessOptions): number {\r\n const cliEntry = path.resolve(process.argv[1] ?? \"\");\r\n if (!cliEntry) {\r\n throw new Error(\"Unable to locate CLI entrypoint for background worker.\");\r\n }\r\n\r\n const child = spawn(\r\n process.execPath,\r\n [\r\n cliEntry,\r\n \"-C\",\r\n options.rootDir,\r\n \"__worker__\",\r\n \"background\",\r\n \"--job-id\",\r\n options.jobId,\r\n ],\r\n {\r\n cwd: options.rootDir,\r\n detached: true,\r\n stdio: \"ignore\",\r\n env: process.env,\r\n },\r\n );\r\n\r\n child.unref();\r\n if (!child.pid) {\r\n throw new Error(\"Failed to spawn background worker process.\");\r\n }\r\n\r\n return child.pid;\r\n}\r\n","import { spawnBackgroundProcess } from \"../../background/spawn.js\";\r\nimport { BackgroundJobStore } from \"../../background/store.js\";\r\nimport { assertPathAllowed } from \"../../utils/fs.js\";\r\nimport { clampNumber, okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const backgroundRunTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"background_run\",\r\n description: \"Run a long shell command in the background and return immediately.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n command: {\r\n type: \"string\",\r\n description: \"Shell command to execute asynchronously.\",\r\n },\r\n cwd: {\r\n type: \"string\",\r\n description: \"Optional working directory.\",\r\n },\r\n timeout_ms: {\r\n type: \"number\",\r\n description: \"Optional timeout in milliseconds.\",\r\n },\r\n },\r\n required: [\"command\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const command = readString(args.command, \"command\");\r\n const shellCwd = typeof args.cwd === \"string\" ? args.cwd : context.cwd;\r\n const resolvedCwd = assertPathAllowed(shellCwd, context.cwd, context.config);\r\n const timeoutMs = clampNumber(args.timeout_ms, 1_000, 600_000, 120_000);\r\n const stallTimeoutMs = clampNumber(context.config.commandStallTimeoutMs, 2_000, 300_000, 30_000);\r\n const store = new BackgroundJobStore(context.projectContext.stateRootDir);\r\n const job = await store.create({\r\n command,\r\n cwd: resolvedCwd,\r\n requestedBy: context.identity.name,\r\n timeoutMs,\r\n stallTimeoutMs,\r\n });\r\n const pid = spawnBackgroundProcess({\r\n rootDir: context.projectContext.stateRootDir,\r\n jobId: job.id,\r\n });\r\n const nextJob = await store.setPid(job.id, pid);\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n job: nextJob,\r\n preview: await store.summarize({\r\n cwd: resolvedCwd,\r\n requestedBy: context.identity.name,\r\n }),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { TeamStore } from \"../../team/store.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const broadcastTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"broadcast\",\r\n description: \"Broadcast a message to all registered teammates except the sender.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n content: {\r\n type: \"string\",\r\n description: \"Broadcast body.\",\r\n },\r\n },\r\n required: [\"content\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const teamStore = new TeamStore(context.projectContext.stateRootDir);\r\n const members = await teamStore.listMembers();\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n const count = await bus.broadcast(\r\n context.identity.name,\r\n readString(args.content, \"content\"),\r\n members.map((member) => member.name),\r\n );\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n count,\r\n preview: `Broadcast to ${count} teammates`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { reconcileTeamState } from \"../../team/reconcile.js\";\r\nimport { TaskStore } from \"../../tasks/store.js\";\r\nimport { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs, readOptionalNumber } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const claimTaskTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"claim_task\",\r\n description: \"Claim an existing project task for the current actor and mark it in progress.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n task_id: {\r\n type: \"number\",\r\n description: \"Task id.\",\r\n },\r\n },\r\n required: [\"task_id\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n await reconcileTeamState(context.projectContext.stateRootDir).catch(() => null);\r\n const args = parseArgs(rawArgs);\r\n const taskId = readOptionalNumber(args.task_id);\r\n if (!taskId) {\r\n throw new Error('Tool argument \"task_id\" must be a positive number.');\r\n }\r\n\r\n const store = new TaskStore(context.projectContext.stateRootDir);\r\n const task = await store.claim(taskId, context.identity.name);\r\n let worktree: Awaited<ReturnType<WorktreeStore[\"ensureForTask\"]>> | undefined;\r\n let worktreeError: string | undefined;\r\n try {\r\n worktree = await new WorktreeStore(context.projectContext.stateRootDir).ensureForTask(task.id, task.subject);\r\n } catch (error) {\r\n worktreeError = String((error as { message?: unknown }).message ?? error);\r\n }\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n task,\r\n worktree,\r\n worktreeError,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { CoordinationPolicyStore } from \"../../team/policyStore.js\";\r\nimport { okResult, parseArgs, readBoolean } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const coordinationPolicyTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"coordination_policy\",\r\n description:\r\n \"Read or update the lead's machine-level coordination gates for plan decisions and shutdown requests.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n allow_plan_decisions: {\r\n type: \"boolean\",\r\n description: \"Whether the lead is currently allowed to approve or reject pending plan requests.\",\r\n },\r\n allow_shutdown_requests: {\r\n type: \"boolean\",\r\n description: \"Whether the lead is currently allowed to issue shutdown requests.\",\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new CoordinationPolicyStore(context.projectContext.stateRootDir);\r\n const current = await store.load();\r\n const wantsUpdate =\r\n typeof args.allow_plan_decisions === \"boolean\" ||\r\n typeof args.allow_shutdown_requests === \"boolean\";\r\n\r\n if (wantsUpdate && context.identity.kind !== \"lead\") {\r\n throw new Error(\"Only the lead can update coordination policy.\");\r\n }\r\n\r\n const policy = wantsUpdate\r\n ? await store.update({\r\n allowPlanDecisions: readBoolean(args.allow_plan_decisions, current.allowPlanDecisions),\r\n allowShutdownRequests: readBoolean(args.allow_shutdown_requests, current.allowShutdownRequests),\r\n })\r\n : current;\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n policy,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import type { DocxBlock, DocxSectionSummary } from \"./types.js\";\r\n\r\nexport function convertHtmlToDocxBlocks(html: string): DocxBlock[] {\r\n const blocks: DocxBlock[] = [];\r\n const pattern = /<(h[1-6]|p|table|ul|ol|pre)\\b[^>]*>([\\s\\S]*?)<\\/\\1>/gi;\r\n\r\n for (const match of html.matchAll(pattern)) {\r\n const tag = (match[1] ?? \"\").toLowerCase();\r\n const innerHtml = match[2] ?? \"\";\r\n\r\n if (/^h[1-6]$/.test(tag)) {\r\n const headingLevel = Number.parseInt(tag.slice(1), 10);\r\n const text = stripHtml(innerHtml);\r\n if (text) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text,\r\n headingLevel,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n if (tag === \"p\") {\r\n const text = stripHtml(innerHtml);\r\n if (text) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n if (tag === \"pre\") {\r\n const code = decodeHtmlEntities(innerHtml).replace(/\\r/g, \"\");\r\n for (const line of code.split(\"\\n\")) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: line,\r\n code: true,\r\n });\r\n }\r\n continue;\r\n }\r\n\r\n if (tag === \"ul\" || tag === \"ol\") {\r\n const items = [...innerHtml.matchAll(/<li\\b[^>]*>([\\s\\S]*?)<\\/li>/gi)];\r\n items.forEach((item, index) => {\r\n const text = stripHtml(item[1] ?? \"\");\r\n if (!text) {\r\n return;\r\n }\r\n\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: tag === \"ol\" ? `${index + 1}. ${text}` : `- ${text}`,\r\n });\r\n });\r\n continue;\r\n }\r\n\r\n if (tag === \"table\") {\r\n const rows = [...innerHtml.matchAll(/<tr\\b[^>]*>([\\s\\S]*?)<\\/tr>/gi)]\r\n .map((row) =>\r\n [...(row[1] ?? \"\").matchAll(/<(?:th|td)\\b[^>]*>([\\s\\S]*?)<\\/(?:th|td)>/gi)]\r\n .map((cell) => stripHtml(cell[1] ?? \"\"))\r\n .filter((cell) => cell.length > 0),\r\n )\r\n .filter((row) => row.length > 0);\r\n\r\n if (rows.length > 0) {\r\n blocks.push({\r\n kind: \"table\",\r\n rows: normalizeTableRows(rows),\r\n });\r\n }\r\n }\r\n }\r\n\r\n return blocks;\r\n}\r\n\r\nexport function renderDocxBlocksToMarkdown(blocks: DocxBlock[]): string {\r\n const lines: string[] = [];\r\n let inCodeFence = false;\r\n\r\n const flushCodeFence = (): void => {\r\n if (inCodeFence) {\r\n lines.push(\"```\");\r\n lines.push(\"\");\r\n inCodeFence = false;\r\n }\r\n };\r\n\r\n for (const block of blocks) {\r\n if (block.kind === \"table\") {\r\n flushCodeFence();\r\n if (block.rows.length === 0) {\r\n continue;\r\n }\r\n\r\n const rows = normalizeTableRows(block.rows);\r\n const header = rows[0] ?? [];\r\n lines.push(`| ${header.join(\" | \")} |`);\r\n lines.push(`| ${header.map(() => \"---\").join(\" | \")} |`);\r\n\r\n for (const row of rows.slice(1)) {\r\n lines.push(`| ${row.join(\" | \")} |`);\r\n }\r\n\r\n lines.push(\"\");\r\n continue;\r\n }\r\n\r\n if (block.code) {\r\n if (!inCodeFence) {\r\n lines.push(\"```\");\r\n inCodeFence = true;\r\n }\r\n lines.push(block.text);\r\n continue;\r\n }\r\n\r\n flushCodeFence();\r\n\r\n if (block.headingLevel) {\r\n lines.push(`${\"#\".repeat(Math.max(1, Math.min(6, block.headingLevel)))} ${block.text}`);\r\n lines.push(\"\");\r\n continue;\r\n }\r\n\r\n lines.push(block.text);\r\n lines.push(\"\");\r\n }\r\n\r\n flushCodeFence();\r\n return lines.join(\"\\n\").trim();\r\n}\r\n\r\nexport function summarizeDocxSections(blocks: DocxBlock[]): DocxSectionSummary[] {\r\n const sections: DocxSectionSummary[] = [];\r\n\r\n for (let index = 0; index < blocks.length; index += 1) {\r\n const block = blocks[index];\r\n if (block?.kind !== \"paragraph\" || !block.headingLevel) {\r\n continue;\r\n }\r\n\r\n const nextHeadingIndex = findNextSectionBoundary(blocks, index, block.headingLevel);\r\n const preview = blocks\r\n .slice(index + 1, nextHeadingIndex)\r\n .filter((item): item is Extract<DocxBlock, { kind: \"paragraph\" }> => item.kind === \"paragraph\")\r\n .map((item) => item.text.trim())\r\n .filter(Boolean)\r\n .join(\" \")\r\n .replace(/\\s+/g, \" \")\r\n .slice(0, 200);\r\n\r\n sections.push({\r\n heading: block.text,\r\n level: block.headingLevel,\r\n preview,\r\n });\r\n }\r\n\r\n return sections;\r\n}\r\n\r\nexport function findSectionRange(\r\n blocks: DocxBlock[],\r\n heading: string,\r\n): { headingIndex: number; bodyStart: number; endIndex: number; level: number } | null {\r\n const normalizedTarget = normalizeHeading(heading);\r\n\r\n for (let index = 0; index < blocks.length; index += 1) {\r\n const block = blocks[index];\r\n if (block?.kind !== \"paragraph\" || !block.headingLevel) {\r\n continue;\r\n }\r\n\r\n if (normalizeHeading(block.text) !== normalizedTarget) {\r\n continue;\r\n }\r\n\r\n return {\r\n headingIndex: index,\r\n bodyStart: index + 1,\r\n endIndex: findNextSectionBoundary(blocks, index, block.headingLevel),\r\n level: block.headingLevel,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nexport function normalizeHeading(value: string): string {\r\n return value.trim().replace(/\\s+/g, \" \").toLocaleLowerCase();\r\n}\r\n\r\nfunction findNextSectionBoundary(blocks: DocxBlock[], startIndex: number, level: number): number {\r\n for (let index = startIndex + 1; index < blocks.length; index += 1) {\r\n const block = blocks[index];\r\n if (block?.kind === \"paragraph\" && block.headingLevel && block.headingLevel <= level) {\r\n return index;\r\n }\r\n }\r\n\r\n return blocks.length;\r\n}\r\n\r\nfunction normalizeTableRows(rows: string[][]): string[][] {\r\n const columnCount = rows.reduce((max, row) => Math.max(max, row.length), 0);\r\n return rows.map((row) => [...row, ...Array.from({ length: columnCount - row.length }, () => \"\")]);\r\n}\r\n\r\nfunction stripHtml(value: string): string {\r\n return decodeHtmlEntities(\r\n replaceAnchors(value)\r\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\r\n .replace(/<\\/p>/gi, \"\\n\")\r\n .replace(/<[^>]+>/g, \" \"),\r\n )\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\nfunction replaceAnchors(value: string): string {\r\n return value.replace(/<a\\b[^>]*href=([\"'])(.*?)\\1[^>]*>([\\s\\S]*?)<\\/a>/gi, (_match, _quote, href, label) => {\r\n const text = stripTags(label).replace(/\\s+/g, \" \").trim() || String(href);\r\n return `[${text}](${decodeHtmlEntities(String(href))})`;\r\n });\r\n}\r\n\r\nfunction stripTags(value: string): string {\r\n return decodeHtmlEntities(\r\n value\r\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\r\n .replace(/<\\/p>/gi, \"\\n\")\r\n .replace(/<[^>]+>/g, \" \"),\r\n );\r\n}\r\n\r\nfunction decodeHtmlEntities(value: string): string {\r\n return value\r\n .replace(/&nbsp;/gi, \" \")\r\n .replace(/&amp;/gi, \"&\")\r\n .replace(/&lt;/gi, \"<\")\r\n .replace(/&gt;/gi, \">\")\r\n .replace(/&quot;/gi, \"\\\"\")\r\n .replace(/&#39;/gi, \"'\");\r\n}\r\n","export interface TemplateRenderResult {\r\n content: string;\r\n usedKeys: string[];\r\n missingKeys: string[];\r\n}\r\n\r\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\r\n\r\nexport function extractTemplateVariables(content: string): string[] {\r\n const variables = new Set<string>();\r\n\r\n for (const match of content.matchAll(PLACEHOLDER_PATTERN)) {\r\n const key = (match[1] ?? \"\").trim();\r\n if (key) {\r\n variables.add(key);\r\n }\r\n }\r\n\r\n return [...variables];\r\n}\r\n\r\nexport function applyTemplateVariables(\r\n content: string,\r\n variables: Record<string, unknown>,\r\n): TemplateRenderResult {\r\n const usedKeys = new Set<string>();\r\n const missingKeys = new Set<string>();\r\n\r\n const rendered = content.replace(PLACEHOLDER_PATTERN, (placeholder, rawKey: string) => {\r\n const key = rawKey.trim();\r\n const value = resolveVariableValue(variables, key);\r\n\r\n if (value === undefined) {\r\n missingKeys.add(key);\r\n return placeholder;\r\n }\r\n\r\n usedKeys.add(key);\r\n return value;\r\n });\r\n\r\n return {\r\n content: rendered,\r\n usedKeys: [...usedKeys],\r\n missingKeys: [...missingKeys],\r\n };\r\n}\r\n\r\nfunction resolveVariableValue(variables: Record<string, unknown>, key: string): string | undefined {\r\n const direct = normalizeScalar(variables[key]);\r\n if (direct !== undefined) {\r\n return direct;\r\n }\r\n\r\n const path = key.split(\".\").map((segment) => segment.trim()).filter(Boolean);\r\n if (path.length === 0) {\r\n return undefined;\r\n }\r\n\r\n let current: unknown = variables;\r\n for (const segment of path) {\r\n if (!current || typeof current !== \"object\" || Array.isArray(current) || !(segment in current)) {\r\n return undefined;\r\n }\r\n\r\n current = (current as Record<string, unknown>)[segment];\r\n }\r\n\r\n return normalizeScalar(current);\r\n}\r\n\r\nfunction normalizeScalar(value: unknown): string | undefined {\r\n if (typeof value === \"string\") {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"number\" || typeof value === \"boolean\") {\r\n return String(value);\r\n }\r\n\r\n return undefined;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport mammoth from \"mammoth\";\r\n\r\nimport { convertHtmlToDocxBlocks, renderDocxBlocksToMarkdown, summarizeDocxSections } from \"./structure.js\";\r\nimport { extractTemplateVariables } from \"./template.js\";\r\nimport type { DocxMessage, DocxOutlineItem, DocxReadData } from \"./types.js\";\r\n\r\nexport async function readDocxDocument(filePath: string): Promise<DocxReadData> {\r\n const stat = await fs.stat(filePath);\r\n\r\n const [htmlResult, textResult] = await Promise.all([\r\n mammoth.convertToHtml({ path: filePath }),\r\n mammoth.extractRawText({ path: filePath }),\r\n ]);\r\n\r\n const html = htmlResult.value ?? \"\";\r\n const rawText = textResult.value ?? \"\";\r\n const blocks = convertHtmlToDocxBlocks(html);\r\n const outline = extractOutline(html);\r\n const messages = normalizeMessages([...htmlResult.messages, ...textResult.messages]);\r\n const markdownPreview = renderDocxBlocksToMarkdown(blocks);\r\n\r\n return {\r\n size: stat.size,\r\n rawText,\r\n html,\r\n messages,\r\n outline,\r\n sections: summarizeDocxSections(blocks),\r\n placeholders: extractTemplateVariables(rawText),\r\n markdownPreview,\r\n title: inferTitle(outline, rawText),\r\n statistics: {\r\n characters: rawText.length,\r\n paragraphs: countParagraphs(rawText),\r\n headings: outline.length,\r\n tables: countTag(html, \"table\"),\r\n links: countTag(html, \"a\"),\r\n images: countTag(html, \"img\"),\r\n },\r\n };\r\n}\r\n\r\nfunction normalizeMessages(messages: Array<{ type?: string; message?: string }>): DocxMessage[] {\r\n const seen = new Set<string>();\r\n const normalized: DocxMessage[] = [];\r\n\r\n for (const message of messages) {\r\n const type = (message.type ?? \"info\").trim() || \"info\";\r\n const text = (message.message ?? \"\").trim();\r\n if (!text) {\r\n continue;\r\n }\r\n\r\n const key = `${type}:${text}`;\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n normalized.push({\r\n type,\r\n message: text,\r\n });\r\n }\r\n\r\n return normalized;\r\n}\r\n\r\nfunction extractOutline(html: string): DocxOutlineItem[] {\r\n const outline: DocxOutlineItem[] = [];\r\n const pattern = /<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/gi;\r\n\r\n for (const match of html.matchAll(pattern)) {\r\n const level = Number.parseInt(match[1] ?? \"0\", 10);\r\n const text = stripHtml(match[2] ?? \"\").trim();\r\n if (!text || !Number.isFinite(level) || level < 1 || level > 6) {\r\n continue;\r\n }\r\n\r\n outline.push({\r\n level,\r\n text,\r\n });\r\n }\r\n\r\n return outline;\r\n}\r\n\r\nfunction inferTitle(outline: DocxOutlineItem[], rawText: string): string | undefined {\r\n const firstHeading = outline.find((item) => item.level === 1)?.text ?? outline[0]?.text;\r\n if (firstHeading) {\r\n return firstHeading;\r\n }\r\n\r\n return rawText\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .find((line) => line.length > 0)\r\n ?.slice(0, 200);\r\n}\r\n\r\nfunction countParagraphs(rawText: string): number {\r\n return rawText\r\n .split(/\\r?\\n\\s*\\r?\\n/)\r\n .map((block) => block.trim())\r\n .filter(Boolean).length;\r\n}\r\n\r\nfunction countTag(html: string, tag: string): number {\r\n const matches = html.match(new RegExp(`<${tag}\\\\b`, \"gi\"));\r\n return matches?.length ?? 0;\r\n}\r\n\r\nfunction stripHtml(value: string): string {\r\n return decodeHtmlEntities(\r\n value\r\n .replace(/<br\\s*\\/?>/gi, \"\\n\")\r\n .replace(/<\\/p>/gi, \"\\n\")\r\n .replace(/<[^>]+>/g, \" \"),\r\n )\r\n .replace(/\\s+/g, \" \")\r\n .trim();\r\n}\r\n\r\nfunction decodeHtmlEntities(value: string): string {\r\n return value\r\n .replace(/&nbsp;/gi, \" \")\r\n .replace(/&amp;/gi, \"&\")\r\n .replace(/&lt;/gi, \"<\")\r\n .replace(/&gt;/gi, \">\")\r\n .replace(/&quot;/gi, \"\\\"\")\r\n .replace(/&#39;/gi, \"'\");\r\n}\r\n","import {\r\n Document,\r\n ExternalHyperlink,\r\n HeadingLevel,\r\n Packer,\r\n Paragraph,\r\n Table,\r\n TableCell,\r\n TableRow,\r\n TextRun,\r\n type ParagraphChild,\r\n} from \"docx\";\r\n\r\nimport type { DocxBlock, DocxSourceFormat, DocxWriteOptions } from \"./types.js\";\r\n\r\nexport async function buildDocxBuffer(options: DocxWriteOptions): Promise<Buffer> {\r\n const blocks = parseDocxSource(options.content, options.format);\r\n const children = blocks.map((block) => blockToDocxNode(block));\r\n const document = new Document({\r\n creator: options.creator ?? \"Athlete\",\r\n title: options.title,\r\n description: options.description,\r\n sections: [\r\n {\r\n children,\r\n },\r\n ],\r\n });\r\n\r\n return Packer.toBuffer(document);\r\n}\r\n\r\nexport function renderDocxSourcePreview(content: string, format: DocxSourceFormat): string {\r\n const blocks = parseDocxSource(content, format);\r\n const lines: string[] = [];\r\n\r\n for (const block of blocks) {\r\n if (block.kind === \"table\") {\r\n lines.push(...block.rows.map((row) => row.join(\" | \")));\r\n lines.push(\"\");\r\n continue;\r\n }\r\n\r\n lines.push(block.text);\r\n lines.push(\"\");\r\n }\r\n\r\n return lines.join(\"\\n\").trim();\r\n}\r\n\r\nexport function parseDocxSource(content: string, format: DocxSourceFormat): DocxBlock[] {\r\n return format === \"markdown\" ? parseMarkdownBlocks(content) : parsePlainTextBlocks(content);\r\n}\r\n\r\nfunction parsePlainTextBlocks(content: string): DocxBlock[] {\r\n return content\r\n .split(/\\r?\\n\\s*\\r?\\n/)\r\n .map((block) => block.trim())\r\n .filter(Boolean)\r\n .map((block) => ({\r\n kind: \"paragraph\" as const,\r\n text: block.replace(/\\r?\\n/g, \"\\n\"),\r\n }));\r\n}\r\n\r\nfunction parseMarkdownBlocks(content: string): DocxBlock[] {\r\n const lines = content.split(/\\r?\\n/);\r\n const blocks: DocxBlock[] = [];\r\n let paragraphLines: string[] = [];\r\n\r\n const flushParagraph = (): void => {\r\n const text = paragraphLines.join(\" \").trim();\r\n if (text) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text,\r\n });\r\n }\r\n paragraphLines = [];\r\n };\r\n\r\n for (let index = 0; index < lines.length; index += 1) {\r\n const line = lines[index] ?? \"\";\r\n const trimmed = line.trim();\r\n\r\n if (!trimmed) {\r\n flushParagraph();\r\n continue;\r\n }\r\n\r\n if (/^```/.test(trimmed)) {\r\n flushParagraph();\r\n const codeLines: string[] = [];\r\n index += 1;\r\n\r\n while (index < lines.length && !/^```/.test((lines[index] ?? \"\").trim())) {\r\n codeLines.push(lines[index] ?? \"\");\r\n index += 1;\r\n }\r\n\r\n if (codeLines.length === 0) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: \"\",\r\n code: true,\r\n });\r\n } else {\r\n for (const codeLine of codeLines) {\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: codeLine,\r\n code: true,\r\n });\r\n }\r\n }\r\n\r\n continue;\r\n }\r\n\r\n const headingMatch = trimmed.match(/^(#{1,6})\\s+(.+)$/);\r\n if (headingMatch) {\r\n flushParagraph();\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: headingMatch[2]?.trim() ?? \"\",\r\n headingLevel: headingMatch[1]?.length ?? 1,\r\n });\r\n continue;\r\n }\r\n\r\n if (isMarkdownTableLine(trimmed)) {\r\n const tableLines = [trimmed];\r\n let cursor = index + 1;\r\n\r\n while (cursor < lines.length && isMarkdownTableLine((lines[cursor] ?? \"\").trim())) {\r\n tableLines.push((lines[cursor] ?? \"\").trim());\r\n cursor += 1;\r\n }\r\n\r\n const rows = parseMarkdownTable(tableLines);\r\n if (rows.length > 0) {\r\n flushParagraph();\r\n blocks.push({\r\n kind: \"table\",\r\n rows,\r\n });\r\n index = cursor - 1;\r\n continue;\r\n }\r\n }\r\n\r\n const bulletMatch = line.match(/^(\\s*)[-*+]\\s+(.+)$/);\r\n if (bulletMatch) {\r\n flushParagraph();\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text: `${\" \".repeat(Math.floor((bulletMatch[1]?.length ?? 0) / 2))}- ${bulletMatch[2]?.trim() ?? \"\"}`,\r\n });\r\n continue;\r\n }\r\n\r\n const orderedMatch = line.match(/^(\\s*)(\\d+)\\.\\s+(.+)$/);\r\n if (orderedMatch) {\r\n flushParagraph();\r\n blocks.push({\r\n kind: \"paragraph\",\r\n text:\r\n `${\" \".repeat(Math.floor((orderedMatch[1]?.length ?? 0) / 2))}` +\r\n `${orderedMatch[2]}. ${orderedMatch[3]?.trim() ?? \"\"}`,\r\n });\r\n continue;\r\n }\r\n\r\n paragraphLines.push(trimmed);\r\n }\r\n\r\n flushParagraph();\r\n return blocks;\r\n}\r\n\r\nfunction isMarkdownTableLine(line: string): boolean {\r\n return line.includes(\"|\") && !/^[-*+]\\s+/.test(line) && !/^\\d+\\.\\s+/.test(line);\r\n}\r\n\r\nfunction parseMarkdownTable(lines: string[]): string[][] {\r\n const rows = lines\r\n .map(parsePipeRow)\r\n .filter((row) => row.length > 1);\r\n\r\n if (rows.length === 0) {\r\n return [];\r\n }\r\n\r\n const separatorIndex =\r\n rows.length > 1 && rows[1]?.every((cell) => /^:?-{3,}:?$/.test(cell.trim())) ? 1 : -1;\r\n const filtered = separatorIndex === -1 ? rows : rows.filter((_, index) => index !== separatorIndex);\r\n\r\n if (filtered.length === 0) {\r\n return [];\r\n }\r\n\r\n const columnCount = filtered.reduce((max, row) => Math.max(max, row.length), 0);\r\n return filtered.map((row) => padRow(row, columnCount));\r\n}\r\n\r\nfunction parsePipeRow(line: string): string[] {\r\n const trimmed = line.trim().replace(/^\\|/, \"\").replace(/\\|$/, \"\");\r\n return trimmed.split(\"|\").map((cell) => cell.trim());\r\n}\r\n\r\nfunction padRow(row: string[], columnCount: number): string[] {\r\n if (row.length >= columnCount) {\r\n return row;\r\n }\r\n\r\n return [...row, ...Array.from({ length: columnCount - row.length }, () => \"\")];\r\n}\r\n\r\nfunction blockToDocxNode(block: DocxBlock): Paragraph | Table {\r\n if (block.kind === \"table\") {\r\n return new Table({\r\n rows: block.rows.map((row) =>\r\n new TableRow({\r\n children: row.map((cell) =>\r\n new TableCell({\r\n children: [\r\n new Paragraph({\r\n children: inlineTextToChildren(cell),\r\n }),\r\n ],\r\n }),\r\n ),\r\n }),\r\n ),\r\n });\r\n }\r\n\r\n return new Paragraph({\r\n heading: block.headingLevel ? mapHeadingLevel(block.headingLevel) : undefined,\r\n children: block.code\r\n ? [new TextRun({ text: block.text || \" \", font: \"Consolas\" })]\r\n : inlineTextToChildren(block.text),\r\n });\r\n}\r\n\r\nfunction inlineTextToChildren(text: string): ParagraphChild[] {\r\n const children: ParagraphChild[] = [];\r\n const pattern = /\\[([^\\]]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)|\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\*([^*]+)\\*/g;\r\n let lastIndex = 0;\r\n\r\n for (const match of text.matchAll(pattern)) {\r\n const matched = match[0] ?? \"\";\r\n const index = match.index ?? 0;\r\n appendTextRun(children, text.slice(lastIndex, index));\r\n\r\n if (match[1] && match[2]) {\r\n children.push(\r\n new ExternalHyperlink({\r\n link: match[2],\r\n children: [\r\n new TextRun({\r\n text: match[1],\r\n style: \"Hyperlink\",\r\n }),\r\n ],\r\n }),\r\n );\r\n } else if (match[3]) {\r\n children.push(\r\n new TextRun({\r\n text: match[3],\r\n bold: true,\r\n }),\r\n );\r\n } else if (match[4]) {\r\n children.push(\r\n new TextRun({\r\n text: match[4],\r\n font: \"Consolas\",\r\n }),\r\n );\r\n } else if (match[5]) {\r\n children.push(\r\n new TextRun({\r\n text: match[5],\r\n italics: true,\r\n }),\r\n );\r\n }\r\n\r\n lastIndex = index + matched.length;\r\n }\r\n\r\n appendTextRun(children, text.slice(lastIndex));\r\n\r\n if (children.length === 0) {\r\n children.push(\r\n new TextRun({\r\n text: \"\",\r\n }),\r\n );\r\n }\r\n\r\n return children;\r\n}\r\n\r\nfunction appendTextRun(children: ParagraphChild[], text: string): void {\r\n if (!text) {\r\n return;\r\n }\r\n\r\n children.push(\r\n new TextRun({\r\n text,\r\n }),\r\n );\r\n}\r\n\r\nfunction mapHeadingLevel(level: number) {\r\n switch (Math.max(1, Math.min(6, level))) {\r\n case 1:\r\n return HeadingLevel.HEADING_1;\r\n case 2:\r\n return HeadingLevel.HEADING_2;\r\n case 3:\r\n return HeadingLevel.HEADING_3;\r\n case 4:\r\n return HeadingLevel.HEADING_4;\r\n case 5:\r\n return HeadingLevel.HEADING_5;\r\n default:\r\n return HeadingLevel.HEADING_6;\r\n }\r\n}\r\n","export { readDocxDocument } from \"./read.js\";\r\nexport { buildDocxBuffer, parseDocxSource, renderDocxSourcePreview } from \"./markdown.js\";\r\nexport {\r\n convertHtmlToDocxBlocks,\r\n findSectionRange,\r\n normalizeHeading,\r\n renderDocxBlocksToMarkdown,\r\n summarizeDocxSections,\r\n} from \"./structure.js\";\r\nexport { applyTemplateVariables, extractTemplateVariables } from \"./template.js\";\r\nexport type {\r\n DocxBlock,\r\n DocxMessage,\r\n DocxOutlineItem,\r\n DocxReadData,\r\n DocxSectionSummary,\r\n DocxSourceFormat,\r\n DocxWriteOptions,\r\n} from \"./types.js\";\r\n","import type { DocxSourceFormat } from \"../documents/docx/index.js\";\r\n\r\nexport function readDocxSourceFormat(value: unknown, fallback: DocxSourceFormat = \"markdown\"): DocxSourceFormat {\r\n if (value === undefined) {\r\n return fallback;\r\n }\r\n\r\n if (value === \"plain_text\" || value === \"markdown\") {\r\n return value;\r\n }\r\n\r\n throw new Error('Tool argument \"format\" must be \"plain_text\" or \"markdown\".');\r\n}\r\n\r\nexport function replaceExtension(targetPath: string, nextExtension: string): string {\r\n const extension = targetPath.match(/\\.[^.]+$/)?.[0];\r\n return extension ? targetPath.slice(0, -extension.length) + nextExtension : `${targetPath}${nextExtension}`;\r\n}\r\n\r\nexport function readTemplateVariables(value: unknown): Record<string, unknown> {\r\n if (value === undefined) {\r\n return {};\r\n }\r\n\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n throw new Error('Tool argument \"variables\" must be a JSON object.');\r\n }\r\n\r\n return value as Record<string, unknown>;\r\n}\r\n\r\nexport function readHeadingLevel(value: unknown, fallback: number): number {\r\n if (value === undefined) {\r\n return fallback;\r\n }\r\n\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n throw new Error('Tool argument \"heading_level\" must be a number between 1 and 6.');\r\n }\r\n\r\n return Math.max(1, Math.min(6, Math.trunc(value)));\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ProjectIgnoreRule } from \"../types.js\";\r\n\r\nconst BUILTIN_PATTERNS = [\r\n \".git/\",\r\n \"node_modules/\",\r\n \"dist/\",\r\n \"coverage/\",\r\n];\r\n\r\nexport async function loadProjectIgnoreRules(rootDir: string, cwd: string): Promise<ProjectIgnoreRule[]> {\r\n const rules: ProjectIgnoreRule[] = BUILTIN_PATTERNS\r\n .map((pattern) => compileIgnoreRule(pattern, {\r\n baseDir: rootDir,\r\n source: \"builtin\",\r\n }))\r\n .filter((rule): rule is ProjectIgnoreRule => Boolean(rule));\r\n\r\n const candidateFiles = uniquePaths([\r\n path.join(rootDir, \".athlete\", \".athleteignore\"),\r\n path.join(cwd, \".athlete\", \".athleteignore\"),\r\n ]);\r\n\r\n for (const filePath of candidateFiles) {\r\n const content = await tryReadUtf8File(filePath);\r\n if (content === null) {\r\n continue;\r\n }\r\n\r\n const baseDir = path.dirname(filePath);\r\n for (const line of content.split(/\\r?\\n/)) {\r\n const rule = compileIgnoreRule(line, {\r\n baseDir,\r\n source: filePath,\r\n });\r\n if (rule) {\r\n rules.push(rule);\r\n }\r\n }\r\n }\r\n\r\n return rules;\r\n}\r\n\r\nexport function isPathIgnored(\r\n targetPath: string,\r\n rules: ProjectIgnoreRule[],\r\n isDirectory = false,\r\n): boolean {\r\n let ignored = false;\r\n\r\n for (const rule of rules) {\r\n const relativePath = toRelativePosix(rule.baseDir, targetPath);\r\n if (!relativePath) {\r\n continue;\r\n }\r\n\r\n const candidate = isDirectory ? ensureTrailingSlash(relativePath) : relativePath;\r\n if (!rule.matcher.test(candidate)) {\r\n continue;\r\n }\r\n\r\n ignored = !rule.negated;\r\n }\r\n\r\n return ignored;\r\n}\r\n\r\nexport function getDefaultAthleteIgnoreContent(): string {\r\n return [\r\n \".git/\",\r\n \"node_modules/\",\r\n \"dist/\",\r\n \"coverage/\",\r\n \"\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nasync function tryReadUtf8File(filePath: string): Promise<string | null> {\r\n try {\r\n return await fs.readFile(filePath, \"utf8\");\r\n } catch (error) {\r\n const errno = error as NodeJS.ErrnoException;\r\n if (errno.code === \"ENOENT\") {\r\n return null;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nfunction compileIgnoreRule(\r\n rawPattern: string,\r\n options: {\r\n baseDir: string;\r\n source: string;\r\n },\r\n): ProjectIgnoreRule | null {\r\n const trimmed = rawPattern.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) {\r\n return null;\r\n }\r\n\r\n const negated = trimmed.startsWith(\"!\");\r\n let pattern = negated ? trimmed.slice(1).trim() : trimmed;\r\n if (!pattern) {\r\n return null;\r\n }\r\n\r\n pattern = pattern.replace(/\\\\/g, \"/\").replace(/^\\.\\/+/, \"\");\r\n const directoryOnly = pattern.endsWith(\"/\");\r\n const anchored = pattern.startsWith(\"/\");\r\n\r\n if (directoryOnly) {\r\n pattern = pattern.replace(/\\/+$/, \"\");\r\n }\r\n\r\n if (anchored) {\r\n pattern = pattern.replace(/^\\/+/, \"\");\r\n }\r\n\r\n if (!pattern) {\r\n return null;\r\n }\r\n\r\n if (!pattern.includes(\"/\")) {\r\n pattern = `**/${pattern}`;\r\n } else if (!anchored && !pattern.startsWith(\"**/\")) {\r\n pattern = `**/${pattern}`;\r\n }\r\n\r\n if (directoryOnly) {\r\n pattern = pattern.endsWith(\"/**\") ? pattern : `${pattern}/**`;\r\n }\r\n\r\n return {\r\n pattern: trimmed,\r\n source: options.source,\r\n baseDir: options.baseDir,\r\n negated,\r\n directoryOnly,\r\n matcher: new RegExp(`^${globToRegex(pattern)}$`),\r\n };\r\n}\r\n\r\nfunction toRelativePosix(baseDir: string, targetPath: string): string | null {\r\n const relativePath = path.relative(path.resolve(baseDir), path.resolve(targetPath));\r\n if (!relativePath || relativePath === \".\") {\r\n return \"\";\r\n }\r\n\r\n if (relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\r\n return null;\r\n }\r\n\r\n return relativePath.replace(/\\\\/g, \"/\");\r\n}\r\n\r\nfunction ensureTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value : `${value}/`;\r\n}\r\n\r\nfunction globToRegex(pattern: string): string {\r\n let result = \"\";\r\n\r\n for (let index = 0; index < pattern.length; index += 1) {\r\n const char = pattern[index] ?? \"\";\r\n const next = pattern[index + 1] ?? \"\";\r\n\r\n if (char === \"*\") {\r\n if (next === \"*\") {\r\n const afterDoubleStar = pattern[index + 2] ?? \"\";\r\n if (afterDoubleStar === \"/\") {\r\n result += \"(?:.*\\\\/)?\";\r\n index += 2;\r\n } else {\r\n result += \".*\";\r\n index += 1;\r\n }\r\n continue;\r\n }\r\n\r\n result += \"[^/]*\";\r\n continue;\r\n }\r\n\r\n if (char === \"?\") {\r\n result += \"[^/]\";\r\n continue;\r\n }\r\n\r\n if (char === \"/\") {\r\n result += \"/\";\r\n continue;\r\n }\r\n\r\n result += escapeRegex(char);\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction escapeRegex(value: string): string {\r\n return value.replace(/[\\\\^$.*+?()[\\]{}|]/g, \"\\\\$&\");\r\n}\r\n\r\nfunction uniquePaths(paths: string[]): string[] {\r\n return [...new Set(paths.map((item) => path.normalize(item)))];\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport fg from \"fast-glob\";\r\n\r\nimport type { ProjectContext } from \"../types.js\";\r\nimport { isPathIgnored } from \"../utils/ignore.js\";\r\n\r\nexport async function findPathSuggestions(\r\n cwd: string,\r\n requestedPath: string,\r\n projectContext: Pick<ProjectContext, \"ignoreRules\">,\r\n limit = 8,\r\n): Promise<string[]> {\r\n const normalized = requestedPath.replace(/\\\\/g, \"/\");\r\n const baseName = path.basename(normalized).trim();\r\n const needle = baseName.length > 0 ? baseName : normalized.trim();\r\n\r\n if (!needle) {\r\n return [];\r\n }\r\n\r\n const patterns = buildCandidatePatterns(needle);\r\n const matches = new Set<string>();\r\n\r\n for (const pattern of patterns) {\r\n const entries = await fg(pattern, {\r\n cwd,\r\n dot: true,\r\n onlyFiles: false,\r\n markDirectories: true,\r\n caseSensitiveMatch: false,\r\n suppressErrors: true,\r\n ignore: [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/coverage/**\"],\r\n });\r\n\r\n for (const entry of entries) {\r\n const absolutePath = path.resolve(cwd, entry);\r\n const isDirectory = entry.endsWith(\"/\");\r\n if (isPathIgnored(absolutePath, projectContext.ignoreRules, isDirectory)) {\r\n continue;\r\n }\r\n\r\n matches.add(entry.replace(/\\//g, \"\\\\\").replace(/[\\\\]+$/, \"\"));\r\n if (matches.size >= limit) {\r\n return [...matches].slice(0, limit);\r\n }\r\n }\r\n }\r\n\r\n return [...matches].slice(0, limit);\r\n}\r\n\r\nfunction buildCandidatePatterns(needle: string): string[] {\r\n const clean = needle.replace(/[*?[\\]{}]/g, \"\");\r\n\r\n return [\r\n `**/${clean}`,\r\n `**/*${clean}*`,\r\n ];\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport {\r\n applyTemplateVariables,\r\n buildDocxBuffer,\r\n convertHtmlToDocxBlocks,\r\n findSectionRange,\r\n normalizeHeading,\r\n parseDocxSource,\r\n readDocxDocument,\r\n renderDocxBlocksToMarkdown,\r\n} from \"../../documents/docx/index.js\";\r\nimport type { DocxBlock } from \"../../documents/docx/index.js\";\r\nimport { assertPathAllowed, ensureParentDirectory, fileExists, truncateText } from \"../../utils/fs.js\";\r\nimport { recordToolChange } from \"../changeTracking.js\";\r\nimport {\r\n readDocxSourceFormat,\r\n readHeadingLevel,\r\n readTemplateVariables,\r\n replaceExtension,\r\n} from \"../docxShared.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { findPathSuggestions } from \"../pathSuggestions.js\";\r\nimport { buildDiffPreview, okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\ntype EditDocxAction =\r\n | \"replace_document\"\r\n | \"append_document\"\r\n | \"replace_section\"\r\n | \"append_to_section\"\r\n | \"add_section\";\r\n\r\nexport const editDocxTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"edit_docx\",\r\n description:\r\n \"Edit an existing .docx file by replacing the whole document, appending content, or targeting a section by heading.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Target .docx file path.\",\r\n },\r\n action: {\r\n type: \"string\",\r\n description:\r\n \"Edit mode: replace_document, append_document, replace_section, append_to_section, or add_section.\",\r\n enum: [\"replace_document\", \"append_document\", \"replace_section\", \"append_to_section\", \"add_section\"],\r\n },\r\n content: {\r\n type: \"string\",\r\n description: \"Content to write into the document or section body.\",\r\n },\r\n format: {\r\n type: \"string\",\r\n description: \"Content format: plain_text or markdown.\",\r\n enum: [\"plain_text\", \"markdown\"],\r\n },\r\n heading: {\r\n type: \"string\",\r\n description: \"Target section heading for section-based actions.\",\r\n },\r\n heading_level: {\r\n type: \"number\",\r\n description: \"Heading level to use when creating a new section. Range: 1-6.\",\r\n },\r\n title: {\r\n type: \"string\",\r\n description: \"Optional document title metadata override.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n description: \"Optional document description metadata override.\",\r\n },\r\n variables: {\r\n type: \"object\",\r\n description: \"Optional template variables used to replace placeholders like {{name}}.\",\r\n additionalProperties: true,\r\n },\r\n create_if_missing: {\r\n type: \"boolean\",\r\n description: \"When a section is missing, create it automatically instead of failing.\",\r\n },\r\n create_directories: {\r\n type: \"boolean\",\r\n description: \"Whether to create parent directories automatically.\",\r\n },\r\n },\r\n required: [\"path\", \"action\", \"content\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const action = readEditAction(args.action);\r\n const content = readString(args.content, \"content\");\r\n const format = readDocxSourceFormat(args.format);\r\n const heading = typeof args.heading === \"string\" ? args.heading.trim() : undefined;\r\n const headingLevel = readHeadingLevel(args.heading_level, 2);\r\n const titleTemplate = typeof args.title === \"string\" ? args.title.trim() : undefined;\r\n const descriptionTemplate = typeof args.description === \"string\" ? args.description.trim() : undefined;\r\n const variables = readTemplateVariables(args.variables);\r\n const createIfMissing = readBoolean(args.create_if_missing, false);\r\n const createDirectories = readBoolean(args.create_directories, true);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const extension = path.extname(resolved).toLowerCase();\r\n\r\n if (extension === \".doc\" || extension === \".docm\") {\r\n throw new ToolExecutionError(`Word output in ${extension} format is not supported. Write a .docx file instead.`, {\r\n code: \"DOC_CONVERSION_REQUIRED\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestedPath: replaceExtension(resolved, \".docx\"),\r\n },\r\n });\r\n }\r\n\r\n if (extension !== \".docx\") {\r\n throw new ToolExecutionError(`edit_docx requires a .docx path, got: ${extension || \"unknown\"}`, {\r\n code: \"INVALID_DOCX_OUTPUT_PATH\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestedPath: resolved.endsWith(\".\") ? `${resolved}docx` : `${resolved}.docx`,\r\n },\r\n });\r\n }\r\n\r\n const existed = await fileExists(resolved);\r\n const beforeBuffer = existed ? await fs.readFile(resolved) : undefined;\r\n\r\n if (!existed && isSectionAction(action) && !createIfMissing) {\r\n const suggestions = await findPathSuggestions(context.cwd, targetPath, context.projectContext);\r\n throw new ToolExecutionError(`File not found: ${targetPath}`, {\r\n code: \"ENOENT\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestions,\r\n },\r\n });\r\n }\r\n\r\n const renderedContent = applyTemplateVariables(content, variables);\r\n const renderedTitle = titleTemplate ? applyTemplateVariables(titleTemplate, variables) : undefined;\r\n const renderedDescription = descriptionTemplate\r\n ? applyTemplateVariables(descriptionTemplate, variables)\r\n : undefined;\r\n\r\n const existingDocument = existed ? await readDocxDocument(resolved) : undefined;\r\n const existingBlocksFromHtml = existingDocument ? convertHtmlToDocxBlocks(existingDocument.html) : [];\r\n const existingBlocks =\r\n existingBlocksFromHtml.length > 0\r\n ? existingBlocksFromHtml\r\n : parseDocxSource(existingDocument?.rawText ?? \"\", \"plain_text\");\r\n const inputBlocks = parseDocxSource(renderedContent.content, format);\r\n const finalBlocks = applyEditAction(existingBlocks, inputBlocks, {\r\n action,\r\n heading,\r\n headingLevel,\r\n createIfMissing,\r\n });\r\n const finalMarkdown = renderDocxBlocksToMarkdown(finalBlocks);\r\n const beforeText = existingDocument?.markdownPreview ?? existingDocument?.rawText ?? \"\";\r\n const preview = buildDiffPreview(beforeText, finalMarkdown);\r\n const buffer = await buildDocxBuffer({\r\n title: renderedTitle?.content ?? existingDocument?.title,\r\n description: renderedDescription?.content,\r\n creator: \"Athlete\",\r\n format: \"markdown\",\r\n content: finalMarkdown,\r\n });\r\n\r\n if (createDirectories) {\r\n await ensureParentDirectory(resolved);\r\n }\r\n\r\n await fs.writeFile(resolved, buffer);\r\n const changeRecord = await recordToolChange(context, {\r\n toolName: \"edit_docx\",\r\n summary: `edit_docx ${resolved} (${action})`,\r\n preview: truncateText(preview || finalMarkdown, 6_000),\r\n operations: [\r\n {\r\n path: resolved,\r\n kind: existed ? \"update\" : \"create\",\r\n binary: true,\r\n preview: truncateText(preview || finalMarkdown, 6_000),\r\n beforeData: beforeBuffer,\r\n afterData: buffer,\r\n },\r\n ],\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n existed,\r\n action,\r\n heading,\r\n headingLevel,\r\n variablesApplied: renderedContent.usedKeys,\r\n missingVariables: [\r\n ...new Set([\r\n ...renderedContent.missingKeys,\r\n ...(renderedTitle?.missingKeys ?? []),\r\n ...(renderedDescription?.missingKeys ?? []),\r\n ]),\r\n ],\r\n bytes: buffer.length,\r\n changeId: changeRecord.change?.id,\r\n changeHistoryWarning: changeRecord.warning,\r\n preview: truncateText(preview || finalMarkdown, 6_000),\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: [resolved],\r\n changeId: changeRecord.change?.id,\r\n },\r\n );\r\n },\r\n};\r\n\r\nfunction readEditAction(value: unknown): EditDocxAction {\r\n if (\r\n value === \"replace_document\" ||\r\n value === \"append_document\" ||\r\n value === \"replace_section\" ||\r\n value === \"append_to_section\" ||\r\n value === \"add_section\"\r\n ) {\r\n return value;\r\n }\r\n\r\n throw new Error(\r\n 'Tool argument \"action\" must be one of: replace_document, append_document, replace_section, append_to_section, add_section.',\r\n );\r\n}\r\n\r\nfunction isSectionAction(action: EditDocxAction): boolean {\r\n return action === \"replace_section\" || action === \"append_to_section\";\r\n}\r\n\r\nfunction applyEditAction(\r\n existingBlocks: DocxBlock[],\r\n inputBlocks: DocxBlock[],\r\n options: {\r\n action: EditDocxAction;\r\n heading?: string;\r\n headingLevel: number;\r\n createIfMissing: boolean;\r\n },\r\n): DocxBlock[] {\r\n switch (options.action) {\r\n case \"replace_document\":\r\n return inputBlocks;\r\n case \"append_document\":\r\n return [...existingBlocks, ...inputBlocks];\r\n case \"add_section\": {\r\n const heading = resolveSectionHeading(options.heading, inputBlocks);\r\n const body = stripLeadingHeading(inputBlocks, heading);\r\n return [...existingBlocks, createHeadingBlock(heading, options.headingLevel), ...body];\r\n }\r\n case \"replace_section\": {\r\n const heading = requireHeading(options.heading, options.action);\r\n const range = findSectionRange(existingBlocks, heading);\r\n const body = stripLeadingHeading(inputBlocks, heading);\r\n\r\n if (!range) {\r\n if (!options.createIfMissing) {\r\n throw new ToolExecutionError(`Section not found: ${heading}`, {\r\n code: \"DOCX_SECTION_NOT_FOUND\",\r\n details: {\r\n heading,\r\n availableHeadings: listSectionHeadings(existingBlocks),\r\n },\r\n });\r\n }\r\n\r\n return [...existingBlocks, createHeadingBlock(heading, options.headingLevel), ...body];\r\n }\r\n\r\n return [\r\n ...existingBlocks.slice(0, range.headingIndex + 1),\r\n ...body,\r\n ...existingBlocks.slice(range.endIndex),\r\n ];\r\n }\r\n case \"append_to_section\": {\r\n const heading = requireHeading(options.heading, options.action);\r\n const range = findSectionRange(existingBlocks, heading);\r\n const body = stripLeadingHeading(inputBlocks, heading);\r\n\r\n if (!range) {\r\n if (!options.createIfMissing) {\r\n throw new ToolExecutionError(`Section not found: ${heading}`, {\r\n code: \"DOCX_SECTION_NOT_FOUND\",\r\n details: {\r\n heading,\r\n availableHeadings: listSectionHeadings(existingBlocks),\r\n },\r\n });\r\n }\r\n\r\n return [...existingBlocks, createHeadingBlock(heading, options.headingLevel), ...body];\r\n }\r\n\r\n return [\r\n ...existingBlocks.slice(0, range.endIndex),\r\n ...body,\r\n ...existingBlocks.slice(range.endIndex),\r\n ];\r\n }\r\n }\r\n}\r\n\r\nfunction requireHeading(value: string | undefined, action: EditDocxAction): string {\r\n if (!value) {\r\n throw new Error(`Tool argument \"heading\" is required when action is \"${action}\".`);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction resolveSectionHeading(heading: string | undefined, inputBlocks: DocxBlock[]): string {\r\n if (heading) {\r\n return heading;\r\n }\r\n\r\n const firstHeading = inputBlocks.find(\r\n (block): block is Extract<DocxBlock, { kind: \"paragraph\" }> =>\r\n block.kind === \"paragraph\" && Boolean(block.headingLevel) && block.text.trim().length > 0,\r\n );\r\n\r\n if (firstHeading) {\r\n return firstHeading.text;\r\n }\r\n\r\n throw new Error('Tool argument \"heading\" is required when action is \"add_section\" unless the content starts with a heading.');\r\n}\r\n\r\nfunction stripLeadingHeading(blocks: DocxBlock[], heading: string): DocxBlock[] {\r\n if (blocks.length === 0) {\r\n return blocks;\r\n }\r\n\r\n const [first, ...rest] = blocks;\r\n if (\r\n first?.kind === \"paragraph\" &&\r\n first.headingLevel &&\r\n normalizeHeading(first.text) === normalizeHeading(heading)\r\n ) {\r\n return rest;\r\n }\r\n\r\n return blocks;\r\n}\r\n\r\nfunction createHeadingBlock(text: string, headingLevel: number): DocxBlock {\r\n return {\r\n kind: \"paragraph\",\r\n text,\r\n headingLevel,\r\n };\r\n}\r\n\r\nfunction listSectionHeadings(blocks: DocxBlock[]): string[] {\r\n return blocks\r\n .filter(\r\n (block): block is Extract<DocxBlock, { kind: \"paragraph\" }> =>\r\n block.kind === \"paragraph\" && Boolean(block.headingLevel) && block.text.trim().length > 0,\r\n )\r\n .map((block) => block.text)\r\n .slice(0, 50);\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { assertPathAllowed, truncateText } from \"../../utils/fs.js\";\r\nimport { recordToolChange } from \"../changeTracking.js\";\r\nimport { buildDiffPreview, countOccurrences, okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const editFileTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"edit_file\",\r\n description: \"Edit a file by replacing text. Prefer this over write_file for small surgical changes.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"File path to edit.\",\r\n },\r\n old_string: {\r\n type: \"string\",\r\n description: \"Exact text to replace.\",\r\n },\r\n new_string: {\r\n type: \"string\",\r\n description: \"Replacement text.\",\r\n },\r\n replace_all: {\r\n type: \"boolean\",\r\n description: \"Whether to replace every occurrence.\",\r\n },\r\n },\r\n required: [\"path\", \"old_string\", \"new_string\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const oldString = readString(args.old_string, \"old_string\");\r\n const newString = readString(args.new_string, \"new_string\");\r\n const replaceAll = readBoolean(args.replace_all, false);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const before = await fs.readFile(resolved, \"utf8\");\r\n const occurrences = countOccurrences(before, oldString);\r\n\r\n if (occurrences === 0) {\r\n throw new Error(`Text not found in file: ${resolved}`);\r\n }\r\n\r\n const after = replaceAll\r\n ? before.split(oldString).join(newString)\r\n : before.replace(oldString, newString);\r\n const preview = buildDiffPreview(before, after);\r\n\r\n await fs.writeFile(resolved, after, \"utf8\");\r\n const changeRecord = await recordToolChange(context, {\r\n toolName: \"edit_file\",\r\n summary: `edit_file ${resolved}`,\r\n preview,\r\n operations: [\r\n {\r\n path: resolved,\r\n kind: \"update\",\r\n binary: false,\r\n preview,\r\n beforeText: before,\r\n afterText: after,\r\n },\r\n ],\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n occurrencesFound: occurrences,\r\n occurrencesChanged: replaceAll ? occurrences : 1,\r\n changeId: changeRecord.change?.id,\r\n changeHistoryWarning: changeRecord.warning,\r\n preview: truncateText(preview, 6_000),\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: [resolved],\r\n changeId: changeRecord.change?.id,\r\n },\r\n );\r\n },\r\n};\r\n","import { TeamStore } from \"../../team/store.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const idleTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"idle\",\r\n description: \"Enter or report idle state. Useful for autonomous teammates waiting for new work.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {},\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(_rawArgs, context) {\r\n if (context.identity.kind === \"teammate\") {\r\n const store = new TeamStore(context.projectContext.stateRootDir);\r\n await store.updateMemberStatus(context.identity.name, \"idle\");\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n idle: true,\r\n actor: context.identity.name,\r\n preview: `${context.identity.name} is now idle.`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n idle: false,\r\n actor: context.identity.name,\r\n preview: \"Lead does not idle.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { assertPathAllowed } from \"../../utils/fs.js\";\r\nimport { isPathIgnored } from \"../../utils/ignore.js\";\r\nimport { clampNumber, okResult, parseArgs, readBoolean, readString, walkDirectory } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const listFilesTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"list_files\",\r\n description: \"List local files or directories in the workspace. Use this to explore a folder before reading or editing local files, not for webpages.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"File or directory path. Relative paths resolve from the current working directory.\",\r\n },\r\n recursive: {\r\n type: \"boolean\",\r\n description: \"Whether to descend into subdirectories.\",\r\n },\r\n max_entries: {\r\n type: \"number\",\r\n description: \"Maximum entries to return.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const recursive = readBoolean(args.recursive, false);\r\n const maxEntries = clampNumber(args.max_entries, 1, 1_000, 200);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const stats = await fs.stat(resolved);\r\n\r\n if (stats.isFile()) {\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n type: \"file\",\r\n size: stats.size,\r\n modifiedAt: stats.mtime.toISOString(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n const entries = await walkDirectory(resolved, recursive, maxEntries, {\r\n shouldIgnore: (entryPath, isDirectory) =>\r\n entryPath !== resolved && isPathIgnored(entryPath, context.projectContext.ignoreRules, isDirectory),\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n recursive,\r\n total: entries.length,\r\n entries,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { reconcileTeamState } from \"../../team/reconcile.js\";\r\nimport { TeamStore } from \"../../team/store.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const listTeammatesTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"list_teammates\",\r\n description: \"List all registered teammates and their current status.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {},\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(_rawArgs, context) {\r\n await reconcileTeamState(context.projectContext.stateRootDir).catch(() => null);\r\n const store = new TeamStore(context.projectContext.stateRootDir);\r\n const members = await store.listMembers();\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n members,\r\n preview: await store.summarizeMembers(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import type { LoadedSkill, LoadedSkillPayload, SkillSummary } from \"./types.js\";\r\n\r\nexport function createLoadedSkillToolResult(skill: LoadedSkill): string {\r\n return JSON.stringify(buildLoadedSkillPayload(skill), null, 2);\r\n}\r\n\r\nexport function buildLoadedSkillPayload(skill: LoadedSkill): LoadedSkillPayload {\r\n return {\r\n ok: true,\r\n skill: buildSkillSummary(skill),\r\n body: skill.body,\r\n };\r\n}\r\n\r\nexport function readLoadedSkillName(output: string | null | undefined): string | undefined {\r\n if (typeof output === \"string\") {\r\n const parsedName = readLoadedSkillNameFromJson(output);\r\n if (parsedName) {\r\n return parsedName;\r\n }\r\n\r\n const legacyMatch = output.match(/<skill\\s+name=\"([^\"]+)\"/i);\r\n if (legacyMatch?.[1]) {\r\n return legacyMatch[1];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction buildSkillSummary(skill: LoadedSkill): SkillSummary {\r\n const {\r\n absolutePath: _absolutePath,\r\n body: _body,\r\n ...summary\r\n } = skill;\r\n\r\n return summary;\r\n}\r\n\r\nfunction readLoadedSkillNameFromJson(output: string): string | undefined {\r\n try {\r\n const parsed = JSON.parse(output) as { skill?: { name?: unknown } };\r\n return typeof parsed?.skill?.name === \"string\" ? parsed.skill.name : undefined;\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n","import { createLoadedSkillToolResult } from \"../../skills/loading.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const loadSkillTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"load_skill\",\r\n description: \"Load the full content of a project skill from SKILL.md when a specialized workflow is relevant.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Skill name. Use a value from the available project skills list.\",\r\n },\r\n },\r\n required: [\"name\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const name = readString(args.name, \"name\").trim();\r\n const skill = context.projectContext.skills.find((item) => item.name === name);\r\n\r\n if (!skill) {\r\n const available = context.projectContext.skills.map((item) => item.name);\r\n throw new Error(\r\n available.length > 0\r\n ? `Unknown skill \"${name}\". Available skills: ${available.join(\", \")}`\r\n : `Unknown skill \"${name}\". No project skills are available.`,\r\n );\r\n }\r\n\r\n return okResult(createLoadedSkillToolResult(skill));\r\n },\r\n};\r\n","export type MineruDocumentCategory = \"pdf\" | \"image\" | \"doc\" | \"ppt\";\r\n\r\nexport const MINERU_MAX_FILE_BYTES = 200 * 1024 * 1024;\r\nexport const MINERU_MAX_FILE_MB = 200;\r\nexport const MINERU_MAX_PAGES = 600;\r\n\r\nexport const MINERU_PDF_EXTENSIONS = [\".pdf\"] as const;\r\nexport const MINERU_IMAGE_EXTENSIONS = [\".png\", \".jpg\", \".jpeg\", \".jp2\", \".webp\", \".gif\", \".bmp\"] as const;\r\nexport const MINERU_DOC_EXTENSIONS = [\".doc\", \".docx\"] as const;\r\nexport const MINERU_PPT_EXTENSIONS = [\".ppt\", \".pptx\"] as const;\r\n\r\nconst CATEGORY_EXTENSIONS: Record<MineruDocumentCategory, readonly string[]> = {\r\n pdf: MINERU_PDF_EXTENSIONS,\r\n image: MINERU_IMAGE_EXTENSIONS,\r\n doc: MINERU_DOC_EXTENSIONS,\r\n ppt: MINERU_PPT_EXTENSIONS,\r\n};\r\n\r\nexport function getMineruSupportedExtensions(category: MineruDocumentCategory): readonly string[] {\r\n return CATEGORY_EXTENSIONS[category];\r\n}\r\n\r\nexport function isMineruSupportedExtension(\r\n category: MineruDocumentCategory,\r\n extension: string,\r\n): boolean {\r\n return CATEGORY_EXTENSIONS[category].includes(extension as never);\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { readDocxDocument } from \"../../documents/docx/index.js\";\r\nimport { assertPathAllowed, truncateText } from \"../../utils/fs.js\";\r\nimport { replaceExtension } from \"../docxShared.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { findPathSuggestions } from \"../pathSuggestions.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const readDocxTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"read_docx\",\r\n description: \"Read a .docx Word document and return text, structure summary, and warnings.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Path to the .docx file.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const extension = path.extname(resolved).toLowerCase();\r\n\r\n if (extension === \".doc\" || extension === \".docm\") {\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n readable: false,\r\n reason: `Word files in ${extension} format are not supported.`,\r\n action: \"convert_to_docx_first\",\r\n suggestedPath: replaceExtension(resolved, \".docx\"),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n if (extension !== \".docx\") {\r\n throw new ToolExecutionError(`Unsupported Word document format: ${extension || \"unknown\"}`, {\r\n code: \"UNSUPPORTED_WORD_FORMAT\",\r\n details: {\r\n requestedPath: targetPath,\r\n supportedExtensions: [\".docx\"],\r\n },\r\n });\r\n }\r\n\r\n try {\r\n const document = await readDocxDocument(resolved);\r\n const maxChars = context.config.maxReadBytes;\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n readable: true,\r\n format: \"docx\",\r\n size: document.size,\r\n title: document.title,\r\n statistics: document.statistics,\r\n outline: document.outline.slice(0, 50),\r\n sections: document.sections.slice(0, 50),\r\n placeholders: document.placeholders,\r\n messages: document.messages.slice(0, 20),\r\n content: truncateText(document.rawText, maxChars),\r\n contentTruncated: document.rawText.length > maxChars,\r\n markdownPreview: truncateText(document.markdownPreview, Math.max(2_000, Math.floor(maxChars / 2))),\r\n markdownPreviewTruncated:\r\n document.markdownPreview.length > Math.max(2_000, Math.floor(maxChars / 2)),\r\n htmlPreview: truncateText(document.html, Math.max(2_000, Math.floor(maxChars / 2))),\r\n htmlPreviewTruncated: document.html.length > Math.max(2_000, Math.floor(maxChars / 2)),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (error) {\r\n const errno = error as NodeJS.ErrnoException;\r\n if (errno.code === \"ENOENT\") {\r\n const suggestions = await findPathSuggestions(context.cwd, targetPath, context.projectContext);\r\n throw new ToolExecutionError(`File not found: ${targetPath}`, {\r\n code: \"ENOENT\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestions,\r\n },\r\n });\r\n }\r\n\r\n throw new ToolExecutionError(\r\n `Failed to read .docx file: ${error instanceof Error ? error.message : String(error)}`,\r\n {\r\n code: \"DOCX_READ_FAILED\",\r\n details: {\r\n requestedPath: targetPath,\r\n },\r\n },\r\n );\r\n }\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport AdmZip from \"adm-zip\";\r\n\r\nexport interface ExtractedMineruMarkdown {\r\n entryName: string;\r\n markdown: string;\r\n}\r\n\r\nexport async function extractMarkdownFromMineruArchive(archivePath: string): Promise<ExtractedMineruMarkdown> {\r\n const buffer = await fs.readFile(archivePath);\r\n const zip = new AdmZip(buffer);\r\n const entries = zip.getEntries().filter((entry) => !entry.isDirectory);\r\n const preferred = entries.find((entry) => normalizeEntryName(entry.entryName).endsWith(\"/full.md\"))\r\n ?? entries.find((entry) => normalizeEntryName(entry.entryName) === \"full.md\")\r\n ?? entries.find((entry) => entry.entryName.toLowerCase().endsWith(\".md\"));\r\n\r\n if (!preferred) {\r\n throw new Error(`MinerU archive ${archivePath} does not contain any markdown file.`);\r\n }\r\n\r\n return {\r\n entryName: preferred.entryName,\r\n markdown: preferred.getData().toString(\"utf8\"),\r\n };\r\n}\r\n\r\nexport async function persistMineruArchive(options: {\r\n archiveBuffer: Buffer;\r\n archivePath: string;\r\n extractDir: string;\r\n}): Promise<void> {\r\n await fs.mkdir(options.extractDir, { recursive: true });\r\n await fs.writeFile(options.archivePath, options.archiveBuffer);\r\n\r\n const zip = new AdmZip(options.archiveBuffer);\r\n zip.extractAllTo(options.extractDir, true);\r\n}\r\n\r\nfunction normalizeEntryName(value: string): string {\r\n return value.replace(/\\\\/g, \"/\").toLowerCase();\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport type { MineruRuntimeConfig } from \"../../types.js\";\r\nimport type {\r\n MineruBatchCreateInput,\r\n MineruBatchCreateResult,\r\n MineruBatchResult,\r\n} from \"./types.js\";\r\n\r\ntype FetchLike = typeof fetch;\r\ntype SleepLike = (ms: number) => Promise<void>;\r\n\r\nexport class MineruClient {\r\n constructor(\r\n private readonly config: MineruRuntimeConfig,\r\n private readonly fetchImpl: FetchLike = fetch,\r\n private readonly sleep: SleepLike = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\r\n ) {}\r\n\r\n async createUploadBatch(input: MineruBatchCreateInput): Promise<MineruBatchCreateResult> {\r\n const response = await this.fetchJson(\"/file-urls/batch\", {\r\n method: \"POST\",\r\n headers: this.buildJsonHeaders(),\r\n body: JSON.stringify({\r\n language: input.language ?? this.config.language,\r\n model_version: input.modelVersion ?? this.config.modelVersion,\r\n enable_table: input.enableTable ?? this.config.enableTable,\r\n enable_formula: input.enableFormula ?? this.config.enableFormula,\r\n files: [\r\n {\r\n name: input.fileName,\r\n is_ocr: input.isOcr,\r\n },\r\n ],\r\n }),\r\n });\r\n\r\n const data = asRecord(response.data);\r\n const batchId = readString(data, [\"batch_id\", \"batchId\"]);\r\n const fileUrls = readStringArray(data, [\"file_urls\", \"fileUrls\"]);\r\n if (!batchId || fileUrls.length === 0) {\r\n throw new Error(\"MinerU createUploadBatch response is missing batch_id or file_urls.\");\r\n }\r\n\r\n return {\r\n batchId,\r\n fileUrls,\r\n };\r\n }\r\n\r\n async uploadFile(uploadUrl: string, filePath: string): Promise<void> {\r\n const buffer = await fs.readFile(filePath);\r\n const response = await this.fetchImpl(uploadUrl, {\r\n method: \"PUT\",\r\n body: buffer,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`MinerU upload failed with status ${response.status}.`);\r\n }\r\n }\r\n\r\n async waitForBatchResult(options: {\r\n batchId: string;\r\n fileName: string;\r\n }): Promise<MineruBatchResult> {\r\n const startedAt = Date.now();\r\n\r\n for (;;) {\r\n const result = await this.getBatchResult(options.batchId, options.fileName);\r\n const state = result.state.toLowerCase();\r\n if (state === \"done\") {\r\n return result;\r\n }\r\n\r\n if (state === \"failed\") {\r\n throw new Error(result.errMsg || `MinerU batch ${options.batchId} failed.`);\r\n }\r\n\r\n if (Date.now() - startedAt >= this.config.timeoutMs) {\r\n throw new Error(`MinerU batch ${options.batchId} timed out after ${this.config.timeoutMs}ms.`);\r\n }\r\n\r\n await this.sleep(this.config.pollIntervalMs);\r\n }\r\n }\r\n\r\n async downloadBuffer(url: string): Promise<Buffer> {\r\n const response = await this.fetchImpl(url);\r\n if (!response.ok) {\r\n throw new Error(`MinerU download failed with status ${response.status}.`);\r\n }\r\n\r\n return Buffer.from(await response.arrayBuffer());\r\n }\r\n\r\n private async getBatchResult(batchId: string, fileName: string): Promise<MineruBatchResult> {\r\n const response = await this.fetchJson(`/extract-results/batch/${encodeURIComponent(batchId)}`, {\r\n method: \"GET\",\r\n headers: this.buildJsonHeaders(),\r\n });\r\n const data = asRecord(response.data);\r\n const results = readArray(data, [\"extract_result\", \"extractResult\"]);\r\n const match = results\r\n .map((item) => normalizeBatchResult(item))\r\n .find((item) => item.fileName === fileName);\r\n\r\n if (!match) {\r\n throw new Error(`MinerU batch ${batchId} does not contain file \"${fileName}\".`);\r\n }\r\n\r\n return match;\r\n }\r\n\r\n private buildJsonHeaders(): Record<string, string> {\r\n return {\r\n \"Content-Type\": \"application/json\",\r\n Authorization: `Bearer ${this.config.token}`,\r\n };\r\n }\r\n\r\n private async fetchJson(relativePath: string, init: RequestInit): Promise<Record<string, unknown>> {\r\n const response = await this.fetchImpl(`${trimTrailingSlash(this.config.baseUrl)}${relativePath}`, init);\r\n const payload = (await response.json()) as unknown;\r\n if (!response.ok) {\r\n throw new Error(`MinerU request failed with status ${response.status}: ${JSON.stringify(payload)}`);\r\n }\r\n\r\n const record = asRecord(payload);\r\n const code = typeof record.code === \"number\" ? record.code : 0;\r\n if (code !== 0) {\r\n throw new Error(`MinerU request failed: ${readString(record, [\"msg\", \"message\"]) ?? `code=${code}`}`);\r\n }\r\n\r\n return record;\r\n }\r\n}\r\n\r\nfunction normalizeBatchResult(value: unknown): MineruBatchResult {\r\n const record = asRecord(value);\r\n const progress = asRecord(record.extract_progress);\r\n\r\n return {\r\n fileName: readString(record, [\"file_name\", \"fileName\"]) ?? \"\",\r\n state: readString(record, [\"state\"]) ?? \"unknown\",\r\n errMsg: readString(record, [\"err_msg\", \"errMsg\"]),\r\n fullZipUrl: readString(record, [\"full_zip_url\", \"fullZipUrl\"]),\r\n fullMarkdownUrl: readString(record, [\"full_md_url\", \"fullMdUrl\", \"md_url\", \"mdUrl\"]),\r\n extractedPages: readNumber(progress, [\"extracted_pages\", \"extractedPages\"]),\r\n totalPages: readNumber(progress, [\"total_pages\", \"totalPages\"]),\r\n };\r\n}\r\n\r\nfunction asRecord(value: unknown): Record<string, unknown> {\r\n return value && typeof value === \"object\" && !Array.isArray(value)\r\n ? (value as Record<string, unknown>)\r\n : {};\r\n}\r\n\r\nfunction readString(record: Record<string, unknown>, keys: string[]): string | undefined {\r\n for (const key of keys) {\r\n const value = record[key];\r\n if (typeof value === \"string\" && value.trim().length > 0) {\r\n return value.trim();\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction readStringArray(record: Record<string, unknown>, keys: string[]): string[] {\r\n for (const key of keys) {\r\n const value = record[key];\r\n if (Array.isArray(value)) {\r\n return value.filter((item): item is string => typeof item === \"string\" && item.length > 0);\r\n }\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction readArray(record: Record<string, unknown>, keys: string[]): unknown[] {\r\n for (const key of keys) {\r\n const value = record[key];\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n }\r\n\r\n return [];\r\n}\r\n\r\nfunction readNumber(record: Record<string, unknown>, keys: string[]): number | undefined {\r\n for (const key of keys) {\r\n const value = record[key];\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n return value;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction trimTrailingSlash(value: string): string {\r\n return value.endsWith(\"/\") ? value.slice(0, -1) : value;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport AdmZip from \"adm-zip\";\r\nimport * as CFB from \"cfb\";\r\n\r\nimport {\r\n MINERU_DOC_EXTENSIONS,\r\n MINERU_IMAGE_EXTENSIONS,\r\n MINERU_PDF_EXTENSIONS,\r\n MINERU_PPT_EXTENSIONS,\r\n} from \"./constants.js\";\r\n\r\nconst VT_I4 = 0x0003;\r\nconst VT_UI4 = 0x0013;\r\nconst SUMMARY_INFORMATION_PAGE_COUNT_PROPERTY = 0x000e;\r\nconst DOCUMENT_SUMMARY_INFORMATION_SLIDE_COUNT_PROPERTY = 0x0007;\r\n\r\nexport interface MineruPageCountProbe {\r\n value?: number;\r\n source: string;\r\n}\r\n\r\nexport async function probeMineruPageCount(\r\n filePath: string,\r\n extension: string,\r\n): Promise<MineruPageCountProbe> {\r\n try {\r\n if (MINERU_PDF_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n value: await readPdfPageCount(filePath),\r\n source: \"pdf_structure\",\r\n };\r\n }\r\n\r\n if (MINERU_IMAGE_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n value: 1,\r\n source: \"single_image\",\r\n };\r\n }\r\n\r\n if (extension === \".docx\") {\r\n return {\r\n value: await readOpenXmlAppProperty(filePath, \"Pages\"),\r\n source: \"openxml_pages\",\r\n };\r\n }\r\n\r\n if (extension === \".pptx\") {\r\n return {\r\n value: await readOpenXmlAppProperty(filePath, \"Slides\"),\r\n source: \"openxml_slides\",\r\n };\r\n }\r\n\r\n if (MINERU_DOC_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n value: await readOlePropertyValue(filePath, \"summary\", SUMMARY_INFORMATION_PAGE_COUNT_PROPERTY),\r\n source: \"ole_summary_information\",\r\n };\r\n }\r\n\r\n if (MINERU_PPT_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n value: await readOlePropertyValue(\r\n filePath,\r\n \"document_summary\",\r\n DOCUMENT_SUMMARY_INFORMATION_SLIDE_COUNT_PROPERTY,\r\n ),\r\n source: \"ole_document_summary_information\",\r\n };\r\n }\r\n } catch {\r\n return {\r\n value: undefined,\r\n source: \"unavailable\",\r\n };\r\n }\r\n\r\n return {\r\n value: undefined,\r\n source: \"unsupported\",\r\n };\r\n}\r\n\r\nasync function readPdfPageCount(filePath: string): Promise<number | undefined> {\r\n const content = (await fs.readFile(filePath)).toString(\"latin1\");\r\n const counts = [...content.matchAll(/\\/Count\\s+(\\d+)\\b/g)]\r\n .map((match) => Number.parseInt(match[1] ?? \"\", 10))\r\n .filter((value) => Number.isFinite(value) && value > 0);\r\n\r\n if (counts.length > 0) {\r\n return Math.max(...counts);\r\n }\r\n\r\n const pageMatches = content.match(/\\/Type\\s*\\/Page\\b/g);\r\n if (!pageMatches || pageMatches.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return pageMatches.length;\r\n}\r\n\r\nasync function readOpenXmlAppProperty(\r\n filePath: string,\r\n propertyName: \"Pages\" | \"Slides\",\r\n): Promise<number | undefined> {\r\n const zip = new AdmZip(await fs.readFile(filePath));\r\n const entry = zip.getEntry(\"docProps/app.xml\");\r\n if (!entry) {\r\n return undefined;\r\n }\r\n\r\n const xml = entry.getData().toString(\"utf8\");\r\n const match = xml.match(new RegExp(`<${propertyName}>(\\\\d+)</${propertyName}>`, \"i\"));\r\n if (!match) {\r\n return undefined;\r\n }\r\n\r\n return normalizePositiveInteger(Number.parseInt(match[1] ?? \"\", 10));\r\n}\r\n\r\nasync function readOlePropertyValue(\r\n filePath: string,\r\n streamName: \"summary\" | \"document_summary\",\r\n propertyId: number,\r\n): Promise<number | undefined> {\r\n const container = CFB.read(await fs.readFile(filePath), { type: \"buffer\" });\r\n const entry =\r\n streamName === \"summary\"\r\n ? CFB.find(container, \"/!SummaryInformation\") ?? CFB.find(container, \"/\\u0005SummaryInformation\")\r\n : CFB.find(container, \"/!DocumentSummaryInformation\") ?? CFB.find(container, \"/\\u0005DocumentSummaryInformation\");\r\n\r\n if (!entry?.content) {\r\n return undefined;\r\n }\r\n\r\n return parsePropertySetInteger(Buffer.from(entry.content), propertyId);\r\n}\r\n\r\nfunction parsePropertySetInteger(buffer: Buffer, propertyId: number): number | undefined {\r\n if (buffer.length < 48 || buffer.readUInt16LE(0) !== 0xfffe) {\r\n return undefined;\r\n }\r\n\r\n const setCount = buffer.readUInt32LE(28);\r\n if (setCount < 1) {\r\n return undefined;\r\n }\r\n\r\n const setOffset = buffer.readUInt32LE(44);\r\n if (setOffset + 8 > buffer.length) {\r\n return undefined;\r\n }\r\n\r\n const propertyCount = buffer.readUInt32LE(setOffset + 4);\r\n for (let index = 0; index < propertyCount; index += 1) {\r\n const entryOffset = setOffset + 8 + index * 8;\r\n if (entryOffset + 8 > buffer.length) {\r\n break;\r\n }\r\n\r\n const currentPropertyId = buffer.readUInt32LE(entryOffset);\r\n const valueOffset = buffer.readUInt32LE(entryOffset + 4);\r\n if (currentPropertyId !== propertyId) {\r\n continue;\r\n }\r\n\r\n const absoluteValueOffset = setOffset + valueOffset;\r\n if (absoluteValueOffset + 8 > buffer.length) {\r\n return undefined;\r\n }\r\n\r\n const valueType = buffer.readUInt32LE(absoluteValueOffset);\r\n if (valueType === VT_I4) {\r\n return normalizePositiveInteger(buffer.readInt32LE(absoluteValueOffset + 4));\r\n }\r\n\r\n if (valueType === VT_UI4) {\r\n return normalizePositiveInteger(buffer.readUInt32LE(absoluteValueOffset + 4));\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction normalizePositiveInteger(value: number): number | undefined {\r\n if (!Number.isFinite(value) || value <= 0) {\r\n return undefined;\r\n }\r\n\r\n return Math.trunc(value);\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { extractMarkdownFromMineruArchive, persistMineruArchive } from \"../../integrations/mineru/archive.js\";\r\nimport {\r\n MINERU_MAX_FILE_BYTES,\r\n MINERU_MAX_FILE_MB,\r\n MINERU_MAX_PAGES,\r\n type MineruDocumentCategory,\r\n} from \"../../integrations/mineru/constants.js\";\r\nimport { MineruClient } from \"../../integrations/mineru/client.js\";\r\nimport { probeMineruPageCount } from \"../../integrations/mineru/pageCount.js\";\r\nimport { assertPathAllowed, ensureParentDirectory, truncateText } from \"../../utils/fs.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { findPathSuggestions } from \"../pathSuggestions.js\";\r\nimport { okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { ToolContext } from \"../types.js\";\r\n\r\nexport interface PreparedMineruReadRequest {\r\n targetPath: string;\r\n resolvedPath: string;\r\n extension: string;\r\n size: number;\r\n pageCount?: number;\r\n pageCountSource: string;\r\n ocr: boolean;\r\n language?: string;\r\n modelVersion?: string;\r\n}\r\n\r\nexport interface MineruReadExecutionOptions {\r\n toolName: string;\r\n category: MineruDocumentCategory;\r\n supportedExtensions: readonly string[];\r\n format: string | ((extension: string) => string);\r\n}\r\n\r\nexport async function prepareMineruReadRequest(\r\n rawArgs: string,\r\n context: ToolContext,\r\n options: MineruReadExecutionOptions,\r\n): Promise<PreparedMineruReadRequest> {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const resolvedPath = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const extension = path.extname(resolvedPath).toLowerCase();\r\n\r\n if (!options.supportedExtensions.includes(extension)) {\r\n throw new ToolExecutionError(\r\n `${options.toolName} requires one of ${options.supportedExtensions.join(\", \")} paths, got: ${extension || \"unknown\"}`,\r\n {\r\n code: \"UNSUPPORTED_MINERU_FORMAT\",\r\n details: {\r\n requestedPath: targetPath,\r\n supportedExtensions: options.supportedExtensions,\r\n },\r\n },\r\n );\r\n }\r\n\r\n let stat: Awaited<ReturnType<typeof fs.stat>>;\r\n try {\r\n stat = await fs.stat(resolvedPath);\r\n } catch (error) {\r\n const errno = error as NodeJS.ErrnoException;\r\n if (errno.code === \"ENOENT\") {\r\n const suggestions = await findPathSuggestions(context.cwd, targetPath, context.projectContext);\r\n throw new ToolExecutionError(`File not found: ${targetPath}`, {\r\n code: \"ENOENT\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestions,\r\n },\r\n });\r\n }\r\n\r\n throw error;\r\n }\r\n\r\n if (stat.size > MINERU_MAX_FILE_BYTES) {\r\n throw new ToolExecutionError(\r\n `${options.toolName} size limit exceeded: current value ${formatMegabytes(stat.size)} MB, limit ${MINERU_MAX_FILE_MB} MB.`,\r\n {\r\n code: \"MINERU_SIZE_LIMIT_EXCEEDED\",\r\n details: {\r\n requestedPath: targetPath,\r\n currentBytes: stat.size,\r\n maxBytes: MINERU_MAX_FILE_BYTES,\r\n },\r\n },\r\n );\r\n }\r\n\r\n const pageCountProbe = await probeMineruPageCount(resolvedPath, extension);\r\n if (pageCountProbe.value && pageCountProbe.value > MINERU_MAX_PAGES) {\r\n throw new ToolExecutionError(\r\n `${options.toolName} page limit exceeded: current value ${pageCountProbe.value} pages, limit ${MINERU_MAX_PAGES} pages.`,\r\n {\r\n code: \"MINERU_PAGE_LIMIT_EXCEEDED\",\r\n details: {\r\n requestedPath: targetPath,\r\n currentPages: pageCountProbe.value,\r\n maxPages: MINERU_MAX_PAGES,\r\n source: pageCountProbe.source,\r\n },\r\n },\r\n );\r\n }\r\n\r\n return {\r\n targetPath,\r\n resolvedPath,\r\n extension,\r\n size: stat.size,\r\n pageCount: pageCountProbe.value,\r\n pageCountSource: pageCountProbe.source,\r\n ocr: readBoolean(args.ocr, true),\r\n language: typeof args.language === \"string\" && args.language.trim().length > 0 ? args.language.trim() : undefined,\r\n modelVersion:\r\n typeof args.model_version === \"string\" && args.model_version.trim().length > 0\r\n ? args.model_version.trim()\r\n : undefined,\r\n };\r\n}\r\n\r\nexport async function executePreparedMineruRead(\r\n request: PreparedMineruReadRequest,\r\n context: ToolContext,\r\n options: MineruReadExecutionOptions,\r\n) {\r\n if (!context.config.mineru.token) {\r\n throw new ToolExecutionError(\"Missing MINERU_API_TOKEN in .athlete/.env.\", {\r\n code: \"MINERU_TOKEN_MISSING\",\r\n });\r\n }\r\n\r\n const client = new MineruClient({\r\n ...context.config.mineru,\r\n language: request.language ?? context.config.mineru.language,\r\n modelVersion: request.modelVersion ?? context.config.mineru.modelVersion,\r\n });\r\n\r\n try {\r\n const batch = await client.createUploadBatch({\r\n fileName: path.basename(request.resolvedPath),\r\n isOcr: request.ocr,\r\n language: request.language,\r\n modelVersion: request.modelVersion,\r\n });\r\n const uploadUrl = batch.fileUrls[0];\r\n if (!uploadUrl) {\r\n throw new ToolExecutionError(`MinerU did not return an upload URL for ${request.targetPath}.`, {\r\n code: \"MINERU_UPLOAD_URL_MISSING\",\r\n });\r\n }\r\n\r\n await client.uploadFile(uploadUrl, request.resolvedPath);\r\n const result = await client.waitForBatchResult({\r\n batchId: batch.batchId,\r\n fileName: path.basename(request.resolvedPath),\r\n });\r\n const totalPages = result.totalPages ?? request.pageCount;\r\n if (totalPages && totalPages > MINERU_MAX_PAGES) {\r\n throw new ToolExecutionError(\r\n `${options.toolName} page limit exceeded: current value ${totalPages} pages, limit ${MINERU_MAX_PAGES} pages.`,\r\n {\r\n code: \"MINERU_PAGE_LIMIT_EXCEEDED\",\r\n details: {\r\n requestedPath: request.targetPath,\r\n currentPages: totalPages,\r\n maxPages: MINERU_MAX_PAGES,\r\n source: \"mineru_result\",\r\n },\r\n },\r\n );\r\n }\r\n\r\n const artifactDir = path.join(context.projectContext.stateRootDir, \".athlete\", \"mineru\", batch.batchId);\r\n const archivePath = path.join(artifactDir, \"result.zip\");\r\n const markdownPath = path.join(artifactDir, \"full.md\");\r\n const markdown = await persistMineruMarkdownArtifacts(client, result, {\r\n targetPath: request.targetPath,\r\n artifactDir,\r\n archivePath,\r\n markdownPath,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: request.resolvedPath,\r\n readable: true,\r\n format: resolveFormat(options.format, request.extension),\r\n sourceExtension: request.extension,\r\n provider: \"mineru\",\r\n size: request.size,\r\n pageCount: totalPages,\r\n pageCountSource: totalPages === result.totalPages ? \"mineru_result\" : request.pageCountSource,\r\n batchId: batch.batchId,\r\n state: result.state,\r\n totalPages: result.totalPages,\r\n extractedPages: result.extractedPages,\r\n artifactDir,\r\n archivePath: result.fullZipUrl ? archivePath : undefined,\r\n markdownPath,\r\n markdownPreview: truncateText(markdown, Math.max(2_000, Math.floor(context.config.maxReadBytes / 2))),\r\n markdownPreviewTruncated:\r\n markdown.length > Math.max(2_000, Math.floor(context.config.maxReadBytes / 2)),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n } catch (error) {\r\n if (error instanceof ToolExecutionError) {\r\n throw error;\r\n }\r\n\r\n throw new ToolExecutionError(\r\n `MinerU request failed: ${error instanceof Error ? error.message : String(error)}`,\r\n {\r\n code: \"MINERU_REQUEST_FAILED\",\r\n details: {\r\n requestedPath: request.targetPath,\r\n },\r\n },\r\n );\r\n }\r\n}\r\n\r\nasync function persistMineruMarkdownArtifacts(\r\n client: MineruClient,\r\n result: Awaited<ReturnType<MineruClient[\"waitForBatchResult\"]>>,\r\n options: {\r\n targetPath: string;\r\n artifactDir: string;\r\n archivePath: string;\r\n markdownPath: string;\r\n },\r\n): Promise<string> {\r\n if (result.fullZipUrl) {\r\n const archiveBuffer = await client.downloadBuffer(result.fullZipUrl);\r\n await ensureParentDirectory(options.archivePath);\r\n await persistMineruArchive({\r\n archiveBuffer,\r\n archivePath: options.archivePath,\r\n extractDir: path.join(options.artifactDir, \"extract\"),\r\n });\r\n const extracted = await extractMarkdownFromMineruArchive(options.archivePath);\r\n await fs.writeFile(options.markdownPath, extracted.markdown, \"utf8\");\r\n return extracted.markdown;\r\n }\r\n\r\n if (result.fullMarkdownUrl) {\r\n const markdown = (await client.downloadBuffer(result.fullMarkdownUrl)).toString(\"utf8\");\r\n await ensureParentDirectory(options.markdownPath);\r\n await fs.writeFile(options.markdownPath, markdown, \"utf8\");\r\n return markdown;\r\n }\r\n\r\n throw new ToolExecutionError(\r\n `MinerU completed without returning a markdown artifact for ${options.targetPath}.`,\r\n {\r\n code: \"MINERU_RESULT_MISSING\",\r\n },\r\n );\r\n}\r\n\r\nfunction formatMegabytes(bytes: number): string {\r\n const megabytes = bytes / (1024 * 1024);\r\n return Number.isInteger(megabytes) ? String(megabytes) : megabytes.toFixed(1);\r\n}\r\n\r\nfunction resolveFormat(\r\n format: string | ((extension: string) => string),\r\n extension: string,\r\n): string {\r\n return typeof format === \"function\" ? format(extension) : format;\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { getMineruSupportedExtensions } from \"../../integrations/mineru/constants.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { readDocxTool } from \"./readDocxTool.js\";\r\nimport { executePreparedMineruRead, prepareMineruReadRequest } from \"./mineruExecution.js\";\r\n\r\nconst SUPPORTED_EXTENSIONS = getMineruSupportedExtensions(\"doc\");\r\nconst DOCX_FALLBACK_CODES = new Set([\r\n \"MINERU_TOKEN_MISSING\",\r\n \"MINERU_REQUEST_FAILED\",\r\n \"MINERU_UPLOAD_URL_MISSING\",\r\n \"MINERU_RESULT_MISSING\",\r\n]);\r\n\r\nexport const mineruDocReadTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"mineru_doc_read\",\r\n description:\r\n \"Read a .doc or .docx document through MinerU and return a Markdown preview plus artifact paths. For .docx, read_docx is the fallback path when MinerU is unavailable.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Local .doc or .docx path.\",\r\n },\r\n ocr: {\r\n type: \"boolean\",\r\n description: \"Whether to force OCR-oriented parsing. Defaults to true.\",\r\n },\r\n language: {\r\n type: \"string\",\r\n description: \"Optional MinerU language override.\",\r\n },\r\n model_version: {\r\n type: \"string\",\r\n description: \"Optional MinerU model version override.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const request = await prepareMineruReadRequest(rawArgs, context, {\r\n toolName: \"mineru_doc_read\",\r\n category: \"doc\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: (extension) => extension.replace(/^\\./, \"\"),\r\n });\r\n\r\n if (request.extension === \".docx\" && !context.config.mineru.token) {\r\n return executeNativeDocxFallback(rawArgs, context, {\r\n trigger: \"MINERU_TOKEN_MISSING\",\r\n reason: \"Missing MINERU_API_TOKEN in .athlete/.env.\",\r\n });\r\n }\r\n\r\n try {\r\n return await executePreparedMineruRead(request, context, {\r\n toolName: \"mineru_doc_read\",\r\n category: \"doc\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: (extension) => extension.replace(/^\\./, \"\"),\r\n });\r\n } catch (error) {\r\n const fallback = getDocxFallback(error, request.extension);\r\n if (!fallback) {\r\n throw error;\r\n }\r\n\r\n return executeNativeDocxFallback(rawArgs, context, fallback);\r\n }\r\n },\r\n};\r\n\r\nfunction getDocxFallback(\r\n error: unknown,\r\n extension: string,\r\n): { trigger: string; reason: string } | null {\r\n if (extension !== \".docx\" || !(error instanceof ToolExecutionError) || !DOCX_FALLBACK_CODES.has(error.code)) {\r\n return null;\r\n }\r\n\r\n return {\r\n trigger: error.code,\r\n reason: error.message,\r\n };\r\n}\r\n\r\nasync function executeNativeDocxFallback(\r\n rawArgs: string,\r\n context: Parameters<RegisteredTool[\"execute\"]>[1],\r\n fallback: {\r\n trigger: string;\r\n reason: string;\r\n },\r\n) {\r\n const nativeResult = await readDocxTool.execute(rawArgs, context);\r\n const parsed = JSON.parse(nativeResult.output) as Record<string, unknown>;\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ...parsed,\r\n format: parsed.format ?? (path.extname(String(parsed.path ?? \"\")).replace(/^\\./, \"\") || \"docx\"),\r\n provider: \"native_docx_fallback\",\r\n fallback: {\r\n used: true,\r\n trigger: fallback.trigger,\r\n reason: fallback.reason,\r\n },\r\n },\r\n null,\r\n 2,\r\n ),\r\n nativeResult.metadata,\r\n );\r\n}\r\n","import { getMineruSupportedExtensions } from \"../../integrations/mineru/constants.js\";\r\nimport { executePreparedMineruRead, prepareMineruReadRequest } from \"./mineruExecution.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nconst SUPPORTED_EXTENSIONS = getMineruSupportedExtensions(\"image\");\r\n\r\nexport const mineruImageReadTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"mineru_image_read\",\r\n description: \"Read an image document through MinerU and return a Markdown preview plus artifact paths.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Local image path.\",\r\n },\r\n ocr: {\r\n type: \"boolean\",\r\n description: \"Whether to force OCR-oriented parsing. Defaults to true.\",\r\n },\r\n language: {\r\n type: \"string\",\r\n description: \"Optional MinerU language override.\",\r\n },\r\n model_version: {\r\n type: \"string\",\r\n description: \"Optional MinerU model version override.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const request = await prepareMineruReadRequest(rawArgs, context, {\r\n toolName: \"mineru_image_read\",\r\n category: \"image\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: \"image\",\r\n });\r\n return executePreparedMineruRead(request, context, {\r\n toolName: \"mineru_image_read\",\r\n category: \"image\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: \"image\",\r\n });\r\n },\r\n};\r\n","import { getMineruSupportedExtensions } from \"../../integrations/mineru/constants.js\";\r\nimport { executePreparedMineruRead, prepareMineruReadRequest } from \"./mineruExecution.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nconst SUPPORTED_EXTENSIONS = getMineruSupportedExtensions(\"pdf\");\r\n\r\nexport const mineruPdfReadTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"mineru_pdf_read\",\r\n description: \"Read a PDF through MinerU and return a Markdown preview plus artifact paths.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Local PDF path.\",\r\n },\r\n ocr: {\r\n type: \"boolean\",\r\n description: \"Whether to force OCR-oriented parsing. Defaults to true.\",\r\n },\r\n language: {\r\n type: \"string\",\r\n description: \"Optional MinerU language override.\",\r\n },\r\n model_version: {\r\n type: \"string\",\r\n description: \"Optional MinerU model version override.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const request = await prepareMineruReadRequest(rawArgs, context, {\r\n toolName: \"mineru_pdf_read\",\r\n category: \"pdf\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: \"pdf\",\r\n });\r\n return executePreparedMineruRead(request, context, {\r\n toolName: \"mineru_pdf_read\",\r\n category: \"pdf\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: \"pdf\",\r\n });\r\n },\r\n};\r\n","import { getMineruSupportedExtensions } from \"../../integrations/mineru/constants.js\";\r\nimport { executePreparedMineruRead, prepareMineruReadRequest } from \"./mineruExecution.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nconst SUPPORTED_EXTENSIONS = getMineruSupportedExtensions(\"ppt\");\r\n\r\nexport const mineruPptReadTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"mineru_ppt_read\",\r\n description: \"Read a .ppt or .pptx presentation through MinerU and return a Markdown preview plus artifact paths.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Local .ppt or .pptx path.\",\r\n },\r\n ocr: {\r\n type: \"boolean\",\r\n description: \"Whether to force OCR-oriented parsing. Defaults to true.\",\r\n },\r\n language: {\r\n type: \"string\",\r\n description: \"Optional MinerU language override.\",\r\n },\r\n model_version: {\r\n type: \"string\",\r\n description: \"Optional MinerU model version override.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const request = await prepareMineruReadRequest(rawArgs, context, {\r\n toolName: \"mineru_ppt_read\",\r\n category: \"ppt\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: (extension) => extension.replace(/^\\./, \"\"),\r\n });\r\n return executePreparedMineruRead(request, context, {\r\n toolName: \"mineru_ppt_read\",\r\n category: \"ppt\",\r\n supportedExtensions: SUPPORTED_EXTENSIONS,\r\n format: (extension) => extension.replace(/^\\./, \"\"),\r\n });\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { CoordinationPolicyStore } from \"../../team/policyStore.js\";\r\nimport { ProtocolRequestStore } from \"../../team/requestStore.js\";\r\nimport { okResult, parseArgs, readRequiredBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const planApprovalTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"plan_approval\",\r\n description:\r\n \"For teammates: submit a plan for lead approval using {plan}. For lead: approve or reject a pending plan using {request_id, approve, feedback}.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n plan: {\r\n type: \"string\",\r\n description: \"Teammate plan text to submit for approval.\",\r\n },\r\n request_id: {\r\n type: \"string\",\r\n description: \"Lead review target request id.\",\r\n },\r\n approve: {\r\n type: \"boolean\",\r\n description: \"Lead review decision.\",\r\n },\r\n feedback: {\r\n type: \"string\",\r\n description: \"Optional review feedback.\",\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new ProtocolRequestStore(context.projectContext.stateRootDir);\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n const policyStore = new CoordinationPolicyStore(context.projectContext.stateRootDir);\r\n\r\n if (context.identity.kind === \"teammate\") {\r\n const plan = readString(args.plan, \"plan\");\r\n const request = await store.create({\r\n kind: \"plan_approval\",\r\n from: context.identity.name,\r\n to: \"lead\",\r\n subject: `Plan review from ${context.identity.name}`,\r\n content: plan,\r\n });\r\n await bus.send(context.identity.name, \"lead\", plan, \"protocol_request\", {\r\n protocolKind: request.kind,\r\n requestId: request.id,\r\n subject: request.subject,\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: `Plan request ${request.id} submitted to lead`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n if (context.identity.kind !== \"lead\") {\r\n throw new Error(\"Only teammates can submit plans and only the lead can review them.\");\r\n }\r\n\r\n const requestId = readString(args.request_id, \"request_id\");\r\n if (typeof args.approve !== \"boolean\") {\r\n const request = await store.load(requestId);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: request ? `${request.id}: ${request.status}` : \"not found\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n const policy = await policyStore.load();\r\n if (!policy.allowPlanDecisions) {\r\n throw new Error(\r\n \"Plan decisions are currently locked by coordination policy. Use coordination_policy to allow plan decisions before approving or rejecting requests.\",\r\n );\r\n }\r\n\r\n const approve = readRequiredBoolean(args.approve, \"approve\");\r\n const feedback = typeof args.feedback === \"string\" ? args.feedback : \"\";\r\n const current = await store.loadOrThrow(requestId);\r\n if (current.kind !== \"plan_approval\") {\r\n throw new Error(`Protocol request ${requestId} is '${current.kind}', not 'plan_approval'.`);\r\n }\r\n if (current.to !== context.identity.name) {\r\n throw new Error(`Plan request ${requestId} targets '${current.to}', not '${context.identity.name}'.`);\r\n }\r\n\r\n const request = await store.resolve(requestId, {\r\n approve,\r\n feedback,\r\n respondedBy: context.identity.name,\r\n });\r\n await bus.send(context.identity.name, current.from, feedback, \"protocol_response\", {\r\n protocolKind: request.kind,\r\n requestId,\r\n approve,\r\n feedback,\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: `Plan ${request.status} for ${request.from}`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport {\r\n MINERU_DOC_EXTENSIONS,\r\n MINERU_IMAGE_EXTENSIONS,\r\n MINERU_PDF_EXTENSIONS,\r\n MINERU_PPT_EXTENSIONS,\r\n} from \"../integrations/mineru/constants.js\";\r\n\r\nexport const SPREADSHEET_EXTENSIONS = new Set([\r\n \".xlsx\",\r\n \".xls\",\r\n \".csv\",\r\n \".tsv\",\r\n \".ods\",\r\n]);\r\n\r\nconst KNOWN_BINARY_EXTENSIONS = new Set([\r\n \".epub\",\r\n \".mobi\",\r\n \".zip\",\r\n \".7z\",\r\n \".rar\",\r\n \".ico\",\r\n \".mp3\",\r\n \".mp4\",\r\n \".wav\",\r\n \".avi\",\r\n \".mov\",\r\n \".exe\",\r\n \".dll\",\r\n \".bin\",\r\n]);\r\n\r\nexport interface InspectedFile {\r\n readable: boolean;\r\n content?: string;\r\n reason?: string;\r\n action?:\r\n | \"skip_file_content\"\r\n | \"use_read_spreadsheet\"\r\n | \"use_mineru_doc_read\"\r\n | \"use_mineru_image_read\"\r\n | \"use_mineru_pdf_read\"\r\n | \"use_mineru_ppt_read\";\r\n suggestedTool?:\r\n | \"read_spreadsheet\"\r\n | \"mineru_doc_read\"\r\n | \"mineru_image_read\"\r\n | \"mineru_pdf_read\"\r\n | \"mineru_ppt_read\";\r\n suggestedPath?: string;\r\n size: number;\r\n extension: string;\r\n}\r\n\r\nexport async function inspectTextFile(filePath: string, maxBytes: number): Promise<InspectedFile> {\r\n const stat = await fs.stat(filePath);\r\n const extension = path.extname(filePath).toLowerCase();\r\n\r\n if (SPREADSHEET_EXTENSIONS.has(extension)) {\r\n return {\r\n readable: false,\r\n reason: `Spreadsheet format detected: ${extension}`,\r\n action: \"use_read_spreadsheet\",\r\n suggestedTool: \"read_spreadsheet\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n if (MINERU_DOC_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n readable: false,\r\n reason: `MinerU Word document detected: ${extension}`,\r\n action: \"use_mineru_doc_read\",\r\n suggestedTool: \"mineru_doc_read\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n if (MINERU_PDF_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n readable: false,\r\n reason: `MinerU PDF document detected: ${extension}`,\r\n action: \"use_mineru_pdf_read\",\r\n suggestedTool: \"mineru_pdf_read\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n if (MINERU_IMAGE_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n readable: false,\r\n reason: `MinerU image document detected: ${extension}`,\r\n action: \"use_mineru_image_read\",\r\n suggestedTool: \"mineru_image_read\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n if (MINERU_PPT_EXTENSIONS.includes(extension as never)) {\r\n return {\r\n readable: false,\r\n reason: `MinerU presentation detected: ${extension}`,\r\n action: \"use_mineru_ppt_read\",\r\n suggestedTool: \"mineru_ppt_read\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n if (KNOWN_BINARY_EXTENSIONS.has(extension)) {\r\n return {\r\n readable: false,\r\n reason: `Unsupported binary/document format: ${extension || \"unknown\"}`,\r\n action: \"skip_file_content\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n const buffer = await fs.readFile(filePath);\r\n if (buffer.includes(0)) {\r\n return {\r\n readable: false,\r\n reason: \"Binary file detected\",\r\n action: \"skip_file_content\",\r\n size: stat.size,\r\n extension,\r\n };\r\n }\r\n\r\n const slice = buffer.subarray(0, Math.min(buffer.length, maxBytes));\r\n return {\r\n readable: true,\r\n content: slice.toString(\"utf8\"),\r\n size: stat.size,\r\n extension,\r\n };\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { buildToolPayloadPreview, compactToolPayload } from \"../../agent/toolResultPreview.js\";\r\nimport { getProjectStatePaths } from \"../../project/statePaths.js\";\r\nimport { formatFileWithLineNumbers } from \"../../utils/fs.js\";\r\nimport type { InspectedFile } from \"../fileIntrospection.js\";\r\n\r\nconst ARTIFACT_PREVIEW_MAX_CHARS = 1_400;\r\n\r\nexport function isToolResultArtifactPath(filePath: string, stateRootDir: string): boolean {\r\n const normalizedPath = path.resolve(filePath);\r\n const artifactRoot = path.resolve(getProjectStatePaths(stateRootDir).toolResultsDir);\r\n\r\n return (\r\n normalizedPath === artifactRoot ||\r\n normalizedPath.startsWith(`${artifactRoot}${path.sep}`)\r\n );\r\n}\r\n\r\nexport function buildToolResultArtifactReadPayload(\r\n filePath: string,\r\n inspected: InspectedFile,\r\n): Record<string, unknown> {\r\n const rawContent = inspected.content ?? \"\";\r\n const summary = buildArtifactSummary(rawContent);\r\n const preview = buildToolPayloadPreview(rawContent, ARTIFACT_PREVIEW_MAX_CHARS);\r\n const content = buildArtifactContent(summary, preview);\r\n\r\n return {\r\n path: filePath,\r\n readable: true,\r\n size: inspected.size,\r\n extension: inspected.extension,\r\n artifactType: \"externalized_tool_result\",\r\n note:\r\n \"This file stores an externalized tool result. Use the summary and preview first, and only reread it with a specific line range when you still need a missing detail.\",\r\n summary,\r\n preview,\r\n startLine: 1,\r\n endLine: content.split(/\\r?\\n/).length,\r\n content,\r\n };\r\n}\r\n\r\nfunction buildArtifactContent(summary: string, preview: string): string {\r\n const lines = [\r\n \"Externalized tool-result artifact\",\r\n \"\",\r\n `Summary: ${summary}`,\r\n \"\",\r\n \"Preview:\",\r\n preview,\r\n ];\r\n\r\n return formatFileWithLineNumbers(lines.join(\"\\n\"), 1);\r\n}\r\n\r\nfunction buildArtifactSummary(rawContent: string): string {\r\n try {\r\n const parsed = JSON.parse(rawContent) as Record<string, unknown>;\r\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\r\n const fragments = [\r\n describeScalar(\"ok\", parsed.ok),\r\n describeScalar(\"path\", parsed.path),\r\n describeScalar(\"requestedPath\", parsed.requestedPath),\r\n describeScalar(\"format\", parsed.format),\r\n describeScalar(\"title\", parsed.title),\r\n describeArrayCount(\"entries\", parsed.entries),\r\n describeArrayCount(\"matches\", parsed.matches),\r\n describeArrayCount(\"sheets\", parsed.sheets),\r\n describeScalar(\"searched\", parsed.searched),\r\n describeScalar(\"total\", parsed.total),\r\n describeScalar(\"jobId\", parsed.jobId),\r\n describeScalar(\"jobStatus\", parsed.jobStatus),\r\n describeScalar(\"taskId\", parsed.taskId),\r\n describeScalar(\"task\", parsed.task),\r\n describeScalar(\"member\", parsed.member),\r\n describeScalar(\"worktree\", parsed.worktree),\r\n ].filter((fragment): fragment is string => Boolean(fragment));\r\n\r\n if (fragments.length > 0) {\r\n return fragments.join(\"; \");\r\n }\r\n }\r\n } catch {\r\n // fall through\r\n }\r\n\r\n return compactToolPayload(undefined, rawContent, 320);\r\n}\r\n\r\nfunction describeScalar(key: string, value: unknown): string | undefined {\r\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\r\n return `${key}=${String(value)}`;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction describeArrayCount(key: string, value: unknown): string | undefined {\r\n if (!Array.isArray(value)) {\r\n return undefined;\r\n }\r\n\r\n return `${key}=${value.length}`;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { assertPathAllowed, formatFileWithLineNumbers, truncateText } from \"../../utils/fs.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { inspectTextFile } from \"../fileIntrospection.js\";\r\nimport { buildToolResultArtifactReadPayload, isToolResultArtifactPath } from \"./toolResultArtifact.js\";\r\nimport { findPathSuggestions } from \"../pathSuggestions.js\";\r\nimport { okResult, parseArgs, readOptionalNumber, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const readFileTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"read_file\",\r\n description: \"Read a local text file from the workspace. Returns numbered lines to make edits easier, and is not for webpage content.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Path to the file to read.\",\r\n },\r\n start_line: {\r\n type: \"number\",\r\n description: \"1-based start line. Optional.\",\r\n },\r\n end_line: {\r\n type: \"number\",\r\n description: \"1-based end line. Optional.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const startLine = readOptionalNumber(args.start_line);\r\n const endLine = readOptionalNumber(args.end_line);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n let inspected;\r\n\r\n try {\r\n inspected = await inspectTextFile(resolved, context.config.maxReadBytes);\r\n } catch (error) {\r\n const errno = error as NodeJS.ErrnoException;\r\n if (errno.code === \"ENOENT\") {\r\n const suggestions = await findPathSuggestions(context.cwd, targetPath, context.projectContext);\r\n throw new ToolExecutionError(`File not found: ${targetPath}`, {\r\n code: \"ENOENT\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestions,\r\n },\r\n });\r\n }\r\n\r\n throw error;\r\n }\r\n\r\n if (!inspected.readable) {\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n readable: false,\r\n reason: inspected.reason,\r\n size: inspected.size,\r\n extension: inspected.extension,\r\n action: inspected.action ?? \"skip_file_content\",\r\n suggestedTool: inspected.suggestedTool,\r\n suggestedPath: inspected.suggestedPath,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n if (!startLine && !endLine && isToolResultArtifactPath(resolved, context.projectContext.stateRootDir)) {\r\n return okResult(\r\n JSON.stringify(buildToolResultArtifactReadPayload(resolved, inspected), null, 2),\r\n );\r\n }\r\n\r\n const lines = (inspected.content ?? \"\").split(/\\r?\\n/);\r\n const sliceStart = startLine ? Math.max(startLine - 1, 0) : 0;\r\n const sliceEnd = endLine ? Math.min(endLine, lines.length) : lines.length;\r\n const selected = lines.slice(sliceStart, sliceEnd).join(\"\\n\");\r\n const formatted = formatFileWithLineNumbers(\r\n truncateText(selected, context.config.maxReadBytes),\r\n sliceStart + 1,\r\n );\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n readable: true,\r\n size: inspected.size,\r\n extension: inspected.extension,\r\n startLine: sliceStart + 1,\r\n endLine: sliceStart + Math.max(1, selected.split(/\\r?\\n/).length),\r\n content: formatted,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const readInboxTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"read_inbox\",\r\n description: \"Read and drain the inbox for the current actor.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {},\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(_rawArgs, context) {\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n const messages = await bus.readInbox(context.identity.name);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n actor: context.identity.name,\r\n messages,\r\n preview:\r\n messages.length > 0\r\n ? messages\r\n .slice(0, 8)\r\n .map((message) => `${message.type} from ${message.from}: ${message.content}`)\r\n .join(\"\\n\")\r\n : \"Inbox empty.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport * as XLSX from \"xlsx\";\r\n\r\nimport { assertPathAllowed } from \"../../utils/fs.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { findPathSuggestions } from \"../pathSuggestions.js\";\r\nimport { SPREADSHEET_EXTENSIONS } from \"../fileIntrospection.js\";\r\nimport { clampNumber, okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nconst DEFAULT_PREVIEW_SHEETS = 3;\r\n\r\nexport const readSpreadsheetTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"read_spreadsheet\",\r\n description: \"Read spreadsheet files like xlsx, xls, csv, tsv, or ods and return a structured preview.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Spreadsheet file path.\",\r\n },\r\n sheet: {\r\n type: \"string\",\r\n description: \"Optional sheet name or 1-based sheet index.\",\r\n },\r\n max_rows: {\r\n type: \"number\",\r\n description: \"Maximum preview rows per sheet.\",\r\n },\r\n max_columns: {\r\n type: \"number\",\r\n description: \"Maximum preview columns per row.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const requestedSheet =\r\n typeof args.sheet === \"number\" && Number.isFinite(args.sheet)\r\n ? String(Math.trunc(args.sheet))\r\n : typeof args.sheet === \"string\"\r\n ? args.sheet.trim()\r\n : \"\";\r\n const maxRows = clampNumber(args.max_rows, 1, 200, context.config.maxSpreadsheetPreviewRows);\r\n const maxColumns = clampNumber(args.max_columns, 1, 100, context.config.maxSpreadsheetPreviewColumns);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n\r\n let stat: Awaited<ReturnType<typeof fs.stat>>;\r\n try {\r\n stat = await fs.stat(resolved);\r\n } catch (error) {\r\n const errno = error as NodeJS.ErrnoException;\r\n if (errno.code === \"ENOENT\") {\r\n const suggestions = await findPathSuggestions(context.cwd, targetPath, context.projectContext);\r\n throw new ToolExecutionError(`File not found: ${targetPath}`, {\r\n code: \"ENOENT\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestions,\r\n },\r\n });\r\n }\r\n\r\n throw error;\r\n }\r\n\r\n const extension = path.extname(resolved).toLowerCase();\r\n if (!SPREADSHEET_EXTENSIONS.has(extension)) {\r\n throw new ToolExecutionError(`Unsupported spreadsheet format: ${extension || \"unknown\"}`, {\r\n code: \"UNSUPPORTED_SPREADSHEET\",\r\n details: {\r\n supportedExtensions: [...SPREADSHEET_EXTENSIONS].sort(),\r\n },\r\n });\r\n }\r\n\r\n let workbook: XLSX.WorkBook;\r\n try {\r\n workbook = XLSX.readFile(resolved, {\r\n cellDates: true,\r\n dense: true,\r\n raw: false,\r\n });\r\n } catch (error) {\r\n throw new ToolExecutionError(\r\n `Failed to parse spreadsheet: ${error instanceof Error ? error.message : String(error)}`,\r\n {\r\n code: \"SPREADSHEET_PARSE_FAILED\",\r\n },\r\n );\r\n }\r\n\r\n const sheetNames = workbook.SheetNames ?? [];\r\n if (sheetNames.length === 0) {\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n extension,\r\n size: stat.size,\r\n sheetCount: 0,\r\n sheets: [],\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n const selectedSheetNames = selectSheets(sheetNames, requestedSheet);\r\n const previews = selectedSheetNames.map((sheetName) =>\r\n buildSheetPreview(workbook.Sheets[sheetName], sheetName, maxRows, maxColumns),\r\n );\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n extension,\r\n size: stat.size,\r\n sheetCount: sheetNames.length,\r\n availableSheets: sheetNames,\r\n previewedSheets: selectedSheetNames.length,\r\n truncatedSheetCount: Math.max(0, sheetNames.length - selectedSheetNames.length),\r\n sheets: previews,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n\r\nfunction selectSheets(sheetNames: string[], requestedSheet: string): string[] {\r\n if (!requestedSheet) {\r\n return sheetNames.slice(0, DEFAULT_PREVIEW_SHEETS);\r\n }\r\n\r\n const byName = sheetNames.find((sheetName) => sheetName === requestedSheet);\r\n if (byName) {\r\n return [byName];\r\n }\r\n\r\n const asIndex = Number.parseInt(requestedSheet, 10);\r\n if (Number.isFinite(asIndex) && asIndex >= 1 && asIndex <= sheetNames.length) {\r\n const selectedSheet = sheetNames[asIndex - 1];\r\n if (selectedSheet) {\r\n return [selectedSheet];\r\n }\r\n }\r\n\r\n throw new ToolExecutionError(`Sheet not found: ${requestedSheet}`, {\r\n code: \"SHEET_NOT_FOUND\",\r\n details: {\r\n requestedSheet,\r\n availableSheets: sheetNames,\r\n },\r\n });\r\n}\r\n\r\nfunction buildSheetPreview(\r\n worksheet: XLSX.WorkSheet | undefined,\r\n sheetName: string,\r\n maxRows: number,\r\n maxColumns: number,\r\n): Record<string, unknown> {\r\n if (!worksheet) {\r\n return {\r\n name: sheetName,\r\n rowCount: 0,\r\n columnCount: 0,\r\n preview: [],\r\n };\r\n }\r\n\r\n const rows = XLSX.utils.sheet_to_json(worksheet, {\r\n header: 1,\r\n raw: false,\r\n blankrows: false,\r\n defval: \"\",\r\n }) as unknown[][];\r\n\r\n const rowCount = rows.length;\r\n const columnCount = rows.reduce((max, row) => Math.max(max, Array.isArray(row) ? row.length : 0), 0);\r\n const preview = rows.slice(0, maxRows).map((row, index) => ({\r\n row: index + 1,\r\n cells: normalizeRow(row, maxColumns),\r\n }));\r\n\r\n return {\r\n name: sheetName,\r\n rowCount,\r\n columnCount,\r\n truncatedRows: Math.max(0, rowCount - preview.length),\r\n truncatedColumns: Math.max(0, columnCount - maxColumns),\r\n preview,\r\n };\r\n}\r\n\r\nfunction normalizeRow(row: unknown[], maxColumns: number): string[] {\r\n return row.slice(0, maxColumns).map((cell) => formatCell(cell));\r\n}\r\n\r\nfunction formatCell(value: unknown): string {\r\n if (value === null || value === undefined) {\r\n return \"\";\r\n }\r\n\r\n if (value instanceof Date) {\r\n return value.toISOString();\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n return value.length > 200 ? `${value.slice(0, 200)}...` : value;\r\n }\r\n\r\n return String(value);\r\n}\r\n","import { ToolExecutionError } from \"../errors.js\";\r\nimport { assertPathAllowed } from \"../../utils/fs.js\";\r\nimport { classifyCommand } from \"../../utils/commandPolicy.js\";\r\nimport { runCommandWithPolicy } from \"../../utils/commandRunner.js\";\r\nimport { clampNumber, okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const runShellTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"run_shell\",\r\n description: \"Run a local terminal command in the current working directory or another directory. For webpages, use browser MCP tools first and treat shell fetching as fallback.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n command: {\r\n type: \"string\",\r\n description: \"Shell command to execute.\",\r\n },\r\n cwd: {\r\n type: \"string\",\r\n description: \"Optional working directory.\",\r\n },\r\n timeout_ms: {\r\n type: \"number\",\r\n description: \"Optional timeout in milliseconds.\",\r\n },\r\n },\r\n required: [\"command\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const command = readString(args.command, \"command\");\r\n const shellCwd = typeof args.cwd === \"string\" ? args.cwd : context.cwd;\r\n const timeoutMs = clampNumber(args.timeout_ms, 1_000, 600_000, 120_000);\r\n const resolvedCwd = assertPathAllowed(shellCwd, context.cwd, context.config);\r\n const classification = classifyCommand(command);\r\n const stallTimeoutMs = clampNumber(\r\n context.config.commandStallTimeoutMs,\r\n 2_000,\r\n 300_000,\r\n 30_000,\r\n );\r\n const maxRetries = clampNumber(context.config.commandMaxRetries, 0, 3, 1);\r\n const retryBackoffMs = clampNumber(context.config.commandRetryBackoffMs, 200, 10_000, 1_500);\r\n\r\n if (classification.preferBackground) {\r\n throw new ToolExecutionError(\r\n \"Long-running command should run in background_run.\",\r\n {\r\n code: \"PREFER_BACKGROUND\",\r\n details: {\r\n suggestedTool: \"background_run\",\r\n },\r\n },\r\n );\r\n }\r\n\r\n const result = await runCommandWithPolicy({\r\n command,\r\n cwd: resolvedCwd,\r\n timeoutMs,\r\n stallTimeoutMs,\r\n abortSignal: context.abortSignal,\r\n maxRetries,\r\n retryBackoffMs,\r\n canRetry: classification.retryable,\r\n });\r\n const status = result.stalled\r\n ? \"stalled\"\r\n : result.timedOut\r\n ? \"timed_out\"\r\n : result.exitCode === 0\r\n ? \"completed\"\r\n : \"failed\";\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n command,\r\n cwd: resolvedCwd,\r\n exitCode: result.exitCode,\r\n status,\r\n attempts: result.attempts,\r\n durationMs: result.durationMs,\r\n stalled: result.stalled,\r\n timedOut: result.timedOut,\r\n commandKind: classification.kind,\r\n output: result.output,\r\n },\r\n null,\r\n 2,\r\n ),\r\n classification.validationKind\r\n ? {\r\n verification: {\r\n attempted: true,\r\n command,\r\n exitCode: result.exitCode,\r\n kind: classification.validationKind,\r\n passed: result.exitCode === 0 && !result.stalled && !result.timedOut,\r\n },\r\n }\r\n : undefined,\r\n );\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport fg from \"fast-glob\";\r\n\r\nimport { assertPathAllowed } from \"../../utils/fs.js\";\r\nimport { isPathIgnored } from \"../../utils/ignore.js\";\r\nimport { buildSearchPattern, clampNumber, okResult, parseArgs, readBoolean, readString, tryReadTextFile } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const searchFilesTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"search_files\",\r\n description: \"Search text in files under a path. Use before editing when you need to locate code.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Directory or file path to search in.\",\r\n },\r\n pattern: {\r\n type: \"string\",\r\n description: \"Plain text or regular expression pattern.\",\r\n },\r\n glob: {\r\n type: \"string\",\r\n description: \"Optional glob like src/**/*.ts.\",\r\n },\r\n case_sensitive: {\r\n type: \"boolean\",\r\n description: \"Whether search is case-sensitive.\",\r\n },\r\n max_results: {\r\n type: \"number\",\r\n description: \"Maximum matches to return.\",\r\n },\r\n },\r\n required: [\"path\", \"pattern\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const pattern = readString(args.pattern, \"pattern\");\r\n const glob = typeof args.glob === \"string\" ? args.glob : \"**/*\";\r\n const caseSensitive = readBoolean(args.case_sensitive, false);\r\n const maxResults = clampNumber(args.max_results, 1, 1_000, context.config.maxSearchResults);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const stats = await fs.stat(resolved);\r\n\r\n const regex = buildSearchPattern(pattern, caseSensitive);\r\n const filePaths = stats.isDirectory()\r\n ? (\r\n await fg(glob, {\r\n cwd: resolved,\r\n absolute: true,\r\n dot: true,\r\n suppressErrors: true,\r\n onlyFiles: true,\r\n ignore: [\"**/.git/**\", \"**/node_modules/**\", \"**/dist/**\", \"**/coverage/**\"],\r\n })\r\n )\r\n .filter((filePath) => !isPathIgnored(filePath, context.projectContext.ignoreRules))\r\n .slice(0, 2_000)\r\n : [resolved];\r\n\r\n const matches: Array<{ path: string; line: number; text: string }> = [];\r\n\r\n for (const filePath of filePaths) {\r\n if (matches.length >= maxResults) {\r\n break;\r\n }\r\n\r\n const content = await tryReadTextFile(filePath, context.config.maxReadBytes);\r\n if (!content) {\r\n continue;\r\n }\r\n\r\n const lines = content.split(/\\r?\\n/);\r\n for (let index = 0; index < lines.length; index += 1) {\r\n if (matches.length >= maxResults) {\r\n break;\r\n }\r\n\r\n const line = lines[index] ?? \"\";\r\n regex.lastIndex = 0;\r\n if (regex.test(line)) {\r\n matches.push({\r\n path: filePath,\r\n line: index + 1,\r\n text: line.slice(0, 500),\r\n });\r\n }\r\n }\r\n }\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n searched: filePaths.length,\r\n pattern,\r\n matches,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const sendMessageTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"send_message\",\r\n description: \"Send a message to a teammate or the lead.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n to: {\r\n type: \"string\",\r\n description: \"Target actor name.\",\r\n },\r\n content: {\r\n type: \"string\",\r\n description: \"Message body.\",\r\n },\r\n msg_type: {\r\n type: \"string\",\r\n enum: [\"message\", \"broadcast\"],\r\n description: \"Optional message type.\",\r\n },\r\n },\r\n required: [\"to\", \"content\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n const message = await bus.send(\r\n context.identity.name,\r\n readString(args.to, \"to\"),\r\n readString(args.content, \"content\"),\r\n args.msg_type === \"broadcast\" ? \"broadcast\" : \"message\",\r\n );\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n message,\r\n preview: `Sent ${message.type} to ${args.to}`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { CoordinationPolicyStore } from \"../../team/policyStore.js\";\r\nimport { ProtocolRequestStore } from \"../../team/requestStore.js\";\r\nimport { TeamStore } from \"../../team/store.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const shutdownRequestTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"shutdown_request\",\r\n description: \"Request a teammate to shut down gracefully.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n teammate: {\r\n type: \"string\",\r\n description: \"Target teammate name.\",\r\n },\r\n reason: {\r\n type: \"string\",\r\n description: \"Optional shutdown reason.\",\r\n },\r\n },\r\n required: [\"teammate\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n if (context.identity.kind !== \"lead\") {\r\n throw new Error(\"Only the lead can issue shutdown_request.\");\r\n }\r\n\r\n const args = parseArgs(rawArgs);\r\n const policy = await new CoordinationPolicyStore(context.projectContext.stateRootDir).load();\r\n if (!policy.allowShutdownRequests) {\r\n throw new Error(\r\n \"Shutdown requests are currently locked by coordination policy. Use coordination_policy to allow shutdown requests before sending them.\",\r\n );\r\n }\r\n const teammate = readString(args.teammate, \"teammate\");\r\n const reason = typeof args.reason === \"string\" ? args.reason : \"Please shut down gracefully.\";\r\n const teamStore = new TeamStore(context.projectContext.stateRootDir);\r\n const member = await teamStore.findMember(teammate);\r\n if (!member) {\r\n throw new Error(`Unknown teammate: ${teammate}`);\r\n }\r\n\r\n const store = new ProtocolRequestStore(context.projectContext.stateRootDir);\r\n const request = await store.create({\r\n kind: \"shutdown\",\r\n from: context.identity.name,\r\n to: member.name,\r\n subject: `Graceful shutdown for ${member.name}`,\r\n content: reason,\r\n });\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n await bus.send(context.identity.name, member.name, reason, \"protocol_request\", {\r\n protocolKind: request.kind,\r\n requestId: request.id,\r\n subject: request.subject,\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: `Shutdown request ${request.id} sent to ${member.name}`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { MessageBus } from \"../../team/messageBus.js\";\r\nimport { ProtocolRequestStore } from \"../../team/requestStore.js\";\r\nimport { TeamStore } from \"../../team/store.js\";\r\nimport { okResult, parseArgs, readRequiredBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const shutdownResponseTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"shutdown_response\",\r\n description:\r\n \"For lead: check shutdown request status by request_id. For teammates: approve or reject an incoming shutdown request.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n request_id: {\r\n type: \"string\",\r\n description: \"Shutdown request id.\",\r\n },\r\n approve: {\r\n type: \"boolean\",\r\n description: \"Teammate response: approve or reject shutdown.\",\r\n },\r\n reason: {\r\n type: \"string\",\r\n description: \"Optional response reason.\",\r\n },\r\n },\r\n required: [\"request_id\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const requestId = readString(args.request_id, \"request_id\");\r\n const requestStore = new ProtocolRequestStore(context.projectContext.stateRootDir);\r\n\r\n if (context.identity.kind === \"lead\") {\r\n const request = await requestStore.load(requestId);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: request ? `${request.id}: ${request.status}` : \"not found\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n if (context.identity.kind !== \"teammate\") {\r\n throw new Error(\"Only teammates can send shutdown_response.\");\r\n }\r\n\r\n const approve = readRequiredBoolean(args.approve, \"approve\");\r\n const reason = typeof args.reason === \"string\" ? args.reason : \"\";\r\n const current = await requestStore.loadOrThrow(requestId);\r\n if (current.kind !== \"shutdown\") {\r\n throw new Error(`Protocol request ${requestId} is '${current.kind}', not 'shutdown'.`);\r\n }\r\n if (current.to !== context.identity.name) {\r\n throw new Error(`Shutdown request ${requestId} targets '${current.to}', not '${context.identity.name}'.`);\r\n }\r\n\r\n const request = await requestStore.resolve(requestId, {\r\n approve,\r\n feedback: reason,\r\n respondedBy: context.identity.name,\r\n });\r\n const bus = new MessageBus(context.projectContext.stateRootDir);\r\n await bus.send(context.identity.name, current.from, reason, \"protocol_response\", {\r\n protocolKind: request.kind,\r\n requestId,\r\n approve,\r\n feedback: reason,\r\n });\r\n if (approve) {\r\n await new TeamStore(context.projectContext.stateRootDir).updateMemberStatus(context.identity.name, \"shutdown\");\r\n }\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n request,\r\n preview: `Shutdown ${approve ? \"approved\" : \"rejected\"}`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import path from \"node:path\";\r\nimport { spawn } from \"node:child_process\";\r\n\r\nimport type { RuntimeConfig } from \"../types.js\";\r\n\r\nexport interface SpawnTeammateProcessOptions {\r\n rootDir: string;\r\n config: RuntimeConfig;\r\n name: string;\r\n role: string;\r\n prompt: string;\r\n}\r\n\r\nexport function spawnTeammateProcess(options: SpawnTeammateProcessOptions): number {\r\n const cliEntry = path.resolve(process.argv[1] ?? \"\");\r\n if (!cliEntry) {\r\n throw new Error(\"Unable to locate CLI entrypoint for teammate worker.\");\r\n }\r\n\r\n const child = spawn(\r\n process.execPath,\r\n [\r\n cliEntry,\r\n \"-C\",\r\n options.rootDir,\r\n \"--mode\",\r\n options.config.mode,\r\n \"--model\",\r\n options.config.model,\r\n \"__worker__\",\r\n \"teammate\",\r\n \"--name\",\r\n options.name,\r\n \"--role\",\r\n options.role,\r\n \"--prompt\",\r\n options.prompt,\r\n ],\r\n {\r\n cwd: options.rootDir,\r\n detached: true,\r\n stdio: \"ignore\",\r\n env: buildTeammateWorkerEnv(options),\r\n },\r\n );\r\n\r\n child.unref();\r\n if (!child.pid) {\r\n throw new Error(\"Failed to spawn teammate worker process.\");\r\n }\r\n\r\n return child.pid;\r\n}\r\n\r\nexport function buildTeammateWorkerEnv(options: SpawnTeammateProcessOptions): NodeJS.ProcessEnv {\r\n const env: NodeJS.ProcessEnv = {\r\n ...process.env,\r\n ATHLETE_API_KEY: options.config.apiKey,\r\n ATHLETE_BASE_URL: options.config.baseUrl,\r\n ATHLETE_MODEL: options.config.model,\r\n ATHLETE_MODE: options.config.mode,\r\n };\r\n\r\n const playwright = options.config.mcp.playwright;\r\n if (options.config.mcp.enabled && playwright.enabled && !playwright.isolated) {\r\n env.ATHLETE_MCP_PLAYWRIGHT_USER_DATA_DIR = path.join(\r\n options.rootDir,\r\n \".athlete\",\r\n \"playwright-mcp\",\r\n \"teammates\",\r\n options.name,\r\n \"profile\",\r\n );\r\n delete env.ATHLETE_MCP_PLAYWRIGHT_ISOLATED;\r\n }\r\n\r\n return env;\r\n}\r\n","import { spawnTeammateProcess } from \"../../team/spawn.js\";\r\nimport { reconcileTeamState } from \"../../team/reconcile.js\";\r\nimport { TeamStore } from \"../../team/store.js\";\r\nimport { TaskStore } from \"../../tasks/store.js\";\r\nimport { okResult, parseArgs, readOptionalNumber, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const spawnTeammateTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"spawn_teammate\",\r\n description: \"Spawn an autonomous background teammate process.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Stable teammate name.\",\r\n },\r\n role: {\r\n type: \"string\",\r\n description: \"Teammate role description.\",\r\n },\r\n prompt: {\r\n type: \"string\",\r\n description: \"Initial teammate assignment.\",\r\n },\r\n task_id: {\r\n type: \"number\",\r\n description: \"Optional task id to reserve for this teammate before it starts running.\",\r\n },\r\n },\r\n required: [\"name\", \"role\", \"prompt\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n if (context.identity.kind !== \"lead\") {\r\n throw new Error(\"Only the lead can spawn_teammate.\");\r\n }\r\n\r\n const args = parseArgs(rawArgs);\r\n const name = readString(args.name, \"name\");\r\n const role = readString(args.role, \"role\");\r\n const prompt = readString(args.prompt, \"prompt\");\r\n const taskId = readOptionalNumber(args.task_id);\r\n await reconcileTeamState(context.projectContext.stateRootDir).catch(() => null);\r\n const teamStore = new TeamStore(context.projectContext.stateRootDir);\r\n const taskStore = new TaskStore(context.projectContext.stateRootDir);\r\n const existing = await teamStore.findMember(name);\r\n if (existing && existing.status === \"working\") {\r\n throw new Error(`Teammate '${name}' is already working.`);\r\n }\r\n\r\n let previousAssignee: string | undefined;\r\n let reservedTaskId: number | undefined;\r\n if (taskId) {\r\n previousAssignee = (await taskStore.load(taskId)).assignee;\r\n await taskStore.assign(taskId, name);\r\n reservedTaskId = taskId;\r\n }\r\n\r\n let pid: number;\r\n try {\r\n pid = spawnTeammateProcess({\r\n rootDir: context.projectContext.stateRootDir,\r\n config: context.config,\r\n name,\r\n role,\r\n prompt,\r\n });\r\n } catch (error) {\r\n if (taskId) {\r\n await taskStore.update(taskId, {\r\n assignee: previousAssignee ?? \"\",\r\n }).catch(() => null);\r\n }\r\n throw error;\r\n }\r\n\r\n const member = await teamStore.upsertMember(name, role, \"working\", {\r\n pid,\r\n sessionId: existing?.sessionId,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n member,\r\n reservedTaskId,\r\n preview: `Spawned '${name}' (${role}) pid=${pid}${reservedTaskId ? ` task=${reservedTaskId}` : \"\"}`,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import type { AgentMode } from \"../types.js\";\r\n\r\nexport type SubagentType = \"explore\" | \"plan\" | \"code\";\r\n\r\nexport interface SubagentProfile {\r\n type: SubagentType;\r\n description: string;\r\n mode: AgentMode;\r\n toolNames: readonly string[];\r\n assignmentPreamble: string;\r\n}\r\n\r\nconst READ_ONLY_SUBAGENT_TOOLS = [\r\n \"list_files\",\r\n \"read_file\",\r\n \"mineru_pdf_read\",\r\n \"mineru_image_read\",\r\n \"mineru_doc_read\",\r\n \"mineru_ppt_read\",\r\n \"read_docx\",\r\n \"read_spreadsheet\",\r\n \"search_files\",\r\n \"load_skill\",\r\n] as const;\r\n\r\nconst CODE_SUBAGENT_TOOLS = [\r\n ...READ_ONLY_SUBAGENT_TOOLS,\r\n \"write_file\",\r\n \"write_docx\",\r\n \"edit_docx\",\r\n \"edit_file\",\r\n \"apply_patch\",\r\n \"undo_last_change\",\r\n \"run_shell\",\r\n] as const;\r\n\r\nexport const SUBAGENT_PROFILES: Record<SubagentType, SubagentProfile> = {\r\n explore: {\r\n type: \"explore\",\r\n description: \"Read-only exploration for finding files, tracing behavior, and reporting concrete facts.\",\r\n mode: \"read-only\",\r\n toolNames: READ_ONLY_SUBAGENT_TOOLS,\r\n assignmentPreamble:\r\n \"Explore the codebase in read-only mode. Gather the minimum concrete evidence needed, stay narrow, and avoid proposing unrelated changes.\",\r\n },\r\n plan: {\r\n type: \"plan\",\r\n description: \"Read-only design analysis for implementation planning and dependency discovery.\",\r\n mode: \"read-only\",\r\n toolNames: READ_ONLY_SUBAGENT_TOOLS,\r\n assignmentPreamble:\r\n \"Analyze the current code and produce an implementation-ready plan grounded in existing architecture. Do not modify files.\",\r\n },\r\n code: {\r\n type: \"code\",\r\n description: \"Implementation-focused coding agent with edit and validation tools, but no coordination tools.\",\r\n mode: \"agent\",\r\n toolNames: CODE_SUBAGENT_TOOLS,\r\n assignmentPreamble:\r\n \"Implement the delegated change directly and keep the solution surgical. Validate targeted behavior when feasible before handing back the result.\",\r\n },\r\n};\r\n\r\nexport function listSubagentTypes(): SubagentType[] {\r\n return Object.keys(SUBAGENT_PROFILES) as SubagentType[];\r\n}\r\n\r\nexport function getSubagentProfile(agentType: string): SubagentProfile {\r\n const normalized = agentType.trim().toLowerCase() as SubagentType;\r\n const profile = SUBAGENT_PROFILES[normalized];\r\n if (!profile) {\r\n throw new Error(`Unknown subagent type: ${agentType}`);\r\n }\r\n\r\n return profile;\r\n}\r\n\r\nexport function resolveSubagentMode(profile: SubagentProfile, parentMode: AgentMode): AgentMode {\r\n if (profile.mode === \"agent\" && parentMode !== \"agent\") {\r\n throw new Error(`The '${profile.type}' subagent requires agent mode.`);\r\n }\r\n\r\n return profile.mode;\r\n}\r\n\r\nexport function buildSubagentAssignment(\r\n description: string,\r\n prompt: string,\r\n profile: SubagentProfile,\r\n): string {\r\n return [\r\n `Delegated task: ${description}`,\r\n profile.assignmentPreamble,\r\n \"Detailed instructions:\",\r\n prompt.trim(),\r\n \"Return a concise final answer for the parent agent. Focus on findings, changes, and any validation you performed.\",\r\n ].join(\"\\n\\n\");\r\n}\r\n\r\nexport function buildSubagentTypeSummary(): string {\r\n return listSubagentTypes()\r\n .map((type) => `- ${type}: ${SUBAGENT_PROFILES[type].description}`)\r\n .join(\"\\n\");\r\n}\r\n","import type { AgentCallbacks } from \"../agent/types.js\";\r\n\r\nconst HEARTBEAT_MS = 15_000;\r\n\r\nexport class SubagentProgressReporter {\r\n private readonly startedAt = Date.now();\r\n private toolCount = 0;\r\n private lastPhase = \"starting\";\r\n private heartbeat: NodeJS.Timeout | null = null;\r\n\r\n constructor(\r\n private readonly agentType: string,\r\n private readonly description: string,\r\n private readonly callbacks?: AgentCallbacks,\r\n ) {}\r\n\r\n start(): void {\r\n this.lastPhase = \"thinking\";\r\n this.emit(`started`);\r\n this.heartbeat = setInterval(() => {\r\n this.emit(`still running; phase=${this.lastPhase}`);\r\n }, HEARTBEAT_MS);\r\n this.heartbeat.unref?.();\r\n }\r\n\r\n finish(): void {\r\n this.stopHeartbeat();\r\n this.emit(`done`);\r\n }\r\n\r\n fail(error: unknown): void {\r\n this.stopHeartbeat();\r\n const message = error instanceof Error ? error.message : String(error);\r\n this.emit(`failed: ${message}`);\r\n }\r\n\r\n createCallbacks(): AgentCallbacks {\r\n return {\r\n onStatus: (text) => {\r\n this.lastPhase = truncate(text, 80);\r\n this.emit(`status=${this.lastPhase}`);\r\n },\r\n onToolCall: (name) => {\r\n this.toolCount += 1;\r\n this.lastPhase = `tool:${name}`;\r\n this.emit(`tool=${name}`);\r\n },\r\n onToolError: (name) => {\r\n this.lastPhase = `tool_error:${name}`;\r\n this.emit(`tool_error=${name}`);\r\n },\r\n };\r\n }\r\n\r\n private emit(event: string): void {\r\n this.callbacks?.onStatus?.(\r\n `[subagent ${this.agentType}] ${this.description} ... ${this.toolCount} tools, ${formatElapsed(Date.now() - this.startedAt)}, ${event}`,\r\n );\r\n }\r\n\r\n private stopHeartbeat(): void {\r\n if (!this.heartbeat) {\r\n return;\r\n }\r\n\r\n clearInterval(this.heartbeat);\r\n this.heartbeat = null;\r\n }\r\n}\r\n\r\nfunction formatElapsed(ms: number): string {\r\n const seconds = Math.max(0, Math.floor(ms / 1_000));\r\n if (seconds < 60) {\r\n return `${seconds}s`;\r\n }\r\n\r\n const minutes = Math.floor(seconds / 60);\r\n const remainder = seconds % 60;\r\n return `${minutes}m${remainder}s`;\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n return value.length <= maxChars ? value : `${value.slice(0, maxChars)}...`;\r\n}\r\n","import { runAgentTurn } from \"../agent/runTurn.js\";\r\nimport { MemorySessionStore } from \"../agent/sessionStore.js\";\r\nimport type { AgentCallbacks, RunTurnResult } from \"../agent/types.js\";\r\nimport type { ToolRegistryFactory } from \"../tools/types.js\";\r\nimport type { RuntimeConfig, StoredMessage, ToolExecutionMetadata } from \"../types.js\";\r\nimport { SubagentProgressReporter } from \"./progress.js\";\r\nimport { buildSubagentAssignment, getSubagentProfile, resolveSubagentMode } from \"./profiles.js\";\r\n\r\nexport interface RunSubagentTaskOptions {\r\n description: string;\r\n prompt: string;\r\n agentType: string;\r\n cwd: string;\r\n config: RuntimeConfig;\r\n createToolRegistry: ToolRegistryFactory;\r\n callbacks?: AgentCallbacks;\r\n}\r\n\r\nexport interface RunSubagentTaskResult {\r\n content: string;\r\n metadata?: ToolExecutionMetadata;\r\n}\r\n\r\nexport async function runSubagentTask(\r\n options: RunSubagentTaskOptions,\r\n): Promise<RunSubagentTaskResult> {\r\n const profile = getSubagentProfile(options.agentType);\r\n const mode = resolveSubagentMode(profile, options.config.mode);\r\n const subagentConfig: RuntimeConfig = {\r\n ...options.config,\r\n mode,\r\n };\r\n const sessionStore = new MemorySessionStore();\r\n const session = await sessionStore.create(options.cwd);\r\n const toolRegistry = options.createToolRegistry(mode, {\r\n onlyNames: profile.toolNames,\r\n excludeNames: [\"task\"],\r\n });\r\n const reporter = new SubagentProgressReporter(profile.type, options.description, options.callbacks);\r\n reporter.start();\r\n\r\n try {\r\n const result = await runAgentTurn({\r\n input: buildSubagentAssignment(options.description, options.prompt, profile),\r\n cwd: options.cwd,\r\n config: subagentConfig,\r\n session,\r\n sessionStore,\r\n toolRegistry,\r\n callbacks: reporter.createCallbacks(),\r\n identity: {\r\n kind: \"subagent\",\r\n name: buildSubagentName(profile.type, options.description),\r\n role: profile.type,\r\n },\r\n });\r\n\r\n reporter.finish();\r\n\r\n return {\r\n content: readLatestAssistantText(result.session.messages),\r\n metadata: buildSubagentMetadata(result, profile.type),\r\n };\r\n } catch (error) {\r\n reporter.fail(error);\r\n throw error;\r\n }\r\n}\r\n\r\nfunction buildSubagentMetadata(\r\n result: RunTurnResult,\r\n agentType: string,\r\n): ToolExecutionMetadata | undefined {\r\n const metadata: ToolExecutionMetadata = {};\r\n\r\n if (result.changedPaths.length > 0) {\r\n metadata.changedPaths = result.changedPaths;\r\n }\r\n\r\n if (result.verificationAttempted) {\r\n metadata.verification = {\r\n attempted: true,\r\n command: `subagent:${agentType}`,\r\n exitCode: 0,\r\n kind: \"delegated\",\r\n };\r\n }\r\n\r\n return Object.keys(metadata).length > 0 ? metadata : undefined;\r\n}\r\n\r\nfunction readLatestAssistantText(messages: StoredMessage[]): string {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const message = messages[index];\r\n if (message?.role !== \"assistant\") {\r\n continue;\r\n }\r\n\r\n const content = message.content?.trim();\r\n if (content) {\r\n return content;\r\n }\r\n\r\n const reasoning = message.reasoningContent?.trim();\r\n if (reasoning) {\r\n return reasoning;\r\n }\r\n }\r\n\r\n return \"(subagent returned no text)\";\r\n}\r\n\r\nfunction buildSubagentName(agentType: string, description: string): string {\r\n const slug = description\r\n .trim()\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-+|-+$/g, \"\")\r\n .slice(0, 32);\r\n\r\n return `${agentType}-${slug || \"task\"}`;\r\n}\r\n","import { buildSubagentTypeSummary, listSubagentTypes } from \"../../subagent/profiles.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nconst SUBAGENT_TYPES = listSubagentTypes();\r\n\r\nexport const taskTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"task\",\r\n description:\r\n \"Spawn a focused subagent with fresh context. The child shares the filesystem but not the current conversation history.\\n\\nAvailable agent types:\\n\" +\r\n buildSubagentTypeSummary(),\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n description: {\r\n type: \"string\",\r\n description: \"Short task name for progress tracking.\",\r\n },\r\n prompt: {\r\n type: \"string\",\r\n description: \"Detailed instructions for the delegated subagent.\",\r\n },\r\n agent_type: {\r\n type: \"string\",\r\n enum: SUBAGENT_TYPES,\r\n description: \"Subagent capability profile to use.\",\r\n },\r\n },\r\n required: [\"description\", \"prompt\", \"agent_type\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n if (context.identity.kind === \"subagent\") {\r\n throw new Error(\"Subagents cannot spawn additional subagents.\");\r\n }\r\n\r\n const args = parseArgs(rawArgs);\r\n const description = readString(args.description, \"description\");\r\n const prompt = readString(args.prompt, \"prompt\");\r\n const agentType = readString(args.agent_type, \"agent_type\");\r\n const { runSubagentTask } = await import(\"../../subagent/run.js\");\r\n const result = await runSubagentTask({\r\n description,\r\n prompt,\r\n agentType,\r\n cwd: context.cwd,\r\n config: context.config,\r\n createToolRegistry: context.createToolRegistry,\r\n callbacks: context.callbacks,\r\n });\r\n const payload: Record<string, unknown> = {\r\n ok: true,\r\n description,\r\n agentType,\r\n content: result.content,\r\n };\r\n\r\n if (result.metadata?.changedPaths?.length) {\r\n payload.changedPaths = result.metadata.changedPaths;\r\n }\r\n\r\n if (result.metadata?.verification?.attempted) {\r\n payload.verification = result.metadata.verification;\r\n }\r\n\r\n return okResult(JSON.stringify(payload, null, 2), result.metadata);\r\n },\r\n};\r\n","import { formatTodoBlock, normalizeTodoItems } from \"../../agent/todos.js\";\r\nimport { TaskStore } from \"../../tasks/store.js\";\r\nimport { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const todoWriteTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"todo_write\",\r\n description:\r\n \"Update the structured todo list for the current task. Keep it short, set at most one item to in_progress, and mark items completed as you finish them.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n items: {\r\n type: \"array\",\r\n description: \"The full current todo list.\",\r\n items: {\r\n type: \"object\",\r\n properties: {\r\n id: {\r\n type: \"string\",\r\n description: \"Stable short id such as 1, 2, 3.\",\r\n },\r\n text: {\r\n type: \"string\",\r\n description: \"Short actionable task description.\",\r\n },\r\n status: {\r\n type: \"string\",\r\n enum: [\"pending\", \"in_progress\", \"completed\"],\r\n description: \"Current task state.\",\r\n },\r\n },\r\n required: [\"id\", \"text\", \"status\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n required: [\"items\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const items = normalizeTodoItems(args.items);\r\n const completed = items.filter((item) => item.status === \"completed\").length;\r\n const inProgress = items.find((item) => item.status === \"in_progress\")?.id ?? null;\r\n const taskStore = new TaskStore(context.projectContext.stateRootDir);\r\n const activeTask = await resolveActiveTask(taskStore, context);\r\n const syncedTask = activeTask ? await taskStore.setChecklist(activeTask.id, items) : undefined;\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n items,\r\n total: items.length,\r\n completed,\r\n inProgress,\r\n taskId: syncedTask?.id,\r\n preview: formatTodoBlock(items),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n\r\nasync function resolveActiveTask(taskStore: TaskStore, context: Parameters<RegisteredTool[\"execute\"]>[1]) {\r\n if (context.identity.kind === \"subagent\") {\r\n return undefined;\r\n }\r\n\r\n if (context.identity.kind === \"teammate\") {\r\n const owned = await taskStore.findOwnedActive(context.identity.name);\r\n if (owned) {\r\n return owned;\r\n }\r\n }\r\n\r\n const worktree = await new WorktreeStore(context.projectContext.stateRootDir).findByPath(context.cwd);\r\n if (!worktree || typeof worktree.taskId !== \"number\") {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await taskStore.load(worktree.taskId);\r\n } catch {\r\n return undefined;\r\n }\r\n}\r\n","import { TaskStore } from \"../../tasks/store.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const taskCreateTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"task_create\",\r\n description: \"Create a persistent task in the project task board.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n subject: {\r\n type: \"string\",\r\n description: \"Short task title.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n description: \"Optional task details.\",\r\n },\r\n assignee: {\r\n type: \"string\",\r\n description: \"Optional teammate this task is reserved for.\",\r\n },\r\n },\r\n required: [\"subject\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new TaskStore(context.projectContext.stateRootDir);\r\n const task = await store.create(readString(args.subject, \"subject\"), typeof args.description === \"string\" ? args.description : \"\", {\r\n assignee: typeof args.assignee === \"string\" ? args.assignee : undefined,\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n task,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { reconcileTeamState } from \"../../team/reconcile.js\";\r\nimport { TaskStore } from \"../../tasks/store.js\";\r\nimport { okResult, parseArgs, readOptionalNumber } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const taskGetTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"task_get\",\r\n description: \"Get a task by id from the persistent project task board.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n task_id: {\r\n type: \"number\",\r\n description: \"Task id.\",\r\n },\r\n },\r\n required: [\"task_id\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n await reconcileTeamState(context.projectContext.stateRootDir).catch(() => null);\r\n const args = parseArgs(rawArgs);\r\n const taskId = readOptionalNumber(args.task_id);\r\n if (!taskId) {\r\n throw new Error('Tool argument \"task_id\" must be a positive number.');\r\n }\r\n\r\n const store = new TaskStore(context.projectContext.stateRootDir);\r\n const task = await store.load(taskId);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n task,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { reconcileTeamState } from \"../../team/reconcile.js\";\r\nimport { TaskStore } from \"../../tasks/store.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const taskListTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"task_list\",\r\n description: \"List all persistent tasks in the project task board.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {},\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(_rawArgs, context) {\r\n await reconcileTeamState(context.projectContext.stateRootDir).catch(() => null);\r\n const store = new TaskStore(context.projectContext.stateRootDir);\r\n const tasks = await store.list();\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n tasks,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { TaskStore } from \"../../tasks/store.js\";\r\nimport { okResult, parseArgs, readOptionalNumber } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const taskUpdateTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"task_update\",\r\n description: \"Update task status, dependencies, assignee, or owner on the persistent task board.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n task_id: {\r\n type: \"number\",\r\n description: \"Task id.\",\r\n },\r\n status: {\r\n type: \"string\",\r\n enum: [\"pending\", \"in_progress\", \"completed\"],\r\n description: \"Optional next status.\",\r\n },\r\n add_blocked_by: {\r\n type: \"array\",\r\n items: { type: \"number\" },\r\n description: \"Optional dependency ids blocking this task.\",\r\n },\r\n add_blocks: {\r\n type: \"array\",\r\n items: { type: \"number\" },\r\n description: \"Optional task ids blocked by this task.\",\r\n },\r\n owner: {\r\n type: \"string\",\r\n description: \"Optional task owner name.\",\r\n },\r\n assignee: {\r\n type: \"string\",\r\n description: \"Optional teammate this task is reserved for. Empty string clears it.\",\r\n },\r\n },\r\n required: [\"task_id\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const taskId = readOptionalNumber(args.task_id);\r\n if (!taskId) {\r\n throw new Error('Tool argument \"task_id\" must be a positive number.');\r\n }\r\n\r\n const store = new TaskStore(context.projectContext.stateRootDir);\r\n const current = await store.load(taskId);\r\n const nextStatus = typeof args.status === \"string\" ? readTaskStatus(args.status) : undefined;\r\n const nextOwner = typeof args.owner === \"string\" ? normalizeOptionalText(args.owner) : undefined;\r\n const nextAssignee = typeof args.assignee === \"string\" ? normalizeOptionalText(args.assignee) : undefined;\r\n const nextBlockedBy = readNumberArray(args.add_blocked_by);\r\n const nextBlocks = readNumberArray(args.add_blocks);\r\n\r\n if (context.identity.kind === \"teammate\") {\r\n if (nextOwner !== undefined) {\r\n throw new Error(\"Teammates cannot change task owner directly; use claim_task instead.\");\r\n }\r\n if (nextAssignee !== undefined) {\r\n throw new Error(\"Teammates cannot change task assignee.\");\r\n }\r\n if (nextBlockedBy && nextBlockedBy.length > 0) {\r\n throw new Error(\"Teammates cannot change task dependencies.\");\r\n }\r\n if (nextBlocks && nextBlocks.length > 0) {\r\n throw new Error(\"Teammates cannot change task dependencies.\");\r\n }\r\n if (nextStatus && current.owner !== context.identity.name) {\r\n throw new Error(`Task ${taskId} is owned by ${current.owner || \"nobody\"}, not ${context.identity.name}.`);\r\n }\r\n }\r\n\r\n const task = await store.update(taskId, {\r\n status: nextStatus,\r\n addBlockedBy: nextBlockedBy,\r\n addBlocks: nextBlocks,\r\n owner: nextOwner,\r\n assignee: nextAssignee,\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n task,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n\r\nfunction readTaskStatus(value: string): \"pending\" | \"in_progress\" | \"completed\" {\r\n if (value === \"pending\" || value === \"in_progress\" || value === \"completed\") {\r\n return value;\r\n }\r\n\r\n throw new Error(`Invalid task status: ${value}`);\r\n}\r\n\r\nfunction readNumberArray(value: unknown): number[] | undefined {\r\n if (!Array.isArray(value)) {\r\n return undefined;\r\n }\r\n\r\n return value\r\n .filter((entry) => typeof entry === \"number\" && Number.isFinite(entry))\r\n .map((entry) => Math.trunc(entry as number))\r\n .filter((entry) => entry > 0);\r\n}\r\n\r\nfunction normalizeOptionalText(value: string): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n","import { truncateText } from \"../../utils/fs.js\";\r\nimport { okResult, parseArgs } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const undoLastChangeTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"undo_last_change\",\r\n description: \"Undo the latest recorded file change, or a specific change id if provided.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n change_id: {\r\n type: \"string\",\r\n description: \"Optional change id from the recorded change history.\",\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const changeId = typeof args.change_id === \"string\" && args.change_id.trim().length > 0\r\n ? args.change_id.trim()\r\n : undefined;\r\n const targetRecord = changeId\r\n ? await context.changeStore.load(changeId)\r\n : await context.changeStore.loadLatestUndoable();\r\n\r\n if (!targetRecord) {\r\n throw new Error(\"No recorded change is available to undo.\");\r\n }\r\n\r\n const preview = truncateText(targetRecord.preview ?? targetRecord.summary, 6_000);\r\n const result = await context.changeStore.undo(targetRecord.id);\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n undoneChangeId: result.record.id,\r\n restoredPaths: result.restoredPaths,\r\n summary: result.record.summary,\r\n preview,\r\n warning: \"Undo restores the previously recorded snapshot and may overwrite later edits on the same files.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: result.restoredPaths,\r\n },\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs, readOptionalNumber, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeCreateTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_create\",\r\n description: \"Create an isolated git worktree, optionally binding it to a task.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Worktree name.\",\r\n },\r\n task_id: {\r\n type: \"number\",\r\n description: \"Optional task id to bind.\",\r\n },\r\n },\r\n required: [\"name\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const name = readString(args.name, \"name\");\r\n const taskId = readOptionalNumber(args.task_id);\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const worktree = await store.create(name, taskId);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n worktree,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { clampNumber, okResult, parseArgs } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeEventsTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_events\",\r\n description: \"Read recent worktree lifecycle events.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n limit: {\r\n type: \"number\",\r\n description: \"Optional number of recent events.\",\r\n },\r\n },\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const limit = clampNumber(args.limit, 1, 200, 20);\r\n const events = await store.readEvents(limit);\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n events,\r\n preview:\r\n events.length > 0\r\n ? events\r\n .map((event) => {\r\n const worktree = event.worktree?.name ? ` ${event.worktree.name}` : \"\";\r\n const task = typeof event.task?.id === \"number\" ? ` task=${event.task.id}` : \"\";\r\n return `${event.event}${worktree}${task}`;\r\n })\r\n .join(\"\\n\")\r\n : \"No worktree events.\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeGetTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_get\",\r\n description: \"Get details for a named isolated git worktree.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Worktree name.\",\r\n },\r\n },\r\n required: [\"name\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const worktree = await store.get(readString(args.name, \"name\"));\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n worktree,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeKeepTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_keep\",\r\n description: \"Mark a worktree as kept for later inspection.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Worktree name.\",\r\n },\r\n },\r\n required: [\"name\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const worktree = await store.keep(readString(args.name, \"name\"));\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n worktree,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeListTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_list\",\r\n description: \"List isolated git worktrees tracked for this project.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {},\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(_rawArgs, context) {\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const worktrees = await store.list();\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n worktrees,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import { WorktreeStore } from \"../../worktrees/store.js\";\r\nimport { okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const worktreeRemoveTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"worktree_remove\",\r\n description: \"Remove an isolated git worktree and optionally complete its bound task.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n name: {\r\n type: \"string\",\r\n description: \"Worktree name.\",\r\n },\r\n force: {\r\n type: \"boolean\",\r\n description: \"Force removal even with uncommitted changes.\",\r\n },\r\n complete_task: {\r\n type: \"boolean\",\r\n description: \"Also mark the bound task completed.\",\r\n },\r\n },\r\n required: [\"name\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const store = new WorktreeStore(context.projectContext.stateRootDir);\r\n const worktree = await store.remove(readString(args.name, \"name\"), {\r\n force: readBoolean(args.force, false),\r\n completeTask: readBoolean(args.complete_task, false),\r\n });\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n worktree,\r\n preview: await store.summarize(),\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n};\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport {\r\n applyTemplateVariables,\r\n buildDocxBuffer,\r\n readDocxDocument,\r\n renderDocxSourcePreview,\r\n} from \"../../documents/docx/index.js\";\r\nimport { assertPathAllowed, ensureParentDirectory, fileExists, truncateText } from \"../../utils/fs.js\";\r\nimport { recordToolChange } from \"../changeTracking.js\";\r\nimport { readDocxSourceFormat, readTemplateVariables, replaceExtension } from \"../docxShared.js\";\r\nimport { ToolExecutionError } from \"../errors.js\";\r\nimport { buildDiffPreview, okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const writeDocxTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"write_docx\",\r\n description: \"Create or overwrite a .docx Word document from plain text or markdown.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Target .docx file path.\",\r\n },\r\n content: {\r\n type: \"string\",\r\n description: \"Source content to write into the document.\",\r\n },\r\n format: {\r\n type: \"string\",\r\n description: \"Content format: plain_text or markdown.\",\r\n enum: [\"plain_text\", \"markdown\"],\r\n },\r\n title: {\r\n type: \"string\",\r\n description: \"Optional document title metadata.\",\r\n },\r\n description: {\r\n type: \"string\",\r\n description: \"Optional document description metadata.\",\r\n },\r\n variables: {\r\n type: \"object\",\r\n description: \"Optional template variables used to replace placeholders like {{name}}.\",\r\n additionalProperties: true,\r\n },\r\n create_directories: {\r\n type: \"boolean\",\r\n description: \"Whether to create parent directories automatically.\",\r\n },\r\n },\r\n required: [\"path\", \"content\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const content = readString(args.content, \"content\");\r\n const format = readDocxSourceFormat(args.format);\r\n const variables = readTemplateVariables(args.variables);\r\n const titleTemplate = typeof args.title === \"string\" ? args.title.trim() : undefined;\r\n const descriptionTemplate = typeof args.description === \"string\" ? args.description.trim() : undefined;\r\n const createDirectories = readBoolean(args.create_directories, true);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const extension = path.extname(resolved).toLowerCase();\r\n\r\n if (extension === \".doc\" || extension === \".docm\") {\r\n throw new ToolExecutionError(`Word output in ${extension} format is not supported. Write a .docx file instead.`, {\r\n code: \"DOC_CONVERSION_REQUIRED\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestedPath: replaceExtension(resolved, \".docx\"),\r\n },\r\n });\r\n }\r\n\r\n if (extension !== \".docx\") {\r\n throw new ToolExecutionError(`write_docx requires a .docx path, got: ${extension || \"unknown\"}`, {\r\n code: \"INVALID_DOCX_OUTPUT_PATH\",\r\n details: {\r\n requestedPath: targetPath,\r\n suggestedPath: resolved.endsWith(\".\") ? `${resolved}docx` : `${resolved}.docx`,\r\n },\r\n });\r\n }\r\n\r\n const existed = await fileExists(resolved);\r\n const beforeBuffer = existed ? await fs.readFile(resolved) : undefined;\r\n const beforeText = existed ? await tryReadExistingDocxText(resolved) : \"\";\r\n const renderedContent = applyTemplateVariables(content, variables);\r\n const renderedTitle = titleTemplate ? applyTemplateVariables(titleTemplate, variables) : undefined;\r\n const renderedDescription = descriptionTemplate\r\n ? applyTemplateVariables(descriptionTemplate, variables)\r\n : undefined;\r\n const afterText = renderDocxSourcePreview(renderedContent.content, format);\r\n const preview = buildDiffPreview(beforeText, afterText);\r\n const buffer = await buildDocxBuffer({\r\n title: renderedTitle?.content,\r\n description: renderedDescription?.content,\r\n creator: \"Athlete\",\r\n format,\r\n content: renderedContent.content,\r\n });\r\n\r\n if (createDirectories) {\r\n await ensureParentDirectory(resolved);\r\n }\r\n\r\n await fs.writeFile(resolved, buffer);\r\n const changeRecord = await recordToolChange(context, {\r\n toolName: \"write_docx\",\r\n summary: `write_docx ${resolved}`,\r\n preview: truncateText(preview || afterText, 6_000),\r\n operations: [\r\n {\r\n path: resolved,\r\n kind: existed ? \"update\" : \"create\",\r\n binary: true,\r\n preview: truncateText(preview || afterText, 6_000),\r\n beforeData: beforeBuffer,\r\n afterData: buffer,\r\n },\r\n ],\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n existed,\r\n format,\r\n bytes: buffer.length,\r\n title: renderedTitle?.content,\r\n variablesApplied: renderedContent.usedKeys,\r\n missingVariables: [\r\n ...new Set([\r\n ...renderedContent.missingKeys,\r\n ...(renderedTitle?.missingKeys ?? []),\r\n ...(renderedDescription?.missingKeys ?? []),\r\n ]),\r\n ],\r\n changeId: changeRecord.change?.id,\r\n changeHistoryWarning: changeRecord.warning,\r\n preview: truncateText(preview || afterText, 6_000),\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: [resolved],\r\n changeId: changeRecord.change?.id,\r\n },\r\n );\r\n },\r\n};\r\n\r\nasync function tryReadExistingDocxText(filePath: string): Promise<string> {\r\n try {\r\n const document = await readDocxDocument(filePath);\r\n return document.rawText;\r\n } catch {\r\n return \"\";\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { assertPathAllowed, ensureParentDirectory, fileExists, truncateText } from \"../../utils/fs.js\";\r\nimport { recordToolChange } from \"../changeTracking.js\";\r\nimport { buildDiffPreview, okResult, parseArgs, readBoolean, readString } from \"../shared.js\";\r\nimport type { RegisteredTool } from \"../types.js\";\r\n\r\nexport const writeFileTool: RegisteredTool = {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"write_file\",\r\n description: \"Create or overwrite a file with new content.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"File path to write.\",\r\n },\r\n content: {\r\n type: \"string\",\r\n description: \"The full target content.\",\r\n },\r\n create_directories: {\r\n type: \"boolean\",\r\n description: \"Whether to create parent directories if they do not exist.\",\r\n },\r\n },\r\n required: [\"path\", \"content\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const content = readString(args.content, \"content\");\r\n const createDirectories = readBoolean(args.create_directories, true);\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const existed = await fileExists(resolved);\r\n const before = existed ? await fs.readFile(resolved, \"utf8\") : \"\";\r\n const preview = buildDiffPreview(before, content);\r\n\r\n if (createDirectories) {\r\n await ensureParentDirectory(resolved);\r\n }\r\n\r\n await fs.writeFile(resolved, content, \"utf8\");\r\n const changeRecord = await recordToolChange(context, {\r\n toolName: \"write_file\",\r\n summary: `write_file ${resolved}`,\r\n preview,\r\n operations: [\r\n {\r\n path: resolved,\r\n kind: existed ? \"update\" : \"create\",\r\n binary: false,\r\n preview,\r\n beforeText: existed ? before : undefined,\r\n afterText: content,\r\n },\r\n ],\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n path: resolved,\r\n existed,\r\n bytes: Buffer.byteLength(content, \"utf8\"),\r\n changeId: changeRecord.change?.id,\r\n changeHistoryWarning: changeRecord.warning,\r\n preview: truncateText(preview, 6_000),\r\n },\r\n null,\r\n 2,\r\n ),\r\n {\r\n changedPaths: [resolved],\r\n changeId: changeRecord.change?.id,\r\n },\r\n );\r\n },\r\n};\r\n","import type { RegisteredTool } from \"./types.js\";\r\n\r\nconst SHELL_LIKE_TOOLS = new Set([\"run_shell\", \"background_run\"]);\r\n\r\nexport function sortRegisteredToolsForExposure(tools: readonly RegisteredTool[]): RegisteredTool[] {\r\n return [...tools]\r\n .map((tool, index) => ({\r\n tool,\r\n index,\r\n rank: getExposureRank(tool.definition.function.name),\r\n }))\r\n .sort((left, right) => {\r\n if (left.rank !== right.rank) {\r\n return left.rank - right.rank;\r\n }\r\n\r\n return left.index - right.index;\r\n })\r\n .map((entry) => entry.tool);\r\n}\r\n\r\nfunction getExposureRank(name: string): number {\r\n if (/^mcp_playwright_browser_/i.test(name)) {\r\n return 0;\r\n }\r\n\r\n if (/^mcp_/i.test(name)) {\r\n return 10;\r\n }\r\n\r\n if (SHELL_LIKE_TOOLS.has(name)) {\r\n return 100;\r\n }\r\n\r\n return 50;\r\n}\r\n","import { applyPatchTool } from \"./files/applyPatchTool.js\";\r\nimport { backgroundCheckTool } from \"./background/backgroundCheckTool.js\";\r\nimport { backgroundRunTool } from \"./background/backgroundRunTool.js\";\r\nimport { broadcastTool } from \"./team/broadcastTool.js\";\r\nimport { claimTaskTool } from \"./tasks/claimTaskTool.js\";\r\nimport { coordinationPolicyTool } from \"./team/coordinationPolicyTool.js\";\r\nimport { editDocxTool } from \"./documents/editDocxTool.js\";\r\nimport { editFileTool } from \"./files/editFileTool.js\";\r\nimport { idleTool } from \"./team/idleTool.js\";\r\nimport { listFilesTool } from \"./files/listFilesTool.js\";\r\nimport { listTeammatesTool } from \"./team/listTeammatesTool.js\";\r\nimport { loadSkillTool } from \"./skills/loadSkillTool.js\";\r\nimport { mineruDocReadTool } from \"./documents/mineruDocReadTool.js\";\r\nimport { mineruImageReadTool } from \"./documents/mineruImageReadTool.js\";\r\nimport { mineruPdfReadTool } from \"./documents/mineruPdfReadTool.js\";\r\nimport { mineruPptReadTool } from \"./documents/mineruPptReadTool.js\";\r\nimport { planApprovalTool } from \"./team/planApprovalTool.js\";\r\nimport { readDocxTool } from \"./documents/readDocxTool.js\";\r\nimport { readFileTool } from \"./files/readFileTool.js\";\r\nimport { readInboxTool } from \"./team/readInboxTool.js\";\r\nimport { readSpreadsheetTool } from \"./documents/readSpreadsheetTool.js\";\r\nimport { runShellTool } from \"./shell/runShellTool.js\";\r\nimport { searchFilesTool } from \"./files/searchFilesTool.js\";\r\nimport { sendMessageTool } from \"./team/sendMessageTool.js\";\r\nimport { shutdownRequestTool } from \"./team/shutdownRequestTool.js\";\r\nimport { shutdownResponseTool } from \"./team/shutdownResponseTool.js\";\r\nimport { spawnTeammateTool } from \"./team/spawnTeammateTool.js\";\r\nimport { taskTool } from \"./tasks/taskTool.js\";\r\nimport { todoWriteTool } from \"./tasks/todoWriteTool.js\";\r\nimport { taskCreateTool } from \"./tasks/taskCreateTool.js\";\r\nimport { taskGetTool } from \"./tasks/taskGetTool.js\";\r\nimport { taskListTool } from \"./tasks/taskListTool.js\";\r\nimport { taskUpdateTool } from \"./tasks/taskUpdateTool.js\";\r\nimport { undoLastChangeTool } from \"./files/undoLastChangeTool.js\";\r\nimport { worktreeCreateTool } from \"./worktrees/worktreeCreateTool.js\";\r\nimport { worktreeEventsTool } from \"./worktrees/worktreeEventsTool.js\";\r\nimport { worktreeGetTool } from \"./worktrees/worktreeGetTool.js\";\r\nimport { worktreeKeepTool } from \"./worktrees/worktreeKeepTool.js\";\r\nimport { worktreeListTool } from \"./worktrees/worktreeListTool.js\";\r\nimport { worktreeRemoveTool } from \"./worktrees/worktreeRemoveTool.js\";\r\nimport { register } from \"./shared.js\";\r\nimport type { RegisteredTool, ToolRegistry, ToolRegistryOptions } from \"./types.js\";\r\nimport type { AgentMode } from \"../types.js\";\r\nimport { writeDocxTool } from \"./documents/writeDocxTool.js\";\r\nimport { writeFileTool } from \"./files/writeFileTool.js\";\r\nimport { sortRegisteredToolsForExposure } from \"./order.js\";\r\n\r\nconst READ_ONLY_TOOLS: readonly RegisteredTool[] = [\r\n todoWriteTool,\r\n taskTool,\r\n listFilesTool,\r\n readFileTool,\r\n mineruPdfReadTool,\r\n mineruImageReadTool,\r\n mineruDocReadTool,\r\n mineruPptReadTool,\r\n readDocxTool,\r\n readSpreadsheetTool,\r\n searchFilesTool,\r\n loadSkillTool,\r\n worktreeListTool,\r\n worktreeGetTool,\r\n worktreeEventsTool,\r\n] as const;\r\n\r\nconst AGENT_TOOLS: readonly RegisteredTool[] = [\r\n ...READ_ONLY_TOOLS,\r\n taskCreateTool,\r\n coordinationPolicyTool,\r\n taskGetTool,\r\n taskListTool,\r\n taskUpdateTool,\r\n claimTaskTool,\r\n worktreeCreateTool,\r\n worktreeKeepTool,\r\n worktreeRemoveTool,\r\n backgroundRunTool,\r\n backgroundCheckTool,\r\n spawnTeammateTool,\r\n listTeammatesTool,\r\n sendMessageTool,\r\n readInboxTool,\r\n broadcastTool,\r\n shutdownRequestTool,\r\n shutdownResponseTool,\r\n planApprovalTool,\r\n idleTool,\r\n writeFileTool,\r\n writeDocxTool,\r\n editDocxTool,\r\n editFileTool,\r\n applyPatchTool,\r\n undoLastChangeTool,\r\n runShellTool,\r\n] as const;\r\n\r\nexport function createToolRegistry(mode: AgentMode, options: ToolRegistryOptions = {}): ToolRegistry {\r\n const tools = new Map<string, RegisteredTool>();\r\n\r\n for (const tool of selectTools(mode, options)) {\r\n register(tools, tool);\r\n }\r\n\r\n return {\r\n definitions: [...tools.values()].map((tool) => tool.definition),\r\n async execute(name, rawArgs, context) {\r\n const tool = tools.get(name);\r\n if (!tool) {\r\n throw new Error(`Unknown tool: ${name}`);\r\n }\r\n\r\n return tool.execute(rawArgs, context);\r\n },\r\n async close() {\r\n return;\r\n },\r\n };\r\n}\r\n\r\nfunction selectTools(mode: AgentMode, options: ToolRegistryOptions): RegisteredTool[] {\r\n const availableTools = mode === \"agent\" ? AGENT_TOOLS : READ_ONLY_TOOLS;\r\n const onlyNames = options.onlyNames ? new Set(options.onlyNames) : null;\r\n const excludeNames = new Set(options.excludeNames ?? []);\r\n\r\n return sortRegisteredToolsForExposure(\r\n [...availableTools, ...(options.includeTools ?? [])].filter((tool) => {\r\n const name = tool.definition.function.name;\r\n if (onlyNames && !onlyNames.has(name)) {\r\n return false;\r\n }\r\n\r\n return !excludeNames.has(name);\r\n }),\r\n );\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { McpRuntimeConfigContext, PlaywrightMcpConfig } from \"../types.js\";\r\n\r\nconst PLAYWRIGHT_STATE_DIR = path.join(\".athlete\", \"playwright-mcp\");\r\n\r\nexport function resolvePlaywrightStateDir(runtime: McpRuntimeConfigContext): string {\r\n const stateRootDir = runtime.stateRootDir\r\n ? path.resolve(runtime.stateRootDir)\r\n : runtime.cwd\r\n ? path.resolve(runtime.cwd)\r\n : \"\";\r\n\r\n return stateRootDir ? path.join(stateRootDir, PLAYWRIGHT_STATE_DIR) : \"\";\r\n}\r\n\r\nexport function resolvePlaywrightUserDataDir(\r\n explicitPath: string,\r\n cwd: string | undefined,\r\n isolated: boolean,\r\n stateDir: string,\r\n): string {\r\n if (isolated) {\r\n return explicitPath ? resolveOptionalPath(explicitPath, cwd) : \"\";\r\n }\r\n\r\n if (explicitPath) {\r\n return resolveOptionalPath(explicitPath, cwd);\r\n }\r\n\r\n return stateDir ? path.join(stateDir, \"profile\") : \"\";\r\n}\r\n\r\nexport function resolvePlaywrightStorageState(\r\n explicitPath: string,\r\n cwd: string | undefined,\r\n isolated: boolean,\r\n stateDir: string,\r\n): string {\r\n if (explicitPath) {\r\n return resolveOptionalPath(explicitPath, cwd);\r\n }\r\n\r\n if (!isolated || !stateDir) {\r\n return \"\";\r\n }\r\n\r\n return path.join(stateDir, \"storage-state.json\");\r\n}\r\n\r\nexport function resolveDefaultStatePath(explicitPath: string, cwd: string | undefined, fallbackPath: string): string {\r\n if (explicitPath) {\r\n return resolveOptionalPath(explicitPath, cwd);\r\n }\r\n\r\n return fallbackPath;\r\n}\r\n\r\nexport function resolveOptionalPath(value: string, cwd: string | undefined): string {\r\n if (!value) {\r\n return \"\";\r\n }\r\n\r\n return path.isAbsolute(value) ? path.normalize(value) : path.resolve(cwd ?? process.cwd(), value);\r\n}\r\n\r\nexport function normalizeOutputMode(value: unknown): PlaywrightMcpConfig[\"outputMode\"] {\r\n return String(value ?? \"\").trim().toLowerCase() === \"file\" ? \"file\" : \"stdout\";\r\n}\r\n","import path from \"node:path\";\r\nimport { normalizeOutputMode, resolveDefaultStatePath, resolveOptionalPath, resolvePlaywrightStateDir, resolvePlaywrightStorageState, resolvePlaywrightUserDataDir } from \"./paths.js\";\r\nimport type {\r\n McpServerConfig,\r\n McpRuntimeConfigContext,\r\n PlaywrightBrowserName,\r\n PlaywrightMcpConfig,\r\n PlaywrightMcpConfigInput,\r\n} from \"../types.js\";\r\n\r\nconst DEFAULT_PLAYWRIGHT_PACKAGE = \"@playwright/mcp@latest\";\r\nconst DEFAULT_PLAYWRIGHT_TIMEOUT_MS = 120_000;\r\nconst DEFAULT_PLAYWRIGHT_OUTPUT_MODE = \"stdout\";\r\n\r\nexport function getDefaultPlaywrightMcpConfig(): PlaywrightMcpConfig {\r\n return {\r\n enabled: false,\r\n command: process.platform === \"win32\" ? \"npx.cmd\" : \"npx\",\r\n packageSpec: DEFAULT_PLAYWRIGHT_PACKAGE,\r\n browser: \"\",\r\n headless: false,\r\n isolated: false,\r\n userDataDir: \"\",\r\n storageState: \"\",\r\n configPath: \"\",\r\n outputDir: \"\",\r\n outputMode: DEFAULT_PLAYWRIGHT_OUTPUT_MODE,\r\n saveSession: true,\r\n caps: [],\r\n extraArgs: [],\r\n env: {},\r\n cwd: \"\",\r\n timeoutMs: DEFAULT_PLAYWRIGHT_TIMEOUT_MS,\r\n };\r\n}\r\n\r\nexport function normalizePlaywrightMcpConfig(\r\n input: PlaywrightMcpConfigInput | undefined,\r\n runtime: McpRuntimeConfigContext = {},\r\n): PlaywrightMcpConfig {\r\n const defaults = getDefaultPlaywrightMcpConfig();\r\n const isolated = Boolean(input?.isolated);\r\n const headless = Boolean(input?.headless);\r\n const stateDir = resolvePlaywrightStateDir(runtime);\r\n const userDataDir = resolvePlaywrightUserDataDir(\r\n String(input?.userDataDir ?? \"\").trim(),\r\n runtime.cwd,\r\n isolated,\r\n stateDir,\r\n );\r\n const storageState = resolvePlaywrightStorageState(\r\n String(input?.storageState ?? \"\").trim(),\r\n runtime.cwd,\r\n isolated,\r\n stateDir,\r\n );\r\n const configPath = resolveDefaultStatePath(\r\n String(input?.configPath ?? \"\").trim(),\r\n runtime.cwd,\r\n path.join(stateDir, \"config.json\"),\r\n );\r\n const outputDir = resolveDefaultStatePath(\r\n String(input?.outputDir ?? \"\").trim(),\r\n runtime.cwd,\r\n path.join(stateDir, \"output\"),\r\n );\r\n\r\n return {\r\n enabled: Boolean(input?.enabled),\r\n command: String(input?.command ?? defaults.command).trim() || defaults.command,\r\n packageSpec: String(input?.packageSpec ?? input?.package ?? defaults.packageSpec).trim() || defaults.packageSpec,\r\n browser: normalizeBrowserName(input?.browser),\r\n headless,\r\n isolated,\r\n userDataDir,\r\n storageState,\r\n configPath,\r\n outputDir,\r\n outputMode: normalizeOutputMode(input?.outputMode),\r\n saveSession: input?.saveSession !== false,\r\n caps: normalizeStringArray(input?.caps),\r\n extraArgs: normalizeExtraArgs(input?.extraArgs, headless),\r\n env: normalizeStringMap(input?.env),\r\n cwd: resolveOptionalPath(String(input?.cwd ?? \"\").trim(), runtime.cwd),\r\n timeoutMs: clampNumber(input?.timeoutMs, 5_000, 10 * 60 * 1_000, defaults.timeoutMs),\r\n };\r\n}\r\n\r\nexport function buildPlaywrightMcpServer(playwright: PlaywrightMcpConfig): McpServerConfig | null {\r\n if (!playwright.enabled) {\r\n return null;\r\n }\r\n const args = [playwright.packageSpec];\r\n if (playwright.browser) {\r\n args.push(\"--browser\", playwright.browser);\r\n }\r\n if (playwright.headless) {\r\n args.push(\"--headless\");\r\n }\r\n if (playwright.isolated) {\r\n args.push(\"--isolated\");\r\n } else if (playwright.userDataDir) {\r\n args.push(\"--user-data-dir\", playwright.userDataDir);\r\n }\r\n if (playwright.storageState) {\r\n args.push(\"--storage-state\", playwright.storageState);\r\n }\r\n if (playwright.configPath) {\r\n args.push(\"--config\", playwright.configPath);\r\n }\r\n if (playwright.outputDir) {\r\n args.push(\"--output-dir\", playwright.outputDir);\r\n }\r\n if (playwright.outputMode) {\r\n args.push(\"--output-mode\", playwright.outputMode);\r\n }\r\n if (playwright.saveSession) {\r\n args.push(\"--save-session\");\r\n }\r\n if (playwright.caps.length > 0) {\r\n args.push(\"--caps\", playwright.caps.join(\",\"));\r\n }\r\n args.push(...playwright.extraArgs);\r\n return {\r\n name: \"playwright\",\r\n enabled: true,\r\n transport: \"stdio\",\r\n command: playwright.command,\r\n args,\r\n env: playwright.env,\r\n cwd: playwright.cwd,\r\n url: \"\",\r\n include: [],\r\n exclude: [],\r\n timeoutMs: playwright.timeoutMs,\r\n trust: true,\r\n auth: {\r\n type: \"none\",\r\n tokenEnv: \"\",\r\n headers: {},\r\n },\r\n };\r\n}\r\n\r\nfunction normalizeBrowserName(value: unknown): PlaywrightBrowserName {\r\n switch (String(value ?? \"\").trim().toLowerCase()) {\r\n case \"chrome\":\r\n return \"chrome\";\r\n case \"firefox\":\r\n return \"firefox\";\r\n case \"webkit\":\r\n return \"webkit\";\r\n case \"msedge\":\r\n return \"msedge\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction normalizeExtraArgs(value: unknown, headless: boolean): string[] {\r\n const blockedFlags = new Set([\r\n \"--browser\",\r\n \"--caps\",\r\n \"--config\",\r\n \"--headless\",\r\n \"--isolated\",\r\n \"--output-dir\",\r\n \"--output-mode\",\r\n \"--save-session\",\r\n \"--storage-state\",\r\n \"--user-data-dir\",\r\n ]);\r\n\r\n return normalizeStringArray(value).filter((arg) => {\r\n if (!headless && arg === \"--headless\") {\r\n return false;\r\n }\r\n\r\n return !blockedFlags.has(arg);\r\n });\r\n}\r\n\r\nfunction normalizeStringArray(value: unknown): string[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n return [...new Set(value.map((item) => String(item).trim()).filter(Boolean))];\r\n}\r\n\r\nfunction normalizeStringMap(value: unknown): Record<string, string> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n return {};\r\n }\r\n\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n .map(([key, raw]) => [key.trim(), String(raw ?? \"\").trim()] as const)\r\n .filter(([key, raw]) => key.length > 0 && raw.length > 0);\r\n\r\n return Object.fromEntries(entries);\r\n}\r\n\r\nfunction clampNumber(value: unknown, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n return Math.max(min, Math.min(max, Math.trunc(value)));\r\n}\r\n","import { buildPlaywrightMcpServer, getDefaultPlaywrightMcpConfig, normalizePlaywrightMcpConfig } from \"./playwright/config.js\";\r\nimport type {\r\n McpConfig,\r\n McpConfigInput,\r\n McpRuntimeConfigContext,\r\n McpServerAuthConfig,\r\n McpServerConfig,\r\n McpTransportType,\r\n ResolvedMcpServerDefinition,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_MCP_SERVER_TIMEOUT_MS = 30_000;\r\n\r\nexport function getDefaultMcpConfig(): McpConfig {\r\n return {\r\n enabled: false,\r\n servers: [],\r\n playwright: getDefaultPlaywrightMcpConfig(),\r\n };\r\n}\r\n\r\nexport function normalizeMcpConfig(\r\n config: McpConfigInput | undefined,\r\n runtime: McpRuntimeConfigContext = {},\r\n): McpConfig {\r\n const servers = Array.isArray(config?.servers)\r\n ? config!.servers\r\n .map((server) => normalizeMcpServer(server))\r\n .filter((server): server is McpServerConfig => server !== null)\r\n : [];\r\n const playwright = normalizePlaywrightMcpConfig(config?.playwright, runtime);\r\n const playwrightServer = buildPlaywrightMcpServer(playwright);\r\n\r\n return {\r\n enabled: Boolean(config?.enabled || playwright.enabled),\r\n servers: dedupeServersByName(playwrightServer ? [...servers, playwrightServer] : servers),\r\n playwright,\r\n };\r\n}\r\n\r\nexport function resolveMcpServerDefinitions(config: McpConfig): ResolvedMcpServerDefinition[] {\r\n return config.servers.map((server) => ({\r\n ...server,\r\n id: server.name,\r\n }));\r\n}\r\n\r\nfunction normalizeMcpServer(server: Partial<McpServerConfig> | undefined): McpServerConfig | null {\r\n const name = String(server?.name ?? \"\").trim();\r\n if (!name) {\r\n return null;\r\n }\r\n\r\n return {\r\n name,\r\n enabled: server?.enabled !== false,\r\n transport: normalizeTransport(server?.transport),\r\n command: String(server?.command ?? \"\").trim(),\r\n args: normalizeStringArray(server?.args),\r\n env: normalizeStringMap(server?.env),\r\n cwd: String(server?.cwd ?? \"\").trim(),\r\n url: String(server?.url ?? \"\").trim(),\r\n include: normalizeStringArray(server?.include),\r\n exclude: normalizeStringArray(server?.exclude),\r\n timeoutMs: clampNumber(server?.timeoutMs, 1_000, 10 * 60 * 1_000, DEFAULT_MCP_SERVER_TIMEOUT_MS),\r\n trust: Boolean(server?.trust),\r\n auth: normalizeAuth(server?.auth),\r\n };\r\n}\r\n\r\nfunction normalizeTransport(value: string | undefined): McpTransportType {\r\n switch ((value ?? \"\").trim().toLowerCase()) {\r\n case \"sse\":\r\n return \"sse\";\r\n case \"streamable-http\":\r\n case \"streamable_http\":\r\n case \"http\":\r\n return \"streamable-http\";\r\n default:\r\n return \"stdio\";\r\n }\r\n}\r\n\r\nfunction normalizeAuth(value: Partial<McpServerAuthConfig> | undefined): McpServerAuthConfig {\r\n const type = normalizeAuthType(value?.type);\r\n return {\r\n type,\r\n tokenEnv: String(value?.tokenEnv ?? \"\").trim(),\r\n headers: normalizeStringMap(value?.headers),\r\n };\r\n}\r\n\r\nfunction normalizeAuthType(value: string | undefined): McpServerAuthConfig[\"type\"] {\r\n switch ((value ?? \"\").trim().toLowerCase()) {\r\n case \"token\":\r\n return \"token\";\r\n case \"oauth\":\r\n return \"oauth\";\r\n default:\r\n return \"none\";\r\n }\r\n}\r\n\r\nfunction normalizeStringArray(value: unknown): string[] {\r\n if (!Array.isArray(value)) {\r\n return [];\r\n }\r\n\r\n return [...new Set(value.map((item) => String(item).trim()).filter(Boolean))];\r\n}\r\n\r\nfunction normalizeStringMap(value: unknown): Record<string, string> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n return {};\r\n }\r\n\r\n const entries = Object.entries(value as Record<string, unknown>)\r\n .map(([key, raw]) => [key.trim(), String(raw ?? \"\").trim()] as const)\r\n .filter(([key, raw]) => key.length > 0 && raw.length > 0);\r\n\r\n return Object.fromEntries(entries);\r\n}\r\n\r\nfunction dedupeServersByName(servers: McpServerConfig[]): McpServerConfig[] {\r\n const seen = new Set<string>();\r\n const deduped: McpServerConfig[] = [];\r\n\r\n for (const server of servers) {\r\n const key = server.name.toLowerCase();\r\n if (seen.has(key)) {\r\n continue;\r\n }\r\n\r\n seen.add(key);\r\n deduped.push(server);\r\n }\r\n\r\n return deduped;\r\n}\r\n\r\nfunction clampNumber(value: unknown, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n return Math.max(min, Math.min(max, Math.trunc(value)));\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport type { Dirent } from \"node:fs\";\r\n\r\nimport type { ResolvedMcpServerDefinition } from \"../types.js\";\r\n\r\nexport async function preparePlaywrightRuntimeArtifacts(\r\n server: ResolvedMcpServerDefinition,\r\n): Promise<void> {\r\n if (server.name !== \"playwright\") {\r\n return;\r\n }\r\n\r\n const configPath = readFlagValue(server.args, \"--config\");\r\n const outputDir = readFlagValue(server.args, \"--output-dir\");\r\n const userDataDir = readFlagValue(server.args, \"--user-data-dir\");\r\n const storageState = readFlagValue(server.args, \"--storage-state\");\r\n\r\n if (outputDir) {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n }\r\n\r\n if (userDataDir) {\r\n await fs.mkdir(userDataDir, { recursive: true });\r\n }\r\n\r\n if (storageState) {\r\n await fs.mkdir(path.dirname(storageState), { recursive: true });\r\n }\r\n\r\n if (configPath) {\r\n await fs.mkdir(path.dirname(configPath), { recursive: true });\r\n await ensureGeneratedConfigFile(server.args, configPath, outputDir, userDataDir);\r\n }\r\n\r\n if (outputDir) {\r\n await migrateLegacyRootArtifacts(outputDir);\r\n }\r\n}\r\n\r\nasync function ensureGeneratedConfigFile(\r\n args: string[],\r\n configPath: string,\r\n outputDir: string,\r\n userDataDir: string,\r\n): Promise<void> {\r\n if (!isManagedPlaywrightConfigPath(configPath)) {\r\n return;\r\n }\r\n\r\n const generatedConfig = {\r\n browser: {\r\n isolated: hasFlag(args, \"--isolated\") || undefined,\r\n userDataDir: hasFlag(args, \"--isolated\") ? undefined : userDataDir || undefined,\r\n launchOptions: {\r\n headless: hasFlag(args, \"--headless\"),\r\n channel: resolveBrowserChannel(readFlagValue(args, \"--browser\")),\r\n },\r\n },\r\n outputDir: outputDir || undefined,\r\n saveSession: hasFlag(args, \"--save-session\") || undefined,\r\n };\r\n\r\n await fs.writeFile(configPath, `${JSON.stringify(generatedConfig, null, 2)}\\n`, \"utf8\");\r\n}\r\n\r\nasync function migrateLegacyRootArtifacts(outputDir: string): Promise<void> {\r\n const stateDir = resolveManagedStateDir(outputDir);\r\n if (!stateDir) {\r\n return;\r\n }\r\n\r\n const stateRootDir = path.dirname(path.dirname(stateDir));\r\n const legacyRootDir = path.join(stateRootDir, \".playwright-mcp\");\r\n const legacyTargetDir = path.join(stateDir, \"legacy-root-artifacts\");\r\n\r\n if (await pathExists(legacyRootDir)) {\r\n await fs.mkdir(legacyTargetDir, { recursive: true });\r\n const migratedLegacyDir = path.join(legacyTargetDir, \".playwright-mcp\");\r\n if (!(await pathExists(migratedLegacyDir))) {\r\n await fs.rename(legacyRootDir, migratedLegacyDir);\r\n }\r\n }\r\n\r\n const rootEntries = await safeReadDir(stateRootDir);\r\n if (rootEntries.length === 0) {\r\n return;\r\n }\r\n\r\n for (const entry of rootEntries) {\r\n if (!entry.isFile() || !/^playwright-.*\\.(png|jpe?g|md|json)$/i.test(entry.name)) {\r\n continue;\r\n }\r\n\r\n await fs.mkdir(legacyTargetDir, { recursive: true });\r\n const sourcePath = path.join(stateRootDir, entry.name);\r\n const targetPath = path.join(legacyTargetDir, entry.name);\r\n\r\n if (await pathExists(targetPath)) {\r\n continue;\r\n }\r\n\r\n await fs.rename(sourcePath, targetPath);\r\n }\r\n}\r\n\r\nfunction resolveManagedStateDir(outputDir: string): string {\r\n const normalized = path.normalize(outputDir);\r\n const marker = path.normalize(path.join(\".athlete\", \"playwright-mcp\"));\r\n const markerIndex = normalized.toLowerCase().indexOf(marker.toLowerCase());\r\n\r\n if (markerIndex < 0) {\r\n return \"\";\r\n }\r\n\r\n return normalized.slice(0, markerIndex + marker.length);\r\n}\r\n\r\nfunction isManagedPlaywrightConfigPath(configPath: string): boolean {\r\n return configPath.toLowerCase().endsWith(\r\n path.normalize(path.join(\".athlete\", \"playwright-mcp\", \"config.json\")).toLowerCase(),\r\n );\r\n}\r\n\r\nfunction resolveBrowserChannel(browserName: string): string | undefined {\r\n switch (browserName.trim().toLowerCase()) {\r\n case \"chrome\":\r\n return \"chrome\";\r\n case \"msedge\":\r\n return \"msedge\";\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction hasFlag(args: string[], flagName: string): boolean {\r\n return args.includes(flagName);\r\n}\r\n\r\nfunction readFlagValue(args: string[], flagName: string): string {\r\n const index = args.indexOf(flagName);\r\n if (index < 0) {\r\n return \"\";\r\n }\r\n\r\n return String(args[index + 1] ?? \"\");\r\n}\r\n\r\nasync function pathExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await fs.access(targetPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function safeReadDir(targetPath: string): Promise<Dirent[]> {\r\n try {\r\n return await fs.readdir(targetPath, { withFileTypes: true });\r\n } catch {\r\n return [];\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport { createRequire } from \"node:module\";\r\n\r\nimport { execa } from \"execa\";\r\n\r\nimport type { PlaywrightBrowserName, ResolvedMcpServerDefinition } from \"../types.js\";\r\n\r\nexport type PlaywrightInstallTarget = \"chrome\" | \"firefox\" | \"webkit\" | \"msedge\" | \"chromium\";\r\n\r\nexport interface PlaywrightBrowserInstallDependencies {\r\n getInstallLocation: (target: PlaywrightInstallTarget) => Promise<string>;\r\n install: (target: PlaywrightInstallTarget) => Promise<void>;\r\n}\r\n\r\nconst localRequire = createRequire(__filename);\r\nconst installInflight = new Map<PlaywrightInstallTarget, Promise<void>>();\r\n\r\nexport async function ensurePlaywrightBrowserAvailableForServer(\r\n server: ResolvedMcpServerDefinition,\r\n dependencies: PlaywrightBrowserInstallDependencies = createDefaultDependencies(),\r\n): Promise<void> {\r\n if (server.name !== \"playwright\" || shouldSkipPlaywrightBrowserInstall()) {\r\n return;\r\n }\r\n\r\n const target = resolvePlaywrightInstallTarget(readBrowserFlag(server.args));\r\n const installLocation = await dependencies.getInstallLocation(target);\r\n if (await isPlaywrightInstallLocationAvailable(installLocation)) {\r\n return;\r\n }\r\n\r\n const existing = installInflight.get(target);\r\n if (existing) {\r\n await existing;\r\n return;\r\n }\r\n\r\n const installPromise = (async () => {\r\n const currentLocation = await dependencies.getInstallLocation(target);\r\n if (await isPlaywrightInstallLocationAvailable(currentLocation)) {\r\n return;\r\n }\r\n\r\n await dependencies.install(target);\r\n })().finally(() => {\r\n installInflight.delete(target);\r\n });\r\n\r\n installInflight.set(target, installPromise);\r\n await installPromise;\r\n}\r\n\r\nexport function resolvePlaywrightInstallTarget(browser: PlaywrightBrowserName): PlaywrightInstallTarget {\r\n switch (browser) {\r\n case \"chrome\":\r\n return \"chrome\";\r\n case \"firefox\":\r\n return \"firefox\";\r\n case \"webkit\":\r\n return \"webkit\";\r\n case \"msedge\":\r\n return \"msedge\";\r\n default:\r\n return \"chromium\";\r\n }\r\n}\r\n\r\nexport function parsePlaywrightInstallLocation(output: string): string {\r\n const match = output.match(/Install location:\\s+([^\\r\\n]+)/i);\r\n return match?.[1]?.trim() ?? \"\";\r\n}\r\n\r\nexport async function isPlaywrightInstallLocationAvailable(location: string): Promise<boolean> {\r\n if (!location) {\r\n return false;\r\n }\r\n\r\n if (location === \"<system>\") {\r\n return true;\r\n }\r\n\r\n try {\r\n await fs.access(location);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction createDefaultDependencies(): PlaywrightBrowserInstallDependencies {\r\n return {\r\n getInstallLocation: readPlaywrightInstallLocation,\r\n install: installPlaywrightBrowser,\r\n };\r\n}\r\n\r\nasync function readPlaywrightInstallLocation(target: PlaywrightInstallTarget): Promise<string> {\r\n const cliPath = resolvePlaywrightCliPath();\r\n const result = await execa(process.execPath, [cliPath, \"install\", \"--dry-run\", target], {\r\n reject: false,\r\n windowsHide: true,\r\n });\r\n\r\n if ((result.exitCode ?? 1) !== 0) {\r\n return \"\";\r\n }\r\n\r\n return parsePlaywrightInstallLocation(result.stdout);\r\n}\r\n\r\nasync function installPlaywrightBrowser(target: PlaywrightInstallTarget): Promise<void> {\r\n const cliPath = resolvePlaywrightCliPath();\r\n await execa(process.execPath, [cliPath, \"install\", target], {\r\n reject: true,\r\n windowsHide: true,\r\n stdio: \"inherit\",\r\n });\r\n}\r\n\r\nfunction resolvePlaywrightCliPath(): string {\r\n const packageJsonPath = localRequire.resolve(\"playwright/package.json\");\r\n return path.join(path.dirname(packageJsonPath), \"cli.js\");\r\n}\r\n\r\nfunction readBrowserFlag(args: string[]): PlaywrightBrowserName {\r\n const index = args.indexOf(\"--browser\");\r\n if (index < 0) {\r\n return \"\";\r\n }\r\n\r\n switch (String(args[index + 1] ?? \"\").trim().toLowerCase()) {\r\n case \"chrome\":\r\n return \"chrome\";\r\n case \"firefox\":\r\n return \"firefox\";\r\n case \"webkit\":\r\n return \"webkit\";\r\n case \"msedge\":\r\n return \"msedge\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction shouldSkipPlaywrightBrowserInstall(): boolean {\r\n const value = String(process.env.ATHLETE_SKIP_PLAYWRIGHT_BROWSER_INSTALL ?? \"\").trim().toLowerCase();\r\n return value === \"1\" || value === \"true\" || value === \"yes\";\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ResolvedMcpServerDefinition } from \"../types.js\";\r\n\r\nexport async function normalizePlaywrightToolInput(\r\n server: ResolvedMcpServerDefinition,\r\n toolName: string,\r\n input: Record<string, unknown>,\r\n): Promise<Record<string, unknown>> {\r\n if (server.name !== \"playwright\") {\r\n return input;\r\n }\r\n\r\n const outputDir = readFlagValue(server.args, \"--output-dir\");\r\n if (!outputDir) {\r\n return input;\r\n }\r\n\r\n if (typeof input.filename === \"string\" && input.filename.trim().length > 0) {\r\n const filename = resolvePlaywrightOutputPath(outputDir, input.filename);\r\n await fs.mkdir(path.dirname(filename), { recursive: true });\r\n return {\r\n ...input,\r\n filename,\r\n };\r\n }\r\n\r\n if (toolName === \"browser_take_screenshot\") {\r\n return input;\r\n }\r\n\r\n return input;\r\n}\r\n\r\nfunction resolvePlaywrightOutputPath(outputDir: string, filename: string): string {\r\n if (path.isAbsolute(filename)) {\r\n return path.normalize(filename);\r\n }\r\n\r\n const normalizedOutputDir = path.resolve(outputDir);\r\n const resolved = path.resolve(normalizedOutputDir, filename);\r\n if (resolved === normalizedOutputDir || resolved.startsWith(`${normalizedOutputDir}${path.sep}`)) {\r\n return resolved;\r\n }\r\n\r\n return path.join(normalizedOutputDir, path.basename(filename));\r\n}\r\n\r\nfunction readFlagValue(args: string[], flagName: string): string {\r\n const index = args.indexOf(flagName);\r\n if (index < 0) {\r\n return \"\";\r\n }\r\n\r\n return String(args[index + 1] ?? \"\");\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\r\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\r\nimport type { Tool } from \"@modelcontextprotocol/sdk/types.js\";\r\n\r\nimport { preparePlaywrightRuntimeArtifacts } from \"./playwright/artifacts.js\";\r\nimport { ensurePlaywrightBrowserAvailableForServer } from \"./playwright/browserInstall.js\";\r\nimport { normalizePlaywrightToolInput } from \"./playwright/invoke.js\";\r\nimport type {\r\n McpClient,\r\n McpDiscoverySnapshot,\r\n McpDiscoveredTool,\r\n McpInvocationContext,\r\n McpToolCallResult,\r\n ResolvedMcpServerDefinition,\r\n} from \"./types.js\";\r\n\r\nconst STDERR_HISTORY_LIMIT = 40;\r\n\r\nexport class StdioMcpClient implements McpClient {\r\n private readonly client = new Client(\r\n {\r\n name: \"athlete\",\r\n version: \"0.1.2\",\r\n },\r\n {\r\n capabilities: {},\r\n },\r\n );\r\n\r\n private readonly transport: StdioClientTransport;\r\n private readonly stderrLines: string[] = [];\r\n private connected = false;\r\n private connectPromise: Promise<void> | null = null;\r\n\r\n constructor(readonly server: ResolvedMcpServerDefinition) {\r\n this.transport = new StdioClientTransport({\r\n command: server.command,\r\n args: server.args,\r\n cwd: server.cwd || undefined,\r\n env: buildServerEnv(server),\r\n stderr: \"pipe\",\r\n });\r\n this.transport.stderr?.on(\"data\", (chunk) => {\r\n for (const line of String(chunk).split(/\\r?\\n/).map((value) => value.trim()).filter(Boolean)) {\r\n this.stderrLines.push(line);\r\n }\r\n\r\n if (this.stderrLines.length > STDERR_HISTORY_LIMIT) {\r\n this.stderrLines.splice(0, this.stderrLines.length - STDERR_HISTORY_LIMIT);\r\n }\r\n });\r\n }\r\n\r\n async discover(): Promise<McpDiscoverySnapshot> {\r\n await this.ensureConnected();\r\n const tools = await listAllTools(this.client, this.server.timeoutMs);\r\n\r\n return {\r\n server: this.server,\r\n status: \"ready\",\r\n tools: tools.map((tool) => this.adaptTool(tool)),\r\n instructions: normalizeInstructions(this.client.getInstructions()),\r\n diagnostics: [...this.stderrLines],\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n async close(): Promise<void> {\r\n this.connectPromise = null;\r\n\r\n try {\r\n await this.client.close();\r\n } catch {\r\n await this.transport.close().catch(() => undefined);\r\n } finally {\r\n this.connected = false;\r\n }\r\n }\r\n\r\n private adaptTool(tool: Tool): McpDiscoveredTool {\r\n return {\r\n serverName: this.server.name,\r\n name: tool.name,\r\n description: tool.description ?? \"\",\r\n inputSchema: tool.inputSchema ?? {\r\n type: \"object\",\r\n properties: {},\r\n },\r\n readOnly: tool.annotations?.readOnlyHint === true,\r\n invoke: async (input, context) => this.invokeTool(tool.name, input, context),\r\n };\r\n }\r\n\r\n private async invokeTool(\r\n toolName: string,\r\n input: Record<string, unknown>,\r\n context: McpInvocationContext,\r\n ): Promise<McpToolCallResult> {\r\n await this.ensureConnected();\r\n const normalizedInput = await normalizePlaywrightToolInput(this.server, toolName, input);\r\n\r\n const result = await this.client.callTool(\r\n {\r\n name: toolName,\r\n arguments: normalizedInput,\r\n },\r\n undefined,\r\n {\r\n signal: context.signal,\r\n timeout: this.server.timeoutMs,\r\n resetTimeoutOnProgress: true,\r\n maxTotalTimeout: this.server.timeoutMs,\r\n },\r\n );\r\n\r\n return {\r\n ok: result.isError !== true,\r\n output: formatToolResult(result),\r\n };\r\n }\r\n\r\n private async ensureConnected(): Promise<void> {\r\n if (this.connected) {\r\n return;\r\n }\r\n\r\n if (this.connectPromise) {\r\n await this.connectPromise;\r\n return;\r\n }\r\n\r\n this.connectPromise = (async () => {\r\n await ensureConfiguredDirectories(this.server);\r\n await this.client.connect(this.transport, {\r\n timeout: this.server.timeoutMs,\r\n });\r\n this.connected = true;\r\n })();\r\n\r\n try {\r\n await this.connectPromise;\r\n } catch (error) {\r\n this.connected = false;\r\n await this.transport.close().catch(() => undefined);\r\n throw error;\r\n } finally {\r\n this.connectPromise = null;\r\n }\r\n }\r\n}\r\n\r\nasync function listAllTools(\r\n client: Client,\r\n timeoutMs: number,\r\n): Promise<Tool[]> {\r\n const tools: Tool[] = [];\r\n let cursor: string | undefined;\r\n\r\n do {\r\n const result = await client.listTools(\r\n cursor ? { cursor } : undefined,\r\n {\r\n timeout: timeoutMs,\r\n },\r\n );\r\n tools.push(...result.tools);\r\n cursor = result.nextCursor;\r\n } while (cursor);\r\n\r\n return tools;\r\n}\r\n\r\nfunction buildServerEnv(server: ResolvedMcpServerDefinition): Record<string, string> {\r\n const env = {\r\n ...server.env,\r\n };\r\n\r\n if (server.auth.type === \"token\" && server.auth.tokenEnv) {\r\n const tokenValue = process.env[server.auth.tokenEnv];\r\n if (tokenValue) {\r\n env[server.auth.tokenEnv] = tokenValue;\r\n }\r\n }\r\n\r\n return env;\r\n}\r\n\r\nfunction normalizeInstructions(instructions: string | undefined): string[] {\r\n const value = instructions?.trim();\r\n return value ? [value] : [];\r\n}\r\n\r\nfunction formatToolResult(result: Awaited<ReturnType<Client[\"callTool\"]>>): string {\r\n if (\"toolResult\" in result) {\r\n return JSON.stringify(result.toolResult, null, 2);\r\n }\r\n\r\n const contentParts = result.content.map((item) => {\r\n switch (item.type) {\r\n case \"text\":\r\n return item.text.trim();\r\n case \"image\":\r\n return `[image:${item.mimeType}; ${item.data.length} bytes]`;\r\n case \"audio\":\r\n return `[audio:${item.mimeType}; ${item.data.length} bytes]`;\r\n case \"resource\":\r\n return \"text\" in item.resource\r\n ? item.resource.text\r\n : `[resource:${item.resource.uri}; blob:${item.resource.mimeType ?? \"application/octet-stream\"}]`;\r\n case \"resource_link\":\r\n return `[resource-link:${item.uri}]`;\r\n default:\r\n return JSON.stringify(item);\r\n }\r\n }).filter(Boolean);\r\n\r\n if (result.structuredContent && Object.keys(result.structuredContent).length > 0) {\r\n contentParts.push(JSON.stringify(result.structuredContent, null, 2));\r\n }\r\n\r\n const output = contentParts.join(\"\\n\\n\").trim();\r\n return output || JSON.stringify(result, null, 2);\r\n}\r\n\r\nasync function ensureConfiguredDirectories(server: ResolvedMcpServerDefinition): Promise<void> {\r\n await ensurePlaywrightBrowserAvailableForServer(server);\r\n\r\n const userDataDir = readFlagValue(server.args, \"--user-data-dir\");\r\n if (userDataDir) {\r\n await fs.mkdir(userDataDir, { recursive: true });\r\n }\r\n\r\n const storageState = readFlagValue(server.args, \"--storage-state\");\r\n if (storageState) {\r\n await fs.mkdir(path.dirname(storageState), { recursive: true });\r\n }\r\n\r\n const outputDir = readFlagValue(server.args, \"--output-dir\");\r\n if (outputDir) {\r\n await fs.mkdir(outputDir, { recursive: true });\r\n }\r\n\r\n await preparePlaywrightRuntimeArtifacts(server);\r\n}\r\n\r\nfunction readFlagValue(args: string[], flagName: string): string {\r\n const index = args.indexOf(flagName);\r\n if (index < 0) {\r\n return \"\";\r\n }\r\n\r\n return String(args[index + 1] ?? \"\");\r\n}\r\n","import { StdioMcpClient } from \"./stdioClient.js\";\r\nimport type { McpClient, McpDiscoverySnapshot, ResolvedMcpServerDefinition } from \"./types.js\";\r\n\r\nexport class PlaceholderMcpClient implements McpClient {\r\n constructor(readonly server: ResolvedMcpServerDefinition) {}\r\n\r\n async discover(): Promise<McpDiscoverySnapshot> {\r\n return {\r\n server: this.server,\r\n status: \"not_implemented\",\r\n tools: [],\r\n instructions: [],\r\n diagnostics: [\r\n `MCP server \"${this.server.name}\" is configured, but real MCP transports are not connected yet.`,\r\n ],\r\n updatedAt: new Date().toISOString(),\r\n };\r\n }\r\n\r\n async close(): Promise<void> {\r\n return;\r\n }\r\n}\r\n\r\nexport function createMcpClient(server: ResolvedMcpServerDefinition): McpClient {\r\n if (server.transport === \"stdio\") {\r\n return new StdioMcpClient(server);\r\n }\r\n\r\n return new PlaceholderMcpClient(server);\r\n}\r\n","import { createMcpClient, PlaceholderMcpClient } from \"./client.js\";\r\nimport type { McpClient, McpDiscoverySnapshot, ResolvedMcpServerDefinition } from \"./types.js\";\r\n\r\nexport type McpClientFactory = (server: ResolvedMcpServerDefinition) => McpClient;\r\n\r\nexport interface DiscoveredMcpConnection {\r\n client: McpClient | null;\r\n snapshot: McpDiscoverySnapshot;\r\n}\r\n\r\nexport async function discoverMcpConnection(\r\n server: ResolvedMcpServerDefinition,\r\n clientFactory: McpClientFactory = createMcpClient,\r\n): Promise<DiscoveredMcpConnection> {\r\n if (!server.enabled) {\r\n return {\r\n client: null,\r\n snapshot: {\r\n server,\r\n status: \"disabled\",\r\n tools: [],\r\n instructions: [],\r\n diagnostics: [`MCP server \"${server.name}\" is disabled in config.`],\r\n updatedAt: new Date().toISOString(),\r\n },\r\n };\r\n }\r\n\r\n const client = clientFactory(server);\r\n try {\r\n return {\r\n client,\r\n snapshot: await client.discover(),\r\n };\r\n } catch (error) {\r\n await client.close().catch(() => undefined);\r\n return {\r\n client: null,\r\n snapshot: {\r\n server,\r\n status: \"error\",\r\n tools: [],\r\n instructions: [],\r\n diagnostics: [error instanceof Error ? error.message : String(error)],\r\n updatedAt: new Date().toISOString(),\r\n },\r\n };\r\n }\r\n}\r\n\r\nexport async function discoverMcpServers(\r\n servers: ResolvedMcpServerDefinition[],\r\n clientFactory: McpClientFactory = createMcpClient,\r\n): Promise<McpDiscoverySnapshot[]> {\r\n const discoveries: McpDiscoverySnapshot[] = [];\r\n const activeClients: McpClient[] = [];\r\n\r\n for (const server of servers) {\r\n const discovered = await discoverMcpConnection(server, clientFactory);\r\n discoveries.push(discovered.snapshot);\r\n if (discovered.client) {\r\n activeClients.push(discovered.client);\r\n }\r\n }\r\n\r\n for (const client of activeClients) {\r\n await client.close().catch(() => undefined);\r\n }\r\n\r\n return discoveries;\r\n}\r\n\r\nexport function createPlaceholderMcpClient(server: ResolvedMcpServerDefinition): McpClient {\r\n return new PlaceholderMcpClient(server);\r\n}\r\n\r\nexport async function closeMcpClients(clients: readonly McpClient[]): Promise<void> {\r\n for (const client of clients) {\r\n try {\r\n await client.close().catch(() => undefined);\r\n } catch {\r\n continue;\r\n }\r\n }\r\n}\r\n","import { resolveMcpServerDefinitions } from \"./config.js\";\r\nimport { createMcpClient } from \"./client.js\";\r\nimport { closeMcpClients, discoverMcpConnection, type McpClientFactory } from \"./discovery.js\";\r\nimport type { McpClient, McpConfig, McpDiscoverySnapshot, McpDiscoveredTool } from \"./types.js\";\r\n\r\nexport class McpClientManager {\r\n private snapshots: McpDiscoverySnapshot[] = [];\r\n private readonly activeClients = new Map<string, McpClient>();\r\n\r\n constructor(\r\n private readonly config: McpConfig,\r\n private readonly clientFactory: McpClientFactory = createMcpClient,\r\n ) {}\r\n\r\n async refresh(): Promise<McpDiscoverySnapshot[]> {\r\n if (!this.config.enabled) {\r\n await this.close();\r\n this.snapshots = [];\r\n return this.snapshots;\r\n }\r\n\r\n const servers = resolveMcpServerDefinitions(this.config);\r\n await this.close();\r\n\r\n const nextSnapshots: McpDiscoverySnapshot[] = [];\r\n for (const server of servers) {\r\n const discovered = await discoverMcpConnection(server, this.clientFactory);\r\n nextSnapshots.push(discovered.snapshot);\r\n if (discovered.client && discovered.snapshot.status === \"ready\") {\r\n this.activeClients.set(server.id, discovered.client);\r\n }\r\n }\r\n\r\n this.snapshots = nextSnapshots;\r\n return this.getSnapshots();\r\n }\r\n\r\n getSnapshots(): McpDiscoverySnapshot[] {\r\n return this.snapshots.map((snapshot) => ({\r\n ...snapshot,\r\n tools: [...snapshot.tools],\r\n instructions: [...snapshot.instructions],\r\n diagnostics: [...snapshot.diagnostics],\r\n }));\r\n }\r\n\r\n getDiscoveredTools(): McpDiscoveredTool[] {\r\n return this.snapshots.flatMap((snapshot) => snapshot.tools);\r\n }\r\n\r\n async close(): Promise<void> {\r\n await closeMcpClients([...this.activeClients.values()]);\r\n this.activeClients.clear();\r\n }\r\n}\r\n","import { parseArgs } from \"../tools/shared.js\";\r\nimport type { RegisteredTool } from \"../tools/types.js\";\r\nimport type { McpDiscoveredTool } from \"./types.js\";\r\n\r\nconst MAX_MCP_TOOL_NAME = 64;\r\n\r\nexport function adaptDiscoveredMcpTools(tools: readonly McpDiscoveredTool[]): RegisteredTool[] {\r\n return tools.map((tool) => ({\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: formatMcpToolName(tool.serverName, tool.name),\r\n description: buildToolDescription(tool),\r\n parameters: normalizeSchema(tool.inputSchema),\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const result = await tool.invoke(args, {\r\n signal: context.abortSignal,\r\n });\r\n\r\n return {\r\n ok: result.ok,\r\n output: result.output,\r\n };\r\n },\r\n }));\r\n}\r\n\r\nexport function formatMcpToolName(serverName: string, toolName: string): string {\r\n const normalized = `mcp_${serverName}_${toolName}`\r\n .replace(/[^a-zA-Z0-9_]/g, \"_\")\r\n .replace(/_+/g, \"_\")\r\n .replace(/^([^a-zA-Z_])/, \"_$1\");\r\n\r\n if (normalized.length <= MAX_MCP_TOOL_NAME) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, 32)}_${normalized.slice(-31)}`;\r\n}\r\n\r\nfunction buildToolDescription(tool: McpDiscoveredTool): string {\r\n const description = tool.description.trim();\r\n const suffix = `MCP server: ${tool.serverName}.`;\r\n if (tool.serverName === \"playwright\" && tool.name.startsWith(\"browser_\")) {\r\n const browserHint = \"Browser/webpage tool. Prefer this for web navigation, page reading, interaction, and screenshots before shell-based fetching.\";\r\n return [description, browserHint, suffix].filter(Boolean).join(\" \");\r\n }\r\n\r\n return description ? `${description} ${suffix}` : suffix;\r\n}\r\n\r\nfunction normalizeSchema(input: Record<string, unknown>): Record<string, unknown> {\r\n const schema = input && typeof input === \"object\" && !Array.isArray(input)\r\n ? structuredClone(input)\r\n : {};\r\n\r\n if (schema.type !== \"object\") {\r\n schema.type = \"object\";\r\n }\r\n\r\n if (!schema.properties || typeof schema.properties !== \"object\" || Array.isArray(schema.properties)) {\r\n schema.properties = {};\r\n }\r\n\r\n return schema;\r\n}\r\n","import { McpClientManager } from \"./clientManager.js\";\r\nimport { adaptDiscoveredMcpTools } from \"./toolAdapter.js\";\r\nimport type { McpConfig } from \"./types.js\";\r\nimport type { RegisteredTool } from \"../tools/types.js\";\r\n\r\nexport async function collectMcpRegisteredTools(\r\n config: McpConfig,\r\n manager = new McpClientManager(config),\r\n): Promise<RegisteredTool[]> {\r\n if (!config.enabled) {\r\n return [];\r\n }\r\n\r\n await manager.refresh();\r\n return adaptDiscoveredMcpTools(manager.getDiscoveredTools());\r\n}\r\n","import { McpClientManager } from \"../mcp/clientManager.js\";\r\nimport { collectMcpRegisteredTools } from \"../mcp/registryIntegration.js\";\r\nimport type { RuntimeConfig } from \"../types.js\";\r\nimport { createToolRegistry } from \"./registry.js\";\r\nimport type { RegisteredTool, ToolRegistry, ToolRegistryOptions } from \"./types.js\";\r\n\r\nexport interface RuntimeToolRegistryDependencies {\r\n manager?: McpClientManager;\r\n collectMcpTools?: (config: RuntimeConfig[\"mcp\"]) => Promise<RegisteredTool[]>;\r\n close?: () => Promise<void>;\r\n}\r\n\r\nexport async function createRuntimeToolRegistry(\r\n config: RuntimeConfig,\r\n options: ToolRegistryOptions = {},\r\n dependencies: RuntimeToolRegistryDependencies = {},\r\n): Promise<ToolRegistry> {\r\n const manager = dependencies.manager ?? new McpClientManager(config.mcp);\r\n const collectMcpTools =\r\n dependencies.collectMcpTools ??\r\n ((mcpConfig: RuntimeConfig[\"mcp\"]) => collectMcpRegisteredTools(mcpConfig, manager));\r\n const mcpTools = await collectMcpTools(config.mcp);\r\n const registry = createToolRegistry(config.mode, {\r\n ...options,\r\n includeTools: [...(options.includeTools ?? []), ...mcpTools],\r\n });\r\n\r\n return {\r\n ...registry,\r\n async close() {\r\n await registry.close?.();\r\n await dependencies.close?.();\r\n if (!dependencies.close || dependencies.manager) {\r\n await manager.close();\r\n }\r\n },\r\n };\r\n}\r\n","export { createToolRegistry } from \"./registry.js\";\r\nexport { createRuntimeToolRegistry } from \"./runtimeRegistry.js\";\r\nexport type {\r\n FunctionToolDefinition,\r\n RegisteredTool,\r\n ToolContext,\r\n ToolRegistry,\r\n ToolRegistryFactory,\r\n ToolRegistryOptions,\r\n} from \"./types.js\";\r\n","import type { ChangeStore } from \"../changes/store.js\";\r\nimport { ToolExecutionError } from \"../tools/errors.js\";\r\nimport { createToolRegistry } from \"../tools/index.js\";\r\nimport type { ProjectContext, ToolCallRecord, ToolExecutionResult } from \"../types.js\";\r\nimport type { RunTurnOptions } from \"./types.js\";\r\nimport { isAbortError } from \"../utils/abort.js\";\r\n\r\nexport async function executeToolCallWithRecovery(\r\n toolRegistry: ReturnType<typeof createToolRegistry>,\r\n toolCall: ToolCallRecord,\r\n options: RunTurnOptions,\r\n projectContext: ProjectContext,\r\n changeStore: ChangeStore,\r\n): Promise<ToolExecutionResult> {\r\n try {\r\n return await toolRegistry.execute(toolCall.function.name, toolCall.function.arguments, {\r\n config: options.config,\r\n cwd: options.cwd,\r\n sessionId: options.session.id,\r\n identity: options.identity ?? {\r\n kind: \"lead\",\r\n name: \"lead\",\r\n },\r\n callbacks: options.callbacks,\r\n abortSignal: options.abortSignal,\r\n projectContext,\r\n changeStore,\r\n createToolRegistry,\r\n });\r\n } catch (error) {\r\n if (isAbortError(error)) {\r\n throw error;\r\n }\r\n\r\n const message = error instanceof Error ? error.message : String(error);\r\n const payload: Record<string, unknown> = {\r\n ok: false,\r\n error: message,\r\n hint: buildToolRecoveryHint(toolCall.function.name, message),\r\n next_step:\r\n \"Use the error to retry with a safer path, inspect directory structure first, or skip unreadable files.\",\r\n };\r\n\r\n if (error instanceof ToolExecutionError) {\r\n payload.code = error.code;\r\n if (error.details) {\r\n payload.details = error.details;\r\n }\r\n }\r\n\r\n return {\r\n ok: false,\r\n output: JSON.stringify(payload, null, 2),\r\n };\r\n }\r\n}\r\n\r\nfunction buildToolRecoveryHint(toolName: string, message: string): string {\r\n const lower = message.toLowerCase();\r\n\r\n if (lower.includes(\"enoent\") || lower.includes(\"no such file\") || lower.includes(\"file not found\")) {\r\n return `The path used by ${toolName} does not exist. Use list_files or search_files, inspect suggestions, and retry with the exact path.`;\r\n }\r\n\r\n if (lower.includes(\"unsupported binary\") || lower.includes(\"binary file detected\")) {\r\n return `The target is not a readable text file. Skip raw content reading and reason from metadata, filenames, or other text files instead.`;\r\n }\r\n\r\n if (lower.includes(\"spreadsheet\")) {\r\n return \"The target looks like a spreadsheet. Use read_spreadsheet instead of read_file, then continue from the structured preview.\";\r\n }\r\n\r\n if (lower.includes(\".docx\") || lower.includes(\"word .docx\")) {\r\n return \"The target is a .docx Word document. Use mineru_doc_read first. If MinerU is unavailable for that file, fall back to read_docx.\";\r\n }\r\n\r\n if (lower.includes(\".pdf\") || lower.includes(\"pdf\")) {\r\n return \"The target is a PDF document. Use mineru_pdf_read instead of read_file so the MinerU-backed extraction path can produce Markdown output.\";\r\n }\r\n\r\n if (lower.includes(\".png\") || lower.includes(\".jpg\") || lower.includes(\".jpeg\") || lower.includes(\".jp2\") || lower.includes(\".webp\") || lower.includes(\".gif\") || lower.includes(\".bmp\") || lower.includes(\"image\")) {\r\n return \"The target is an image document. Use mineru_image_read so MinerU can extract structured Markdown output.\";\r\n }\r\n\r\n if (lower.includes(\".ppt\") || lower.includes(\".pptx\") || lower.includes(\"presentation\") || lower.includes(\"deck\")) {\r\n return \"The target is a presentation document. Use mineru_ppt_read so MinerU can extract the deck into Markdown artifacts.\";\r\n }\r\n\r\n if (lower.includes(\"legacy word\") || lower.includes(\".doc files\") || lower.includes(\".doc\")) {\r\n return \"The target is a Word document. Use mineru_doc_read so MinerU can parse .doc or .docx content.\";\r\n }\r\n\r\n if (lower.includes(\"path not allowed\")) {\r\n return \"The target path is outside allowedRoots. Try a path inside the current project or ask the user to widen access.\";\r\n }\r\n\r\n if (lower.includes(\"unknown tool\")) {\r\n return `The ${toolName} tool is unavailable in the current mode. Use the tools exposed now, or switch to agent mode if you need editing or shell access.`;\r\n }\r\n\r\n if (lower.includes(\"invalid tool arguments\")) {\r\n return `The arguments for ${toolName} were malformed. Re-read the tool schema and retry with valid JSON arguments.`;\r\n }\r\n\r\n if (lower.includes(\"failed to apply patch\")) {\r\n return \"The patch did not match the current file contents. Read the file again and generate a smaller, more accurate patch.\";\r\n }\r\n\r\n return `The ${toolName} tool failed. Inspect the error, verify assumptions, and retry using a narrower and safer operation.`;\r\n}\r\n","import type {\r\n LoadedSkill,\r\n SkillMatchReason,\r\n SkillSelectionInput,\r\n SkillSelectionResult,\r\n} from \"./types.js\";\r\n\r\nexport function selectSkillsForTurn(input: SkillSelectionInput): SkillSelectionResult {\r\n const availableToolNames = new Set(input.availableToolNames.map((name) => name.toLowerCase()));\r\n const loadedSkillNames = input.loadedSkillNames ?? new Set<string>();\r\n const combinedText = normalizeText([input.input, input.objective, input.taskSummary]);\r\n const taskText = normalizeText([input.objective, input.taskSummary]);\r\n\r\n const matches = input.skills.map((skill) => {\r\n const blockedBy: SkillSelectionResult[\"matches\"][number][\"blockedBy\"] = [];\r\n const matchedBy: SkillMatchReason[] = [];\r\n const named = combinedText.includes(skill.name.toLowerCase());\r\n const loaded = loadedSkillNames.has(skill.name);\r\n\r\n if (skill.agentKinds.length > 0 && !skill.agentKinds.includes(input.identity.kind)) {\r\n blockedBy.push(\"agent_kind\");\r\n }\r\n\r\n if (\r\n skill.roles.length > 0 &&\r\n (!input.identity.role || !skill.roles.includes(input.identity.role.toLowerCase()))\r\n ) {\r\n blockedBy.push(\"role\");\r\n }\r\n\r\n if (!hasAllTools(availableToolNames, skill.tools.required)) {\r\n blockedBy.push(\"required_tools\");\r\n }\r\n\r\n if (hasAnyTools(availableToolNames, skill.tools.incompatible)) {\r\n blockedBy.push(\"incompatible_tools\");\r\n }\r\n\r\n const taskMatched = matchesAny(taskText, skill.taskTypes);\r\n if (skill.taskTypes.length > 0) {\r\n if (taskMatched) {\r\n matchedBy.push(\"task_type\");\r\n } else {\r\n blockedBy.push(\"task_type\");\r\n }\r\n }\r\n\r\n const sceneMatched = matchesAny(combinedText, skill.scenes);\r\n if (skill.scenes.length > 0) {\r\n if (sceneMatched) {\r\n matchedBy.push(\"scene\");\r\n } else {\r\n blockedBy.push(\"scene\");\r\n }\r\n }\r\n\r\n const triggerMatched = matchesTriggers(combinedText, skill);\r\n if (skill.triggers.keywords.length > 0 || skill.triggers.patterns.length > 0) {\r\n if (triggerMatched) {\r\n matchedBy.push(\"trigger\");\r\n } else if (!named) {\r\n blockedBy.push(\"trigger\");\r\n }\r\n }\r\n\r\n if (named) {\r\n matchedBy.push(\"name\");\r\n } else if (matchedBy.length === 0) {\r\n matchedBy.push(\"default\");\r\n }\r\n\r\n return {\r\n skill,\r\n applicable: blockedBy.length === 0 && skill.loadMode !== \"manual\",\r\n named,\r\n loaded,\r\n blockedBy: uniqueList(blockedBy),\r\n matchedBy: uniqueList(matchedBy),\r\n };\r\n });\r\n\r\n const namedSkills = matches\r\n .filter((match) => match.named && match.blockedBy.length === 0)\r\n .map((match) => match.skill);\r\n const applicableSkills = matches.filter((match) => match.applicable).map((match) => match.skill);\r\n const suggestedSkills = applicableSkills.filter((skill) => skill.loadMode === \"suggested\");\r\n const requiredSkills = applicableSkills.filter((skill) => skill.loadMode === \"required\");\r\n const loadedSkills = matches.filter((match) => match.loaded).map((match) => match.skill);\r\n const missingRequiredSkills = requiredSkills.filter((skill) => !loadedSkillNames.has(skill.name));\r\n\r\n return {\r\n matches,\r\n namedSkills,\r\n applicableSkills,\r\n suggestedSkills,\r\n requiredSkills,\r\n missingRequiredSkills,\r\n loadedSkills,\r\n };\r\n}\r\n\r\nfunction normalizeText(values: Array<string | undefined>): string {\r\n return values\r\n .filter((value): value is string => typeof value === \"string\" && value.trim().length > 0)\r\n .join(\"\\n\")\r\n .toLowerCase();\r\n}\r\n\r\nfunction hasAllTools(availableToolNames: Set<string>, requiredTools: string[]): boolean {\r\n return requiredTools.every((tool) => availableToolNames.has(tool));\r\n}\r\n\r\nfunction hasAnyTools(availableToolNames: Set<string>, tools: string[]): boolean {\r\n return tools.some((tool) => availableToolNames.has(tool));\r\n}\r\n\r\nfunction matchesAny(text: string, values: string[]): boolean {\r\n return values.some((value) => value && text.includes(value));\r\n}\r\n\r\nfunction matchesTriggers(text: string, skill: LoadedSkill): boolean {\r\n if (matchesAny(text, skill.triggers.keywords)) {\r\n return true;\r\n }\r\n\r\n return skill.triggers.patterns.some((pattern) => {\r\n try {\r\n return new RegExp(pattern, \"i\").test(text);\r\n } catch {\r\n return false;\r\n }\r\n });\r\n}\r\n\r\nfunction uniqueList<T>(values: T[]): T[] {\r\n return [...new Set(values)];\r\n}\r\n","import { isInternalMessage } from \"../agent/taskState.js\";\r\nimport type { SessionRecord, StoredMessage, ToolExecutionResult } from \"../types.js\";\r\nimport { selectSkillsForTurn } from \"./matching.js\";\r\nimport { readLoadedSkillName } from \"./loading.js\";\r\nimport type { LoadedSkill, SkillIdentity, SkillRuntimeState } from \"./types.js\";\r\n\r\nexport function buildSkillRuntimeState(options: {\r\n skills: LoadedSkill[];\r\n session: Pick<SessionRecord, \"messages\" | \"taskState\">;\r\n input?: string;\r\n identity: SkillIdentity;\r\n objective?: string;\r\n taskSummary?: string;\r\n availableToolNames: string[];\r\n}): SkillRuntimeState {\r\n const loadedSkillNames = getLoadedSkillNames(options.session.messages);\r\n const selection = selectSkillsForTurn({\r\n skills: options.skills,\r\n input: options.input ?? findLatestUserText(options.session.messages),\r\n identity: options.identity,\r\n objective: options.objective ?? options.session.taskState?.objective,\r\n taskSummary: options.taskSummary,\r\n availableToolNames: options.availableToolNames,\r\n loadedSkillNames,\r\n });\r\n\r\n return {\r\n ...selection,\r\n loadedSkillNames,\r\n };\r\n}\r\n\r\nexport function getSkillToolGateResult(\r\n toolName: string,\r\n runtimeState: SkillRuntimeState,\r\n): ToolExecutionResult | null {\r\n if (toolName === \"load_skill\" || runtimeState.missingRequiredSkills.length === 0) {\r\n return null;\r\n }\r\n\r\n const missingNames = runtimeState.missingRequiredSkills.map((skill) => skill.name);\r\n return {\r\n ok: false,\r\n output: JSON.stringify(\r\n {\r\n ok: false,\r\n error: \"Required skill(s) not loaded.\",\r\n code: \"SKILL_REQUIRED\",\r\n missing: missingNames,\r\n hint: `Call load_skill for: ${missingNames.join(\", \")}`,\r\n suggestedTool: \"load_skill\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n };\r\n}\r\n\r\nexport function getLoadedSkillNames(messages: StoredMessage[]): Set<string> {\r\n const loaded = new Set<string>();\r\n\r\n for (const message of messages) {\r\n if (message?.role !== \"tool\" || message.name !== \"load_skill\") {\r\n continue;\r\n }\r\n\r\n const loadedName = readLoadedSkillName(message.content);\r\n if (loadedName) {\r\n loaded.add(loadedName);\r\n }\r\n }\r\n\r\n return loaded;\r\n}\r\n\r\nexport function formatMissingRequiredSkillReminder(runtimeState: SkillRuntimeState): string {\r\n return runtimeState.missingRequiredSkills.map((skill) => skill.name).join(\", \");\r\n}\r\n\r\nfunction findLatestUserText(messages: StoredMessage[]): string {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const message = messages[index];\r\n if (message?.role !== \"user\" || !message.content || isInternalMessage(message.content)) {\r\n continue;\r\n }\r\n\r\n return message.content;\r\n }\r\n\r\n return \"\";\r\n}\r\n","import { handleCompletedAssistantResponse } from \"./finalize.js\";\r\nimport { createMessage } from \"./messages.js\";\r\nimport { createInternalReminder } from \"./taskState.js\";\r\nimport { formatMissingRequiredSkillReminder } from \"../skills/state.js\";\r\nimport type { SkillRuntimeState } from \"../types.js\";\r\nimport type { AgentIdentity, AssistantResponse, RunTurnOptions, RunTurnResult } from \"./types.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\n\r\ninterface ResolveToollessTurnParams {\r\n session: SessionRecord;\r\n response: AssistantResponse;\r\n identity: AgentIdentity;\r\n changedPaths: Set<string>;\r\n hadIncompleteTodosAtStart: boolean;\r\n hasSubstantiveToolActivity: boolean;\r\n validationReminderInjected: boolean;\r\n skillRuntimeState: SkillRuntimeState;\r\n options: RunTurnOptions;\r\n}\r\n\r\nexport async function resolveToollessTurn(\r\n params: ResolveToollessTurnParams,\r\n): Promise<\r\n | {\r\n kind: \"continue\";\r\n session: SessionRecord;\r\n validationReminderInjected: boolean;\r\n }\r\n | {\r\n kind: \"return\";\r\n result: RunTurnResult;\r\n }\r\n> {\r\n if (params.skillRuntimeState.missingRequiredSkills.length > 0) {\r\n const missingSkillNames = formatMissingRequiredSkillReminder(params.skillRuntimeState);\r\n const session = await params.options.sessionStore.appendMessages(params.session, [\r\n createMessage(\"assistant\", params.response.content ?? \"\", {\r\n reasoningContent: params.response.reasoningContent,\r\n }),\r\n createMessage(\r\n \"user\",\r\n createInternalReminder(\r\n `Required skill(s) not loaded: ${missingSkillNames}. ` +\r\n \"Use load_skill for the missing skills before continuing.\",\r\n ),\r\n ),\r\n ]);\r\n params.options.callbacks?.onStatus?.(\"Required skill missing. Asking the model to load it...\");\r\n return {\r\n kind: \"continue\",\r\n session,\r\n validationReminderInjected: params.validationReminderInjected,\r\n };\r\n }\r\n\r\n return handleCompletedAssistantResponse({\r\n session: params.session,\r\n response: params.response,\r\n identity: params.identity,\r\n changedPaths: params.changedPaths,\r\n hadIncompleteTodosAtStart: params.hadIncompleteTodosAtStart,\r\n hasSubstantiveToolActivity: params.hasSubstantiveToolActivity,\r\n verificationState: params.session.verificationState,\r\n validationReminderInjected: params.validationReminderInjected,\r\n options: params.options,\r\n });\r\n}\r\n","import type { PromptLayers } from \"./promptSections.js\";\r\nimport type { AgentCallbacks } from \"./types.js\";\r\nimport type { SessionCheckpoint } from \"../types.js\";\r\n\r\nexport function extendPromptLayersForTurnState(\r\n promptLayers: PromptLayers,\r\n checkpoint: SessionCheckpoint | undefined,\r\n iteration: number,\r\n softToolLimit: number,\r\n consecutiveRequestFailures: number,\r\n): PromptLayers {\r\n const nextDynamicBlocks = [...promptLayers.dynamicBlocks];\r\n const shouldShowTurnState = iteration > 0 || consecutiveRequestFailures > 0 || Boolean(checkpoint);\r\n\r\n if (shouldShowTurnState) {\r\n const phase = checkpoint?.flow?.phase ?? \"active\";\r\n const reason = checkpoint?.flow?.reason ? ` (${checkpoint.flow.reason})` : \"\";\r\n nextDynamicBlocks.push(\r\n [\r\n \"Turn execution state:\",\r\n `- Tool steps completed in this request: ${iteration}/${softToolLimit}`,\r\n `- Checkpoint phase: ${phase}${reason}`,\r\n `- Provider retry count in this request: ${consecutiveRequestFailures}`,\r\n \"- Use the session checkpoint block above as the source of truth for resumed progress.\",\r\n ].join(\"\\n\"),\r\n );\r\n }\r\n\r\n return {\r\n ...promptLayers,\r\n dynamicBlocks: nextDynamicBlocks,\r\n };\r\n}\r\n\r\nexport function emitTurnProgressStatus(\r\n callbacks: AgentCallbacks | undefined,\r\n iteration: number,\r\n softToolLimit: number,\r\n continuationWindow: number,\r\n): void {\r\n if (iteration <= 0) {\r\n return;\r\n }\r\n\r\n if (iteration % continuationWindow === 0) {\r\n callbacks?.onStatus?.(\r\n `Reached ${iteration} tool steps. Auto-continuing into another continuation window...`,\r\n );\r\n return;\r\n }\r\n\r\n if (iteration % softToolLimit === 0) {\r\n callbacks?.onStatus?.(\r\n `Reached ${iteration} tool steps. Continuing automatically with compressed context...`,\r\n );\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { execa } from \"execa\";\r\n\r\nexport interface ProjectRoots {\r\n rootDir: string;\r\n stateRootDir: string;\r\n}\r\n\r\nexport async function resolveProjectRoots(startDir: string): Promise<ProjectRoots> {\r\n const rootDir = await findExecutionRoot(startDir);\r\n const stateRootDir = await findStateRoot(rootDir);\r\n\r\n return {\r\n rootDir,\r\n stateRootDir,\r\n };\r\n}\r\n\r\nasync function findExecutionRoot(startDir: string): Promise<string> {\r\n let currentDir = path.resolve(startDir);\r\n const fsRoot = path.parse(currentDir).root;\r\n\r\n while (true) {\r\n try {\r\n await fs.access(path.join(currentDir, \".git\"));\r\n return currentDir;\r\n } catch {\r\n if (currentDir === fsRoot) {\r\n return path.resolve(startDir);\r\n }\r\n\r\n currentDir = path.dirname(currentDir);\r\n }\r\n }\r\n}\r\n\r\nasync function findStateRoot(executionRoot: string): Promise<string> {\r\n try {\r\n const result = await execa(\r\n \"git\",\r\n [\"-C\", executionRoot, \"rev-parse\", \"--path-format=absolute\", \"--git-common-dir\"],\r\n {\r\n reject: true,\r\n timeout: 10_000,\r\n windowsHide: true,\r\n },\r\n );\r\n\r\n const commonGitDir = result.stdout.trim();\r\n if (!commonGitDir) {\r\n return executionRoot;\r\n }\r\n\r\n const normalizedCommonDir = path.resolve(commonGitDir);\r\n if (path.basename(normalizedCommonDir).toLowerCase() === \".git\") {\r\n return path.dirname(normalizedCommonDir);\r\n }\r\n\r\n return executionRoot;\r\n } catch {\r\n return executionRoot;\r\n }\r\n}\r\n","export const SKILL_SCHEMA_VERSION = \"skill.v1\";\r\nexport const SKILL_LOAD_MODES = [\"manual\", \"suggested\", \"required\"] as const;\r\nexport const SKILL_AGENT_KINDS = [\"lead\", \"teammate\", \"subagent\"] as const;\r\n\r\nexport type SkillSchemaVersion = typeof SKILL_SCHEMA_VERSION;\r\nexport type SkillLoadMode = (typeof SKILL_LOAD_MODES)[number];\r\nexport type SkillAgentKind = (typeof SKILL_AGENT_KINDS)[number];\r\n\r\nexport interface SkillTriggerSet {\r\n keywords: string[];\r\n patterns: string[];\r\n}\r\n\r\nexport interface SkillToolConstraints {\r\n required: string[];\r\n optional: string[];\r\n incompatible: string[];\r\n}\r\n\r\nexport interface LoadedSkill {\r\n schemaVersion: SkillSchemaVersion;\r\n version: string;\r\n name: string;\r\n description: string;\r\n path: string;\r\n absolutePath: string;\r\n body: string;\r\n loadMode: SkillLoadMode;\r\n agentKinds: SkillAgentKind[];\r\n roles: string[];\r\n taskTypes: string[];\r\n scenes: string[];\r\n triggers: SkillTriggerSet;\r\n tools: SkillToolConstraints;\r\n}\r\n\r\nexport interface SkillIdentity {\r\n kind: SkillAgentKind;\r\n name: string;\r\n role?: string;\r\n teamName?: string;\r\n}\r\n\r\nexport type SkillMatchBlockReason =\r\n | \"agent_kind\"\r\n | \"role\"\r\n | \"task_type\"\r\n | \"scene\"\r\n | \"required_tools\"\r\n | \"incompatible_tools\"\r\n | \"trigger\";\r\n\r\nexport type SkillMatchReason = \"name\" | \"task_type\" | \"scene\" | \"trigger\" | \"default\";\r\n\r\nexport interface SkillMatchResult {\r\n skill: LoadedSkill;\r\n applicable: boolean;\r\n named: boolean;\r\n loaded: boolean;\r\n blockedBy: SkillMatchBlockReason[];\r\n matchedBy: SkillMatchReason[];\r\n}\r\n\r\nexport interface SkillSelectionInput {\r\n skills: LoadedSkill[];\r\n input?: string;\r\n identity: SkillIdentity;\r\n objective?: string;\r\n taskSummary?: string;\r\n availableToolNames: string[];\r\n loadedSkillNames?: ReadonlySet<string>;\r\n}\r\n\r\nexport interface SkillSelectionResult {\r\n matches: SkillMatchResult[];\r\n namedSkills: LoadedSkill[];\r\n applicableSkills: LoadedSkill[];\r\n suggestedSkills: LoadedSkill[];\r\n requiredSkills: LoadedSkill[];\r\n missingRequiredSkills: LoadedSkill[];\r\n loadedSkills: LoadedSkill[];\r\n}\r\n\r\nexport type SkillSummary = Omit<LoadedSkill, \"absolutePath\" | \"body\">;\r\n\r\nexport interface LoadedSkillPayload {\r\n ok: true;\r\n skill: SkillSummary;\r\n body: string;\r\n}\r\n\r\nexport interface SkillRuntimeState extends SkillSelectionResult {\r\n loadedSkillNames: Set<string>;\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport {\r\n SKILL_AGENT_KINDS,\r\n SKILL_LOAD_MODES,\r\n SKILL_SCHEMA_VERSION,\r\n} from \"./types.js\";\r\nimport type {\r\n LoadedSkill,\r\n SkillAgentKind,\r\n SkillLoadMode,\r\n SkillToolConstraints,\r\n SkillTriggerSet,\r\n} from \"./types.js\";\r\n\r\nconst FRONTMATTER_PATTERN = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/;\r\n\r\nexport class SkillSchemaError extends Error {\r\n constructor(\r\n message: string,\r\n readonly filePath: string,\r\n ) {\r\n super(`${message} (${filePath})`);\r\n this.name = \"SkillSchemaError\";\r\n }\r\n}\r\n\r\nexport function parseSkillSource(\r\n text: string,\r\n options: {\r\n absolutePath: string;\r\n rootDir: string;\r\n },\r\n): LoadedSkill {\r\n const normalized = text.replace(/^\\uFEFF/, \"\");\r\n const match = normalized.match(FRONTMATTER_PATTERN);\r\n const frontmatter = match?.[1] ?? \"\";\r\n const body = (match?.[2] ?? normalized).trim();\r\n const metadata = parseSimpleFrontmatter(frontmatter);\r\n const hasFrontmatter = frontmatter.trim().length > 0;\r\n const name = readSkillName(metadata, options.absolutePath, hasFrontmatter, options.rootDir);\r\n const description = readSkillDescription(metadata, body, options.absolutePath);\r\n const schemaVersion = readSchemaVersion(metadata, options.absolutePath);\r\n const loadMode = readLoadMode(metadata, options.absolutePath);\r\n const agentKinds = readAgentKinds(metadata, options.absolutePath);\r\n const roles = readNormalizedList(metadata.roles);\r\n const taskTypes = readNormalizedList(metadata.task_types);\r\n const scenes = readNormalizedList(metadata.scenes);\r\n const triggers = readTriggers(metadata, options.absolutePath);\r\n const tools = readToolConstraints(metadata);\r\n const version = readVersion(metadata.version);\r\n\r\n validateToolConstraints(tools, options.absolutePath);\r\n\r\n return {\r\n schemaVersion,\r\n version,\r\n name,\r\n description,\r\n path: path.relative(options.rootDir, options.absolutePath) || \"SKILL.md\",\r\n absolutePath: options.absolutePath,\r\n body,\r\n loadMode,\r\n agentKinds,\r\n roles,\r\n taskTypes,\r\n scenes,\r\n triggers,\r\n tools,\r\n };\r\n}\r\n\r\nfunction parseSimpleFrontmatter(frontmatter: string): Record<string, string> {\r\n const result: Record<string, string> = {};\r\n\r\n for (const line of frontmatter.split(/\\r?\\n/)) {\r\n const separatorIndex = line.indexOf(\":\");\r\n if (separatorIndex <= 0) {\r\n continue;\r\n }\r\n\r\n const key = line.slice(0, separatorIndex).trim().toLowerCase();\r\n const value = line.slice(separatorIndex + 1).trim();\r\n if (!key) {\r\n continue;\r\n }\r\n\r\n result[key] = value.replace(/^['\"]|['\"]$/g, \"\");\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction readSkillName(\r\n metadata: Record<string, string>,\r\n absolutePath: string,\r\n hasFrontmatter: boolean,\r\n rootDir: string,\r\n): string {\r\n const name = metadata.name?.trim();\r\n if (name) {\r\n return name;\r\n }\r\n\r\n if (hasFrontmatter) {\r\n throw new SkillSchemaError('Skill metadata field \"name\" is required.', absolutePath);\r\n }\r\n\r\n const relativeDir = path.relative(rootDir, path.dirname(absolutePath));\r\n const fallback = relativeDir && relativeDir !== \".\" ? path.basename(relativeDir) : path.basename(rootDir);\r\n if (fallback) {\r\n return fallback;\r\n }\r\n\r\n throw new SkillSchemaError('Unable to infer skill \"name\".', absolutePath);\r\n}\r\n\r\nfunction readSkillDescription(\r\n metadata: Record<string, string>,\r\n body: string,\r\n absolutePath: string,\r\n): string {\r\n const description = metadata.description?.trim() || inferDescription(body);\r\n if (description) {\r\n return description;\r\n }\r\n\r\n throw new SkillSchemaError('Skill metadata field \"description\" is required.', absolutePath);\r\n}\r\n\r\nfunction readSchemaVersion(metadata: Record<string, string>, absolutePath: string): typeof SKILL_SCHEMA_VERSION {\r\n const raw = metadata.schema_version?.trim();\r\n if (!raw || raw === SKILL_SCHEMA_VERSION) {\r\n return SKILL_SCHEMA_VERSION;\r\n }\r\n\r\n throw new SkillSchemaError(\r\n `Unsupported skill schema_version \"${raw}\". Expected \"${SKILL_SCHEMA_VERSION}\".`,\r\n absolutePath,\r\n );\r\n}\r\n\r\nfunction readLoadMode(metadata: Record<string, string>, absolutePath: string): SkillLoadMode {\r\n const raw = metadata.load_mode?.trim().toLowerCase();\r\n if (raw) {\r\n if ((SKILL_LOAD_MODES as readonly string[]).includes(raw)) {\r\n return raw as SkillLoadMode;\r\n }\r\n\r\n throw new SkillSchemaError(`Invalid skill load_mode \"${raw}\".`, absolutePath);\r\n }\r\n\r\n if (parseBoolean(metadata.required)) {\r\n return \"required\";\r\n }\r\n\r\n const hasTargetingMetadata = [\r\n metadata.trigger_keywords,\r\n metadata.trigger_patterns,\r\n metadata.triggers,\r\n metadata.trigger,\r\n metadata.task_types,\r\n metadata.scenes,\r\n metadata.agent_kinds,\r\n metadata.identity_kinds,\r\n metadata.roles,\r\n ].some((value) => typeof value === \"string\" && value.trim().length > 0);\r\n\r\n return hasTargetingMetadata ? \"suggested\" : \"manual\";\r\n}\r\n\r\nfunction readVersion(raw: string | undefined): string {\r\n const normalized = raw?.trim();\r\n return normalized && normalized.length > 0 ? normalized : \"1.0.0\";\r\n}\r\n\r\nfunction readAgentKinds(metadata: Record<string, string>, absolutePath: string): SkillAgentKind[] {\r\n const values = readNormalizedList(metadata.agent_kinds || metadata.identity_kinds);\r\n const invalid = values.find(\r\n (value) => !(SKILL_AGENT_KINDS as readonly string[]).includes(value),\r\n );\r\n if (invalid) {\r\n throw new SkillSchemaError(`Invalid skill agent_kinds value \"${invalid}\".`, absolutePath);\r\n }\r\n\r\n return values as SkillAgentKind[];\r\n}\r\n\r\nfunction readTriggers(metadata: Record<string, string>, absolutePath: string): SkillTriggerSet {\r\n const keywords = readNormalizedList(\r\n metadata.trigger_keywords || metadata.triggers || metadata.trigger,\r\n );\r\n const patterns = readStringList(metadata.trigger_patterns);\r\n\r\n for (const pattern of patterns) {\r\n try {\r\n new RegExp(pattern, \"i\");\r\n } catch {\r\n throw new SkillSchemaError(`Invalid trigger_patterns entry \"${pattern}\".`, absolutePath);\r\n }\r\n }\r\n\r\n return {\r\n keywords,\r\n patterns,\r\n };\r\n}\r\n\r\nfunction readToolConstraints(metadata: Record<string, string>): SkillToolConstraints {\r\n return {\r\n required: readNormalizedList(metadata.required_tools),\r\n optional: readNormalizedList(metadata.optional_tools),\r\n incompatible: readNormalizedList(metadata.incompatible_tools),\r\n };\r\n}\r\n\r\nfunction validateToolConstraints(tools: SkillToolConstraints, absolutePath: string): void {\r\n const overlaps = [\r\n { left: \"required_tools\", right: \"optional_tools\", values: intersect(tools.required, tools.optional) },\r\n { left: \"required_tools\", right: \"incompatible_tools\", values: intersect(tools.required, tools.incompatible) },\r\n { left: \"optional_tools\", right: \"incompatible_tools\", values: intersect(tools.optional, tools.incompatible) },\r\n ];\r\n\r\n for (const overlap of overlaps) {\r\n if (overlap.values.length === 0) {\r\n continue;\r\n }\r\n\r\n throw new SkillSchemaError(\r\n `Skill metadata fields ${overlap.left} and ${overlap.right} cannot overlap: ${overlap.values.join(\", \")}`,\r\n absolutePath,\r\n );\r\n }\r\n}\r\n\r\nfunction readStringList(raw: string | undefined): string[] {\r\n if (!raw) {\r\n return [];\r\n }\r\n\r\n const trimmed = raw.trim();\r\n if (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\")) {\r\n try {\r\n const parsed = JSON.parse(trimmed) as unknown;\r\n if (Array.isArray(parsed)) {\r\n return parsed\r\n .filter((item): item is string => typeof item === \"string\")\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n }\r\n } catch {\r\n return [];\r\n }\r\n }\r\n\r\n return trimmed\r\n .split(/[,|]/)\r\n .map((item) => item.trim())\r\n .filter(Boolean);\r\n}\r\n\r\nfunction readNormalizedList(raw: string | undefined): string[] {\r\n return uniqueList(readStringList(raw).map((item) => item.toLowerCase()));\r\n}\r\n\r\nfunction parseBoolean(raw: string | undefined): boolean {\r\n if (!raw) {\r\n return false;\r\n }\r\n\r\n const normalized = raw.trim().toLowerCase();\r\n return normalized === \"true\" || normalized === \"1\" || normalized === \"yes\";\r\n}\r\n\r\nfunction inferDescription(body: string): string {\r\n const firstContentLine = body\r\n .split(/\\r?\\n/)\r\n .map((line) => line.trim())\r\n .find((line) => line.length > 0 && !line.startsWith(\"#\"));\r\n\r\n return firstContentLine?.slice(0, 160) ?? \"\";\r\n}\r\n\r\nfunction intersect(left: string[], right: string[]): string[] {\r\n const rightSet = new Set(right);\r\n return left.filter((value) => rightSet.has(value));\r\n}\r\n\r\nfunction uniqueList(values: string[]): string[] {\r\n return [...new Set(values)];\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport fg from \"fast-glob\";\r\n\r\nimport type { LoadedSkill, ProjectIgnoreRule } from \"../types.js\";\r\nimport { isPathIgnored } from \"../utils/ignore.js\";\r\nimport { parseSkillSource } from \"./schema.js\";\r\n\r\nexport async function discoverSkills(\r\n rootDir: string,\r\n cwd: string,\r\n ignoreRules: ProjectIgnoreRule[],\r\n): Promise<LoadedSkill[]> {\r\n const candidateRoots = uniquePaths([\r\n path.join(rootDir, \".skills\"),\r\n path.join(rootDir, \"skills\"),\r\n path.join(cwd, \".skills\"),\r\n path.join(cwd, \"skills\"),\r\n ]);\r\n const standaloneSkillFiles = uniquePaths([\r\n path.join(rootDir, \"SKILL.md\"),\r\n path.join(cwd, \"SKILL.md\"),\r\n ]);\r\n const discovered: LoadedSkill[] = [];\r\n const seenPaths = new Set<string>();\r\n const seenNames = new Map<string, string>();\r\n\r\n for (const skillFile of standaloneSkillFiles) {\r\n await collectSkill(skillFile, rootDir, ignoreRules, seenPaths, seenNames, discovered);\r\n }\r\n\r\n for (const skillRoot of candidateRoots) {\r\n if (!(await isDirectory(skillRoot))) {\r\n continue;\r\n }\r\n\r\n const skillFiles = await fg(\"**/SKILL.md\", {\r\n cwd: skillRoot,\r\n absolute: true,\r\n dot: true,\r\n onlyFiles: true,\r\n suppressErrors: true,\r\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/dist/**\"],\r\n });\r\n\r\n for (const skillFile of skillFiles.sort((left, right) => left.localeCompare(right))) {\r\n await collectSkill(skillFile, rootDir, ignoreRules, seenPaths, seenNames, discovered);\r\n }\r\n }\r\n\r\n return discovered.sort((left, right) => left.name.localeCompare(right.name));\r\n}\r\n\r\nexport async function loadSkillBody(skill: LoadedSkill): Promise<string> {\r\n return skill.body;\r\n}\r\n\r\nasync function collectSkill(\r\n skillFile: string,\r\n rootDir: string,\r\n ignoreRules: ProjectIgnoreRule[],\r\n seenPaths: Set<string>,\r\n seenNames: Map<string, string>,\r\n discovered: LoadedSkill[],\r\n): Promise<void> {\r\n const normalizedPath = path.normalize(skillFile);\r\n if (seenPaths.has(normalizedPath)) {\r\n return;\r\n }\r\n\r\n seenPaths.add(normalizedPath);\r\n if (!(await isRegularFile(skillFile)) || isPathIgnored(skillFile, ignoreRules)) {\r\n return;\r\n }\r\n\r\n const parsed = parseSkillSource(await fs.readFile(skillFile, \"utf8\"), {\r\n absolutePath: skillFile,\r\n rootDir,\r\n });\r\n const existingPath = seenNames.get(parsed.name);\r\n if (existingPath && existingPath !== parsed.absolutePath) {\r\n throw new Error(\r\n `Duplicate skill name \"${parsed.name}\" found in ${existingPath} and ${parsed.absolutePath}.`,\r\n );\r\n }\r\n\r\n seenNames.set(parsed.name, parsed.absolutePath);\r\n discovered.push(parsed);\r\n}\r\n\r\nasync function isRegularFile(filePath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(filePath);\r\n return stat.isFile();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function isDirectory(targetPath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(targetPath);\r\n return stat.isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction uniquePaths(paths: string[]): string[] {\r\n return [...new Set(paths.map((item) => path.normalize(item)))];\r\n}\r\n","export { discoverSkills, loadSkillBody } from \"./discovery.js\";\r\nexport { parseSkillSource } from \"./schema.js\";\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport fg from \"fast-glob\";\r\n\r\nimport { resolveProjectRoots } from \"./repoRoots.js\";\r\nimport { discoverSkills } from \"../skills/catalog.js\";\r\nimport type { LoadedInstructionFile, LoadedSkill, ProjectContext } from \"../types.js\";\r\nimport { isPathIgnored, loadProjectIgnoreRules } from \"../utils/ignore.js\";\r\n\r\nconst DEFAULT_PROJECT_DOC_MAX_BYTES = 24 * 1024;\r\n\r\nexport async function loadProjectContext(cwd: string): Promise<ProjectContext> {\r\n const roots = await resolveProjectRoots(cwd);\r\n const instructions = await getInstructionFiles(roots.rootDir, cwd);\r\n const { content, truncated } = concatInstructionFiles(instructions);\r\n const ignoreRules = await loadProjectIgnoreRules(roots.rootDir, cwd);\r\n const skills = await discoverSkills(roots.rootDir, cwd, ignoreRules);\r\n\r\n return {\r\n rootDir: roots.rootDir,\r\n stateRootDir: roots.stateRootDir,\r\n cwd,\r\n instructions,\r\n instructionText: content,\r\n instructionTruncated: truncated,\r\n skills,\r\n ignoreRules,\r\n };\r\n}\r\n\r\nasync function getInstructionFiles(rootDir: string, cwd: string): Promise<LoadedInstructionFile[]> {\r\n const directories = getDirectoriesFromRootToCwd(rootDir, cwd);\r\n const results: LoadedInstructionFile[] = [];\r\n\r\n for (const directory of directories) {\r\n const overridePath = path.join(directory, \"AGENTS.override.md\");\r\n const agentsPath = path.join(directory, \"AGENTS.md\");\r\n\r\n if (await isRegularFile(overridePath)) {\r\n results.push(await readInstructionFile(rootDir, overridePath, \"AGENTS.override.md\"));\r\n continue;\r\n }\r\n\r\n if (await isRegularFile(agentsPath)) {\r\n results.push(await readInstructionFile(rootDir, agentsPath, \"AGENTS.md\"));\r\n }\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction getDirectoriesFromRootToCwd(rootDir: string, cwd: string): string[] {\r\n const absoluteRoot = path.resolve(rootDir);\r\n const absoluteCwd = path.resolve(cwd);\r\n const relativePath = path.relative(absoluteRoot, absoluteCwd);\r\n\r\n if (!relativePath || relativePath === \".\") {\r\n return [absoluteRoot];\r\n }\r\n\r\n const parts = relativePath.split(path.sep).filter(Boolean);\r\n const directories = [absoluteRoot];\r\n\r\n for (let index = 0; index < parts.length; index += 1) {\r\n directories.push(path.join(absoluteRoot, ...parts.slice(0, index + 1)));\r\n }\r\n\r\n return directories;\r\n}\r\n\r\nasync function isRegularFile(filePath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(filePath);\r\n return stat.isFile();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function readInstructionFile(\r\n rootDir: string,\r\n absolutePath: string,\r\n filename: LoadedInstructionFile[\"filename\"],\r\n): Promise<LoadedInstructionFile> {\r\n return {\r\n path: absolutePath,\r\n relativePath: path.relative(rootDir, absolutePath) || filename,\r\n filename,\r\n content: await fs.readFile(absolutePath, \"utf8\"),\r\n };\r\n}\r\n\r\nfunction concatInstructionFiles(files: LoadedInstructionFile[]): { content: string; truncated: boolean } {\r\n const maxBytes = readProjectDocMaxBytes();\r\n let totalBytes = 0;\r\n let truncated = false;\r\n const parts: string[] = [];\r\n\r\n for (const file of files) {\r\n if (!file.content.trim()) {\r\n continue;\r\n }\r\n\r\n const heading = `# ${file.filename}\\n\\nPath: ${file.relativePath}\\n\\n`;\r\n const block = `${heading}${file.content}`.trimEnd();\r\n const separator = parts.length > 0 ? \"\\n\\n\" : \"\";\r\n const blockBytes = Buffer.byteLength(separator + block, \"utf8\");\r\n\r\n if (totalBytes + blockBytes <= maxBytes) {\r\n parts.push(`${separator}${block}`);\r\n totalBytes += blockBytes;\r\n continue;\r\n }\r\n\r\n truncated = true;\r\n const remainingBytes = Math.max(0, maxBytes - totalBytes - Buffer.byteLength(separator, \"utf8\"));\r\n const suffix = \"\\n\\n... (project instructions truncated)\";\r\n const suffixBytes = Buffer.byteLength(suffix, \"utf8\");\r\n const prefixBudget = Math.max(0, remainingBytes - suffixBytes);\r\n const prefix = truncateUtf8(block, prefixBudget);\r\n parts.push(`${separator}${prefix}${suffix}`);\r\n break;\r\n }\r\n\r\n return {\r\n content: parts.join(\"\"),\r\n truncated,\r\n };\r\n}\r\n\r\nfunction readProjectDocMaxBytes(): number {\r\n const raw = process.env.ATHLETE_PROJECT_DOC_MAX_BYTES;\r\n const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_PROJECT_DOC_MAX_BYTES;\r\n}\r\n\r\nfunction truncateUtf8(value: string, bytes: number): string {\r\n const buffer = Buffer.from(value, \"utf8\");\r\n if (buffer.length <= bytes) {\r\n return value;\r\n }\r\n\r\n return buffer.subarray(0, Math.max(0, bytes)).toString(\"utf8\");\r\n}\r\n\r\nasync function isDirectory(targetPath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(targetPath);\r\n return stat.isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction uniquePaths(paths: string[]): string[] {\r\n return [...new Set(paths.map((item) => path.normalize(item)))];\r\n}\r\n","import { isInternalMessage } from \"../agent/taskState.js\";\r\nimport type { SessionRecord, StoredMessage, ToolExecutionResult } from \"../types.js\";\r\nimport type { SkillRuntimeState } from \"./types.js\";\r\n\r\nconst BROWSER_WORKFLOW_SKILLS = new Set([\"web-research\", \"browser-automation\"]);\r\nconst LOCAL_WEB_DETOUR_TOOLS = new Set([\"list_files\", \"read_file\", \"search_files\", \"run_shell\", \"background_run\"]);\r\nconst WEB_FETCH_PATTERNS = [\r\n /\\bcurl(\\.exe)?\\b/i,\r\n /\\bwget\\b/i,\r\n /invoke-webrequest/i,\r\n /news\\.google\\.com/i,\r\n /https?:\\/\\//i,\r\n];\r\n\r\nexport function getWorkflowToolGateResult(\r\n toolName: string,\r\n rawArgs: string,\r\n session: Pick<SessionRecord, \"messages\">,\r\n runtimeState: SkillRuntimeState,\r\n): ToolExecutionResult | null {\r\n if (!hasLoadedBrowserWorkflow(runtimeState) || !LOCAL_WEB_DETOUR_TOOLS.has(toolName)) {\r\n return null;\r\n }\r\n\r\n const browserState = readBrowserWorkflowState(session.messages);\r\n if (!browserState.hasBrowserActivity) {\r\n return buildBlockedWorkflowResult(\r\n \"BROWSER_WORKFLOW_REQUIRED\",\r\n \"Use Playwright browser tools before local file inspection or shell-based web fetching.\",\r\n \"Start with mcp_playwright_browser_navigate, then inspect the page with mcp_playwright_browser_snapshot.\",\r\n \"mcp_playwright_browser_navigate\",\r\n );\r\n }\r\n\r\n if (!browserState.hasSnapshot && (toolName !== \"run_shell\" || commandLooksLikeWebFetch(rawArgs))) {\r\n return buildBlockedWorkflowResult(\r\n \"BROWSER_SNAPSHOT_REQUIRED\",\r\n \"Capture the current page state with Playwright before detouring into local files or shell web fetching.\",\r\n \"Call mcp_playwright_browser_snapshot next so the agent reads the live page before falling back.\",\r\n \"mcp_playwright_browser_snapshot\",\r\n );\r\n }\r\n\r\n if ((toolName === \"run_shell\" || toolName === \"background_run\") && commandLooksLikeWebFetch(rawArgs)) {\r\n return buildBlockedWorkflowResult(\r\n \"SHELL_WEB_FALLBACK_BLOCKED\",\r\n \"Shell-based web fetching is fallback-only when Playwright browser tools are available.\",\r\n \"Keep using mcp_playwright_browser_* tools unless the browser path failed and you clearly explain the fallback.\",\r\n \"mcp_playwright_browser_snapshot\",\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction hasLoadedBrowserWorkflow(runtimeState: SkillRuntimeState): boolean {\r\n return [...runtimeState.loadedSkillNames].some((name) => BROWSER_WORKFLOW_SKILLS.has(name));\r\n}\r\n\r\nfunction readBrowserWorkflowState(messages: StoredMessage[]): {\r\n hasBrowserActivity: boolean;\r\n hasSnapshot: boolean;\r\n} {\r\n const anchor = findLatestExternalUserIndex(messages);\r\n const relevantMessages = anchor >= 0 ? messages.slice(anchor) : messages;\r\n let hasBrowserActivity = false;\r\n let hasSnapshot = false;\r\n\r\n for (const message of relevantMessages) {\r\n if (message.role !== \"tool\" || typeof message.name !== \"string\") {\r\n continue;\r\n }\r\n\r\n if (!message.name.startsWith(\"mcp_playwright_browser_\")) {\r\n continue;\r\n }\r\n\r\n hasBrowserActivity = true;\r\n if (message.name === \"mcp_playwright_browser_snapshot\") {\r\n hasSnapshot = true;\r\n }\r\n }\r\n\r\n return {\r\n hasBrowserActivity,\r\n hasSnapshot,\r\n };\r\n}\r\n\r\nfunction findLatestExternalUserIndex(messages: StoredMessage[]): number {\r\n for (let index = messages.length - 1; index >= 0; index -= 1) {\r\n const message = messages[index];\r\n if (!message) {\r\n continue;\r\n }\r\n\r\n if (message.role !== \"user\" || !message.content || isInternalMessage(message.content)) {\r\n continue;\r\n }\r\n\r\n return index;\r\n }\r\n\r\n return -1;\r\n}\r\n\r\nfunction commandLooksLikeWebFetch(rawArgs: string): boolean {\r\n try {\r\n const parsed = JSON.parse(rawArgs) as { command?: unknown };\r\n const command = typeof parsed.command === \"string\" ? parsed.command : \"\";\r\n return WEB_FETCH_PATTERNS.some((pattern) => pattern.test(command));\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction buildBlockedWorkflowResult(\r\n code: string,\r\n error: string,\r\n hint: string,\r\n suggestedTool: string,\r\n): ToolExecutionResult {\r\n return {\r\n ok: false,\r\n output: JSON.stringify(\r\n {\r\n ok: false,\r\n code,\r\n error,\r\n hint,\r\n suggestedTool,\r\n },\r\n null,\r\n 2,\r\n ),\r\n };\r\n}\r\n","import OpenAI from \"openai\";\r\nimport { buildRequestContext } from \"./contextBuilder.js\";\r\nimport { filterToolDefinitionsForCloseout, noteSubstantiveToolActivity } from \"./closeout.js\";\r\nimport { emitAssistantFinalOutput, emitAssistantReasoning, shouldInjectTodoReminder } from \"./finalize.js\";\r\nimport { AgentTurnError, getErrorMessage } from \"./errors.js\";\r\nimport { fetchAssistantResponse } from \"./api.js\";\r\nimport { ToolLoopGuard } from \"./loopGuard.js\";\r\nimport { createMessage } from \"./messages.js\";\r\nimport { getPlanBlockedResult, readCommandFromArgs } from \"./planGate.js\";\r\nimport { buildRecoveryRequestConfig, buildRecoveryStatus, computeRecoveryDelayMs, isRecoverableTurnError, pickRequestModel, sleep } from \"./retryPolicy.js\";\r\nimport { noteRuntimeCompression, noteRuntimeModelRequests, noteRuntimeToolExecution, type ModelRequestMetric } from \"./runtimeMetrics.js\";\r\nimport { injectInboxMessagesIfNeeded, loadPromptRuntimeState, shouldYieldTurn } from \"./runtimeState.js\";\r\nimport { buildSystemPromptLayers } from \"./systemPrompt.js\";\r\nimport { createInternalReminder } from \"./taskState.js\";\r\nimport { initializeTurnSession, persistRecoveryTurn, persistToolBatchCheckpoint, persistYieldedTurn } from \"./turnPersistence.js\";\r\nimport { createStoredToolMessage } from \"./toolResultStorage.js\";\r\nimport { prioritizeToolDefinitionsForTurn } from \"./toolPriority.js\";\r\nimport { hasIncompleteTodos } from \"./todos.js\";\r\nimport { executeToolCallWithRecovery } from \"./toolExecutor.js\";\r\nimport { getLightweightVerificationAttempt, readVerificationProgress } from \"./verificationSignals.js\";\r\nimport { isVerificationRequired, markVerificationRequired, noteVerificationReminder, recordVerificationAttempt } from \"./verificationState.js\";\r\nimport { resolveToollessTurn } from \"./toollessTurn.js\";\r\nimport { emitTurnProgressStatus, extendPromptLayersForTurnState } from \"./turnState.js\";\r\nimport type { AgentIdentity, RunTurnOptions, RunTurnResult } from \"./types.js\";\r\nimport { ChangeStore } from \"../changes/store.js\";\r\nimport { loadProjectContext } from \"../context/projectContext.js\";\r\nimport { buildSkillRuntimeState, getSkillToolGateResult } from \"../skills/state.js\";\r\nimport { getWorkflowToolGateResult } from \"../skills/workflowGuards.js\";\r\nimport { createRuntimeToolRegistry } from \"../tools/runtimeRegistry.js\";\r\nimport type { StoredMessage } from \"../types.js\";\r\nimport { throwIfAborted } from \"../utils/abort.js\";\r\nimport { classifyCommand } from \"../utils/commandPolicy.js\";\r\nexport type { AgentCallbacks, RunTurnOptions } from \"./types.js\";\r\n\r\nexport async function runAgentTurn(options: RunTurnOptions): Promise<RunTurnResult> {\r\n if (!options.config.apiKey) {\r\n throw new Error(\"Missing ATHLETE_API_KEY. Open the project's .env file and add your key.\");\r\n }\r\n const projectContext = await loadProjectContext(options.cwd);\r\n const identity = options.identity ?? { kind: \"lead\" as const, name: \"lead\" };\r\n let session = await initializeTurnSession(options.session, options.input, options.sessionStore);\r\n const client = new OpenAI({ apiKey: options.config.apiKey, baseURL: options.config.baseUrl });\r\n const ownsToolRegistry = !options.toolRegistry;\r\n const toolRegistry = options.toolRegistry ?? (await createRuntimeToolRegistry(options.config));\r\n const availableToolNames = toolRegistry.definitions.map((tool) => tool.function.name);\r\n const changeStore = new ChangeStore(options.config.paths.changesDir);\r\n const loopGuard = new ToolLoopGuard();\r\n const softToolLimit = Math.max(1, options.config.maxToolIterations);\r\n const continuationWindow = softToolLimit * Math.max(1, options.config.maxContinuationBatches);\r\n const hadIncompleteTodosAtStart = options.identity?.kind === \"lead\" ? hasIncompleteTodos(options.session.todoItems) : false;\r\n let compressionAnnounced = false;\r\n let changedPaths = new Set<string>();\r\n let hasSubstantiveToolActivity = false;\r\n let { validationAttempted, validationPassed, requiresVerification } = readVerificationProgress(session);\r\n let validationReminderInjected = false;\r\n let consecutiveRequestFailures = 0;\r\n let roundsSinceTodoWrite = 0;\r\n try {\r\n for (let iteration = 0; ; iteration += 1) {\r\n throwIfAborted(options.abortSignal, \"Turn aborted by user.\");\r\n if (shouldYieldTurn(options.yieldAfterToolSteps, iteration)) {\r\n session = await persistYieldedTurn(session, options.sessionStore, iteration);\r\n options.callbacks?.onStatus?.(`Yielding after ${iteration} tool steps so background work can poll inbox and tasks.`);\r\n return {\r\n session,\r\n changedPaths: [...changedPaths],\r\n verificationAttempted: validationAttempted,\r\n verificationPassed: validationPassed,\r\n yielded: true,\r\n yieldReason: `tool_steps_${iteration}`,\r\n paused: false,\r\n };\r\n }\r\n session = await injectInboxMessagesIfNeeded(session, options, identity, projectContext.stateRootDir);\r\n throwIfAborted(options.abortSignal, \"Turn aborted by user.\");\r\n const runtimeState = await loadPromptRuntimeState(projectContext.stateRootDir, identity, options.cwd);\r\n const skillRuntimeState = buildSkillRuntimeState({\r\n skills: projectContext.skills,\r\n session,\r\n input: options.input,\r\n identity,\r\n objective: session.taskState?.objective,\r\n taskSummary: runtimeState.taskSummary,\r\n availableToolNames,\r\n });\r\n let promptLayers = buildSystemPromptLayers(options.cwd, options.config, projectContext, session.taskState, session.todoItems, session.verificationState, runtimeState, skillRuntimeState, session.checkpoint);\r\n promptLayers = extendPromptLayersForTurnState(promptLayers, session.checkpoint, iteration, softToolLimit, consecutiveRequestFailures);\r\n const requestModel = pickRequestModel(options.config.model, consecutiveRequestFailures);\r\n const requestConfig = buildRecoveryRequestConfig(options.config, requestModel, consecutiveRequestFailures);\r\n const requestContext = buildRequestContext(promptLayers, session.messages, requestConfig);\r\n const prioritizedToolDefinitions = prioritizeToolDefinitionsForTurn(toolRegistry.definitions, { input: options.input, objective: session.taskState?.objective, taskSummary: runtimeState.taskSummary, missingRequiredSkillNames: skillRuntimeState.missingRequiredSkills.map((skill) => skill.name) });\r\n const turnToolDefinitions = filterToolDefinitionsForCloseout(prioritizedToolDefinitions, { session, changedPaths, hasSubstantiveToolActivity, verificationState: session.verificationState });\r\n session = requestContext.compressed ? noteRuntimeCompression(session) : session;\r\n if (requestContext.compressed && !compressionAnnounced) {\r\n options.callbacks?.onStatus?.(`Context compressed automatically at ~${requestContext.estimatedChars} chars to keep the turn running.`);\r\n compressionAnnounced = true;\r\n }\r\n emitTurnProgressStatus(options.callbacks, iteration, softToolLimit, continuationWindow);\r\n let response;\r\n const modelRequestMetrics: ModelRequestMetric[] = [];\r\n options.callbacks?.onModelWaitStart?.();\r\n try {\r\n response = await fetchAssistantResponse(client, requestContext.messages, requestModel, turnToolDefinitions, options.callbacks, options.abortSignal, (metric) => modelRequestMetrics.push(metric));\r\n session = noteRuntimeModelRequests(session, modelRequestMetrics);\r\n consecutiveRequestFailures = 0;\r\n } catch (error) {\r\n session = noteRuntimeModelRequests(session, modelRequestMetrics);\r\n if (!isRecoverableTurnError(error)) {\r\n throw error;\r\n }\r\n consecutiveRequestFailures += 1;\r\n session = await persistRecoveryTurn(session, options.sessionStore, consecutiveRequestFailures, error);\r\n const delayMs = computeRecoveryDelayMs(consecutiveRequestFailures);\r\n options.callbacks?.onStatus?.(\r\n buildRecoveryStatus(\r\n error,\r\n consecutiveRequestFailures,\r\n delayMs,\r\n options.config.model,\r\n requestModel,\r\n requestConfig,\r\n ),\r\n );\r\n await sleep(delayMs, options.abortSignal);\r\n continue;\r\n } finally {\r\n options.callbacks?.onModelWaitStop?.();\r\n }\r\n emitAssistantReasoning(response, options);\r\n throwIfAborted(options.abortSignal, \"Turn aborted by user.\");\r\n if (response.toolCalls.length === 0) {\r\n const completed = await resolveToollessTurn({\r\n session,\r\n response,\r\n identity,\r\n changedPaths,\r\n hadIncompleteTodosAtStart,\r\n hasSubstantiveToolActivity,\r\n validationReminderInjected,\r\n skillRuntimeState,\r\n options,\r\n });\r\n if (completed.kind === \"continue\") {\r\n session = completed.session;\r\n validationReminderInjected = completed.validationReminderInjected;\r\n continue;\r\n }\r\n emitAssistantFinalOutput(response, options);\r\n return completed.result;\r\n }\r\n session = await options.sessionStore.appendMessages(session, [\r\n createMessage(\"assistant\", response.content, {\r\n reasoningContent: response.reasoningContent,\r\n toolCalls: response.toolCalls,\r\n }),\r\n ]);\r\n const batchToolMessages: StoredMessage[] = [];\r\n const batchChangedPaths = new Set<string>();\r\n let usedTodoWrite = false;\r\n for (const toolCall of response.toolCalls) {\r\n throwIfAborted(options.abortSignal, \"Turn aborted by user.\");\r\n options.callbacks?.onToolCall?.(toolCall.function.name, toolCall.function.arguments);\r\n usedTodoWrite = usedTodoWrite || toolCall.function.name === \"todo_write\";\r\n hasSubstantiveToolActivity = noteSubstantiveToolActivity(hasSubstantiveToolActivity, toolCall.function.name);\r\n const command = readCommandFromArgs(toolCall.function.arguments);\r\n if (command && (toolCall.function.name === \"run_shell\" || toolCall.function.name === \"background_run\")) {\r\n const classification = classifyCommand(command);\r\n if (!classification.isReadOnly && !classification.validationKind) {\r\n session = await options.sessionStore.save({\r\n ...session,\r\n verificationState: markVerificationRequired(session.verificationState),\r\n });\r\n ({ validationAttempted, validationPassed, requiresVerification } = readVerificationProgress(session));\r\n validationReminderInjected = false;\r\n }\r\n }\r\n const blockedResult = loopGuard.getBlockedResult(toolCall);\r\n const planBlockedResult = blockedResult\r\n ? null\r\n : getPlanBlockedResult(toolCall.function.name, toolCall.function.arguments, session, identity);\r\n const skillBlockedResult = blockedResult || planBlockedResult\r\n ? null\r\n : getSkillToolGateResult(toolCall.function.name, skillRuntimeState);\r\n const workflowBlockedResult = blockedResult || planBlockedResult || skillBlockedResult\r\n ? null\r\n : getWorkflowToolGateResult(toolCall.function.name, toolCall.function.arguments, session, skillRuntimeState);\r\n const toolStartedAt = Date.now();\r\n const result = blockedResult ?? planBlockedResult ?? skillBlockedResult ?? workflowBlockedResult ?? (await executeToolCallWithRecovery(toolRegistry, toolCall, options, projectContext, changeStore));\r\n throwIfAborted(options.abortSignal, \"Turn aborted by user.\");\r\n const metadata = \"metadata\" in result ? result.metadata : undefined;\r\n if (metadata?.changedPaths?.length) {\r\n changedPaths = new Set([...changedPaths, ...metadata.changedPaths]);\r\n metadata.changedPaths.forEach((changedPath) => batchChangedPaths.add(changedPath));\r\n loopGuard.reset();\r\n session = await options.sessionStore.save({\r\n ...session,\r\n verificationState: markVerificationRequired(session.verificationState, {\r\n pendingPaths: metadata.changedPaths,\r\n }),\r\n });\r\n ({ validationAttempted, validationPassed, requiresVerification } = readVerificationProgress(session));\r\n validationReminderInjected = false;\r\n }\r\n const verificationAttempt = metadata?.verification?.attempted\r\n ? metadata.verification\r\n : getLightweightVerificationAttempt({\r\n toolName: toolCall.function.name,\r\n rawArgs: toolCall.function.arguments,\r\n pendingPaths: session.verificationState?.pendingPaths ?? [...changedPaths],\r\n resultOk: result.ok,\r\n });\r\n if (verificationAttempt) {\r\n session = await options.sessionStore.save({\r\n ...session,\r\n verificationState: recordVerificationAttempt(session.verificationState, verificationAttempt),\r\n });\r\n ({ validationAttempted, validationPassed, requiresVerification } = readVerificationProgress(session));\r\n }\r\n if (result.ok) {\r\n options.callbacks?.onToolResult?.(toolCall.function.name, result.output);\r\n } else {\r\n options.callbacks?.onToolError?.(toolCall.function.name, result.output);\r\n }\r\n const storedToolMessage = await createStoredToolMessage({\r\n toolCallId: toolCall.id,\r\n toolName: toolCall.function.name,\r\n rawOutput: result.output,\r\n sessionId: session.id,\r\n projectContext,\r\n });\r\n batchToolMessages.push(storedToolMessage);\r\n session = await options.sessionStore.appendMessages(noteRuntimeToolExecution(session, { toolName: toolCall.function.name, durationMs: Date.now() - toolStartedAt, ok: result.ok, externalizedToolResult: storedToolMessage.externalizedToolResult }), [storedToolMessage]);\r\n }\r\n session = await persistToolBatchCheckpoint({ session, sessionStore: options.sessionStore, toolNames: response.toolCalls.map((toolCall) => toolCall.function.name), toolMessages: batchToolMessages, changedPaths: [...batchChangedPaths] });\r\n roundsSinceTodoWrite = usedTodoWrite ? 0 : roundsSinceTodoWrite + 1;\r\n if (shouldInjectTodoReminder(roundsSinceTodoWrite, response.toolCalls)) {\r\n session = await options.sessionStore.appendMessages(session, [\r\n createMessage(\r\n \"user\",\r\n createInternalReminder(\r\n \"This task is still in progress. Use todo_write now: keep the list short, mark exactly one item in_progress, and update completed items before continuing.\",\r\n ),\r\n ),\r\n ]);\r\n }\r\n if (requiresVerification && !validationAttempted) {\r\n session = await options.sessionStore.save({\r\n ...session,\r\n verificationState: noteVerificationReminder(session.verificationState),\r\n });\r\n }\r\n }\r\n } catch (error) {\r\n const persistedSession = await options.sessionStore.save(session).catch(() => session);\r\n throw new AgentTurnError(getErrorMessage(error), persistedSession, { cause: error });\r\n } finally {\r\n if (ownsToolRegistry) {\r\n await toolRegistry.close?.().catch(() => undefined);\r\n }\r\n }\r\n}\r\n","#!/usr/bin/env node\r\n\r\nimport { Command, InvalidOptionArgumentError } from \"commander\";\r\nimport { execa } from \"execa\";\r\nimport OpenAI from \"openai\";\r\n\r\nimport { runBackgroundWorker } from \"./background/worker.js\";\r\nimport { getErrorMessage } from \"./agent/errors.js\";\r\nimport { SessionStore } from \"./agent/sessionStore.js\";\r\nimport { ChangeStore } from \"./changes/store.js\";\r\nimport {\r\n coerceConfigValue,\r\n extractCliOverrides,\r\n resolveCliRuntime,\r\n runOneShotPrompt,\r\n truncateCliValue,\r\n} from \"./cli/support.js\";\r\nimport { initializeProjectFiles } from \"./config/init.js\";\r\nimport { loadConfig, parseAgentMode, updateConfig } from \"./config/store.js\";\r\nimport { runTeammateWorker } from \"./team/worker.js\";\r\nimport {\r\n createTelegramService as createConfiguredTelegramService,\r\n registerTelegramCommands,\r\n} from \"./telegram/cli.js\";\r\nimport { acquireTelegramProcessLock } from \"./telegram/processLock.js\";\r\nimport type { AppConfig, RuntimeConfig } from \"./types.js\";\r\nimport { startInteractiveChat } from \"./ui/interactive.js\";\r\nimport { ui } from \"./utils/console.js\";\r\nimport { installStdioGuards, writeStdoutLine } from \"./utils/stdio.js\";\r\nimport {\r\n createWeixinService as createConfiguredWeixinService,\r\n loginWeixin as loginConfiguredWeixin,\r\n logoutWeixin as logoutConfiguredWeixin,\r\n registerWeixinCommands,\r\n} from \"./weixin/cli.js\";\r\nimport { acquireWeixinProcessLock } from \"./weixin/processLock.js\";\r\n\r\nexport interface CliProgramDependencies {\r\n startInteractive?: typeof startInteractiveChat;\r\n createTelegramService?: (options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n }) => Promise<{\r\n run(signal?: AbortSignal): Promise<void>;\r\n stop?(): void;\r\n }>;\r\n acquireProcessLock?: typeof acquireTelegramProcessLock;\r\n loginWeixin?: typeof loginConfiguredWeixin;\r\n createWeixinService?: (options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n }) => Promise<{\r\n run(signal?: AbortSignal): Promise<void>;\r\n stop?(): void;\r\n }>;\r\n logoutWeixin?: typeof logoutConfiguredWeixin;\r\n acquireWeixinProcessLock?: typeof acquireWeixinProcessLock;\r\n resolveRuntime?: typeof resolveCliRuntime;\r\n}\r\n\r\nexport function buildCliProgram(dependencies: CliProgramDependencies = {}): Command {\r\n const program = new Command();\r\n const startInteractive = dependencies.startInteractive ?? startInteractiveChat;\r\n const createTelegramService = dependencies.createTelegramService ?? createConfiguredTelegramService;\r\n const createWeixinService = dependencies.createWeixinService ?? createConfiguredWeixinService;\r\n const resolveRuntimeForCommand = dependencies.resolveRuntime ?? resolveCliRuntime;\r\n\r\n program\r\n .name(\"athlete\")\r\n .description(\"Athlete - a terminal AI coding assistant.\")\r\n .option(\"-m, --model <model>\", \"Override the configured model\")\r\n .option(\r\n \"--mode <mode>\",\r\n \"Mode: read-only | agent\",\r\n (value: string) => {\r\n const parsed = parseAgentMode(value);\r\n if (!parsed) {\r\n throw new InvalidOptionArgumentError(`Invalid mode: ${value}`);\r\n }\r\n\r\n return parsed;\r\n },\r\n )\r\n .option(\"-C, --cwd <path>\", \"Working directory for this run\")\r\n .argument(\"[prompt...]\", \"Start a new session with a one-shot prompt. Without a prompt, opens interactive chat.\")\r\n .action(async (promptParts: string[]) => {\r\n const prompt = promptParts.join(\" \").trim();\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const sessionStore = new SessionStore(runtime.paths.sessionsDir);\r\n const session = await sessionStore.create(runtime.cwd);\r\n\r\n if (!prompt) {\r\n await startInteractive({\r\n cwd: runtime.cwd,\r\n config: runtime.config,\r\n session,\r\n sessionStore,\r\n });\r\n return;\r\n }\r\n\r\n const nextSession = await runOneShotPrompt(prompt, runtime.cwd, runtime.config, session, sessionStore);\r\n ui.dim(`session: ${nextSession.id}`);\r\n });\r\n\r\n program\r\n .command(\"run\")\r\n .description(\"Run a one-shot prompt in a new session.\")\r\n .argument(\"<prompt...>\", \"Prompt to send\")\r\n .action(async (promptParts: string[]) => {\r\n const prompt = promptParts.join(\" \").trim();\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const sessionStore = new SessionStore(runtime.paths.sessionsDir);\r\n const session = await sessionStore.create(runtime.cwd);\r\n const nextSession = await runOneShotPrompt(prompt, runtime.cwd, runtime.config, session, sessionStore);\r\n\r\n ui.dim(`session: ${nextSession.id}`);\r\n });\r\n\r\n program\r\n .command(\"resume\")\r\n .description(\"Resume the latest session or a specific session id in interactive mode.\")\r\n .argument(\"[sessionId]\", \"Session id\")\r\n .action(async (sessionId: string | undefined) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const sessionStore = new SessionStore(runtime.paths.sessionsDir);\r\n const session = sessionId ? await sessionStore.load(sessionId) : await sessionStore.loadLatest();\r\n\r\n if (!session) {\r\n throw new Error(\"No saved sessions found.\");\r\n }\r\n\r\n await startInteractive({\r\n cwd: runtime.overrides.cwd ? runtime.cwd : session.cwd,\r\n config: runtime.config,\r\n session,\r\n sessionStore,\r\n });\r\n });\r\n\r\n program\r\n .command(\"sessions\")\r\n .description(\"List recent sessions.\")\r\n .option(\"-n, --limit <count>\", \"Number of sessions to show\", (value) => Number.parseInt(value, 10), 20)\r\n .action(async (options: { limit?: number }) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const sessionStore = new SessionStore(runtime.paths.sessionsDir);\r\n const sessions = await sessionStore.list(options.limit ?? 20);\r\n\r\n if (sessions.length === 0) {\r\n ui.info(\"No saved sessions yet.\");\r\n return;\r\n }\r\n\r\n for (const session of sessions) {\r\n writeStdoutLine(\r\n [\r\n session.id,\r\n session.updatedAt,\r\n session.title ?? \"(untitled)\",\r\n `messages=${session.messageCount}`,\r\n ].join(\" \"),\r\n );\r\n }\r\n });\r\n\r\n program\r\n .command(\"init\")\r\n .description(\"Create local .athlete/.env and .athlete/.athleteignore files in the current project.\")\r\n .action(async () => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const result = await initializeProjectFiles(runtime.cwd);\r\n\r\n if (result.created.length > 0) {\r\n ui.success(`Created ${result.created.length} file(s).`);\r\n for (const filePath of result.created) {\r\n writeStdoutLine(filePath);\r\n }\r\n }\r\n\r\n if (result.skipped.length > 0) {\r\n ui.info(`Skipped ${result.skipped.length} existing file(s).`);\r\n for (const filePath of result.skipped) {\r\n writeStdoutLine(filePath);\r\n }\r\n }\r\n });\r\n\r\n program\r\n .command(\"changes\")\r\n .description(\"List recorded file changes, or show one change by id.\")\r\n .argument(\"[changeId]\", \"Optional change id\")\r\n .option(\"-n, --limit <count>\", \"Number of changes to show\", (value) => Number.parseInt(value, 10), 20)\r\n .action(async (changeId: string | undefined, options: { limit?: number }) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const changeStore = new ChangeStore(runtime.paths.changesDir);\r\n\r\n if (changeId) {\r\n const change = await changeStore.load(changeId);\r\n writeStdoutLine(JSON.stringify(change, null, 2));\r\n return;\r\n }\r\n\r\n const changes = await changeStore.list(options.limit ?? 20);\r\n if (changes.length === 0) {\r\n ui.info(\"No recorded changes yet.\");\r\n return;\r\n }\r\n\r\n for (const change of changes) {\r\n writeStdoutLine(\r\n [\r\n change.id,\r\n change.createdAt,\r\n change.toolName,\r\n `files=${change.operations.length}`,\r\n change.undoneAt ? \"undone\" : \"active\",\r\n truncateCliValue(change.summary, 80),\r\n ].join(\" \"),\r\n );\r\n }\r\n });\r\n\r\n program\r\n .command(\"undo\")\r\n .description(\"Undo the latest recorded change or a specific change id.\")\r\n .argument(\"[changeId]\", \"Optional change id\")\r\n .action(async (changeId: string | undefined) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const changeStore = new ChangeStore(runtime.paths.changesDir);\r\n const result = await changeStore.undo(changeId);\r\n\r\n ui.success(`Undid ${result.record.id}`);\r\n for (const filePath of result.restoredPaths) {\r\n writeStdoutLine(filePath);\r\n }\r\n });\r\n\r\n program\r\n .command(\"diff\")\r\n .description(\"Show current git diff in this project, or only for one path.\")\r\n .argument(\"[target]\", \"Optional file path\")\r\n .action(async (target: string | undefined) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const result = await execa(\"git\", target ? [\"diff\", \"--\", target] : [\"diff\"], {\r\n cwd: runtime.cwd,\r\n all: true,\r\n reject: false,\r\n });\r\n\r\n if ((result.exitCode ?? 0) > 1) {\r\n throw new Error(result.all || \"git diff failed.\");\r\n }\r\n\r\n const output = result.all?.trim();\r\n writeStdoutLine(output ? output : \"No diff.\");\r\n });\r\n\r\n const configCommand = program.command(\"config\").description(\"Read or update Athlete config.\");\r\n\r\n configCommand\r\n .command(\"show\")\r\n .description(\"Show config file values and API key status.\")\r\n .action(async () => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n const config = await loadConfig();\r\n writeStdoutLine(\r\n JSON.stringify(\r\n {\r\n ...config,\r\n apiKey: runtime.config.apiKey ? \"set\" : \"missing\",\r\n telegram: {\r\n ...config.telegram,\r\n token: runtime.config.telegram.token ? \"set\" : \"missing\",\r\n stateDir: runtime.config.telegram.stateDir,\r\n },\r\n weixin: {\r\n ...config.weixin,\r\n credentials: runtime.config.weixin.credentials ? \"set\" : \"missing\",\r\n stateDir: runtime.config.weixin.stateDir,\r\n },\r\n configFile: runtime.paths.configFile,\r\n sessionsDir: runtime.paths.sessionsDir,\r\n changesDir: runtime.paths.changesDir,\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n });\r\n\r\n configCommand\r\n .command(\"path\")\r\n .description(\"Show the config file path.\")\r\n .action(async () => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n writeStdoutLine(runtime.paths.configFile);\r\n });\r\n\r\n configCommand\r\n .command(\"get\")\r\n .description(\"Read a config key.\")\r\n .argument(\"<key>\", \"Config key\")\r\n .action(async (key: string) => {\r\n const config = await loadConfig();\r\n if (!(key in config)) {\r\n throw new Error(`Unknown config key: ${key}`);\r\n }\r\n\r\n const typedKey = key as keyof AppConfig;\r\n writeStdoutLine(JSON.stringify(config[typedKey], null, 2));\r\n });\r\n\r\n configCommand\r\n .command(\"set\")\r\n .description(\"Set a config key. Arrays can be JSON or comma-separated.\")\r\n .argument(\"<key>\", \"Config key\")\r\n .argument(\"<value>\", \"Config value\")\r\n .action(async (key: string, value: string) => {\r\n const next = await updateConfig((config) => {\r\n if (!(key in config)) {\r\n throw new Error(`Unknown config key: ${key}`);\r\n }\r\n\r\n const typedKey = key as keyof AppConfig;\r\n return {\r\n ...config,\r\n [typedKey]: coerceConfigValue(typedKey, value),\r\n } as AppConfig;\r\n });\r\n\r\n ui.success(`Updated ${key}`);\r\n writeStdoutLine(JSON.stringify(next[key as keyof AppConfig], null, 2));\r\n });\r\n\r\n program\r\n .command(\"doctor\")\r\n .description(\"Check local setup and validate the API connection.\")\r\n .action(async () => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n\r\n ui.info(`config: ${runtime.paths.configFile}`);\r\n ui.info(`sessions: ${runtime.paths.sessionsDir}`);\r\n ui.info(`model: ${runtime.config.model}`);\r\n ui.info(`baseUrl: ${runtime.config.baseUrl}`);\r\n ui.info(`mode: ${runtime.config.mode}`);\r\n\r\n if (!runtime.config.apiKey) {\r\n ui.warn(\"No API key found. Update the .env file first.\");\r\n return;\r\n }\r\n\r\n const client = new OpenAI({\r\n apiKey: runtime.config.apiKey,\r\n baseURL: runtime.config.baseUrl,\r\n });\r\n\r\n const models = await client.models.list();\r\n const count = Array.isArray(models.data) ? models.data.length : 0;\r\n ui.success(`API reachable. models=${count}`);\r\n });\r\n\r\n registerTelegramCommands(program, {\r\n getCliOverrides: () => extractCliOverrides(program.opts()),\r\n resolveRuntime: resolveRuntimeForCommand,\r\n createTelegramService,\r\n acquireProcessLock: dependencies.acquireProcessLock ?? acquireTelegramProcessLock,\r\n });\r\n registerWeixinCommands(program, {\r\n getCliOverrides: () => extractCliOverrides(program.opts()),\r\n resolveRuntime: resolveRuntimeForCommand,\r\n loginWeixin: dependencies.loginWeixin ?? loginConfiguredWeixin,\r\n createWeixinService,\r\n logoutWeixin: dependencies.logoutWeixin ?? logoutConfiguredWeixin,\r\n acquireProcessLock: dependencies.acquireWeixinProcessLock ?? acquireWeixinProcessLock,\r\n });\r\n\r\n const workerCommand = program.command(\"__worker__\");\r\n\r\n workerCommand\r\n .command(\"background\")\r\n .requiredOption(\"--job-id <jobId>\", \"Background job id\")\r\n .action(async (options: { jobId: string }) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n await runBackgroundWorker({\r\n rootDir: runtime.cwd,\r\n jobId: options.jobId,\r\n });\r\n });\r\n\r\n workerCommand\r\n .command(\"teammate\")\r\n .requiredOption(\"--name <name>\", \"Teammate name\")\r\n .requiredOption(\"--role <role>\", \"Teammate role\")\r\n .requiredOption(\"--prompt <prompt>\", \"Initial teammate prompt\")\r\n .action(async (options: { name: string; role: string; prompt: string }) => {\r\n const runtime = await resolveRuntimeForCommand(extractCliOverrides(program.opts()));\r\n await runTeammateWorker({\r\n rootDir: runtime.cwd,\r\n config: runtime.config,\r\n name: options.name,\r\n role: options.role,\r\n prompt: options.prompt,\r\n });\r\n });\r\n\r\n return program;\r\n}\r\n\r\nexport async function runCli(\r\n argv: string[] = process.argv,\r\n dependencies: CliProgramDependencies = {},\r\n): Promise<void> {\r\n installStdioGuards();\r\n const program = buildCliProgram(dependencies);\r\n await program.parseAsync(argv);\r\n}\r\n\r\nif (typeof require !== \"undefined\" && typeof module !== \"undefined\" && require.main === module) {\r\n void runCli().catch((error: unknown) => {\r\n ui.error(getErrorMessage(error));\r\n process.exitCode = 1;\r\n });\r\n}\r\n","import { MessageBus } from \"../team/messageBus.js\";\r\nimport { truncateText } from \"../utils/fs.js\";\r\nimport { runCommandWithPolicy } from \"../utils/commandRunner.js\";\r\nimport { BackgroundJobStore } from \"./store.js\";\r\n\r\nexport interface BackgroundWorkerOptions {\r\n rootDir: string;\r\n jobId: string;\r\n}\r\n\r\nexport async function runBackgroundWorker(options: BackgroundWorkerOptions): Promise<void> {\r\n const store = new BackgroundJobStore(options.rootDir);\r\n const bus = new MessageBus(options.rootDir);\r\n const job = await store.load(options.jobId);\r\n\r\n try {\r\n const result = await runCommandWithPolicy({\r\n command: job.command,\r\n cwd: job.cwd,\r\n timeoutMs: job.timeoutMs,\r\n stallTimeoutMs: job.stallTimeoutMs ?? job.timeoutMs,\r\n maxRetries: 0,\r\n retryBackoffMs: 0,\r\n canRetry: false,\r\n });\r\n const status = result.stalled || result.timedOut\r\n ? \"timed_out\"\r\n : result.exitCode === 0\r\n ? \"completed\"\r\n : \"failed\";\r\n\r\n const completed = await store.complete(job.id, {\r\n status,\r\n exitCode: typeof result.exitCode === \"number\" ? result.exitCode : undefined,\r\n output: truncateText(result.output ?? \"\", 12_000),\r\n });\r\n await notifyCompletion(bus, completed);\r\n } catch (error) {\r\n const completed = await store.complete(job.id, {\r\n status: isTimedOutError(error) ? \"timed_out\" : \"failed\",\r\n exitCode: readExitCode(error),\r\n output: truncateText(readProcessOutput(error), 12_000),\r\n });\r\n await notifyCompletion(bus, completed);\r\n }\r\n}\r\n\r\nasync function notifyCompletion(bus: MessageBus, job: Awaited<ReturnType<BackgroundJobStore[\"load\"]>>): Promise<void> {\r\n const statusText =\r\n job.status === \"completed\"\r\n ? \"completed\"\r\n : job.status === \"timed_out\"\r\n ? \"timed out\"\r\n : \"failed\";\r\n const preview = truncateText(job.output?.trim() || \"(no output)\", 600);\r\n await bus.send(\r\n `bg-${job.id}`,\r\n job.requestedBy,\r\n `[bg:${job.id}] ${statusText}: ${job.command}\\n${preview}`,\r\n \"background_result\",\r\n {\r\n jobId: job.id,\r\n jobStatus: job.status,\r\n exitCode: job.exitCode,\r\n },\r\n );\r\n}\r\n\r\nfunction isTimedOutError(error: unknown): boolean {\r\n return Boolean((error as { timedOut?: unknown }).timedOut);\r\n}\r\n\r\nfunction readExitCode(error: unknown): number | undefined {\r\n const exitCode = (error as { exitCode?: unknown }).exitCode;\r\n return typeof exitCode === \"number\" && Number.isFinite(exitCode) ? Math.trunc(exitCode) : undefined;\r\n}\r\n\r\nfunction readProcessOutput(error: unknown): string {\r\n const all = (error as { all?: unknown }).all;\r\n if (typeof all === \"string\" && all.length > 0) {\r\n return all;\r\n }\r\n\r\n const message = (error as { message?: unknown }).message;\r\n return typeof message === \"string\" && message.length > 0 ? message : \"Background job failed.\";\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { SessionStore } from \"../agent/sessionStore.js\";\r\nimport { runManagedAgentTurn } from \"../agent/managedTurn.js\";\r\nimport { parseAgentMode, resolveRuntimeConfig } from \"../config/store.js\";\r\nimport type { AgentMode, AppConfig, CliOverrides, RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { createStreamRenderer } from \"../ui/streamRenderer.js\";\r\nimport { tryParseJson } from \"../utils/json.js\";\r\nimport { ui } from \"../utils/console.js\";\r\n\r\nexport async function resolveCliRuntime(overrides: CliOverrides): Promise<{\r\n cwd: string;\r\n config: RuntimeConfig;\r\n paths: RuntimeConfig[\"paths\"];\r\n overrides: CliOverrides;\r\n}> {\r\n const cwd = overrides.cwd ? path.resolve(overrides.cwd) : process.cwd();\r\n const config = await resolveRuntimeConfig({\r\n cwd,\r\n model: overrides.model,\r\n mode: normalizeModeOverride(overrides.mode),\r\n });\r\n\r\n return {\r\n cwd,\r\n config,\r\n paths: config.paths,\r\n overrides,\r\n };\r\n}\r\n\r\nexport async function runOneShotPrompt(\r\n prompt: string,\r\n cwd: string,\r\n config: RuntimeConfig,\r\n session: SessionRecord,\r\n sessionStore: SessionStore,\r\n): Promise<SessionRecord> {\r\n const streamRenderer = createStreamRenderer(config, {\r\n cwd,\r\n assistantLeadingBlankLine: false,\r\n assistantTrailingNewlines: \"\\n\",\r\n reasoningLeadingBlankLine: false,\r\n toolArgsMaxChars: 160,\r\n toolErrorLabel: \"failed, model will try another path\",\r\n });\r\n\r\n try {\r\n const result = await runManagedAgentTurn({\r\n input: prompt,\r\n cwd,\r\n config,\r\n session,\r\n sessionStore,\r\n callbacks: streamRenderer.callbacks,\r\n identity: {\r\n kind: \"lead\",\r\n name: \"lead\",\r\n },\r\n });\r\n if (result.paused && result.pauseReason) {\r\n ui.warn(result.pauseReason);\r\n }\r\n return result.session;\r\n } catch (error) {\r\n streamRenderer.flush();\r\n throw error;\r\n }\r\n}\r\n\r\nexport function coerceConfigValue(key: keyof AppConfig, rawValue: string): AppConfig[keyof AppConfig] {\r\n switch (key) {\r\n case \"allowedRoots\": {\r\n const parsed = tryParseJson(rawValue);\r\n if (Array.isArray(parsed)) {\r\n return parsed.map((item) => String(item)) as AppConfig[keyof AppConfig];\r\n }\r\n\r\n return rawValue\r\n .split(\",\")\r\n .map((item) => item.trim())\r\n .filter(Boolean) as AppConfig[keyof AppConfig];\r\n }\r\n case \"showReasoning\":\r\n return (rawValue === \"true\" || rawValue === \"1\") as AppConfig[keyof AppConfig];\r\n case \"contextWindowMessages\":\r\n case \"maxContextChars\":\r\n case \"contextSummaryChars\":\r\n case \"yieldAfterToolSteps\":\r\n case \"maxToolIterations\":\r\n case \"maxContinuationBatches\":\r\n case \"maxReadBytes\":\r\n case \"maxSearchResults\":\r\n case \"maxSpreadsheetPreviewRows\":\r\n case \"maxSpreadsheetPreviewColumns\":\r\n case \"commandStallTimeoutMs\":\r\n case \"commandMaxRetries\":\r\n case \"commandRetryBackoffMs\": {\r\n const parsed = Number(rawValue);\r\n if (!Number.isFinite(parsed)) {\r\n throw new Error(`Expected a number for ${key}.`);\r\n }\r\n\r\n return parsed as AppConfig[keyof AppConfig];\r\n }\r\n case \"mode\": {\r\n const parsed = parseAgentMode(rawValue);\r\n if (!parsed) {\r\n throw new Error(`Invalid mode: ${rawValue}`);\r\n }\r\n\r\n return parsed as AppConfig[keyof AppConfig];\r\n }\r\n case \"provider\":\r\n return \"deepseek\" as AppConfig[keyof AppConfig];\r\n case \"mcp\":\r\n case \"telegram\":\r\n case \"weixin\": {\r\n const parsed = tryParseJson(rawValue);\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n throw new Error(`Expected a JSON object for ${key}.`);\r\n }\r\n\r\n return parsed as AppConfig[keyof AppConfig];\r\n }\r\n default:\r\n return rawValue as AppConfig[keyof AppConfig];\r\n }\r\n}\r\n\r\nexport function extractCliOverrides(options: Record<string, unknown>): CliOverrides {\r\n return {\r\n cwd: typeof options.cwd === \"string\" ? options.cwd : undefined,\r\n model: typeof options.model === \"string\" ? options.model : undefined,\r\n mode: normalizeModeOverride(typeof options.mode === \"string\" ? options.mode : (options.mode as AgentMode | undefined)),\r\n };\r\n}\r\n\r\nexport function truncateCliValue(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\nfunction normalizeModeOverride(value: string | AgentMode | undefined): AgentMode | undefined {\r\n return typeof value === \"string\" ? parseAgentMode(value) : value;\r\n}\r\n","import { buildCheckpointContinuationInput } from \"./checkpoint.js\";\r\nimport { runAgentTurn } from \"./runTurn.js\";\r\nimport { prepareLeadTurn } from \"../orchestrator/prepareLeadTurn.js\";\r\nimport type { AgentIdentity, RunTurnOptions, RunTurnResult } from \"./types.js\";\r\n\r\nexport interface ManagedTurnYieldContext {\r\n result: RunTurnResult;\r\n sliceIndex: number;\r\n defaultInput: string;\r\n}\r\n\r\nexport interface ManagedTurnYieldDecision {\r\n input?: string;\r\n}\r\n\r\nexport interface ManagedTurnOptions extends RunTurnOptions {\r\n onYield?: (\r\n context: ManagedTurnYieldContext,\r\n ) => Promise<ManagedTurnYieldDecision | void> | ManagedTurnYieldDecision | void;\r\n runSlice?: (options: RunTurnOptions) => Promise<RunTurnResult>;\r\n}\r\n\r\nexport async function runManagedAgentTurn(options: ManagedTurnOptions): Promise<RunTurnResult> {\r\n const runSlice = options.runSlice ?? runAgentTurn;\r\n const yieldAfterToolSteps = resolveYieldAfterToolSteps(options);\r\n let nextInput = options.input;\r\n let session = options.session;\r\n\r\n for (let sliceIndex = 0; ; sliceIndex += 1) {\r\n if ((options.identity?.kind ?? \"lead\") === \"lead\") {\r\n const prepared = await prepareLeadTurn({\r\n input: nextInput,\r\n cwd: options.cwd,\r\n config: options.config,\r\n session,\r\n sessionStore: options.sessionStore,\r\n callbacks: options.callbacks,\r\n });\r\n session = prepared.session;\r\n }\r\n\r\n const result = await runSlice({\r\n ...options,\r\n input: nextInput,\r\n session,\r\n yieldAfterToolSteps,\r\n });\r\n session = result.session;\r\n\r\n if (!result.yielded || !yieldAfterToolSteps) {\r\n return {\r\n ...result,\r\n session,\r\n };\r\n }\r\n\r\n const defaultInput = buildContinuationInput(options.identity, session.checkpoint);\r\n const decision = await options.onYield?.({\r\n result: {\r\n ...result,\r\n session,\r\n },\r\n sliceIndex,\r\n defaultInput,\r\n });\r\n nextInput = normalizeContinuationInput(decision?.input) ?? defaultInput;\r\n }\r\n}\r\n\r\nfunction resolveYieldAfterToolSteps(options: ManagedTurnOptions): number | undefined {\r\n if (options.identity?.kind === \"subagent\") {\r\n return undefined;\r\n }\r\n\r\n const configured =\r\n typeof options.yieldAfterToolSteps === \"number\"\r\n ? options.yieldAfterToolSteps\r\n : options.config.yieldAfterToolSteps;\r\n\r\n if (!Number.isFinite(configured) || configured <= 0) {\r\n return undefined;\r\n }\r\n\r\n return Math.trunc(configured);\r\n}\r\n\r\nfunction buildContinuationInput(\r\n identity: AgentIdentity | undefined,\r\n checkpoint: RunTurnOptions[\"session\"][\"checkpoint\"],\r\n): string {\r\n return buildCheckpointContinuationInput(identity, checkpoint);\r\n}\r\n\r\nfunction normalizeContinuationInput(value: string | undefined): string | undefined {\r\n if (typeof value !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.trim();\r\n return normalized.length > 0 ? normalized : undefined;\r\n}\r\n","import { loadProjectContext } from \"../context/projectContext.js\";\r\nimport { analyzeOrchestratorInput } from \"./analyze.js\";\r\nimport { dispatchOrchestratorAction } from \"./dispatch.js\";\r\nimport { loadOrchestratorProgress } from \"./progress.js\";\r\nimport { routeOrchestratorAction } from \"./route.js\";\r\nimport { ensureTaskPlan } from \"./taskPlanning.js\";\r\nimport type { PreparedLeadTurn, PrepareLeadTurnOptions } from \"./types.js\";\r\n\r\nexport async function prepareLeadTurn(options: PrepareLeadTurnOptions): Promise<PreparedLeadTurn> {\r\n const projectContext = await loadProjectContext(options.cwd);\r\n const analysis = analyzeOrchestratorInput({\r\n input: options.input,\r\n session: options.session,\r\n });\r\n let progress = await loadOrchestratorProgress({\r\n rootDir: projectContext.stateRootDir,\r\n cwd: options.cwd,\r\n objective: analysis.objective,\r\n });\r\n const seededPlan = await ensureTaskPlan({\r\n rootDir: projectContext.stateRootDir,\r\n cwd: options.cwd,\r\n analysis,\r\n existingTasks: progress.relevantTasks,\r\n });\r\n progress = await loadOrchestratorProgress({\r\n rootDir: projectContext.stateRootDir,\r\n cwd: options.cwd,\r\n objective: analysis.objective,\r\n });\r\n const plan = {\r\n ...seededPlan,\r\n tasks: progress.relevantTasks,\r\n readyTasks: progress.readyTasks,\r\n };\r\n const decision = routeOrchestratorAction({\r\n analysis,\r\n progress,\r\n plan,\r\n });\r\n const dispatched = await dispatchOrchestratorAction({\r\n rootDir: projectContext.stateRootDir,\r\n cwd: options.cwd,\r\n config: options.config,\r\n session: options.session,\r\n sessionStore: options.sessionStore,\r\n analysis,\r\n decision,\r\n callbacks: options.callbacks,\r\n deps: options.deps,\r\n });\r\n\r\n return {\r\n session: dispatched.session,\r\n analysis,\r\n progress,\r\n plan,\r\n decision,\r\n };\r\n}\r\n","import { isContinuationDirective, isInternalMessage } from \"../agent/taskState.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\nimport { normalizeBackgroundCommand } from \"./commandNormalization.js\";\r\nimport {\r\n BACKGROUND_PATTERN,\r\n COMPLEXITY_PATTERN,\r\n INVESTIGATION_PATTERN,\r\n TEAMMATE_PATTERN,\r\n} from \"./intentLexicon.js\";\r\nimport { buildOrchestratorObjective } from \"./metadata.js\";\r\nimport type { OrchestratorAnalysis, OrchestratorProgressSnapshot } from \"./types.js\";\r\n\r\nexport function analyzeOrchestratorInput(input: {\r\n input: string;\r\n session: SessionRecord;\r\n progress?: Partial<Pick<OrchestratorProgressSnapshot, \"relevantTasks\" | \"runningBackgroundJobs\" | \"teammates\">>;\r\n}): OrchestratorAnalysis {\r\n const objective = buildOrchestratorObjective(resolveObjectiveText(input.input, input.session));\r\n const text = objective.text;\r\n const backgroundCommand = normalizeBackgroundCommand(extractBackgroundCommand(text));\r\n const needsInvestigation = INVESTIGATION_PATTERN.test(text);\r\n const wantsTeammate = TEAMMATE_PATTERN.test(text);\r\n const wantsBackground = Boolean(backgroundCommand) || BACKGROUND_PATTERN.test(text);\r\n const wantsSubagent = needsInvestigation || /\\bsubagent\\b|子智能体|子任务/.test(text);\r\n const prefersParallel = wantsTeammate || /\\bparallel\\b|同时|并行/.test(text);\r\n\r\n let score = 0;\r\n if (objective.text.length >= 72) {\r\n score += 1;\r\n }\r\n if (COMPLEXITY_PATTERN.test(text)) {\r\n score += 1;\r\n }\r\n if (needsInvestigation) {\r\n score += 1;\r\n }\r\n if (wantsTeammate || wantsBackground || wantsSubagent) {\r\n score += 1;\r\n }\r\n if ((input.progress?.relevantTasks?.length ?? 0) > 1) {\r\n score += 1;\r\n }\r\n if ((input.progress?.runningBackgroundJobs?.length ?? 0) > 0 || (input.progress?.teammates?.length ?? 0) > 0) {\r\n score += 1;\r\n }\r\n\r\n const complexity = score >= 4 ? \"complex\" : score >= 1 ? \"moderate\" : \"simple\";\r\n\r\n return {\r\n objective,\r\n complexity,\r\n needsInvestigation,\r\n prefersParallel,\r\n wantsBackground,\r\n wantsSubagent,\r\n wantsTeammate,\r\n backgroundCommand,\r\n };\r\n}\r\n\r\nfunction resolveObjectiveText(input: string, session: SessionRecord): string {\r\n const normalizedInput = String(input ?? \"\").trim();\r\n if (normalizedInput && !isInternalMessage(normalizedInput) && !isContinuationDirective(normalizedInput)) {\r\n return normalizedInput;\r\n }\r\n\r\n if (session.taskState?.objective && !isInternalMessage(session.taskState.objective)) {\r\n return session.taskState.objective;\r\n }\r\n\r\n for (let index = session.messages.length - 1; index >= 0; index -= 1) {\r\n const message = session.messages[index];\r\n if (message?.role !== \"user\") {\r\n continue;\r\n }\r\n\r\n const content = String(message.content ?? \"\").trim();\r\n if (content && !isInternalMessage(content)) {\r\n return content;\r\n }\r\n }\r\n\r\n return normalizedInput || \"Continue the current task.\";\r\n}\r\n\r\nfunction extractBackgroundCommand(text: string): string | undefined {\r\n const backtickMatch = text.match(/`([^`]+)`/);\r\n if (backtickMatch?.[1] && BACKGROUND_PATTERN.test(text)) {\r\n return backtickMatch[1].trim();\r\n }\r\n\r\n const prefixedMatch = text.match(/(?:background|后台)\\s*[::]\\s*([^\\n]+)/i);\r\n if (prefixedMatch?.[1]) {\r\n return prefixedMatch[1].trim();\r\n }\r\n\r\n return undefined;\r\n}\r\n","export function normalizeBackgroundCommand(command: string | undefined): string | undefined {\r\n const normalized = String(command ?? \"\").trim();\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n const nodeEvalMatch = normalized.match(/^node\\s+-e\\s+(.+)$/i);\r\n if (!nodeEvalMatch?.[1]) {\r\n return normalized;\r\n }\r\n\r\n const script = nodeEvalMatch[1].trim();\r\n if (!script || /^([\"']).*\\1$/.test(script)) {\r\n return normalized;\r\n }\r\n\r\n return `node -e \"${script.replace(/\"/g, '\\\\\"')}\"`;\r\n}\r\n","const INVESTIGATION_TERMS = [\r\n \"investigate\",\r\n \"inspect\",\r\n \"survey\",\r\n \"analyze\",\r\n \"analyse\",\r\n \"trace\",\r\n \"find\",\r\n \"read through\",\r\n \"调查\",\r\n \"梳理\",\r\n \"定位\",\r\n \"分析\",\r\n \"巡检\",\r\n \"排查\",\r\n] as const;\r\n\r\nconst TEAMMATE_TERMS = [\r\n \"teammate\",\r\n \"parallel\",\r\n \"coworker\",\r\n \"并行\",\r\n \"队友\",\r\n \"分给别人\",\r\n \"交给队友\",\r\n] as const;\r\n\r\nconst BACKGROUND_TERMS = [\r\n \"background\",\r\n \"后台\",\r\n \"长时间\",\r\n \"耗时\",\r\n \"慢操作\",\r\n] as const;\r\n\r\nconst COMPLEXITY_TERMS = [\r\n \"refactor\",\r\n \"verify\",\r\n \"validate\",\r\n \"integrate\",\r\n \"integration\",\r\n \"coordinate\",\r\n \"split\",\r\n \"orchestrate\",\r\n \"orchestration\",\r\n \"orchestrator\",\r\n \"重构\",\r\n \"验证\",\r\n \"拆分\",\r\n \"协调\",\r\n \"接线\",\r\n \"回归\",\r\n] as const;\r\n\r\nexport const INVESTIGATION_PATTERN = buildKeywordPattern(INVESTIGATION_TERMS);\r\nexport const TEAMMATE_PATTERN = buildKeywordPattern(TEAMMATE_TERMS);\r\nexport const BACKGROUND_PATTERN = buildKeywordPattern(BACKGROUND_TERMS);\r\nexport const COMPLEXITY_PATTERN = buildKeywordPattern(COMPLEXITY_TERMS);\r\n\r\nfunction buildKeywordPattern(terms: readonly string[]): RegExp {\r\n return new RegExp(`(${terms.map(escapeRegExp).join(\"|\")})`, \"i\");\r\n}\r\n\r\nfunction escapeRegExp(value: string): string {\r\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n}\r\n","import crypto from \"node:crypto\";\r\n\r\nimport type { TaskRecord } from \"../tasks/types.js\";\r\nimport type { OrchestratorObjective, OrchestratorTaskMeta, OrchestratorTaskSnapshot } from \"./types.js\";\r\n\r\nconst ORCHESTRATOR_MARKER = \"[athlete-orchestrator]\";\r\n\r\nexport function buildOrchestratorObjective(text: string): OrchestratorObjective {\r\n const normalized = normalizeText(text) || \"current task\";\r\n return {\r\n key: crypto.createHash(\"sha1\").update(normalized.toLowerCase()).digest(\"hex\").slice(0, 10),\r\n text: normalized,\r\n };\r\n}\r\n\r\nexport function readOrchestratorTask(task: TaskRecord): OrchestratorTaskSnapshot | null {\r\n const meta = readOrchestratorMetadata(task.description);\r\n if (!meta) {\r\n return null;\r\n }\r\n\r\n return {\r\n record: task,\r\n meta,\r\n };\r\n}\r\n\r\nexport function readOrchestratorMetadata(description: string): OrchestratorTaskMeta | null {\r\n const match = String(description ?? \"\").match(/\\[athlete-orchestrator\\]\\s*([\\s\\S]+)$/);\r\n if (!match?.[1]) {\r\n return null;\r\n }\r\n\r\n try {\r\n const parsed = JSON.parse(match[1]) as Partial<OrchestratorTaskMeta>;\r\n if (!parsed || typeof parsed !== \"object\") {\r\n return null;\r\n }\r\n\r\n if (!parsed.key || !parsed.kind || !parsed.objective) {\r\n return null;\r\n }\r\n\r\n if (parsed.kind !== \"survey\" && parsed.kind !== \"implementation\" && parsed.kind !== \"validation\") {\r\n return null;\r\n }\r\n\r\n return {\r\n key: normalizeText(parsed.key),\r\n kind: parsed.kind,\r\n objective: normalizeText(parsed.objective),\r\n backgroundCommand: normalizeOptionalText(parsed.backgroundCommand),\r\n delegatedTo: normalizeOptionalText(parsed.delegatedTo),\r\n jobId: normalizeOptionalText(parsed.jobId),\r\n };\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport function writeOrchestratorMetadata(description: string, meta: OrchestratorTaskMeta): string {\r\n const base = stripOrchestratorMetadata(description);\r\n const payload = JSON.stringify(\r\n {\r\n key: normalizeText(meta.key),\r\n kind: meta.kind,\r\n objective: normalizeText(meta.objective),\r\n backgroundCommand: normalizeOptionalText(meta.backgroundCommand),\r\n delegatedTo: normalizeOptionalText(meta.delegatedTo),\r\n jobId: normalizeOptionalText(meta.jobId),\r\n },\r\n null,\r\n 2,\r\n );\r\n\r\n return [base, ORCHESTRATOR_MARKER, payload]\r\n .filter((part) => part && part.trim().length > 0)\r\n .join(\"\\n\\n\");\r\n}\r\n\r\nexport function stripOrchestratorMetadata(description: string): string {\r\n return String(description ?? \"\")\r\n .replace(/\\s*\\[athlete-orchestrator\\]\\s*[\\s\\S]*$/m, \"\")\r\n .trim();\r\n}\r\n\r\nfunction normalizeText(value: unknown): string {\r\n return String(value ?? \"\").replace(/\\s+/g, \" \").trim();\r\n}\r\n\r\nfunction normalizeOptionalText(value: unknown): string | undefined {\r\n const normalized = normalizeText(value);\r\n return normalized.length > 0 ? normalized : undefined;\r\n}\r\n","import { createMessage } from \"../agent/messages.js\";\r\nimport { createEmptyTaskState, createInternalReminder } from \"../agent/taskState.js\";\r\nimport { BackgroundJobStore } from \"../background/store.js\";\r\nimport { spawnBackgroundProcess as defaultSpawnBackgroundProcess } from \"../background/spawn.js\";\r\nimport { runSubagentTask as defaultRunSubagentTask } from \"../subagent/run.js\";\r\nimport { MessageBus } from \"../team/messageBus.js\";\r\nimport { TeamStore } from \"../team/store.js\";\r\nimport { spawnTeammateProcess as defaultSpawnTeammateProcess } from \"../team/spawn.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { createToolRegistry } from \"../tools/index.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\nimport { normalizeBackgroundCommand } from \"./commandNormalization.js\";\r\nimport { readOrchestratorMetadata, writeOrchestratorMetadata } from \"./metadata.js\";\r\nimport type {\r\n OrchestratorAnalysis,\r\n OrchestratorDecision,\r\n OrchestratorDispatchDependencies,\r\n OrchestratorSubagentInput,\r\n PrepareLeadTurnOptions,\r\n} from \"./types.js\";\r\n\r\nexport async function dispatchOrchestratorAction(input: {\r\n rootDir: string;\r\n cwd: string;\r\n config: PrepareLeadTurnOptions[\"config\"];\r\n session: PrepareLeadTurnOptions[\"session\"];\r\n sessionStore: PrepareLeadTurnOptions[\"sessionStore\"];\r\n analysis: OrchestratorAnalysis;\r\n decision: OrchestratorDecision;\r\n callbacks?: PrepareLeadTurnOptions[\"callbacks\"];\r\n deps?: OrchestratorDispatchDependencies;\r\n}): Promise<{\r\n session: PrepareLeadTurnOptions[\"session\"];\r\n decision: OrchestratorDecision;\r\n}> {\r\n const deps = {\r\n runSubagentTask: input.deps?.runSubagentTask ?? (async (options: OrchestratorSubagentInput) =>\r\n defaultRunSubagentTask({\r\n ...options,\r\n createToolRegistry,\r\n })),\r\n spawnTeammateProcess: input.deps?.spawnTeammateProcess ?? defaultSpawnTeammateProcess,\r\n spawnBackgroundProcess: input.deps?.spawnBackgroundProcess ?? defaultSpawnBackgroundProcess,\r\n };\r\n const taskStore = new TaskStore(input.rootDir);\r\n let session = await input.sessionStore.save({\r\n ...input.session,\r\n taskState: {\r\n ...(input.session.taskState ?? createEmptyTaskState()),\r\n objective: input.analysis.objective.text,\r\n lastUpdatedAt: new Date().toISOString(),\r\n },\r\n });\r\n\r\n switch (input.decision.action) {\r\n case \"delegate_subagent\": {\r\n const task = input.decision.task;\r\n if (!task) {\r\n return { session, decision: input.decision };\r\n }\r\n\r\n await claimForLead(taskStore, task.record.id);\r\n const result = await deps.runSubagentTask({\r\n description: task.record.subject,\r\n prompt: buildSubagentPrompt(input.analysis, task.record.id, task.record.subject),\r\n agentType: input.decision.subagentType ?? \"explore\",\r\n cwd: input.cwd,\r\n config: input.config,\r\n callbacks: input.callbacks,\r\n });\r\n await taskStore.update(task.record.id, {\r\n status: \"completed\",\r\n owner: \"lead\",\r\n });\r\n session = await appendOrchestratorNote(\r\n session,\r\n input.sessionStore,\r\n `Orchestrator delegated Task #${task.record.id} to a subagent and completed it.\\n<subagent-result>${result.content}</subagent-result>`,\r\n );\r\n break;\r\n }\r\n\r\n case \"delegate_teammate\": {\r\n const task = input.decision.task;\r\n const teammate = input.decision.teammate;\r\n if (!task || !teammate) {\r\n return { session, decision: input.decision };\r\n }\r\n\r\n await taskStore.assign(task.record.id, teammate.name);\r\n await patchTaskMetadata(taskStore, task.record.id, {\r\n delegatedTo: teammate.name,\r\n });\r\n const teamStore = new TeamStore(input.rootDir);\r\n const existing = await teamStore.findMember(teammate.name);\r\n const prompt = buildTeammatePrompt(input.analysis, task.record.id, task.record.subject);\r\n if (!existing || existing.status === \"shutdown\" || typeof existing.pid !== \"number\") {\r\n const pid = deps.spawnTeammateProcess({\r\n rootDir: input.rootDir,\r\n config: input.config,\r\n name: teammate.name,\r\n role: teammate.role,\r\n prompt,\r\n });\r\n await teamStore.upsertMember(teammate.name, teammate.role, \"working\", {\r\n pid,\r\n sessionId: existing?.sessionId,\r\n });\r\n }\r\n\r\n await new MessageBus(input.rootDir)\r\n .send(\"lead\", teammate.name, prompt, \"message\")\r\n .catch(() => null);\r\n session = await appendOrchestratorNote(\r\n session,\r\n input.sessionStore,\r\n `Orchestrator assigned Task #${task.record.id} to teammate '${teammate.name}'.`,\r\n );\r\n break;\r\n }\r\n\r\n case \"run_in_background\": {\r\n const command = normalizeBackgroundCommand(input.decision.backgroundCommand ?? input.analysis.backgroundCommand);\r\n if (!command) {\r\n return { session, decision: input.decision };\r\n }\r\n\r\n const cwd = input.decision.task\r\n ? await new WorktreeStore(input.rootDir).resolveTaskCwd(input.decision.task.record.id).catch(() => input.cwd)\r\n : input.cwd;\r\n const store = new BackgroundJobStore(input.rootDir);\r\n const job = await store.create({\r\n command,\r\n cwd,\r\n requestedBy: \"lead\",\r\n timeoutMs: 120_000,\r\n stallTimeoutMs: input.config.commandStallTimeoutMs,\r\n });\r\n const pid = deps.spawnBackgroundProcess({\r\n rootDir: input.rootDir,\r\n jobId: job.id,\r\n });\r\n await store.setPid(job.id, pid);\r\n if (input.decision.task) {\r\n await claimForLead(taskStore, input.decision.task.record.id);\r\n await patchTaskMetadata(taskStore, input.decision.task.record.id, {\r\n backgroundCommand: command,\r\n jobId: job.id,\r\n });\r\n }\r\n session = await appendOrchestratorNote(\r\n session,\r\n input.sessionStore,\r\n `Orchestrator started background job ${job.id} for '${command}'.`,\r\n );\r\n break;\r\n }\r\n\r\n case \"wait_for_existing_work\": {\r\n session = await appendOrchestratorNote(\r\n session,\r\n input.sessionStore,\r\n \"Orchestrator is waiting for existing delegated work before issuing more dispatches.\",\r\n );\r\n break;\r\n }\r\n\r\n case \"self_execute\":\r\n default: {\r\n if (input.decision.task && (!input.decision.task.record.owner || input.decision.task.record.owner === \"lead\")) {\r\n await claimForLead(taskStore, input.decision.task.record.id);\r\n session = await appendOrchestratorNote(\r\n session,\r\n input.sessionStore,\r\n `Orchestrator kept Task #${input.decision.task.record.id} on the lead for direct execution.`,\r\n );\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n session,\r\n decision: input.decision,\r\n };\r\n}\r\n\r\nasync function claimForLead(taskStore: TaskStore, taskId: number): Promise<void> {\r\n const current = await taskStore.load(taskId);\r\n if (current.owner === \"lead\") {\r\n return;\r\n }\r\n\r\n if (!current.owner) {\r\n await taskStore.claim(taskId, \"lead\").catch(() => null);\r\n }\r\n}\r\n\r\nasync function patchTaskMetadata(\r\n taskStore: TaskStore,\r\n taskId: number,\r\n patch: {\r\n backgroundCommand?: string;\r\n delegatedTo?: string;\r\n jobId?: string;\r\n },\r\n): Promise<void> {\r\n const task = await taskStore.load(taskId);\r\n const meta = readOrchestratorMetadata(task.description);\r\n if (!meta) {\r\n return;\r\n }\r\n\r\n await taskStore.save({\r\n ...task,\r\n description: writeOrchestratorMetadata(task.description, {\r\n ...meta,\r\n ...patch,\r\n }),\r\n });\r\n}\r\n\r\nasync function appendOrchestratorNote(\r\n session: PrepareLeadTurnOptions[\"session\"],\r\n sessionStore: PrepareLeadTurnOptions[\"sessionStore\"],\r\n text: string,\r\n): Promise<PrepareLeadTurnOptions[\"session\"]> {\r\n const content = createInternalReminder(`Orchestrator: ${text}`);\r\n const recentDuplicate = session.messages\r\n .slice(-6)\r\n .some((message) => message.role === \"user\" && message.content === content);\r\n if (recentDuplicate) {\r\n return session;\r\n }\r\n\r\n return sessionStore.appendMessages(session, [\r\n createMessage(\"user\", content),\r\n ]);\r\n}\r\n\r\nfunction buildSubagentPrompt(analysis: OrchestratorAnalysis, taskId: number, subject: string): string {\r\n return [\r\n `Focus on Task #${taskId}: ${subject}.`,\r\n `Objective: ${analysis.objective.text}`,\r\n \"Return only the concrete facts the lead needs next. Do not make unrelated changes.\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction buildTeammatePrompt(analysis: OrchestratorAnalysis, taskId: number, subject: string): string {\r\n return [\r\n `Claim Task #${taskId} from the persistent task board and execute only that scope.`,\r\n `Objective: ${analysis.objective.text}`,\r\n `Task focus: ${subject}`,\r\n \"Keep the task board updated, use isolated worktrees when provided, and message the lead if you are blocked.\",\r\n ].join(\"\\n\");\r\n}\r\n","import { reconcileBackgroundJobs } from \"../background/reconcile.js\";\r\nimport { BackgroundJobStore } from \"../background/store.js\";\r\nimport { CoordinationPolicyStore } from \"../team/policyStore.js\";\r\nimport { ProtocolRequestStore } from \"../team/requestStore.js\";\r\nimport { reconcileTeamState } from \"../team/reconcile.js\";\r\nimport { TeamStore } from \"../team/store.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\nimport { readOrchestratorTask } from \"./metadata.js\";\r\nimport type { OrchestratorObjective, OrchestratorProgressSnapshot, OrchestratorTaskSnapshot } from \"./types.js\";\r\n\r\nconst TASK_KIND_ORDER = {\r\n survey: 0,\r\n implementation: 1,\r\n validation: 2,\r\n} as const;\r\n\r\nexport async function loadOrchestratorProgress(input: {\r\n rootDir: string;\r\n cwd: string;\r\n objective: OrchestratorObjective;\r\n}): Promise<OrchestratorProgressSnapshot> {\r\n await reconcileTeamState(input.rootDir).catch(() => null);\r\n await reconcileBackgroundJobs(input.rootDir).catch(() => null);\r\n\r\n const taskStore = new TaskStore(input.rootDir);\r\n const backgroundStore = new BackgroundJobStore(input.rootDir);\r\n const [tasks, teammates, relevantBackgroundJobs, worktrees, protocolRequests, policy] = await Promise.all([\r\n taskStore.list(),\r\n new TeamStore(input.rootDir).listMembers().catch(() => []),\r\n backgroundStore.listRelevant({\r\n cwd: input.cwd,\r\n requestedBy: \"lead\",\r\n }).catch(() => []),\r\n new WorktreeStore(input.rootDir).list().catch(() => []),\r\n new ProtocolRequestStore(input.rootDir).list().catch(() => []),\r\n new CoordinationPolicyStore(input.rootDir).load().catch(() => ({\r\n allowPlanDecisions: false,\r\n allowShutdownRequests: false,\r\n updatedAt: new Date().toISOString(),\r\n })),\r\n ]);\r\n\r\n await syncSuccessfulBackgroundTasks(taskStore, tasks, relevantBackgroundJobs);\r\n const refreshedTasks = await taskStore.list();\r\n const relevantTasks = refreshedTasks\r\n .map((task) => readOrchestratorTask(task))\r\n .filter((task): task is OrchestratorTaskSnapshot => Boolean(task && task.meta.key === input.objective.key));\r\n const readyTasks = relevantTasks\r\n .filter((task) => isReadyTask(task))\r\n .sort(compareTasks);\r\n\r\n return {\r\n rootDir: input.rootDir,\r\n cwd: input.cwd,\r\n tasks: refreshedTasks,\r\n relevantTasks: relevantTasks.sort(compareTasks),\r\n readyTasks,\r\n relevantBackgroundJobs,\r\n runningBackgroundJobs: relevantBackgroundJobs.filter((job) => job.status === \"running\"),\r\n teammates,\r\n idleTeammates: teammates.filter((member) => member.status === \"idle\"),\r\n workingTeammates: teammates.filter((member) => member.status === \"working\"),\r\n worktrees,\r\n protocolRequests,\r\n policy,\r\n };\r\n}\r\n\r\nasync function syncSuccessfulBackgroundTasks(\r\n taskStore: TaskStore,\r\n tasks: Awaited<ReturnType<TaskStore[\"list\"]>>,\r\n jobs: Awaited<ReturnType<BackgroundJobStore[\"listRelevant\"]>>,\r\n): Promise<void> {\r\n const jobsById = new Map(jobs.map((job) => [job.id, job]));\r\n for (const task of tasks) {\r\n const orchestrated = readOrchestratorTask(task);\r\n if (!orchestrated?.meta.jobId || task.status === \"completed\") {\r\n continue;\r\n }\r\n\r\n const job = jobsById.get(orchestrated.meta.jobId);\r\n if (!job || job.status !== \"completed\" || job.exitCode !== 0) {\r\n continue;\r\n }\r\n\r\n await taskStore.update(task.id, {\r\n status: \"completed\",\r\n owner: task.owner || \"lead\",\r\n }).catch(() => null);\r\n }\r\n}\r\n\r\nfunction isReadyTask(task: OrchestratorTaskSnapshot): boolean {\r\n if (task.record.status === \"completed\") {\r\n return false;\r\n }\r\n\r\n if (task.record.blockedBy.length > 0) {\r\n return false;\r\n }\r\n\r\n return !task.record.owner || task.record.owner === \"lead\";\r\n}\r\n\r\nfunction compareTasks(left: OrchestratorTaskSnapshot, right: OrchestratorTaskSnapshot): number {\r\n const leftOrder = TASK_KIND_ORDER[left.meta.kind] ?? 99;\r\n const rightOrder = TASK_KIND_ORDER[right.meta.kind] ?? 99;\r\n if (leftOrder !== rightOrder) {\r\n return leftOrder - rightOrder;\r\n }\r\n\r\n return left.record.id - right.record.id;\r\n}\r\n","import type { TeamMemberRecord } from \"../team/types.js\";\r\nimport type {\r\n OrchestratorAnalysis,\r\n OrchestratorDecision,\r\n OrchestratorProgressSnapshot,\r\n OrchestratorTaskPlan,\r\n OrchestratorTaskSnapshot,\r\n} from \"./types.js\";\r\n\r\nexport function routeOrchestratorAction(input: {\r\n analysis: OrchestratorAnalysis;\r\n progress: OrchestratorProgressSnapshot;\r\n plan: OrchestratorTaskPlan;\r\n}): OrchestratorDecision {\r\n const readyTasks = input.plan.readyTasks.length > 0 ? input.plan.readyTasks : input.progress.readyTasks;\r\n const surveyTask = readyTasks.find((task) => task.meta.kind === \"survey\");\r\n const implementationTask = readyTasks.find((task) => task.meta.kind === \"implementation\");\r\n const validationTask = readyTasks.find((task) => task.meta.kind === \"validation\");\r\n\r\n if (surveyTask) {\r\n return {\r\n action: \"delegate_subagent\",\r\n reason: `Task #${surveyTask.record.id} should be surveyed before implementation.`,\r\n task: surveyTask,\r\n subagentType: \"explore\",\r\n };\r\n }\r\n\r\n if (input.analysis.wantsBackground && input.analysis.backgroundCommand) {\r\n const runningMatch = input.progress.runningBackgroundJobs.find((job) => job.command === input.analysis.backgroundCommand);\r\n if (runningMatch && !implementationTask && !validationTask) {\r\n return {\r\n action: \"wait_for_existing_work\",\r\n reason: `Background job ${runningMatch.id} is still running.`,\r\n };\r\n }\r\n\r\n const targetTask = validationTask ?? implementationTask;\r\n if (targetTask) {\r\n return {\r\n action: \"run_in_background\",\r\n reason: `Task #${targetTask.record.id} should run as background work.`,\r\n task: targetTask,\r\n backgroundCommand: input.analysis.backgroundCommand,\r\n };\r\n }\r\n }\r\n\r\n if (implementationTask && shouldDelegateToTeammate(input.analysis, input.progress, implementationTask)) {\r\n return {\r\n action: \"delegate_teammate\",\r\n reason: `Task #${implementationTask.record.id} can run in parallel.`,\r\n task: implementationTask,\r\n teammate: selectTeammateTarget(input.progress.idleTeammates, input.progress.teammates, implementationTask),\r\n };\r\n }\r\n\r\n if (!implementationTask && !validationTask && hasRunningDelegatedWork(input.progress)) {\r\n return {\r\n action: \"wait_for_existing_work\",\r\n reason: \"Delegated work is already in progress and no ready task remains for the lead.\",\r\n };\r\n }\r\n\r\n const focusTask = implementationTask ?? validationTask ?? readyTasks[0];\r\n return {\r\n action: \"self_execute\",\r\n reason: focusTask\r\n ? `Lead keeps Task #${focusTask.record.id} on the current turn.`\r\n : \"No additional orchestration work is needed before the lead continues directly.\",\r\n task: focusTask,\r\n };\r\n}\r\n\r\nfunction shouldDelegateToTeammate(\r\n analysis: OrchestratorAnalysis,\r\n progress: OrchestratorProgressSnapshot,\r\n task: OrchestratorTaskSnapshot,\r\n): boolean {\r\n if (task.record.assignee && task.record.assignee !== \"lead\") {\r\n return true;\r\n }\r\n\r\n if (analysis.wantsTeammate) {\r\n return true;\r\n }\r\n\r\n return analysis.prefersParallel && analysis.complexity === \"complex\" && (progress.idleTeammates.length > 0 || progress.teammates.length === 0);\r\n}\r\n\r\nfunction selectTeammateTarget(\r\n idleTeammates: TeamMemberRecord[],\r\n teammates: TeamMemberRecord[],\r\n task: OrchestratorTaskSnapshot,\r\n): { name: string; role: string } {\r\n if (task.record.assignee) {\r\n const existing = teammates.find((member) => member.name === task.record.assignee);\r\n return {\r\n name: task.record.assignee,\r\n role: existing?.role ?? \"implementer\",\r\n };\r\n }\r\n\r\n if (idleTeammates.length > 0) {\r\n const firstIdle = idleTeammates[0];\r\n if (!firstIdle) {\r\n return {\r\n name: `worker-${teammates.length + 1}`,\r\n role: \"implementer\",\r\n };\r\n }\r\n\r\n return {\r\n name: firstIdle.name,\r\n role: firstIdle.role,\r\n };\r\n }\r\n\r\n return {\r\n name: `worker-${teammates.length + 1}`,\r\n role: \"implementer\",\r\n };\r\n}\r\n\r\nfunction hasRunningDelegatedWork(progress: OrchestratorProgressSnapshot): boolean {\r\n return progress.runningBackgroundJobs.length > 0 || progress.workingTeammates.length > 0;\r\n}\r\n","import { TaskStore } from \"../tasks/store.js\";\r\nimport { readOrchestratorTask, writeOrchestratorMetadata } from \"./metadata.js\";\r\nimport type { OrchestratorAnalysis, OrchestratorTaskKind, OrchestratorTaskPlan, OrchestratorTaskSnapshot } from \"./types.js\";\r\n\r\ninterface TaskSpec {\r\n kind: OrchestratorTaskKind;\r\n blockedBy?: OrchestratorTaskKind;\r\n}\r\n\r\nexport async function ensureTaskPlan(input: {\r\n rootDir: string;\r\n cwd: string;\r\n analysis: OrchestratorAnalysis;\r\n existingTasks: OrchestratorTaskSnapshot[];\r\n}): Promise<OrchestratorTaskPlan> {\r\n const specs = buildTaskSpecs(input.analysis);\r\n if (specs.length === 0) {\r\n return {\r\n objective: input.analysis.objective,\r\n createdTaskIds: [],\r\n tasks: input.existingTasks,\r\n readyTasks: input.existingTasks.filter((task) => task.record.status !== \"completed\" && task.record.blockedBy.length === 0),\r\n };\r\n }\r\n\r\n const store = new TaskStore(input.rootDir);\r\n const existingByKind = new Map(input.existingTasks.map((task) => [task.meta.kind, task]));\r\n const createdTaskIds: number[] = [];\r\n\r\n for (const spec of specs) {\r\n let current = existingByKind.get(spec.kind);\r\n if (!current) {\r\n const created = await store.create(\r\n buildTaskSubject(spec.kind, input.analysis.objective.text),\r\n writeOrchestratorMetadata(\r\n buildTaskDescription(spec.kind, input.analysis.objective.text),\r\n {\r\n key: input.analysis.objective.key,\r\n kind: spec.kind,\r\n objective: input.analysis.objective.text,\r\n backgroundCommand: spec.kind === \"validation\" ? input.analysis.backgroundCommand : undefined,\r\n },\r\n ),\r\n );\r\n createdTaskIds.push(created.id);\r\n const createdSnapshot = readOrchestratorTask(created);\r\n current = createdSnapshot ?? undefined;\r\n if (current) {\r\n existingByKind.set(spec.kind, current);\r\n }\r\n continue;\r\n }\r\n\r\n if (spec.kind === \"validation\" && input.analysis.backgroundCommand && current.meta.backgroundCommand !== input.analysis.backgroundCommand) {\r\n const saved = await store.save({\r\n ...current.record,\r\n description: writeOrchestratorMetadata(current.record.description, {\r\n ...current.meta,\r\n backgroundCommand: input.analysis.backgroundCommand,\r\n }),\r\n });\r\n const refreshed = readOrchestratorTask(saved);\r\n if (refreshed) {\r\n existingByKind.set(spec.kind, refreshed);\r\n }\r\n }\r\n }\r\n\r\n for (const spec of specs) {\r\n if (!spec.blockedBy) {\r\n continue;\r\n }\r\n\r\n const task = existingByKind.get(spec.kind);\r\n const blocker = existingByKind.get(spec.blockedBy);\r\n if (!task || !blocker || task.record.blockedBy.includes(blocker.record.id)) {\r\n continue;\r\n }\r\n\r\n const updated = await store.update(task.record.id, {\r\n addBlockedBy: [blocker.record.id],\r\n });\r\n const refreshed = readOrchestratorTask(updated);\r\n if (refreshed) {\r\n existingByKind.set(spec.kind, refreshed);\r\n }\r\n }\r\n\r\n const tasks = [...existingByKind.values()].sort(compareTasks);\r\n return {\r\n objective: input.analysis.objective,\r\n createdTaskIds,\r\n tasks,\r\n readyTasks: tasks.filter((task) => task.record.status !== \"completed\" && task.record.blockedBy.length === 0),\r\n };\r\n}\r\n\r\nfunction buildTaskSpecs(analysis: OrchestratorAnalysis): TaskSpec[] {\r\n if (analysis.complexity === \"simple\" && !analysis.wantsBackground && !analysis.wantsSubagent && !analysis.wantsTeammate) {\r\n return [];\r\n }\r\n\r\n const specs: TaskSpec[] = [];\r\n if (analysis.needsInvestigation || analysis.wantsSubagent) {\r\n specs.push({ kind: \"survey\" });\r\n }\r\n\r\n specs.push({\r\n kind: \"implementation\",\r\n blockedBy: specs.some((spec) => spec.kind === \"survey\") ? \"survey\" : undefined,\r\n });\r\n specs.push({\r\n kind: \"validation\",\r\n blockedBy: \"implementation\",\r\n });\r\n return specs;\r\n}\r\n\r\nfunction buildTaskSubject(kind: OrchestratorTaskKind, objective: string): string {\r\n const label =\r\n kind === \"survey\"\r\n ? \"Survey\"\r\n : kind === \"implementation\"\r\n ? \"Implement\"\r\n : \"Validate\";\r\n return `${label}: ${truncate(objective, 120)}`;\r\n}\r\n\r\nfunction buildTaskDescription(kind: OrchestratorTaskKind, objective: string): string {\r\n switch (kind) {\r\n case \"survey\":\r\n return `Gather the minimum concrete facts needed before implementation.\\nObjective: ${objective}`;\r\n case \"validation\":\r\n return `Run the smallest useful validation pass after implementation.\\nObjective: ${objective}`;\r\n default:\r\n return `Execute the main implementation work for the current objective.\\nObjective: ${objective}`;\r\n }\r\n}\r\n\r\nfunction compareTasks(left: OrchestratorTaskSnapshot, right: OrchestratorTaskSnapshot): number {\r\n const order = {\r\n survey: 0,\r\n implementation: 1,\r\n validation: 2,\r\n } as const;\r\n const leftOrder = order[left.meta.kind] ?? 99;\r\n const rightOrder = order[right.meta.kind] ?? 99;\r\n if (leftOrder !== rightOrder) {\r\n return leftOrder - rightOrder;\r\n }\r\n\r\n return left.record.id - right.record.id;\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n return value.length <= maxChars ? value : `${value.slice(0, maxChars)}...`;\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport { loadDotEnvFiles } from \"./env.js\";\r\nimport { resolveProjectRoots } from \"../context/repoRoots.js\";\r\nimport { getDefaultMcpConfig, normalizeMcpConfig } from \"../mcp/config.js\";\r\nimport { getAppPaths } from \"./paths.js\";\r\nimport {\r\n DEFAULT_TELEGRAM_CONFIG,\r\n normalizeTelegramConfig,\r\n parseTelegramAllowedUserIds,\r\n resolveTelegramRuntimeConfig,\r\n} from \"../telegram/config.js\";\r\nimport { FileWeixinCredentialStore } from \"../weixin/credentialsStore.js\";\r\nimport {\r\n DEFAULT_WEIXIN_CONFIG,\r\n normalizeWeixinConfig,\r\n parseWeixinAllowedUserIds,\r\n resolveWeixinRuntimeConfig,\r\n} from \"../weixin/config.js\";\r\nimport type { AgentMode, AppConfig, CliOverrides, MineruRuntimeConfig, RuntimeConfig } from \"../types.js\";\r\n\r\nconst DEFAULT_CONFIG: AppConfig = {\r\n provider: \"deepseek\",\r\n baseUrl: \"https://api.deepseek.com\",\r\n model: \"deepseek-reasoner\",\r\n mode: \"agent\",\r\n allowedRoots: [\".\"],\r\n yieldAfterToolSteps: 12,\r\n contextWindowMessages: 30,\r\n maxContextChars: 48_000,\r\n contextSummaryChars: 8_000,\r\n maxToolIterations: 8,\r\n maxContinuationBatches: 8,\r\n maxReadBytes: 120_000,\r\n maxSearchResults: 80,\r\n maxSpreadsheetPreviewRows: 20,\r\n maxSpreadsheetPreviewColumns: 12,\r\n commandStallTimeoutMs: 30_000,\r\n commandMaxRetries: 1,\r\n commandRetryBackoffMs: 1_500,\r\n showReasoning: true,\r\n mcp: getDefaultMcpConfig(),\r\n telegram: DEFAULT_TELEGRAM_CONFIG,\r\n weixin: DEFAULT_WEIXIN_CONFIG,\r\n};\r\n\r\nexport async function ensureAppDirectories(): Promise<ReturnType<typeof getAppPaths>> {\r\n const paths = getAppPaths();\r\n await fs.mkdir(paths.configDir, { recursive: true });\r\n await fs.mkdir(paths.dataDir, { recursive: true });\r\n await fs.mkdir(paths.cacheDir, { recursive: true });\r\n await fs.mkdir(paths.sessionsDir, { recursive: true });\r\n await fs.mkdir(paths.changesDir, { recursive: true });\r\n return paths;\r\n}\r\n\r\nexport function getDefaultConfig(): AppConfig {\r\n return structuredClone(DEFAULT_CONFIG);\r\n}\r\n\r\nexport async function loadConfig(): Promise<AppConfig> {\r\n const paths = await ensureAppDirectories();\r\n\r\n try {\r\n const raw = await fs.readFile(paths.configFile, \"utf8\");\r\n const parsed = JSON.parse(raw) as Partial<AppConfig>;\r\n return normalizeConfig(mergeAppConfig(DEFAULT_CONFIG, parsed));\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return getDefaultConfig();\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function saveConfig(config: AppConfig): Promise<void> {\r\n const paths = await ensureAppDirectories();\r\n const normalized = normalizeConfig(config);\r\n await fs.writeFile(paths.configFile, `${JSON.stringify(normalized, null, 2)}\\n`, \"utf8\");\r\n}\r\n\r\nexport async function updateConfig(\r\n updater: (config: AppConfig) => AppConfig | Promise<AppConfig>,\r\n): Promise<AppConfig> {\r\n const current = await loadConfig();\r\n const next = await updater(current);\r\n await saveConfig(next);\r\n return next;\r\n}\r\n\r\nexport async function resolveRuntimeConfig(overrides: CliOverrides = {}): Promise<RuntimeConfig> {\r\n const cwd = overrides.cwd ?? process.cwd();\r\n loadDotEnvFiles(cwd);\r\n const paths = await ensureAppDirectories();\r\n const fileConfig = await loadConfig();\r\n const projectRoots = await resolveProjectRoots(cwd);\r\n const playwrightEnabled = parseBooleanEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_ENABLED) ?? fileConfig.mcp.playwright.enabled;\r\n const telegramAllowedUserIds = process.env.ATHLETE_TELEGRAM_ALLOWED_USER_IDS\r\n ? parseTelegramAllowedUserIds(process.env.ATHLETE_TELEGRAM_ALLOWED_USER_IDS)\r\n : fileConfig.telegram.allowedUserIds;\r\n const telegramConfig = normalizeTelegramConfig({\r\n ...fileConfig.telegram,\r\n token: process.env.ATHLETE_TELEGRAM_TOKEN ?? fileConfig.telegram.token,\r\n apiBaseUrl: process.env.ATHLETE_TELEGRAM_API_BASE_URL ?? fileConfig.telegram.apiBaseUrl,\r\n proxyUrl: process.env.ATHLETE_TELEGRAM_PROXY_URL ?? fileConfig.telegram.proxyUrl,\r\n allowedUserIds: telegramAllowedUserIds,\r\n polling: {\r\n ...fileConfig.telegram.polling,\r\n timeoutSeconds:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_POLLING_TIMEOUT_SECONDS) ?? fileConfig.telegram.polling.timeoutSeconds,\r\n limit: parseIntegerEnv(process.env.ATHLETE_TELEGRAM_POLLING_LIMIT) ?? fileConfig.telegram.polling.limit,\r\n retryBackoffMs:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_POLLING_RETRY_BACKOFF_MS) ??\r\n fileConfig.telegram.polling.retryBackoffMs,\r\n },\r\n delivery: {\r\n ...fileConfig.telegram.delivery,\r\n maxRetries:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_DELIVERY_MAX_RETRIES) ?? fileConfig.telegram.delivery.maxRetries,\r\n baseDelayMs:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_DELIVERY_BASE_DELAY_MS) ??\r\n fileConfig.telegram.delivery.baseDelayMs,\r\n maxDelayMs:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_DELIVERY_MAX_DELAY_MS) ?? fileConfig.telegram.delivery.maxDelayMs,\r\n },\r\n messageChunkChars:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_MESSAGE_CHUNK_CHARS) ?? fileConfig.telegram.messageChunkChars,\r\n typingIntervalMs:\r\n parseIntegerEnv(process.env.ATHLETE_TELEGRAM_TYPING_INTERVAL_MS) ?? fileConfig.telegram.typingIntervalMs,\r\n });\r\n const weixinAllowedUserIds = process.env.ATHLETE_WEIXIN_ALLOWED_USER_IDS\r\n ? parseWeixinAllowedUserIds(process.env.ATHLETE_WEIXIN_ALLOWED_USER_IDS)\r\n : fileConfig.weixin.allowedUserIds;\r\n const weixinConfig = normalizeWeixinConfig({\r\n ...fileConfig.weixin,\r\n baseUrl: process.env.ATHLETE_WEIXIN_BASE_URL ?? fileConfig.weixin.baseUrl,\r\n cdnBaseUrl: process.env.ATHLETE_WEIXIN_CDN_BASE_URL ?? fileConfig.weixin.cdnBaseUrl,\r\n allowedUserIds: weixinAllowedUserIds,\r\n polling: {\r\n ...fileConfig.weixin.polling,\r\n timeoutMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_POLLING_TIMEOUT_MS) ?? fileConfig.weixin.polling.timeoutMs,\r\n retryBackoffMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_POLLING_RETRY_BACKOFF_MS) ??\r\n fileConfig.weixin.polling.retryBackoffMs,\r\n },\r\n delivery: {\r\n ...fileConfig.weixin.delivery,\r\n maxRetries:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_DELIVERY_MAX_RETRIES) ?? fileConfig.weixin.delivery.maxRetries,\r\n baseDelayMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_DELIVERY_BASE_DELAY_MS) ?? fileConfig.weixin.delivery.baseDelayMs,\r\n maxDelayMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_DELIVERY_MAX_DELAY_MS) ?? fileConfig.weixin.delivery.maxDelayMs,\r\n receiptTimeoutMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_DELIVERY_RECEIPT_TIMEOUT_MS) ??\r\n fileConfig.weixin.delivery.receiptTimeoutMs,\r\n },\r\n messageChunkChars:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_MESSAGE_CHUNK_CHARS) ?? fileConfig.weixin.messageChunkChars,\r\n typingIntervalMs:\r\n parseIntegerEnv(process.env.ATHLETE_WEIXIN_TYPING_INTERVAL_MS) ?? fileConfig.weixin.typingIntervalMs,\r\n qrTimeoutMs: parseIntegerEnv(process.env.ATHLETE_WEIXIN_QR_TIMEOUT_MS) ?? fileConfig.weixin.qrTimeoutMs,\r\n routeTag: process.env.ATHLETE_WEIXIN_ROUTE_TAG ?? fileConfig.weixin.routeTag,\r\n });\r\n const provisionalWeixin = resolveWeixinRuntimeConfig(weixinConfig, projectRoots.stateRootDir);\r\n const weixinCredentials = await new FileWeixinCredentialStore(provisionalWeixin.credentialsFile).load();\r\n\r\n const merged = normalizeConfig({\r\n ...fileConfig,\r\n model: process.env.ATHLETE_MODEL ?? overrides.model ?? fileConfig.model,\r\n baseUrl: process.env.ATHLETE_BASE_URL ?? fileConfig.baseUrl,\r\n mode:\r\n parseAgentMode(process.env.ATHLETE_MODE) ??\r\n overrides.mode ??\r\n fileConfig.mode,\r\n mcp: {\r\n ...fileConfig.mcp,\r\n enabled: parseBooleanEnv(process.env.ATHLETE_MCP_ENABLED) ?? fileConfig.mcp.enabled,\r\n playwright: {\r\n ...fileConfig.mcp.playwright,\r\n enabled: playwrightEnabled,\r\n browser: parsePlaywrightBrowserEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_BROWSER) ?? fileConfig.mcp.playwright.browser,\r\n headless: parseBooleanEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_HEADLESS) ?? fileConfig.mcp.playwright.headless,\r\n isolated: parseBooleanEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_ISOLATED) ?? fileConfig.mcp.playwright.isolated,\r\n userDataDir: process.env.ATHLETE_MCP_PLAYWRIGHT_USER_DATA_DIR ?? fileConfig.mcp.playwright.userDataDir,\r\n outputMode: parsePlaywrightOutputModeEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_OUTPUT_MODE) ?? fileConfig.mcp.playwright.outputMode,\r\n saveSession: parseBooleanEnv(process.env.ATHLETE_MCP_PLAYWRIGHT_SAVE_SESSION) ?? fileConfig.mcp.playwright.saveSession,\r\n },\r\n },\r\n telegram: telegramConfig,\r\n weixin: weixinConfig,\r\n }, {\r\n cwd,\r\n cacheDir: paths.cacheDir,\r\n stateRootDir: projectRoots.stateRootDir,\r\n });\r\n\r\n const apiKey = process.env.ATHLETE_API_KEY ?? \"\";\r\n\r\n return {\r\n ...merged,\r\n apiKey,\r\n mineru: readMineruRuntimeConfig(),\r\n paths,\r\n telegram: resolveTelegramRuntimeConfig(merged.telegram, projectRoots.stateRootDir),\r\n weixin: resolveWeixinRuntimeConfig(merged.weixin, projectRoots.stateRootDir, weixinCredentials),\r\n };\r\n}\r\n\r\nexport function parseAgentMode(value?: string): AgentMode | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.trim().toLowerCase();\r\n if (normalized === \"read-only\") {\r\n return \"read-only\";\r\n }\r\n\r\n if (normalized === \"agent\") {\r\n return \"agent\";\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction normalizeConfig(\r\n config: AppConfig,\r\n runtime: {\r\n cwd?: string;\r\n cacheDir?: string;\r\n stateRootDir?: string;\r\n } = {},\r\n): AppConfig {\r\n const allowedRoots =\r\n Array.isArray(config.allowedRoots) && config.allowedRoots.length > 0\r\n ? [...new Set(config.allowedRoots.map((value) => String(value).trim()).filter(Boolean))]\r\n : [\".\"];\r\n\r\n return {\r\n provider: \"deepseek\",\r\n baseUrl: config.baseUrl?.trim() || DEFAULT_CONFIG.baseUrl,\r\n model: config.model?.trim() || DEFAULT_CONFIG.model,\r\n mode: parseAgentMode(config.mode) ?? DEFAULT_CONFIG.mode,\r\n allowedRoots,\r\n yieldAfterToolSteps: clampNumber(\r\n config.yieldAfterToolSteps,\r\n 0,\r\n 50,\r\n DEFAULT_CONFIG.yieldAfterToolSteps,\r\n ),\r\n contextWindowMessages: clampNumber(config.contextWindowMessages, 6, 120, DEFAULT_CONFIG.contextWindowMessages),\r\n maxContextChars: clampNumber(config.maxContextChars, 8_000, 300_000, DEFAULT_CONFIG.maxContextChars),\r\n contextSummaryChars: clampNumber(\r\n config.contextSummaryChars,\r\n 1_000,\r\n 40_000,\r\n DEFAULT_CONFIG.contextSummaryChars,\r\n ),\r\n maxToolIterations: clampNumber(config.maxToolIterations, 1, 20, DEFAULT_CONFIG.maxToolIterations),\r\n maxContinuationBatches: clampNumber(\r\n config.maxContinuationBatches,\r\n 1,\r\n 20,\r\n DEFAULT_CONFIG.maxContinuationBatches,\r\n ),\r\n maxReadBytes: clampNumber(config.maxReadBytes, 2_000, 500_000, DEFAULT_CONFIG.maxReadBytes),\r\n maxSearchResults: clampNumber(config.maxSearchResults, 10, 500, DEFAULT_CONFIG.maxSearchResults),\r\n maxSpreadsheetPreviewRows: clampNumber(\r\n config.maxSpreadsheetPreviewRows,\r\n 1,\r\n 200,\r\n DEFAULT_CONFIG.maxSpreadsheetPreviewRows,\r\n ),\r\n maxSpreadsheetPreviewColumns: clampNumber(\r\n config.maxSpreadsheetPreviewColumns,\r\n 1,\r\n 100,\r\n DEFAULT_CONFIG.maxSpreadsheetPreviewColumns,\r\n ),\r\n commandStallTimeoutMs: clampNumber(config.commandStallTimeoutMs, 2_000, 300_000, DEFAULT_CONFIG.commandStallTimeoutMs),\r\n commandMaxRetries: clampNumber(config.commandMaxRetries, 0, 3, DEFAULT_CONFIG.commandMaxRetries),\r\n commandRetryBackoffMs: clampNumber(\r\n config.commandRetryBackoffMs,\r\n 200,\r\n 10_000,\r\n DEFAULT_CONFIG.commandRetryBackoffMs,\r\n ),\r\n showReasoning: Boolean(config.showReasoning),\r\n mcp: normalizeMcpConfig(config.mcp, runtime),\r\n telegram: normalizeTelegramConfig(config.telegram),\r\n weixin: normalizeWeixinConfig(config.weixin),\r\n };\r\n}\r\n\r\nfunction mergeAppConfig(base: AppConfig, patch: Partial<AppConfig>): AppConfig {\r\n return {\r\n ...base,\r\n ...patch,\r\n mcp: {\r\n ...base.mcp,\r\n ...(patch.mcp ?? {}),\r\n playwright: {\r\n ...base.mcp.playwright,\r\n ...(patch.mcp?.playwright ?? {}),\r\n },\r\n },\r\n telegram: {\r\n ...base.telegram,\r\n ...(patch.telegram ?? {}),\r\n polling: {\r\n ...base.telegram.polling,\r\n ...(patch.telegram?.polling ?? {}),\r\n },\r\n delivery: {\r\n ...base.telegram.delivery,\r\n ...(patch.telegram?.delivery ?? {}),\r\n },\r\n },\r\n weixin: {\r\n ...base.weixin,\r\n ...(patch.weixin ?? {}),\r\n polling: {\r\n ...base.weixin.polling,\r\n ...(patch.weixin?.polling ?? {}),\r\n },\r\n delivery: {\r\n ...base.weixin.delivery,\r\n ...(patch.weixin?.delivery ?? {}),\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction clampNumber(value: number, min: number, max: number, fallback: number): number {\r\n if (!Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n return Math.max(min, Math.min(max, Math.trunc(value)));\r\n}\r\n\r\nfunction parseBooleanEnv(value: string | undefined): boolean | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.trim().toLowerCase();\r\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(normalized)) {\r\n return true;\r\n }\r\n\r\n if ([\"0\", \"false\", \"no\", \"off\"].includes(normalized)) {\r\n return false;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction parseIntegerEnv(value: string | undefined): number | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n\r\n const parsed = Number.parseInt(value, 10);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n}\r\n\r\nfunction parsePlaywrightBrowserEnv(value: string | undefined): RuntimeConfig[\"mcp\"][\"playwright\"][\"browser\"] | undefined {\r\n switch ((value ?? \"\").trim().toLowerCase()) {\r\n case \"chrome\":\r\n return \"chrome\";\r\n case \"firefox\":\r\n return \"firefox\";\r\n case \"webkit\":\r\n return \"webkit\";\r\n case \"msedge\":\r\n return \"msedge\";\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction parsePlaywrightOutputModeEnv(value: string | undefined): RuntimeConfig[\"mcp\"][\"playwright\"][\"outputMode\"] | undefined {\r\n switch ((value ?? \"\").trim().toLowerCase()) {\r\n case \"file\":\r\n return \"file\";\r\n case \"stdout\":\r\n return \"stdout\";\r\n default:\r\n return undefined;\r\n }\r\n}\r\n\r\nfunction readMineruRuntimeConfig(): MineruRuntimeConfig {\r\n return {\r\n token: (process.env.MINERU_API_TOKEN ?? \"\").trim(),\r\n baseUrl: (process.env.MINERU_BASE_URL ?? \"https://mineru.net/api/v4\").trim(),\r\n modelVersion: (process.env.MINERU_MODEL_VERSION ?? \"vlm\").trim(),\r\n language: (process.env.MINERU_LANGUAGE ?? \"ch\").trim(),\r\n enableTable: parseBooleanEnv(process.env.MINERU_ENABLE_TABLE) ?? true,\r\n enableFormula: parseBooleanEnv(process.env.MINERU_ENABLE_FORMULA) ?? true,\r\n pollIntervalMs: clampNumber(\r\n Number.parseInt(process.env.MINERU_POLL_INTERVAL_MS ?? \"\", 10),\r\n 200,\r\n 60_000,\r\n 2_000,\r\n ),\r\n timeoutMs: clampNumber(\r\n Number.parseInt(process.env.MINERU_TIMEOUT_MS ?? \"\", 10),\r\n 5_000,\r\n 60 * 60 * 1000,\r\n 300_000,\r\n ),\r\n };\r\n}\r\n\r\n","import fs from \"node:fs\";\r\nimport path from \"node:path\";\r\n\r\nimport dotenv from \"dotenv\";\r\n\r\nconst managedEnvValues = new Map<string, string>();\r\n\r\nexport function loadDotEnvFiles(cwd: string): void {\r\n const originalEnvKeys = new Set(\r\n Object.entries(process.env)\r\n .filter(([key, value]) => managedEnvValues.get(key) !== value)\r\n .map(([key]) => key),\r\n );\r\n\r\n for (const [key, value] of managedEnvValues) {\r\n if (originalEnvKeys.has(key) || process.env[key] !== value) {\r\n continue;\r\n }\r\n\r\n delete process.env[key];\r\n }\r\n\r\n managedEnvValues.clear();\r\n const packageRoot = path.resolve(__dirname, \"..\");\r\n const candidateFiles = uniquePaths([\r\n path.join(packageRoot, \".athlete\", \".env\"),\r\n path.join(cwd, \".athlete\", \".env\"),\r\n ]);\r\n\r\n for (const filePath of candidateFiles) {\r\n if (!fs.existsSync(filePath)) {\r\n continue;\r\n }\r\n\r\n const parsed = dotenv.parse(fs.readFileSync(filePath, \"utf8\"));\r\n for (const [key, value] of Object.entries(parsed)) {\r\n if (originalEnvKeys.has(key)) {\r\n continue;\r\n }\r\n\r\n process.env[key] = value;\r\n managedEnvValues.set(key, value);\r\n }\r\n }\r\n}\r\n\r\nfunction uniquePaths(paths: string[]): string[] {\r\n return [...new Set(paths.map((item) => path.normalize(item)))];\r\n}\r\n","import envPaths from \"env-paths\";\r\nimport path from \"node:path\";\r\n\r\nimport type { AppPaths } from \"../types.js\";\r\n\r\nexport function getAppPaths(): AppPaths {\r\n const resolved = envPaths(\"athlete\", { suffix: \"\" });\r\n\r\n return {\r\n configDir: resolved.config,\r\n dataDir: resolved.data,\r\n cacheDir: resolved.cache,\r\n configFile: path.join(resolved.config, \"config.json\"),\r\n sessionsDir: path.join(resolved.data, \"sessions\"),\r\n changesDir: path.join(resolved.data, \"changes\"),\r\n };\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { getProjectStatePaths } from \"../project/statePaths.js\";\r\n\r\nexport interface TelegramConfig {\r\n token: string;\r\n apiBaseUrl: string;\r\n proxyUrl: string;\r\n allowedUserIds: number[];\r\n polling: {\r\n timeoutSeconds: number;\r\n limit: number;\r\n retryBackoffMs: number;\r\n };\r\n delivery: {\r\n maxRetries: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n };\r\n messageChunkChars: number;\r\n typingIntervalMs: number;\r\n}\r\n\r\nexport interface TelegramRuntimeConfig extends TelegramConfig {\r\n stateDir: string;\r\n}\r\n\r\nexport const DEFAULT_TELEGRAM_CONFIG: TelegramConfig = {\r\n token: \"\",\r\n apiBaseUrl: \"https://api.telegram.org\",\r\n proxyUrl: \"\",\r\n allowedUserIds: [],\r\n polling: {\r\n timeoutSeconds: 50,\r\n limit: 100,\r\n retryBackoffMs: 1_000,\r\n },\r\n delivery: {\r\n maxRetries: 6,\r\n baseDelayMs: 1_000,\r\n maxDelayMs: 30_000,\r\n },\r\n messageChunkChars: 3_500,\r\n typingIntervalMs: 4_000,\r\n};\r\n\r\nexport function normalizeTelegramConfig(config: Partial<TelegramConfig> = {}): TelegramConfig {\r\n return {\r\n token: String(config.token ?? DEFAULT_TELEGRAM_CONFIG.token).trim(),\r\n apiBaseUrl: normalizeApiBaseUrl(config.apiBaseUrl),\r\n proxyUrl: normalizeProxyUrl(config.proxyUrl),\r\n allowedUserIds: normalizeAllowedUserIds(config.allowedUserIds),\r\n polling: {\r\n timeoutSeconds: clampNumber(\r\n config.polling?.timeoutSeconds,\r\n 1,\r\n 50,\r\n DEFAULT_TELEGRAM_CONFIG.polling.timeoutSeconds,\r\n ),\r\n limit: clampNumber(config.polling?.limit, 1, 100, DEFAULT_TELEGRAM_CONFIG.polling.limit),\r\n retryBackoffMs: clampNumber(\r\n config.polling?.retryBackoffMs,\r\n 250,\r\n 60_000,\r\n DEFAULT_TELEGRAM_CONFIG.polling.retryBackoffMs,\r\n ),\r\n },\r\n delivery: {\r\n maxRetries: clampNumber(config.delivery?.maxRetries, 1, 32, DEFAULT_TELEGRAM_CONFIG.delivery.maxRetries),\r\n baseDelayMs: clampNumber(\r\n config.delivery?.baseDelayMs,\r\n 250,\r\n 120_000,\r\n DEFAULT_TELEGRAM_CONFIG.delivery.baseDelayMs,\r\n ),\r\n maxDelayMs: clampNumber(\r\n config.delivery?.maxDelayMs,\r\n 1_000,\r\n 120_000,\r\n DEFAULT_TELEGRAM_CONFIG.delivery.maxDelayMs,\r\n ),\r\n },\r\n messageChunkChars: clampNumber(\r\n config.messageChunkChars,\r\n 128,\r\n 4_096,\r\n DEFAULT_TELEGRAM_CONFIG.messageChunkChars,\r\n ),\r\n typingIntervalMs: clampNumber(\r\n config.typingIntervalMs,\r\n 500,\r\n 60_000,\r\n DEFAULT_TELEGRAM_CONFIG.typingIntervalMs,\r\n ),\r\n };\r\n}\r\n\r\nexport function resolveTelegramRuntimeConfig(\r\n config: Partial<TelegramConfig> | undefined,\r\n stateRootDir: string,\r\n): TelegramRuntimeConfig {\r\n const normalized = normalizeTelegramConfig(config);\r\n return {\r\n ...normalized,\r\n stateDir: path.join(getProjectStatePaths(stateRootDir).athleteDir, \"telegram\"),\r\n };\r\n}\r\n\r\nexport function parseTelegramAllowedUserIds(raw: string | undefined): number[] {\r\n if (!raw) {\r\n return [];\r\n }\r\n\r\n return normalizeAllowedUserIds(\r\n raw\r\n .split(\",\")\r\n .map((value) => Number.parseInt(value.trim(), 10))\r\n .filter((value) => Number.isFinite(value)),\r\n );\r\n}\r\n\r\nfunction normalizeApiBaseUrl(raw: string | undefined): string {\r\n const value = String(raw ?? DEFAULT_TELEGRAM_CONFIG.apiBaseUrl).trim();\r\n return value.replace(/\\/+$/u, \"\") || DEFAULT_TELEGRAM_CONFIG.apiBaseUrl;\r\n}\r\n\r\nfunction normalizeProxyUrl(raw: string | undefined): string {\r\n const value = String(raw ?? DEFAULT_TELEGRAM_CONFIG.proxyUrl).trim();\r\n return value.replace(/\\/+$/u, \"\");\r\n}\r\n\r\nfunction normalizeAllowedUserIds(values: readonly number[] | undefined): number[] {\r\n if (!Array.isArray(values)) {\r\n return [];\r\n }\r\n\r\n const unique = new Set<number>();\r\n for (const value of values) {\r\n const normalized = Number.isFinite(value) ? Math.trunc(value) : Number.NaN;\r\n if (Number.isFinite(normalized) && normalized > 0) {\r\n unique.add(normalized);\r\n }\r\n }\r\n\r\n return [...unique];\r\n}\r\n\r\nfunction clampNumber(value: number | undefined, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n const normalized = Math.trunc(value);\r\n return Math.max(min, Math.min(max, normalized));\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport async function readJsonFile<T>(filePath: string, fallback: T): Promise<T> {\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n return JSON.parse(raw) as T;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return fallback;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function writeJsonFileAtomically(filePath: string, value: unknown): Promise<void> {\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n const temporaryPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;\r\n await fs.writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\r\n await fs.rename(temporaryPath, filePath);\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface WeixinLoginState {\r\n token: string;\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n botId?: string;\r\n userId?: string;\r\n connectedAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WeixinCredentialStoreLike {\r\n load(): Promise<WeixinLoginState | null>;\r\n save(state: WeixinLoginState): Promise<void>;\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport class FileWeixinCredentialStore implements WeixinCredentialStoreLike {\r\n constructor(private readonly filePath: string) {}\r\n\r\n async load(): Promise<WeixinLoginState | null> {\r\n const payload = await readJsonFile<WeixinLoginState | null>(this.filePath, null);\r\n if (!payload || typeof payload.token !== \"string\" || !payload.token.trim()) {\r\n return null;\r\n }\r\n\r\n return {\r\n token: payload.token.trim(),\r\n baseUrl: String(payload.baseUrl ?? \"\").trim(),\r\n cdnBaseUrl: String(payload.cdnBaseUrl ?? \"\").trim(),\r\n botId: typeof payload.botId === \"string\" && payload.botId.trim() ? payload.botId.trim() : undefined,\r\n userId: typeof payload.userId === \"string\" && payload.userId.trim() ? payload.userId.trim() : undefined,\r\n connectedAt: String(payload.connectedAt ?? \"\").trim(),\r\n updatedAt: String(payload.updatedAt ?? \"\").trim(),\r\n };\r\n }\r\n\r\n async save(state: WeixinLoginState): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n token: state.token.trim(),\r\n baseUrl: state.baseUrl.trim(),\r\n cdnBaseUrl: state.cdnBaseUrl.trim(),\r\n ...(state.botId ? { botId: state.botId.trim() } : {}),\r\n ...(state.userId ? { userId: state.userId.trim() } : {}),\r\n connectedAt: state.connectedAt,\r\n updatedAt: state.updatedAt,\r\n });\r\n }\r\n\r\n async clear(): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, null);\r\n }\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { getProjectStatePaths } from \"../project/statePaths.js\";\r\nimport type { WeixinLoginState } from \"./credentialsStore.js\";\r\n\r\nconst DEFAULT_OPENILINK_BASE_URL = \"https://ilinkai.weixin.qq.com\";\r\nconst DEFAULT_OPENILINK_CDN_BASE_URL = \"https://novac2c.cdn.weixin.qq.com/c2c\";\r\n\r\nexport interface WeixinConfig {\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n allowedUserIds: string[];\r\n polling: {\r\n timeoutMs: number;\r\n retryBackoffMs: number;\r\n };\r\n delivery: {\r\n maxRetries: number;\r\n baseDelayMs: number;\r\n maxDelayMs: number;\r\n receiptTimeoutMs: number;\r\n };\r\n messageChunkChars: number;\r\n typingIntervalMs: number;\r\n qrTimeoutMs: number;\r\n routeTag: string;\r\n}\r\n\r\nexport interface WeixinRuntimeConfig extends WeixinConfig {\r\n stateDir: string;\r\n credentialsFile: string;\r\n syncBufFile: string;\r\n sessionMapFile: string;\r\n attachmentStoreFile: string;\r\n contextTokenFile: string;\r\n deliveryQueueFile: string;\r\n processLockFile: string;\r\n credentials: WeixinLoginState | null;\r\n}\r\n\r\nexport const DEFAULT_WEIXIN_CONFIG: WeixinConfig = {\r\n baseUrl: DEFAULT_OPENILINK_BASE_URL,\r\n cdnBaseUrl: DEFAULT_OPENILINK_CDN_BASE_URL,\r\n allowedUserIds: [],\r\n polling: {\r\n timeoutMs: 30_000,\r\n retryBackoffMs: 1_000,\r\n },\r\n delivery: {\r\n maxRetries: 6,\r\n baseDelayMs: 1_000,\r\n maxDelayMs: 30_000,\r\n receiptTimeoutMs: 5_000,\r\n },\r\n messageChunkChars: 3_500,\r\n typingIntervalMs: 4_000,\r\n qrTimeoutMs: 480_000,\r\n routeTag: \"\",\r\n};\r\n\r\nexport function normalizeWeixinConfig(config: Partial<WeixinConfig> = {}): WeixinConfig {\r\n return {\r\n baseUrl: normalizeUrl(config.baseUrl, DEFAULT_WEIXIN_CONFIG.baseUrl),\r\n cdnBaseUrl: normalizeUrl(config.cdnBaseUrl, DEFAULT_WEIXIN_CONFIG.cdnBaseUrl),\r\n allowedUserIds: normalizeAllowedUserIds(config.allowedUserIds),\r\n polling: {\r\n timeoutMs: clampNumber(config.polling?.timeoutMs, 1_000, 120_000, DEFAULT_WEIXIN_CONFIG.polling.timeoutMs),\r\n retryBackoffMs: clampNumber(\r\n config.polling?.retryBackoffMs,\r\n 250,\r\n 60_000,\r\n DEFAULT_WEIXIN_CONFIG.polling.retryBackoffMs,\r\n ),\r\n },\r\n delivery: {\r\n maxRetries: clampNumber(config.delivery?.maxRetries, 1, 32, DEFAULT_WEIXIN_CONFIG.delivery.maxRetries),\r\n baseDelayMs: clampNumber(\r\n config.delivery?.baseDelayMs,\r\n 250,\r\n 120_000,\r\n DEFAULT_WEIXIN_CONFIG.delivery.baseDelayMs,\r\n ),\r\n maxDelayMs: clampNumber(\r\n config.delivery?.maxDelayMs,\r\n 1_000,\r\n 120_000,\r\n DEFAULT_WEIXIN_CONFIG.delivery.maxDelayMs,\r\n ),\r\n receiptTimeoutMs: clampNumber(\r\n config.delivery?.receiptTimeoutMs,\r\n 1_000,\r\n 300_000,\r\n DEFAULT_WEIXIN_CONFIG.delivery.receiptTimeoutMs,\r\n ),\r\n },\r\n messageChunkChars: clampNumber(\r\n config.messageChunkChars,\r\n 128,\r\n 12_000,\r\n DEFAULT_WEIXIN_CONFIG.messageChunkChars,\r\n ),\r\n typingIntervalMs: clampNumber(\r\n config.typingIntervalMs,\r\n 500,\r\n 60_000,\r\n DEFAULT_WEIXIN_CONFIG.typingIntervalMs,\r\n ),\r\n qrTimeoutMs: clampNumber(config.qrTimeoutMs, 30_000, 900_000, DEFAULT_WEIXIN_CONFIG.qrTimeoutMs),\r\n routeTag: String(config.routeTag ?? DEFAULT_WEIXIN_CONFIG.routeTag).trim(),\r\n };\r\n}\r\n\r\nexport function resolveWeixinRuntimeConfig(\r\n config: Partial<WeixinConfig> | undefined,\r\n stateRootDir: string,\r\n credentials: WeixinLoginState | null = null,\r\n): WeixinRuntimeConfig {\r\n const normalized = normalizeWeixinConfig(config);\r\n const stateDir = path.join(getProjectStatePaths(stateRootDir).athleteDir, \"weixin\");\r\n return {\r\n ...normalized,\r\n stateDir,\r\n credentialsFile: path.join(stateDir, \"credentials.json\"),\r\n syncBufFile: path.join(stateDir, \"sync-buf.json\"),\r\n sessionMapFile: path.join(stateDir, \"session-map.json\"),\r\n attachmentStoreFile: path.join(stateDir, \"attachments.json\"),\r\n contextTokenFile: path.join(stateDir, \"context-token.json\"),\r\n deliveryQueueFile: path.join(stateDir, \"delivery.json\"),\r\n processLockFile: path.join(stateDir, \"service.pid\"),\r\n credentials,\r\n };\r\n}\r\n\r\nexport function parseWeixinAllowedUserIds(raw: string | undefined): string[] {\r\n if (!raw) {\r\n return [];\r\n }\r\n\r\n return normalizeAllowedUserIds(raw.split(/[,\\r\\n]+/u));\r\n}\r\n\r\nfunction normalizeUrl(raw: string | undefined, fallback: string): string {\r\n const value = String(raw ?? fallback).trim().replace(/\\/+$/u, \"\");\r\n return value || fallback;\r\n}\r\n\r\nfunction normalizeAllowedUserIds(values: readonly string[] | undefined): string[] {\r\n if (!Array.isArray(values)) {\r\n return [];\r\n }\r\n\r\n const unique = new Set<string>();\r\n for (const value of values) {\r\n const normalized = String(value ?? \"\").trim();\r\n if (normalized) {\r\n unique.add(normalized);\r\n }\r\n }\r\n\r\n return [...unique];\r\n}\r\n\r\nfunction clampNumber(value: number | undefined, min: number, max: number, fallback: number): number {\r\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\r\n return fallback;\r\n }\r\n\r\n const normalized = Math.trunc(value);\r\n return Math.max(min, Math.min(max, normalized));\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { AgentCallbacks } from \"../agent/types.js\";\r\nimport type { RuntimeConfig } from \"../types.js\";\r\nimport { tryParseJson } from \"../utils/json.js\";\r\nimport { ui } from \"../utils/console.js\";\r\nimport { writeStdout } from \"../utils/stdio.js\";\r\n\r\ninterface StreamRendererOptions {\r\n cwd?: string;\r\n assistantLeadingBlankLine?: boolean;\r\n assistantTrailingNewlines?: string;\r\n reasoningLeadingBlankLine?: boolean;\r\n toolArgsMaxChars?: number;\r\n toolErrorLabel: string;\r\n abortSignal?: AbortSignal;\r\n}\r\n\r\ninterface StreamState {\r\n assistantOpen: boolean;\r\n reasoningOpen: boolean;\r\n}\r\n\r\ninterface ToolDisplay {\r\n summary: string;\r\n preview?: string;\r\n}\r\n\r\nexport interface StreamRenderer {\r\n callbacks: AgentCallbacks;\r\n flush: () => void;\r\n}\r\n\r\nexport function createStreamRenderer(\r\n config: Pick<RuntimeConfig, \"showReasoning\">,\r\n options: StreamRendererOptions,\r\n): StreamRenderer {\r\n let aborted = false;\r\n const isAborted = (): boolean => aborted || options.abortSignal?.aborted === true;\r\n\r\n const state: StreamState = {\r\n assistantOpen: false,\r\n reasoningOpen: false,\r\n };\r\n const flush = (): void => {\r\n if (!state.reasoningOpen && !state.assistantOpen) {\r\n return;\r\n }\r\n\r\n writeStdout(\"\\n\");\r\n state.reasoningOpen = false;\r\n state.assistantOpen = false;\r\n };\r\n\r\n if (options.abortSignal) {\r\n options.abortSignal.addEventListener(\"abort\", () => {\r\n if (aborted) {\r\n return;\r\n }\r\n aborted = true;\r\n flush();\r\n });\r\n }\r\n\r\n const beginReasoning = (): void => {\r\n if (!config.showReasoning) {\r\n return;\r\n }\r\n\r\n if (!state.reasoningOpen) {\r\n writeStdout(options.reasoningLeadingBlankLine ? \"\\n[reasoning]\\n\" : \"[reasoning]\\n\");\r\n state.reasoningOpen = true;\r\n }\r\n };\r\n\r\n const beginAssistant = (): void => {\r\n if (state.reasoningOpen) {\r\n writeStdout(\"\\n\");\r\n state.reasoningOpen = false;\r\n }\r\n\r\n if (!state.assistantOpen) {\r\n if (options.assistantLeadingBlankLine) {\r\n writeStdout(\"\\n\");\r\n }\r\n state.assistantOpen = true;\r\n }\r\n };\r\n\r\n return {\r\n flush,\r\n callbacks: {\r\n onReasoningDelta(delta) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n if (!config.showReasoning) {\r\n return;\r\n }\r\n\r\n beginReasoning();\r\n writeStdout(delta);\r\n },\r\n onReasoning(text) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n if (!config.showReasoning) {\r\n return;\r\n }\r\n\r\n beginReasoning();\r\n writeStdout(`${text}\\n`);\r\n state.reasoningOpen = false;\r\n },\r\n onAssistantDelta(delta) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n beginAssistant();\r\n writeStdout(delta);\r\n },\r\n onAssistantText(text) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n beginAssistant();\r\n writeStdout(text);\r\n },\r\n onAssistantDone() {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n if (state.reasoningOpen) {\r\n writeStdout(\"\\n\");\r\n state.reasoningOpen = false;\r\n }\r\n\r\n if (state.assistantOpen) {\r\n writeStdout(options.assistantTrailingNewlines ?? \"\\n\");\r\n state.assistantOpen = false;\r\n }\r\n },\r\n onToolCall(name, args) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n flush();\r\n const display = buildToolCallDisplay(name, args, options.toolArgsMaxChars ?? 160, options.cwd);\r\n ui.tool(display.summary);\r\n if (display.preview) {\r\n ui.dim(`[content]\\n${display.preview}`);\r\n }\r\n },\r\n onToolResult(name, output) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n flush();\r\n const display = buildToolResultDisplay(name, output, options.cwd);\r\n if (display.summary) {\r\n ui.dim(`[result] ${display.summary}`);\r\n }\r\n if (display.preview) {\r\n ui.dim(`[preview]\\n${display.preview}`);\r\n }\r\n },\r\n onToolError(name, error) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n flush();\r\n ui.warn(`${name} ${options.toolErrorLabel}`);\r\n ui.dim(truncate(error, 600));\r\n },\r\n onStatus(text) {\r\n if (isAborted()) {\r\n return;\r\n }\r\n\r\n flush();\r\n ui.dim(text);\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction truncate(value: string, maxChars: number): string {\r\n if (value.length <= maxChars) {\r\n return value;\r\n }\r\n\r\n return `${value.slice(0, maxChars)}...`;\r\n}\r\n\r\nfunction buildToolCallDisplay(\r\n name: string,\r\n rawArgs: string,\r\n maxChars: number,\r\n cwd?: string,\r\n): ToolDisplay {\r\n const parsed = tryParseJson(rawArgs);\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n return {\r\n summary: `${name} ${truncate(rawArgs, maxChars)}`,\r\n };\r\n }\r\n\r\n const args = parsed as Record<string, unknown>;\r\n const path = normalizeDisplayPath(readStringField(args, \"path\"), cwd);\r\n const content = readStringField(args, \"content\");\r\n\r\n switch (name) {\r\n case \"read_file\": {\r\n const range = formatLineRange(args.start_line, args.end_line);\r\n return {\r\n summary: `${name} ${path ?? \"(missing path)\"}${range}`,\r\n };\r\n }\r\n case \"read_docx\":\r\n case \"mineru_doc_read\":\r\n case \"mineru_image_read\":\r\n case \"mineru_pdf_read\":\r\n case \"mineru_ppt_read\":\r\n case \"read_spreadsheet\":\r\n return {\r\n summary: `${name} ${path ?? \"(missing path)\"}`,\r\n };\r\n case \"list_files\":\r\n return {\r\n summary:\r\n `${name} ${path ?? \"(missing path)\"}` +\r\n (args.recursive === true ? \" (recursive)\" : \"\"),\r\n };\r\n case \"search_files\":\r\n return {\r\n summary:\r\n `${name} ${path ?? \"(missing path)\"}` +\r\n (typeof args.pattern === \"string\" ? ` pattern=${args.pattern}` : \"\"),\r\n };\r\n case \"write_file\":\r\n return {\r\n summary: `${name} ${path ?? \"(missing path)\"}`,\r\n preview: content ? truncateBlock(content, 1_600) : undefined,\r\n };\r\n case \"write_docx\":\r\n return {\r\n summary: `${name} ${path ?? \"(missing path)\"}`,\r\n preview: content ? truncateBlock(content, 1_600) : undefined,\r\n };\r\n case \"edit_docx\": {\r\n const action = readStringField(args, \"action\");\r\n const heading = readStringField(args, \"heading\");\r\n return {\r\n summary:\r\n `${name} ${path ?? \"(missing path)\"}` +\r\n (action ? ` action=${action}` : \"\") +\r\n (heading ? ` heading=${heading}` : \"\"),\r\n preview: content ? truncateBlock(content, 1_600) : undefined,\r\n };\r\n }\r\n case \"edit_file\": {\r\n const oldString = readStringField(args, \"old_string\");\r\n const newString = readStringField(args, \"new_string\");\r\n return {\r\n summary:\r\n `${name} ${path ?? \"(missing path)\"}` +\r\n (args.replace_all === true ? \" replace_all=true\" : \"\"),\r\n preview: buildReplacementPreview(oldString, newString),\r\n };\r\n }\r\n case \"apply_patch\":\r\n return {\r\n summary: `${name}`,\r\n preview: typeof args.patch === \"string\" ? truncateBlock(args.patch, 2_000) : undefined,\r\n };\r\n case \"run_shell\": {\r\n const command = readStringField(args, \"command\");\r\n const cwd = readStringField(args, \"cwd\");\r\n return {\r\n summary:\r\n `${name} ${command ?? \"\"}`.trim() +\r\n (cwd ? ` cwd=${cwd}` : \"\"),\r\n };\r\n }\r\n case \"background_run\": {\r\n const command = readStringField(args, \"command\");\r\n const cwd = readStringField(args, \"cwd\");\r\n return {\r\n summary:\r\n `${name} ${command ?? \"\"}`.trim() +\r\n (cwd ? ` cwd=${cwd}` : \"\"),\r\n };\r\n }\r\n case \"background_check\": {\r\n const jobId = readStringField(args, \"job_id\");\r\n return {\r\n summary: `${name} ${jobId ?? \"recent\"}`.trim(),\r\n };\r\n }\r\n case \"task\": {\r\n const agentType = readStringField(args, \"agent_type\");\r\n const description = readStringField(args, \"description\");\r\n return {\r\n summary:\r\n `${name} ${agentType ?? \"\"}`.trim() +\r\n (description ? ` \"${description}\"` : \"\"),\r\n };\r\n }\r\n case \"worktree_create\": {\r\n const worktreeName = readStringField(args, \"name\");\r\n const taskId = typeof args.task_id === \"number\" ? Math.trunc(args.task_id) : undefined;\r\n return {\r\n summary: `${name} ${worktreeName ?? \"\"}`.trim() + (taskId ? ` task=${taskId}` : \"\"),\r\n };\r\n }\r\n case \"worktree_get\":\r\n case \"worktree_events\":\r\n case \"worktree_keep\":\r\n case \"worktree_remove\": {\r\n const worktreeName = readStringField(args, \"name\");\r\n return {\r\n summary: `${name} ${worktreeName ?? \"\"}`.trim(),\r\n };\r\n }\r\n case \"task_create\": {\r\n const subject = readStringField(args, \"subject\");\r\n return {\r\n summary: `${name} ${subject ?? \"\"}`.trim(),\r\n };\r\n }\r\n case \"task_update\": {\r\n const taskId = typeof args.task_id === \"number\" ? Math.trunc(args.task_id) : undefined;\r\n const status = readStringField(args, \"status\");\r\n return {\r\n summary:\r\n `${name} #${taskId ?? \"?\"}` +\r\n (status ? ` status=${status}` : \"\"),\r\n };\r\n }\r\n case \"claim_task\": {\r\n const taskId = typeof args.task_id === \"number\" ? Math.trunc(args.task_id) : undefined;\r\n return {\r\n summary: `${name} #${taskId ?? \"?\"}`,\r\n };\r\n }\r\n case \"spawn_teammate\": {\r\n const teammate = readStringField(args, \"name\");\r\n const role = readStringField(args, \"role\");\r\n return {\r\n summary: `${name} ${teammate ?? \"\"}`.trim() + (role ? ` role=${role}` : \"\"),\r\n };\r\n }\r\n case \"send_message\": {\r\n const recipient = readStringField(args, \"to\");\r\n const msgType = readStringField(args, \"msg_type\");\r\n return {\r\n summary: `${name} ${recipient ?? \"\"}`.trim() + (msgType ? ` type=${msgType}` : \"\"),\r\n };\r\n }\r\n case \"task_list\":\r\n case \"worktree_list\":\r\n case \"list_teammates\":\r\n case \"read_inbox\":\r\n case \"broadcast\":\r\n case \"idle\":\r\n case \"plan_approval\":\r\n case \"shutdown_request\":\r\n case \"shutdown_response\":\r\n return {\r\n summary: name,\r\n };\r\n case \"todo_write\": {\r\n const items = Array.isArray(args.items) ? args.items : [];\r\n return {\r\n summary: `${name} items=${items.length}`,\r\n preview: formatTodoItemsPreview(items),\r\n };\r\n }\r\n case \"load_skill\": {\r\n const skillName = readStringField(args, \"name\");\r\n return {\r\n summary: `${name} ${skillName ?? \"\"}`.trim(),\r\n };\r\n }\r\n default:\r\n return {\r\n summary: `${name} ${truncate(rawArgs, maxChars)}`,\r\n };\r\n }\r\n}\r\n\r\nfunction buildToolResultDisplay(name: string, rawOutput: string, cwd?: string): ToolDisplay {\r\n const parsed = tryParseJson(rawOutput);\r\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\r\n return {\r\n summary: name,\r\n preview: truncateBlock(rawOutput, 1_600),\r\n };\r\n }\r\n\r\n const output = parsed as Record<string, unknown>;\r\n if (name === \"task\") {\r\n const description = readStringField(output, \"description\");\r\n const agentType = readStringField(output, \"agentType\");\r\n return {\r\n summary:\r\n [name, agentType, description ? `\"${description}\"` : undefined].filter(Boolean).join(\" \"),\r\n preview:\r\n readPrimaryPreview(output, cwd) ??\r\n formatFallbackObjectPreview(output, cwd),\r\n };\r\n }\r\n\r\n const path = normalizeDisplayPath(readStringField(output, \"path\"), cwd);\r\n const preview =\r\n readPrimaryPreview(output, cwd) ??\r\n (name === \"list_files\" ? formatEntriesPreview(output.entries, cwd) : undefined) ??\r\n (name === \"search_files\" ? formatMatchesPreview(output.matches, cwd) : undefined) ??\r\n (name === \"read_spreadsheet\" ? formatSheetsPreview(output.sheets) : undefined) ??\r\n formatFallbackObjectPreview(output, cwd);\r\n\r\n return {\r\n summary: [name, path].filter(Boolean).join(\" \"),\r\n preview,\r\n };\r\n}\r\n\r\nfunction readPrimaryPreview(payload: Record<string, unknown>, cwd?: string): string | undefined {\r\n for (const key of [\"content\", \"preview\", \"output\", \"markdownPreview\"]) {\r\n const value = payload[key];\r\n if (typeof value === \"string\" && value.trim().length > 0) {\r\n return truncateBlock(rewriteAbsolutePaths(value, cwd), 1_600);\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nfunction formatEntriesPreview(value: unknown, cwd?: string): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lines = value\r\n .slice(0, 24)\r\n .map((entry) => {\r\n if (!entry || typeof entry !== \"object\") {\r\n return null;\r\n }\r\n\r\n const record = entry as Record<string, unknown>;\r\n const type = record.type === \"directory\" ? \"dir \" : \"file\";\r\n const displayPath = normalizeDisplayPath(readStringField(record, \"path\"), cwd);\r\n return displayPath ? `${type} ${displayPath}` : null;\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return lines.length > 0 ? lines.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction formatMatchesPreview(value: unknown, cwd?: string): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lines = value\r\n .slice(0, 16)\r\n .map((match) => {\r\n if (!match || typeof match !== \"object\") {\r\n return null;\r\n }\r\n\r\n const record = match as Record<string, unknown>;\r\n const displayPath = normalizeDisplayPath(readStringField(record, \"path\"), cwd);\r\n const line = typeof record.line === \"number\" ? record.line : undefined;\r\n const text = readStringField(record, \"text\");\r\n if (!displayPath || !text) {\r\n return null;\r\n }\r\n\r\n return `${displayPath}${line ? `:${line}` : \"\"}\\n ${text}`;\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return lines.length > 0 ? lines.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction formatSheetsPreview(value: unknown): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const fragments: string[] = [];\r\n\r\n for (const sheet of value.slice(0, 3)) {\r\n if (!sheet || typeof sheet !== \"object\") {\r\n continue;\r\n }\r\n\r\n const record = sheet as Record<string, unknown>;\r\n const name = readStringField(record, \"name\") ?? \"Sheet\";\r\n fragments.push(`sheet: ${name}`);\r\n\r\n if (Array.isArray(record.preview)) {\r\n for (const row of record.preview.slice(0, 6)) {\r\n if (!row || typeof row !== \"object\") {\r\n continue;\r\n }\r\n\r\n const rowRecord = row as Record<string, unknown>;\r\n const cells = Array.isArray(rowRecord.cells)\r\n ? rowRecord.cells.map((cell) => String(cell)).join(\" | \")\r\n : \"\";\r\n if (cells) {\r\n fragments.push(` ${cells}`);\r\n }\r\n }\r\n }\r\n }\r\n\r\n return fragments.length > 0 ? fragments.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction formatFallbackObjectPreview(value: Record<string, unknown>, cwd?: string): string | undefined {\r\n const keys = [\"reason\", \"error\", \"hint\", \"action\", \"suggestedPath\", \"suggestedTool\"];\r\n const fragments = keys\r\n .map((key) => {\r\n const field = value[key];\r\n return typeof field === \"string\" && field.trim().length > 0\r\n ? `${key}: ${normalizeDisplayPath(field, cwd) ?? rewriteAbsolutePaths(field, cwd)}`\r\n : null;\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return fragments.length > 0 ? fragments.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction formatTodoItemsPreview(value: unknown): string | undefined {\r\n if (!Array.isArray(value) || value.length === 0) {\r\n return undefined;\r\n }\r\n\r\n const lines = value\r\n .slice(0, 12)\r\n .map((entry) => {\r\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\r\n return null;\r\n }\r\n\r\n const record = entry as Record<string, unknown>;\r\n const id = readStringField(record, \"id\");\r\n const text = readStringField(record, \"text\");\r\n const status = readStringField(record, \"status\");\r\n if (!id || !text || !status) {\r\n return null;\r\n }\r\n\r\n return `${formatTodoMarker(status)} #${id}: ${text}`;\r\n })\r\n .filter((line): line is string => Boolean(line));\r\n\r\n return lines.length > 0 ? lines.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction buildReplacementPreview(oldString: string | undefined, newString: string | undefined): string | undefined {\r\n const fragments: string[] = [];\r\n\r\n if (oldString) {\r\n fragments.push(`- old\\n${truncateBlock(oldString, 700)}`);\r\n }\r\n\r\n if (newString) {\r\n fragments.push(`+ new\\n${truncateBlock(newString, 700)}`);\r\n }\r\n\r\n return fragments.length > 0 ? fragments.join(\"\\n\") : undefined;\r\n}\r\n\r\nfunction readStringField(payload: Record<string, unknown>, key: string): string | undefined {\r\n const value = payload[key];\r\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\r\n}\r\n\r\nfunction formatLineRange(startLine: unknown, endLine: unknown): string {\r\n const start = typeof startLine === \"number\" && Number.isFinite(startLine) ? Math.trunc(startLine) : undefined;\r\n const end = typeof endLine === \"number\" && Number.isFinite(endLine) ? Math.trunc(endLine) : undefined;\r\n\r\n if (start && end) {\r\n return `:${start}-${end}`;\r\n }\r\n\r\n if (start) {\r\n return `:${start}+`;\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nfunction truncateBlock(value: string, maxChars: number): string {\r\n const normalized = value.replace(/\\r\\n/g, \"\\n\").trim();\r\n if (normalized.length <= maxChars) {\r\n return normalized;\r\n }\r\n\r\n return `${normalized.slice(0, maxChars)}\\n... [truncated]`;\r\n}\r\n\r\nfunction normalizeDisplayPath(value: string | undefined, cwd?: string): string | undefined {\r\n if (!value) {\r\n return value;\r\n }\r\n\r\n if (!cwd) {\r\n return value;\r\n }\r\n\r\n const normalizedCwd = path.resolve(cwd);\r\n const normalizedValue = path.resolve(value);\r\n if (\r\n normalizedValue === normalizedCwd ||\r\n normalizedValue.startsWith(`${normalizedCwd}${path.sep}`)\r\n ) {\r\n return path.relative(normalizedCwd, normalizedValue) || \".\";\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction rewriteAbsolutePaths(value: string, cwd?: string): string {\r\n if (!cwd) {\r\n return value;\r\n }\r\n\r\n const normalizedCwd = path.resolve(cwd).replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\r\n const pattern = new RegExp(`${normalizedCwd}(?:\\\\\\\\[^\\\\s\"']*|/[^\\\\s\"']*)*`, \"g\");\r\n\r\n return value.replace(pattern, (match) => normalizeDisplayPath(match, cwd) ?? match);\r\n}\r\n\r\nfunction formatTodoMarker(status: string): string {\r\n switch (status) {\r\n case \"completed\":\r\n return \"[x]\";\r\n case \"in_progress\":\r\n return \"[>]\";\r\n default:\r\n return \"[ ]\";\r\n }\r\n}\r\n","export function tryParseJson(input: string): unknown {\r\n try {\r\n return JSON.parse(input);\r\n } catch {\r\n return input;\r\n }\r\n}\r\n\r\nexport function stringifyJson(value: unknown): string {\r\n return `${JSON.stringify(value, null, 2)}\\n`;\r\n}\r\n","import chalk from \"chalk\";\r\nimport { writeStderrLine, writeStdoutLine } from \"./stdio.js\";\r\n\r\nexport const ui = {\r\n info(message: string): void {\r\n writeStdoutLine(`${chalk.cyan(\"[i]\")} ${message}`);\r\n },\r\n success(message: string): void {\r\n writeStdoutLine(`${chalk.green(\"[ok]\")} ${message}`);\r\n },\r\n warn(message: string): void {\r\n writeStdoutLine(`${chalk.yellow(\"!\")} ${message}`);\r\n },\r\n error(message: string): void {\r\n writeStderrLine(`${chalk.red(\"[x]\")} ${message}`);\r\n },\r\n tool(message: string): void {\r\n writeStdoutLine(`${chalk.magenta(\"[tool]\")} ${message}`);\r\n },\r\n dim(message: string): void {\r\n writeStdoutLine(chalk.gray(message));\r\n },\r\n heading(message: string): void {\r\n writeStdoutLine(chalk.bold(message));\r\n },\r\n plain(message: string): void {\r\n writeStdoutLine(message);\r\n },\r\n};\r\n","import fs from \"node:fs\";\r\n\r\nlet stdoutBroken = false;\r\nlet stderrBroken = false;\r\nlet guardsInstalled = false;\r\n\r\nexport function installStdioGuards(): void {\r\n if (guardsInstalled) {\r\n return;\r\n }\r\n\r\n guardsInstalled = true;\r\n\r\n process.stdout.on(\"error\", (error) => {\r\n if (isIgnorableStreamError(error)) {\r\n stdoutBroken = true;\r\n return;\r\n }\r\n\r\n throw error;\r\n });\r\n\r\n process.stderr.on(\"error\", (error) => {\r\n if (isIgnorableStreamError(error)) {\r\n stderrBroken = true;\r\n return;\r\n }\r\n\r\n throw error;\r\n });\r\n}\r\n\r\nexport function writeStdout(text: string): boolean {\r\n return writeToFd(1, text, \"stdout\");\r\n}\r\n\r\nexport function writeStdoutLine(text = \"\"): boolean {\r\n return writeStdout(`${text}\\n`);\r\n}\r\n\r\nexport function writeStderr(text: string): boolean {\r\n return writeToFd(2, text, \"stderr\");\r\n}\r\n\r\nexport function writeStderrLine(text = \"\"): boolean {\r\n return writeStderr(`${text}\\n`);\r\n}\r\n\r\nfunction writeToFd(fd: number, text: string, stream: \"stdout\" | \"stderr\"): boolean {\r\n if (stream === \"stdout\" ? stdoutBroken : stderrBroken) {\r\n return false;\r\n }\r\n\r\n const target = stream === \"stdout\" ? process.stdout : process.stderr;\r\n\r\n try {\r\n if (target.isTTY) {\r\n return target.write(text);\r\n }\r\n\r\n fs.writeSync(fd, text, undefined, \"utf8\");\r\n return true;\r\n } catch (error) {\r\n if (isIgnorableStreamError(error)) {\r\n if (stream === \"stdout\") {\r\n stdoutBroken = true;\r\n } else {\r\n stderrBroken = true;\r\n }\r\n return false;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nfunction isIgnorableStreamError(error: unknown): boolean {\r\n const code = String((error as { code?: unknown }).code ?? \"\");\r\n return code === \"EPIPE\" || code === \"ERR_STREAM_DESTROYED\" || code === \"ERR_STREAM_WRITE_AFTER_END\";\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport { getDefaultAthleteIgnoreContent } from \"../utils/ignore.js\";\r\n\r\nexport interface InitProjectResult {\r\n created: string[];\r\n skipped: string[];\r\n}\r\n\r\nexport async function initializeProjectFiles(cwd: string): Promise<InitProjectResult> {\r\n const created: string[] = [];\r\n const skipped: string[] = [];\r\n\r\n const athleteDir = path.join(cwd, \".athlete\");\r\n const envPath = path.join(athleteDir, \".env\");\r\n const envExamplePath = path.join(athleteDir, \".env.example\");\r\n const ignorePath = path.join(athleteDir, \".athleteignore\");\r\n const envTemplate = buildProjectEnvTemplate(false);\r\n const envExampleTemplate = buildProjectEnvTemplate(true);\r\n\r\n // Ensure .athlete directory exists\r\n await fs.mkdir(athleteDir, { recursive: true });\r\n\r\n if (await fileExists(envPath)) {\r\n skipped.push(envPath);\r\n } else {\r\n await fs.writeFile(envPath, envTemplate, \"utf8\");\r\n created.push(envPath);\r\n }\r\n\r\n if (await fileExists(envExamplePath)) {\r\n skipped.push(envExamplePath);\r\n } else {\r\n await fs.writeFile(envExamplePath, envExampleTemplate, \"utf8\");\r\n created.push(envExamplePath);\r\n }\r\n\r\n if (await fileExists(ignorePath)) {\r\n skipped.push(ignorePath);\r\n } else {\r\n await fs.writeFile(ignorePath, getDefaultAthleteIgnoreContent(), \"utf8\");\r\n created.push(ignorePath);\r\n }\r\n\r\n return {\r\n created,\r\n skipped,\r\n };\r\n}\r\n\r\nasync function fileExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await fs.access(targetPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction buildProjectEnvTemplate(example: boolean): string {\r\n const athleteApiKeyLine = example ? \"ATHLETE_API_KEY=replace-with-your-key\" : \"ATHLETE_API_KEY=replace-with-your-key\";\r\n\r\n return [\r\n \"# Athlete CLI 环境变量模板\",\r\n example\r\n ? \"# 把这个文件复制成 .athlete/.env,再把真实密钥填进去。\"\r\n : \"# 这是当前项目本地使用的真实环境变量文件。\",\r\n example\r\n ? \"# .athlete/.env.example 可以提交到仓库,但 .athlete/.env 不要提交。\"\r\n : \"# 真实密钥只放在这个文件里,不要提交到仓库。\",\r\n \"# 同一时间只保留一组正在使用的 ATHLETE provider/model 配置。\",\r\n \"\",\r\n \"# 当前默认示例:DeepSeek 官方\",\r\n athleteApiKeyLine,\r\n \"ATHLETE_BASE_URL=https://api.deepseek.com\",\r\n \"ATHLETE_MODEL=deepseek-reasoner\",\r\n \"\",\r\n \"# 本仓库的 Playwright MCP 默认配置\",\r\n \"ATHLETE_MCP_ENABLED=1\",\r\n \"ATHLETE_MCP_PLAYWRIGHT_ENABLED=1\",\r\n \"ATHLETE_MCP_PLAYWRIGHT_BROWSER=chrome\",\r\n \"ATHLETE_MCP_PLAYWRIGHT_OUTPUT_MODE=file\",\r\n \"ATHLETE_MCP_PLAYWRIGHT_SAVE_SESSION=1\",\r\n \"\",\r\n \"# Telegram 私聊接入配置\",\r\n \"# ATHLETE_TELEGRAM_TOKEN 是 Telegram 机器人 token。\",\r\n \"# 获取方法:Telegram 搜索 @BotFather -> /start -> /newbot -> 按提示创建 bot -> 复制返回的 token。\",\r\n \"# 示例 `123456789:AA...` 里,冒号前通常是 bot 的数字编号,冒号后是一长串密钥。不要填 @机器人用户名。\",\r\n \"ATHLETE_TELEGRAM_TOKEN=replace-with-your-bot-token\",\r\n \"# ATHLETE_TELEGRAM_ALLOWED_USER_IDS 是允许控制这个 bot 的 Telegram 数字 user id 白名单。\",\r\n \"# 获取方法:Telegram 搜索 @userinfobot -> /start -> 复制回复里的 Id。这里填的是纯数字,不是 @用户名。\",\r\n \"# 多个用户用英文逗号分隔,例如 `7333287071,123456789`。空白名单等于任何人都不能控制。\",\r\n \"ATHLETE_TELEGRAM_ALLOWED_USER_IDS=123456789\",\r\n \"# ATHLETE_TELEGRAM_PROXY_URL 是 Telegram 请求走的本地代理地址;如果本机能直连 Telegram,可以先留空。\",\r\n \"# 常见获取位置:Clash Verge / Clash for Windows / v2rayN 的设置页里看 HTTP 或 Mixed Port。\",\r\n \"# 例如看到 `mixed-port: 7897`,就填 `http://127.0.0.1:7897`;其中 `127.0.0.1` 是本机,`7897` 是本地代理端口。\",\r\n \"# ATHLETE_TELEGRAM_API_BASE_URL=https://api.telegram.org\",\r\n \"# ATHLETE_TELEGRAM_PROXY_URL=http://127.0.0.1:7897\",\r\n \"# ATHLETE_TELEGRAM_POLLING_TIMEOUT_SECONDS=50\",\r\n \"# ATHLETE_TELEGRAM_POLLING_LIMIT=100\",\r\n \"# ATHLETE_TELEGRAM_POLLING_RETRY_BACKOFF_MS=1000\",\r\n \"# ATHLETE_TELEGRAM_MESSAGE_CHUNK_CHARS=3500\",\r\n \"# ATHLETE_TELEGRAM_TYPING_INTERVAL_MS=4000\",\r\n \"# ATHLETE_TELEGRAM_DELIVERY_MAX_RETRIES=6\",\r\n \"# ATHLETE_TELEGRAM_DELIVERY_BASE_DELAY_MS=1000\",\r\n \"# ATHLETE_TELEGRAM_DELIVERY_MAX_DELAY_MS=30000\",\r\n \"\",\r\n \"# Weixin 私聊接入配置\",\r\n \"# Weixin 没有单独的 bot token 环境变量,先运行 `athlete weixin login` 扫码登录。\",\r\n \"# 登录成功后,登录态会写入 `.athlete/weixin/credentials.json`。\",\r\n \"# ATHLETE_WEIXIN_ALLOWED_USER_IDS 是允许控制 Athlete 的微信用户 ID 白名单。\",\r\n \"# 最容易的找法:运行 `athlete weixin serve`,让目标微信号先发一条消息,终端日志里会出现 `user=...`,把这个值原样填进来。\",\r\n \"# 如果你只是先用当前登录账号自测,`athlete weixin login` 成功后也会打印 `login complete user=...`。\",\r\n \"# 示例 `o9cq...@im.wechat` 就是一个微信 user id。多个用户用英文逗号分隔。\",\r\n \"ATHLETE_WEIXIN_ALLOWED_USER_IDS=replace-with-your-weixin-user-id\",\r\n \"# 下面两个 URL 通常保持默认即可,一般不需要改。\",\r\n \"ATHLETE_WEIXIN_BASE_URL=https://ilinkai.weixin.qq.com\",\r\n \"ATHLETE_WEIXIN_CDN_BASE_URL=https://novac2c.cdn.weixin.qq.com/c2c\",\r\n \"# ATHLETE_WEIXIN_POLLING_TIMEOUT_MS=30000\",\r\n \"# ATHLETE_WEIXIN_POLLING_RETRY_BACKOFF_MS=1000\",\r\n \"# ATHLETE_WEIXIN_MESSAGE_CHUNK_CHARS=3500\",\r\n \"# ATHLETE_WEIXIN_TYPING_INTERVAL_MS=4000\",\r\n \"# ATHLETE_WEIXIN_QR_TIMEOUT_MS=480000\",\r\n \"# ATHLETE_WEIXIN_DELIVERY_MAX_RETRIES=6\",\r\n \"# ATHLETE_WEIXIN_DELIVERY_BASE_DELAY_MS=1000\",\r\n \"# ATHLETE_WEIXIN_DELIVERY_MAX_DELAY_MS=30000\",\r\n \"# ATHLETE_WEIXIN_DELIVERY_RECEIPT_TIMEOUT_MS=5000\",\r\n \"# ATHLETE_WEIXIN_ROUTE_TAG=\",\r\n \"# ATHLETE_WEIXIN_ROUTE_TAG 只有在你明确知道 OpeniLink 给了 route tag 时才需要填,否则留空。\",\r\n \"\",\r\n \"# MinerU 标准 API 配置\",\r\n \"# 标准 API 使用 Authorization: Bearer <token>\",\r\n \"MINERU_API_TOKEN=replace-with-your-token\",\r\n \"MINERU_BASE_URL=https://mineru.net/api/v4\",\r\n \"MINERU_MODEL_VERSION=vlm\",\r\n \"MINERU_LANGUAGE=ch\",\r\n \"MINERU_ENABLE_TABLE=true\",\r\n \"MINERU_ENABLE_FORMULA=true\",\r\n \"MINERU_POLL_INTERVAL_MS=2000\",\r\n \"MINERU_TIMEOUT_MS=300000\",\r\n \"\",\r\n \"# 备用示例:SiliconFlow + DeepSeek V3.2\",\r\n \"# ATHLETE_API_KEY=replace-with-your-key\",\r\n \"# ATHLETE_BASE_URL=https://api.siliconflow.cn/v1\",\r\n \"# ATHLETE_MODEL=deepseek-ai/DeepSeek-V3.2\",\r\n \"\",\r\n \"# 备用示例:SiliconFlow + MiniMax M2.5\",\r\n \"# ATHLETE_API_KEY=replace-with-your-key\",\r\n \"# ATHLETE_BASE_URL=https://api.siliconflow.cn/v1\",\r\n \"# ATHLETE_MODEL=Pro/MiniMaxAI/MiniMax-M2.5\",\r\n \"\",\r\n \"# 备用示例:SiliconFlow + Kimi K2.5\",\r\n \"# ATHLETE_API_KEY=replace-with-your-key\",\r\n \"# ATHLETE_BASE_URL=https://api.siliconflow.cn/v1\",\r\n \"# ATHLETE_MODEL=Pro/moonshotai/Kimi-K2.5\",\r\n \"\",\r\n ].join(\"\\n\");\r\n}\r\n","import process from \"node:process\";\r\n\r\nimport { runManagedAgentTurn } from \"../agent/managedTurn.js\";\r\nimport { SessionStore } from \"../agent/sessionStore.js\";\r\nimport type { RuntimeConfig } from \"../types.js\";\r\nimport { MessageBus } from \"./messageBus.js\";\r\nimport { reconcileTeamState } from \"./reconcile.js\";\r\nimport { TeamStore } from \"./store.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\n\r\nexport interface TeammateWorkerOptions {\r\n rootDir: string;\r\n config: RuntimeConfig;\r\n name: string;\r\n role: string;\r\n prompt: string;\r\n}\r\n\r\nconst POLL_INTERVAL_MS = 2_000;\r\n\r\nclass TeammateShutdownError extends Error {\r\n constructor() {\r\n super(\"Teammate shutdown requested.\");\r\n }\r\n}\r\n\r\nexport async function runTeammateWorker(options: TeammateWorkerOptions): Promise<void> {\r\n const sessionStore = new SessionStore(options.config.paths.sessionsDir);\r\n const teamStore = new TeamStore(options.rootDir);\r\n const taskStore = new TaskStore(options.rootDir);\r\n const bus = new MessageBus(options.rootDir);\r\n const existingMember = await teamStore.findMember(options.name);\r\n let session =\r\n existingMember?.sessionId\r\n ? await tryLoadSession(sessionStore, existingMember.sessionId)\r\n : null;\r\n\r\n if (!session) {\r\n session = await sessionStore.create(options.rootDir);\r\n }\r\n\r\n await teamStore.upsertMember(options.name, options.role, \"working\", {\r\n sessionId: session.id,\r\n pid: process.pid,\r\n });\r\n\r\n let bootstrapPending = true;\r\n\r\n while (true) {\r\n await reconcileTeamState(options.rootDir).catch(() => null);\r\n const member = await teamStore.findMember(options.name);\r\n if (!member || member.status === \"shutdown\") {\r\n return;\r\n }\r\n\r\n const workItems: Array<{ input: string; cwd: string }> = [];\r\n if (bootstrapPending) {\r\n workItems.push({\r\n input: options.prompt,\r\n cwd: options.rootDir,\r\n });\r\n bootstrapPending = false;\r\n }\r\n\r\n const inbox = await bus.peekInbox(options.name);\r\n if (inbox.length > 0) {\r\n workItems.push({\r\n input: \"[internal] Pending inbox updates detected. Read and handle them before continuing the current task.\",\r\n cwd: options.rootDir,\r\n });\r\n }\r\n\r\n if (workItems.length === 0) {\r\n const claimable = await taskStore.listClaimable(options.name);\r\n const nextTask = claimable[0];\r\n if (nextTask) {\r\n await taskStore.claim(nextTask.id, options.name);\r\n let taskCwd = options.rootDir;\r\n let worktreeNote = \"\";\r\n try {\r\n const worktree = await new WorktreeStore(options.rootDir).ensureForTask(nextTask.id, nextTask.subject);\r\n taskCwd = worktree.path;\r\n worktreeNote = `\\n<worktree name=\"${worktree.name}\" path=\"${worktree.path}\" branch=\"${worktree.branch}\" />`;\r\n } catch (error) {\r\n worktreeNote = `\\n<worktree-error>${String((error as { message?: unknown }).message ?? error)}</worktree-error>`;\r\n }\r\n\r\n workItems.push({\r\n cwd: taskCwd,\r\n input:\r\n `<auto-claimed>Task #${nextTask.id}: ${nextTask.subject}\\n${nextTask.description}</auto-claimed>` +\r\n worktreeNote,\r\n });\r\n }\r\n }\r\n\r\n if (workItems.length === 0) {\r\n await teamStore.updateMemberStatus(options.name, \"idle\", process.pid);\r\n await sleep(POLL_INTERVAL_MS);\r\n continue;\r\n }\r\n\r\n await teamStore.updateMemberStatus(options.name, \"working\", process.pid);\r\n\r\n for (const workItem of workItems) {\r\n try {\r\n const result = await runManagedAgentTurn({\r\n input: workItem.input,\r\n cwd: workItem.cwd,\r\n config: options.config,\r\n session,\r\n sessionStore,\r\n identity: {\r\n kind: \"teammate\",\r\n name: options.name,\r\n role: options.role,\r\n teamName: (await teamStore.loadConfig()).teamName,\r\n },\r\n onYield: async ({ defaultInput }) => {\r\n const memberAfterSlice = await teamStore.findMember(options.name);\r\n if (!memberAfterSlice || memberAfterSlice.status === \"shutdown\") {\r\n throw new TeammateShutdownError();\r\n }\r\n\r\n const urgentInbox = await bus.peekInbox(options.name);\r\n return {\r\n input:\r\n urgentInbox.length > 0\r\n ? \"[internal] New inbox updates are pending. Read and handle them, then continue the task.\"\r\n : defaultInput,\r\n };\r\n },\r\n });\r\n session = result.session;\r\n\r\n const memberAfterTurn = await teamStore.findMember(options.name);\r\n if (!memberAfterTurn || memberAfterTurn.status === \"shutdown\") {\r\n return;\r\n }\r\n\r\n if (result.paused) {\r\n return;\r\n }\r\n } catch (error) {\r\n if (error instanceof TeammateShutdownError) {\r\n return;\r\n }\r\n\r\n throw error;\r\n }\r\n }\r\n }\r\n}\r\n\r\nasync function tryLoadSession(sessionStore: SessionStore, sessionId: string) {\r\n try {\r\n return await sessionStore.load(sessionId);\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport type { Command } from \"commander\";\r\n\r\nimport { getErrorMessage } from \"../agent/errors.js\";\r\nimport { SessionStore } from \"../agent/sessionStore.js\";\r\nimport type { CliOverrides, RuntimeConfig } from \"../types.js\";\r\nimport { FetchTelegramBotApiClient } from \"./botApiClient.js\";\r\nimport { TelegramDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport { createConsoleTelegramLogger } from \"./logger.js\";\r\nimport { FileTelegramOffsetStore } from \"./offsetStore.js\";\r\nimport { acquireTelegramProcessLock } from \"./processLock.js\";\r\nimport { applyTelegramProxyEnvironment } from \"./proxy.js\";\r\nimport { FileTelegramSessionMapStore } from \"./sessionMapStore.js\";\r\nimport { TelegramService } from \"./service.js\";\r\n\r\nexport async function createTelegramService(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n}): Promise<TelegramService> {\r\n const logger = createConsoleTelegramLogger();\r\n applyTelegramProxyEnvironment(options.config.telegram.proxyUrl);\r\n const bot = new FetchTelegramBotApiClient({\r\n token: options.config.telegram.token,\r\n apiBaseUrl: options.config.telegram.apiBaseUrl,\r\n });\r\n const stateDir = options.config.telegram.stateDir;\r\n\r\n return new TelegramService({\r\n cwd: options.cwd,\r\n config: options.config,\r\n bot,\r\n sessionStore: new SessionStore(options.config.paths.sessionsDir),\r\n sessionMapStore: new FileTelegramSessionMapStore(path.join(stateDir, \"session-map.json\")),\r\n offsetStore: new FileTelegramOffsetStore(path.join(stateDir, \"offset.json\")),\r\n deliveryQueue: new TelegramDeliveryQueue({\r\n storePath: path.join(stateDir, \"delivery.json\"),\r\n target: bot,\r\n deliveryConfig: options.config.telegram.delivery,\r\n onDelivered(entry) {\r\n logger.info(\"delivery sent\", {\r\n chatId: entry.chatId,\r\n fileName: entry.kind === \"file\" ? entry.fileName : undefined,\r\n detail: entry.kind === \"file\" ? \"type=file\" : \"type=text\",\r\n });\r\n },\r\n onDeliveryFailed(entry, error) {\r\n logger.error(\"delivery failed\", {\r\n chatId: entry.chatId,\r\n fileName: entry.kind === \"file\" ? entry.fileName : undefined,\r\n detail: getErrorMessage(error),\r\n });\r\n },\r\n }),\r\n logger,\r\n });\r\n}\r\n\r\nexport function registerTelegramCommands(\r\n program: Command,\r\n dependencies: {\r\n getCliOverrides: () => CliOverrides;\r\n resolveRuntime: (overrides: CliOverrides) => Promise<{\r\n cwd: string;\r\n config: RuntimeConfig;\r\n paths: RuntimeConfig[\"paths\"];\r\n overrides: CliOverrides;\r\n }>;\r\n createTelegramService?: (options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n }) => Promise<{\r\n run(signal?: AbortSignal): Promise<void>;\r\n stop?(): void;\r\n }>;\r\n acquireProcessLock?: typeof acquireTelegramProcessLock;\r\n },\r\n): void {\r\n const telegramCommand = program.command(\"telegram\").description(\"Serve Telegram private-chat control.\");\r\n\r\n telegramCommand\r\n .command(\"serve\")\r\n .description(\"Run the Telegram private-chat service via long polling.\")\r\n .action(async () => {\r\n const runtime = await dependencies.resolveRuntime(dependencies.getCliOverrides());\r\n if (!runtime.config.telegram.token) {\r\n throw new Error(\"Telegram token missing. Set ATHLETE_TELEGRAM_TOKEN or config.telegram.token.\");\r\n }\r\n\r\n if (runtime.config.telegram.allowedUserIds.length === 0) {\r\n throw new Error(\"Telegram whitelist is empty. Set ATHLETE_TELEGRAM_ALLOWED_USER_IDS or config.telegram.allowedUserIds.\");\r\n }\r\n\r\n const lock = await (dependencies.acquireProcessLock ?? acquireTelegramProcessLock)({\r\n stateDir: runtime.config.telegram.stateDir,\r\n });\r\n const service = await (dependencies.createTelegramService ?? createTelegramService)({\r\n cwd: runtime.cwd,\r\n config: runtime.config,\r\n });\r\n console.log(\r\n `[telegram] starting private-chat service chat_users=${runtime.config.telegram.allowedUserIds.join(\",\")} state=${runtime.config.telegram.stateDir} proxy=${runtime.config.telegram.proxyUrl || \"direct\"}`,\r\n );\r\n const controller = new AbortController();\r\n const releaseSignals = bindShutdownSignals(() => {\r\n controller.abort();\r\n service.stop?.();\r\n });\r\n\r\n try {\r\n await service.run(controller.signal);\r\n } finally {\r\n releaseSignals();\r\n await lock.release();\r\n }\r\n });\r\n}\r\n\r\nfunction bindShutdownSignals(onShutdown: () => void): () => void {\r\n const handler = () => {\r\n onShutdown();\r\n };\r\n process.once(\"SIGINT\", handler);\r\n process.once(\"SIGTERM\", handler);\r\n\r\n return () => {\r\n process.off(\"SIGINT\", handler);\r\n process.off(\"SIGTERM\", handler);\r\n };\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { TelegramUpdate } from \"./types.js\";\r\n\r\nexport interface TelegramGetUpdatesRequest {\r\n offset?: number;\r\n limit: number;\r\n timeoutSeconds: number;\r\n signal?: AbortSignal;\r\n}\r\n\r\nexport interface TelegramSendMessageRequest {\r\n chatId: number;\r\n text: string;\r\n}\r\n\r\nexport interface TelegramSentMessage {\r\n messageId: number;\r\n chatId: number;\r\n}\r\n\r\nexport interface TelegramSendChatActionRequest {\r\n chatId: number;\r\n action: \"typing\";\r\n}\r\n\r\nexport interface TelegramEditMessageTextRequest {\r\n chatId: number;\r\n messageId: number;\r\n text: string;\r\n}\r\n\r\nexport interface TelegramDeleteMessageRequest {\r\n chatId: number;\r\n messageId: number;\r\n}\r\n\r\nexport interface TelegramSendDocumentRequest {\r\n chatId: number;\r\n filePath: string;\r\n fileName?: string;\r\n caption?: string;\r\n}\r\n\r\nexport interface TelegramGetFileRequest {\r\n fileId: string;\r\n}\r\n\r\nexport interface TelegramFileDescriptor {\r\n filePath: string;\r\n fileSize?: number;\r\n}\r\n\r\nexport interface TelegramBotApiClient {\r\n getUpdates(request: TelegramGetUpdatesRequest): Promise<TelegramUpdate[]>;\r\n sendMessage(request: TelegramSendMessageRequest): Promise<TelegramSentMessage>;\r\n sendChatAction(request: TelegramSendChatActionRequest): Promise<void>;\r\n editMessageText(request: TelegramEditMessageTextRequest): Promise<void>;\r\n deleteMessage(request: TelegramDeleteMessageRequest): Promise<void>;\r\n sendDocument(request: TelegramSendDocumentRequest): Promise<void>;\r\n getFile(request: TelegramGetFileRequest): Promise<TelegramFileDescriptor>;\r\n downloadFile(request: TelegramFileDescriptor): Promise<Buffer>;\r\n}\r\n\r\nexport class FetchTelegramBotApiClient implements TelegramBotApiClient {\r\n private readonly baseUrl: string;\r\n private readonly fileBaseUrl: string;\r\n private readonly fetchImpl: typeof fetch;\r\n private readonly token: string;\r\n\r\n constructor(options: {\r\n token: string;\r\n apiBaseUrl: string;\r\n fetchImpl?: typeof fetch;\r\n }) {\r\n const normalizedApiBaseUrl = options.apiBaseUrl.replace(/\\/+$/u, \"\");\r\n this.baseUrl = `${normalizedApiBaseUrl}/bot${options.token}`;\r\n this.fileBaseUrl = `${normalizedApiBaseUrl}/file/bot${options.token}`;\r\n this.fetchImpl = options.fetchImpl ?? fetch;\r\n this.token = options.token;\r\n }\r\n\r\n async getUpdates(request: TelegramGetUpdatesRequest): Promise<TelegramUpdate[]> {\r\n const result = await this.post<TelegramUpdate[]>(\r\n \"getUpdates\",\r\n {\r\n offset: request.offset,\r\n limit: request.limit,\r\n timeout: request.timeoutSeconds,\r\n allowed_updates: [\"message\"],\r\n },\r\n request.signal,\r\n );\r\n\r\n return Array.isArray(result) ? result : [];\r\n }\r\n\r\n async sendMessage(request: TelegramSendMessageRequest): Promise<TelegramSentMessage> {\r\n const message = await this.post<{\r\n message_id?: number;\r\n chat?: {\r\n id?: number;\r\n };\r\n }>(\"sendMessage\", {\r\n chat_id: request.chatId,\r\n text: request.text,\r\n });\r\n\r\n return {\r\n messageId: Math.trunc(message?.message_id ?? 0),\r\n chatId: Math.trunc(message?.chat?.id ?? request.chatId),\r\n };\r\n }\r\n\r\n async sendChatAction(request: TelegramSendChatActionRequest): Promise<void> {\r\n await this.post(\"sendChatAction\", {\r\n chat_id: request.chatId,\r\n action: request.action,\r\n });\r\n }\r\n\r\n async editMessageText(request: TelegramEditMessageTextRequest): Promise<void> {\r\n await this.post(\"editMessageText\", {\r\n chat_id: request.chatId,\r\n message_id: request.messageId,\r\n text: request.text,\r\n });\r\n }\r\n\r\n async deleteMessage(request: TelegramDeleteMessageRequest): Promise<void> {\r\n await this.post(\"deleteMessage\", {\r\n chat_id: request.chatId,\r\n message_id: request.messageId,\r\n });\r\n }\r\n\r\n async sendDocument(request: TelegramSendDocumentRequest): Promise<void> {\r\n const fileName = request.fileName?.trim() || path.basename(request.filePath);\r\n const buffer = await fs.readFile(request.filePath);\r\n const form = new FormData();\r\n form.set(\"chat_id\", String(request.chatId));\r\n form.set(\"document\", new Blob([buffer]), fileName);\r\n if (request.caption?.trim()) {\r\n form.set(\"caption\", request.caption.trim());\r\n }\r\n\r\n const response = await this.fetchImpl(`${this.baseUrl}/sendDocument`, {\r\n method: \"POST\",\r\n body: form,\r\n });\r\n\r\n const payload = await response.json() as {\r\n ok?: boolean;\r\n description?: string;\r\n };\r\n if (!response.ok || payload.ok !== true) {\r\n throw new Error(payload.description || `Telegram API sendDocument failed with status ${response.status}`);\r\n }\r\n }\r\n\r\n async getFile(request: TelegramGetFileRequest): Promise<TelegramFileDescriptor> {\r\n const result = await this.post<{\r\n file_path?: string;\r\n file_size?: number;\r\n }>(\"getFile\", {\r\n file_id: request.fileId,\r\n });\r\n\r\n const filePath = String(result?.file_path ?? \"\").trim();\r\n if (!filePath) {\r\n throw new Error(`Telegram API getFile did not return file_path for ${request.fileId}`);\r\n }\r\n\r\n return {\r\n filePath,\r\n fileSize:\r\n typeof result?.file_size === \"number\" && Number.isFinite(result.file_size)\r\n ? Math.trunc(result.file_size)\r\n : undefined,\r\n };\r\n }\r\n\r\n async downloadFile(request: TelegramFileDescriptor): Promise<Buffer> {\r\n const response = await this.fetchImpl(`${this.fileBaseUrl}/${request.filePath.replace(/^\\/+/u, \"\")}`, {\r\n method: \"GET\",\r\n });\r\n if (!response.ok) {\r\n throw new Error(`Telegram file download failed with status ${response.status}`);\r\n }\r\n\r\n const arrayBuffer = await response.arrayBuffer();\r\n return Buffer.from(arrayBuffer);\r\n }\r\n\r\n private async post<T = unknown>(method: string, body: Record<string, unknown>, signal?: AbortSignal): Promise<T> {\r\n const response = await this.fetchImpl(`${this.baseUrl}/${method}`, {\r\n method: \"POST\",\r\n headers: {\r\n \"content-type\": \"application/json\",\r\n },\r\n body: JSON.stringify(body),\r\n signal,\r\n });\r\n\r\n const payload = await response.json() as {\r\n ok?: boolean;\r\n result?: T;\r\n description?: string;\r\n };\r\n\r\n if (!response.ok || payload.ok !== true) {\r\n throw new Error(payload.description || `Telegram API ${method} failed with status ${response.status}`);\r\n }\r\n\r\n return payload.result as T;\r\n }\r\n}\r\n","import crypto from \"node:crypto\";\r\n\r\nimport type {\r\n TelegramSendDocumentRequest,\r\n TelegramSendMessageRequest,\r\n} from \"./botApiClient.js\";\r\nimport type { TelegramConfig } from \"./config.js\";\r\nimport { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface TelegramDeliveryTarget {\r\n sendMessage(request: TelegramSendMessageRequest): Promise<unknown>;\r\n sendDocument(request: TelegramSendDocumentRequest): Promise<unknown>;\r\n}\r\n\r\ninterface TelegramDeliveryEntryBase {\r\n id: string;\r\n kind: \"text\" | \"file\";\r\n chatId: number;\r\n attemptCount: number;\r\n createdAt: number;\r\n nextAttemptAt: number;\r\n lastError?: string;\r\n}\r\n\r\nexport interface TelegramTextDeliveryEntry extends TelegramDeliveryEntryBase {\r\n kind: \"text\";\r\n text: string;\r\n}\r\n\r\nexport interface TelegramFileDeliveryEntry extends TelegramDeliveryEntryBase {\r\n kind: \"file\";\r\n filePath: string;\r\n fileName?: string;\r\n caption?: string;\r\n}\r\n\r\nexport type TelegramDeliveryEntry = TelegramTextDeliveryEntry | TelegramFileDeliveryEntry;\r\n\r\nexport class TelegramDeliveryQueue {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(\r\n private readonly options: {\r\n storePath: string;\r\n target: TelegramDeliveryTarget;\r\n deliveryConfig: TelegramConfig[\"delivery\"];\r\n now?: () => number;\r\n onDelivered?: (entry: TelegramDeliveryEntry) => void;\r\n onDeliveryFailed?: (entry: TelegramDeliveryEntry, error: unknown) => void;\r\n },\r\n ) {}\r\n\r\n async enqueue(input: { chatId: number; text: string }): Promise<TelegramTextDeliveryEntry> {\r\n return this.withLock(async () => {\r\n const entries = await this.readEntries();\r\n const now = this.now();\r\n const entry: TelegramTextDeliveryEntry = {\r\n id: crypto.randomUUID(),\r\n kind: \"text\",\r\n chatId: input.chatId,\r\n text: input.text,\r\n attemptCount: 0,\r\n createdAt: now,\r\n nextAttemptAt: now,\r\n };\r\n entries.push(entry);\r\n entries.sort((left, right) => left.createdAt - right.createdAt);\r\n await this.writeEntries(entries);\r\n return entry;\r\n });\r\n }\r\n\r\n async enqueueFile(input: {\r\n chatId: number;\r\n filePath: string;\r\n fileName?: string;\r\n caption?: string;\r\n }): Promise<TelegramFileDeliveryEntry> {\r\n return this.withLock(async () => {\r\n const entries = await this.readEntries();\r\n const now = this.now();\r\n const entry: TelegramFileDeliveryEntry = {\r\n id: crypto.randomUUID(),\r\n kind: \"file\",\r\n chatId: input.chatId,\r\n filePath: input.filePath,\r\n fileName: input.fileName,\r\n caption: input.caption,\r\n attemptCount: 0,\r\n createdAt: now,\r\n nextAttemptAt: now,\r\n };\r\n entries.push(entry);\r\n entries.sort((left, right) => left.createdAt - right.createdAt);\r\n await this.writeEntries(entries);\r\n return entry;\r\n });\r\n }\r\n\r\n async flushDue(): Promise<void> {\r\n await this.withLock(async () => {\r\n const entries = await this.readEntries();\r\n const now = this.now();\r\n let dirty = false;\r\n\r\n for (const entry of entries) {\r\n if (entry.nextAttemptAt > now) {\r\n continue;\r\n }\r\n\r\n try {\r\n await this.deliver(entry);\r\n dirty = true;\r\n entry.nextAttemptAt = Number.NaN;\r\n this.options.onDelivered?.(entry);\r\n } catch (error) {\r\n dirty = true;\r\n entry.attemptCount += 1;\r\n entry.lastError = error instanceof Error ? error.message : String(error);\r\n entry.nextAttemptAt = now + computeBackoffMs(entry.attemptCount, this.options.deliveryConfig);\r\n this.options.onDeliveryFailed?.(entry, error);\r\n }\r\n }\r\n\r\n if (!dirty) {\r\n return;\r\n }\r\n\r\n await this.writeEntries(entries.filter((entry) => Number.isFinite(entry.nextAttemptAt)));\r\n });\r\n }\r\n\r\n async listPending(): Promise<TelegramDeliveryEntry[]> {\r\n return this.withLock(async () => this.readEntries());\r\n }\r\n\r\n private async deliver(entry: TelegramDeliveryEntry): Promise<void> {\r\n if (entry.kind === \"file\") {\r\n await this.options.target.sendDocument({\r\n chatId: entry.chatId,\r\n filePath: entry.filePath,\r\n fileName: entry.fileName,\r\n caption: entry.caption,\r\n });\r\n return;\r\n }\r\n\r\n await this.options.target.sendMessage({\r\n chatId: entry.chatId,\r\n text: entry.text,\r\n });\r\n }\r\n\r\n private async readEntries(): Promise<TelegramDeliveryEntry[]> {\r\n const payload = await readJsonFile<{ entries?: TelegramDeliveryEntry[] } | null>(this.options.storePath, null);\r\n return Array.isArray(payload?.entries) ? payload.entries : [];\r\n }\r\n\r\n private async writeEntries(entries: TelegramDeliveryEntry[]): Promise<void> {\r\n await writeJsonFileAtomically(this.options.storePath, {\r\n entries,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n\r\n private now(): number {\r\n return this.options.now?.() ?? Date.now();\r\n }\r\n}\r\n\r\nfunction computeBackoffMs(attemptCount: number, config: TelegramConfig[\"delivery\"]): number {\r\n const exponent = Math.max(0, Math.min(attemptCount - 1, config.maxRetries - 1));\r\n return Math.min(config.maxDelayMs, config.baseDelayMs * 2 ** exponent);\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport async function readJsonFile<T>(filePath: string, fallback: T): Promise<T> {\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n return JSON.parse(raw) as T;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return fallback;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nexport async function writeJsonFileAtomically(filePath: string, value: unknown): Promise<void> {\r\n await fs.mkdir(path.dirname(filePath), { recursive: true });\r\n const temporaryPath = `${filePath}.tmp-${process.pid}-${Date.now()}`;\r\n await fs.writeFile(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\r\n await fs.rename(temporaryPath, filePath);\r\n}\r\n","export interface TelegramLogContext {\r\n peerKey?: string;\r\n userId?: number;\r\n chatId?: number;\r\n sessionId?: string;\r\n inputKind?: \"text\" | \"file\";\r\n fileName?: string;\r\n toolName?: string;\r\n detail?: string;\r\n}\r\n\r\nexport interface TelegramLogger {\r\n info(event: string, context?: TelegramLogContext): void;\r\n error(event: string, context?: TelegramLogContext): void;\r\n}\r\n\r\nexport function createConsoleTelegramLogger(): TelegramLogger {\r\n return {\r\n info(event, context) {\r\n console.log(formatTelegramLogLine(event, context));\r\n },\r\n error(event, context) {\r\n console.error(formatTelegramLogLine(event, context));\r\n },\r\n };\r\n}\r\n\r\nfunction formatTelegramLogLine(event: string, context: TelegramLogContext = {}): string {\r\n const fragments = [\"[telegram]\", event];\r\n\r\n if (context.userId) {\r\n fragments.push(`user=${context.userId}`);\r\n }\r\n if (context.chatId) {\r\n fragments.push(`chat=${context.chatId}`);\r\n }\r\n if (context.peerKey) {\r\n fragments.push(`peer=${context.peerKey}`);\r\n }\r\n if (context.sessionId) {\r\n fragments.push(`session=${context.sessionId}`);\r\n }\r\n if (context.inputKind) {\r\n fragments.push(`input=${context.inputKind}`);\r\n }\r\n if (context.fileName) {\r\n fragments.push(`file=${context.fileName}`);\r\n }\r\n if (context.toolName) {\r\n fragments.push(`tool=${context.toolName}`);\r\n }\r\n if (context.detail) {\r\n fragments.push(context.detail);\r\n }\r\n\r\n return fragments.join(\" \");\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface TelegramOffsetStoreLike {\r\n load(): Promise<number | null>;\r\n save(offset: number): Promise<void>;\r\n}\r\n\r\nexport class FileTelegramOffsetStore implements TelegramOffsetStoreLike {\r\n constructor(private readonly filePath: string) {}\r\n\r\n async load(): Promise<number | null> {\r\n const payload = await readJsonFile<{ nextOffset?: number } | null>(this.filePath, null);\r\n if (!payload || !Number.isFinite(payload.nextOffset)) {\r\n return null;\r\n }\r\n\r\n return Math.trunc(payload.nextOffset as number);\r\n }\r\n\r\n async save(offset: number): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n nextOffset: Math.trunc(offset),\r\n });\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport interface TelegramProcessLock {\r\n pidFilePath: string;\r\n release(): Promise<void>;\r\n}\r\n\r\nexport async function acquireTelegramProcessLock(options: {\r\n stateDir: string;\r\n processId?: number;\r\n isProcessAlive?: (processId: number) => Promise<boolean> | boolean;\r\n}): Promise<TelegramProcessLock> {\r\n const processId = options.processId ?? process.pid;\r\n const pidFilePath = path.join(options.stateDir, \"service.pid\");\r\n const isProcessAlive = options.isProcessAlive ?? defaultIsProcessAlive;\r\n\r\n await fs.mkdir(options.stateDir, { recursive: true });\r\n\r\n const existingPid = await readPidFile(pidFilePath);\r\n if (existingPid && existingPid !== processId && await isProcessAlive(existingPid)) {\r\n throw new Error(\r\n `Telegram service already running with PID ${existingPid}. Stop the existing process before starting a new one.`,\r\n );\r\n }\r\n\r\n await fs.writeFile(pidFilePath, `${processId}\\n`, \"utf8\");\r\n\r\n return {\r\n pidFilePath,\r\n async release() {\r\n const currentPid = await readPidFile(pidFilePath);\r\n if (currentPid !== processId) {\r\n return;\r\n }\r\n\r\n await fs.rm(pidFilePath, { force: true });\r\n },\r\n };\r\n}\r\n\r\nasync function readPidFile(filePath: string): Promise<number | null> {\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n const parsed = Number.parseInt(raw.trim(), 10);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return null;\r\n }\r\n\r\n throw error;\r\n }\r\n}\r\n\r\nasync function defaultIsProcessAlive(targetPid: number): Promise<boolean> {\r\n if (!Number.isFinite(targetPid) || targetPid <= 0) {\r\n return false;\r\n }\r\n\r\n try {\r\n process.kill(targetPid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","export function applyTelegramProxyEnvironment(proxyUrl: string): void {\r\n const normalized = proxyUrl.trim();\r\n if (!normalized) {\r\n return;\r\n }\r\n\r\n process.env.NODE_USE_ENV_PROXY = \"1\";\r\n process.env.HTTPS_PROXY = normalized;\r\n process.env.HTTP_PROXY = normalized;\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface TelegramSessionBinding {\r\n peerKey: string;\r\n userId: number;\r\n chatId: number;\r\n sessionId: string;\r\n cwd: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface TelegramSessionMapStoreLike {\r\n get(peerKey: string): Promise<TelegramSessionBinding | null>;\r\n set(binding: TelegramSessionBinding): Promise<void>;\r\n delete(peerKey: string): Promise<void>;\r\n list(): Promise<TelegramSessionBinding[]>;\r\n}\r\n\r\nexport class FileTelegramSessionMapStore implements TelegramSessionMapStoreLike {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(private readonly filePath: string) {}\r\n\r\n async get(peerKey: string): Promise<TelegramSessionBinding | null> {\r\n return this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n return bindings.find((binding) => binding.peerKey === peerKey) ?? null;\r\n });\r\n }\r\n\r\n async set(binding: TelegramSessionBinding): Promise<void> {\r\n await this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n const next = bindings.filter((entry) => entry.peerKey !== binding.peerKey);\r\n next.push(binding);\r\n next.sort((left, right) => left.peerKey.localeCompare(right.peerKey));\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async delete(peerKey: string): Promise<void> {\r\n await this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n const next = bindings.filter((entry) => entry.peerKey !== peerKey);\r\n if (next.length === bindings.length) {\r\n return;\r\n }\r\n\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async list(): Promise<TelegramSessionBinding[]> {\r\n return this.withLock(async () => this.readAll());\r\n }\r\n\r\n private async readAll(): Promise<TelegramSessionBinding[]> {\r\n const payload = await readJsonFile<{ bindings?: TelegramSessionBinding[] } | null>(this.filePath, null);\r\n return Array.isArray(payload?.bindings) ? payload.bindings : [];\r\n }\r\n\r\n private async writeAll(bindings: TelegramSessionBinding[]): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n bindings,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport type { RunTurnResult } from \"../agent/types.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { PerPeerCommandQueue } from \"./commandQueue.js\";\r\nimport {\r\n FileTelegramAttachmentStore,\r\n type TelegramAttachmentStoreLike,\r\n} from \"./attachmentStore.js\";\r\nimport { TelegramLongPollingSource } from \"./polling.js\";\r\nimport type { TelegramOffsetStoreLike } from \"./offsetStore.js\";\r\nimport { createConsoleTelegramLogger, type TelegramLogger } from \"./logger.js\";\r\nimport { chunkTelegramMessage } from \"./messageChunking.js\";\r\nimport type { TelegramSessionMapStoreLike } from \"./sessionMapStore.js\";\r\nimport { runTelegramTurn, type TelegramActiveTurn } from \"./turnRunner.js\";\r\nimport { summarizeText } from \"./turnLogging.js\";\r\nimport type { TelegramBotApiClient } from \"./botApiClient.js\";\r\nimport { classifyTelegramUpdate } from \"./updateFilter.js\";\r\nimport { TelegramDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport type { TelegramPrivateMessage, TelegramUpdate } from \"./types.js\";\r\n\r\nexport interface TelegramServiceOptions {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n bot: TelegramBotApiClient;\r\n sessionStore: SessionStoreLike & {\r\n load(id: string): Promise<SessionRecord>;\r\n };\r\n sessionMapStore: TelegramSessionMapStoreLike;\r\n offsetStore: TelegramOffsetStoreLike;\r\n deliveryQueue: TelegramDeliveryQueue;\r\n attachmentStore?: TelegramAttachmentStoreLike;\r\n commandQueue?: PerPeerCommandQueue;\r\n runTurn?: (options: ManagedTurnOptions) => Promise<RunTurnResult>;\r\n pollingSource?: TelegramLongPollingSource;\r\n logger?: TelegramLogger;\r\n sleep?: (ms: number) => Promise<void>;\r\n}\r\n\r\nexport class TelegramService {\r\n private readonly pollingSource: TelegramLongPollingSource;\r\n private readonly commandQueue: PerPeerCommandQueue;\r\n private readonly attachmentStore: TelegramAttachmentStoreLike;\r\n private readonly logger: TelegramLogger;\r\n private readonly inFlightTasks = new Set<Promise<void>>();\r\n private readonly activeTurns = new Map<string, TelegramActiveTurn>();\r\n private readonly pendingStopRequests = new Set<string>();\r\n private readonly pendingUpdateCommits: Array<{\r\n updateId: number;\r\n settled: boolean;\r\n error: unknown;\r\n }> = [];\r\n private readonly pendingUpdateIds = new Set<number>();\r\n private readonly queuedTurnCounts = new Map<string, number>();\r\n private stopped = false;\r\n\r\n constructor(private readonly options: TelegramServiceOptions) {\r\n this.commandQueue = options.commandQueue ?? new PerPeerCommandQueue();\r\n this.pollingSource =\r\n options.pollingSource ??\r\n new TelegramLongPollingSource(options.bot, options.offsetStore, options.config.telegram);\r\n this.attachmentStore =\r\n options.attachmentStore ??\r\n new FileTelegramAttachmentStore(path.join(options.config.telegram.stateDir, \"attachments.json\"));\r\n this.logger = options.logger ?? createConsoleTelegramLogger();\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n this.abortAllActiveTurns(\"Telegram service stopping.\");\r\n }\r\n\r\n async run(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n this.logger.info(\"service online\", {\r\n detail: `state=${this.options.config.telegram.stateDir}`,\r\n });\r\n\r\n try {\r\n while (!this.stopped && !signal?.aborted) {\r\n try {\r\n await this.runPollIteration(signal);\r\n } catch (error) {\r\n if (signal?.aborted) {\r\n break;\r\n }\r\n\r\n this.logger.error(\"polling failure\", {\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n await this.sleep(this.options.config.telegram.polling.retryBackoffMs);\r\n }\r\n }\r\n } finally {\r\n await this.waitForIdle();\r\n }\r\n }\r\n\r\n async runOnce(signal?: AbortSignal): Promise<void> {\r\n await this.runCommittedIteration(signal);\r\n }\r\n\r\n private async runCommittedIteration(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n await this.options.deliveryQueue.flushDue();\r\n\r\n const updates = await this.pollingSource.getUpdates(signal);\r\n const turnTasks: Promise<void>[] = [];\r\n for (const update of updates) {\r\n const { task } = await this.processUpdate(update);\r\n if (task) {\r\n turnTasks.push(task);\r\n }\r\n }\r\n if (turnTasks.length > 0) {\r\n await Promise.all(turnTasks);\r\n }\r\n for (const update of updates) {\r\n await this.pollingSource.commit(update.update_id);\r\n }\r\n\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n private async runPollIteration(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n await this.options.deliveryQueue.flushDue();\r\n\r\n const updates = await this.pollingSource.getUpdates(signal);\r\n\r\n for (const update of updates) {\r\n if (this.pendingUpdateIds.has(update.update_id)) {\r\n continue;\r\n }\r\n\r\n this.pendingUpdateIds.add(update.update_id);\r\n const { task } = await this.processUpdate(update);\r\n this.queuePendingUpdateCommit(update.update_id, task ? [task] : []);\r\n }\r\n\r\n await this.drainPendingUpdateCommits();\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n async waitForIdle(): Promise<void> {\r\n while (this.inFlightTasks.size > 0) {\r\n await Promise.allSettled([...this.inFlightTasks]);\r\n }\r\n }\r\n\r\n private async processUpdate(update: TelegramUpdate): Promise<{\r\n task: Promise<void> | null;\r\n }> {\r\n const classified = classifyTelegramUpdate(update, {\r\n allowedUserIds: this.options.config.telegram.allowedUserIds,\r\n });\r\n\r\n if (classified.kind === \"ignore\") {\r\n return { task: null };\r\n }\r\n\r\n if (classified.kind === \"private_message\" && isStopCommand(classified.text)) {\r\n await this.handleStopCommand(classified);\r\n return { task: null };\r\n }\r\n\r\n this.logger.info(\"received inbound message\", {\r\n peerKey: classified.peerKey,\r\n userId: classified.userId,\r\n chatId: classified.chatId,\r\n inputKind: classified.kind === \"private_file_message\" ? \"file\" : \"text\",\r\n fileName: classified.kind === \"private_file_message\" ? classified.fileName : undefined,\r\n });\r\n\r\n this.incrementQueuedTurns(classified.peerKey);\r\n const task = this.commandQueue.enqueue(classified.peerKey, async () => {\r\n await runTelegramTurn({\r\n cwd: this.options.cwd,\r\n config: this.options.config,\r\n bot: this.options.bot,\r\n sessionStore: this.options.sessionStore,\r\n sessionMapStore: this.options.sessionMapStore,\r\n attachmentStore: this.attachmentStore,\r\n deliveryQueue: this.options.deliveryQueue,\r\n logger: this.logger,\r\n message: classified,\r\n runTurn: this.options.runTurn,\r\n enqueueReply: (chatId, text) => this.enqueueReply(chatId, text),\r\n markQueuedTurnStarted: (peerKey) => this.decrementQueuedTurns(peerKey),\r\n consumePendingStop: (peerKey) => this.pendingStopRequests.delete(peerKey),\r\n onActiveTurnStart: (peerKey, activeTurn) => {\r\n this.activeTurns.set(peerKey, activeTurn);\r\n },\r\n onActiveTurnEnd: (peerKey) => {\r\n this.activeTurns.delete(peerKey);\r\n },\r\n });\r\n });\r\n return {\r\n task: this.trackTask(task, {\r\n peerKey: classified.peerKey,\r\n userId: classified.userId,\r\n chatId: classified.chatId,\r\n }),\r\n };\r\n }\r\n\r\n private async handleStopCommand(message: TelegramPrivateMessage): Promise<void> {\r\n const activeTurn = this.activeTurns.get(message.peerKey);\r\n if (activeTurn && !activeTurn.controller.signal.aborted) {\r\n activeTurn.controller.abort();\r\n await this.enqueueReply(message.chatId, \"Stopping the current Telegram task. The bot stays online for your next request.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop requested\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n chatId: message.chatId,\r\n sessionId: activeTurn.sessionId,\r\n });\r\n return;\r\n }\r\n\r\n if (this.getQueuedTurnCount(message.peerKey) > 0) {\r\n this.pendingStopRequests.add(message.peerKey);\r\n await this.enqueueReply(message.chatId, \"Stopping the current Telegram task. The bot stays online for your next request.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop armed for queued turn\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n chatId: message.chatId,\r\n });\r\n return;\r\n }\r\n\r\n await this.enqueueReply(message.chatId, \"No Telegram task is running right now.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop requested with no active turn\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n chatId: message.chatId,\r\n });\r\n }\r\n\r\n private async enqueueReply(chatId: number, text: string): Promise<void> {\r\n if (!text) {\r\n return;\r\n }\r\n\r\n for (const chunk of chunkTelegramMessage(text, this.options.config.telegram.messageChunkChars)) {\r\n await this.options.deliveryQueue.enqueue({\r\n chatId,\r\n text: chunk,\r\n });\r\n this.logger.info(\"queued text reply\", {\r\n chatId,\r\n detail: summarizeText(chunk),\r\n });\r\n }\r\n\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n private async ensureStateDirectory(): Promise<void> {\r\n await fs.mkdir(this.options.config.telegram.stateDir, { recursive: true });\r\n }\r\n\r\n private trackTask(\r\n task: Promise<void>,\r\n context: {\r\n peerKey: string;\r\n userId: number;\r\n chatId: number;\r\n },\r\n ): Promise<void> {\r\n const tracked = task\r\n .catch((error) => {\r\n this.logger.error(\"background task failure\", {\r\n ...context,\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n })\r\n .finally(async () => {\r\n this.inFlightTasks.delete(tracked);\r\n try {\r\n await this.options.deliveryQueue.flushDue();\r\n } catch (error) {\r\n this.logger.error(\"delivery flush failure\", {\r\n ...context,\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n });\r\n this.inFlightTasks.add(tracked);\r\n return tracked;\r\n }\r\n\r\n private abortAllActiveTurns(message: string): void {\r\n for (const activeTurn of this.activeTurns.values()) {\r\n if (!activeTurn.controller.signal.aborted) {\r\n activeTurn.controller.abort(message);\r\n }\r\n }\r\n }\r\n\r\n private async sleep(ms: number): Promise<void> {\r\n if (!Number.isFinite(ms) || ms <= 0) {\r\n return;\r\n }\r\n\r\n if (this.options.sleep) {\r\n await this.options.sleep(ms);\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, ms));\r\n }\r\n\r\n private incrementQueuedTurns(peerKey: string): void {\r\n this.queuedTurnCounts.set(peerKey, this.getQueuedTurnCount(peerKey) + 1);\r\n }\r\n\r\n private decrementQueuedTurns(peerKey: string): void {\r\n const nextCount = Math.max(0, this.getQueuedTurnCount(peerKey) - 1);\r\n if (nextCount === 0) {\r\n this.queuedTurnCounts.delete(peerKey);\r\n return;\r\n }\r\n\r\n this.queuedTurnCounts.set(peerKey, nextCount);\r\n }\r\n\r\n private getQueuedTurnCount(peerKey: string): number {\r\n return this.queuedTurnCounts.get(peerKey) ?? 0;\r\n }\r\n\r\n private queuePendingUpdateCommit(updateId: number, tasks: Promise<void>[]): void {\r\n const entry = {\r\n updateId,\r\n settled: false,\r\n error: null as unknown,\r\n };\r\n\r\n Promise.all(tasks)\r\n .then(() => {\r\n entry.settled = true;\r\n })\r\n .catch((error) => {\r\n entry.error = error;\r\n entry.settled = true;\r\n });\r\n\r\n this.pendingUpdateCommits.push(entry);\r\n }\r\n\r\n private async drainPendingUpdateCommits(): Promise<void> {\r\n while (this.pendingUpdateCommits.length > 0) {\r\n const next = this.pendingUpdateCommits[0]!;\r\n if (!next.settled) {\r\n return;\r\n }\r\n\r\n if (next.error) {\r\n throw next.error;\r\n }\r\n\r\n await this.pollingSource.commit(next.updateId);\r\n this.pendingUpdateCommits.shift();\r\n this.pendingUpdateIds.delete(next.updateId);\r\n }\r\n }\r\n}\r\n\r\nfunction isStopCommand(input: string): boolean {\r\n return input.trim().toLowerCase() === \"/stop\";\r\n}\r\n","export class PerPeerCommandQueue {\r\n private readonly tails = new Map<string, Promise<void>>();\r\n\r\n async enqueue<T>(peerKey: string, task: () => Promise<T> | T): Promise<T> {\r\n const previous = this.tails.get(peerKey) ?? Promise.resolve();\r\n let release!: () => void;\r\n const current = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n const tail = previous.catch(() => undefined).then(() => current);\r\n this.tails.set(peerKey, tail);\r\n\r\n await previous.catch(() => undefined);\r\n\r\n try {\r\n return await task();\r\n } finally {\r\n release();\r\n if (this.tails.get(peerKey) === tail) {\r\n this.tails.delete(peerKey);\r\n }\r\n }\r\n }\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface TelegramAttachmentRecord {\r\n id: string;\r\n peerKey: string;\r\n userId: number;\r\n chatId: number;\r\n messageId: number;\r\n updateId: number;\r\n sessionId: string;\r\n telegramFileId: string;\r\n telegramFileUniqueId: string;\r\n telegramFilePath: string;\r\n localFilePath: string;\r\n fileName?: string;\r\n mimeType?: string;\r\n fileSize?: number;\r\n caption?: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface TelegramAttachmentStoreLike {\r\n add(record: TelegramAttachmentRecord): Promise<void>;\r\n getLatestByPeer(peerKey: string): Promise<TelegramAttachmentRecord | null>;\r\n listByPeer(peerKey: string, limit?: number): Promise<TelegramAttachmentRecord[]>;\r\n}\r\n\r\nexport class FileTelegramAttachmentStore implements TelegramAttachmentStoreLike {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(private readonly filePath: string) {}\r\n\r\n async add(record: TelegramAttachmentRecord): Promise<void> {\r\n await this.withLock(async () => {\r\n const records = await this.readAll();\r\n const next = records.filter((entry) => entry.id !== record.id);\r\n next.push(record);\r\n next.sort((left, right) => {\r\n if (left.updatedAt === right.updatedAt) {\r\n return left.id.localeCompare(right.id);\r\n }\r\n\r\n return left.updatedAt.localeCompare(right.updatedAt);\r\n });\r\n await this.writeAll(trimRecords(next, 200));\r\n });\r\n }\r\n\r\n async getLatestByPeer(peerKey: string): Promise<TelegramAttachmentRecord | null> {\r\n return this.withLock(async () => {\r\n const records = await this.readAll();\r\n const matches = records.filter((entry) => entry.peerKey === peerKey);\r\n return matches[matches.length - 1] ?? null;\r\n });\r\n }\r\n\r\n async listByPeer(peerKey: string, limit = 5): Promise<TelegramAttachmentRecord[]> {\r\n return this.withLock(async () => {\r\n const records = await this.readAll();\r\n const matches = records.filter((entry) => entry.peerKey === peerKey);\r\n return matches.slice(Math.max(0, matches.length - Math.max(1, limit))).reverse();\r\n });\r\n }\r\n\r\n private async readAll(): Promise<TelegramAttachmentRecord[]> {\r\n const payload = await readJsonFile<{ attachments?: TelegramAttachmentRecord[] } | null>(this.filePath, null);\r\n return Array.isArray(payload?.attachments) ? payload.attachments : [];\r\n }\r\n\r\n private async writeAll(records: TelegramAttachmentRecord[]): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n attachments: records,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n\r\nfunction trimRecords(records: TelegramAttachmentRecord[], maxRecords: number): TelegramAttachmentRecord[] {\r\n if (records.length <= maxRecords) {\r\n return records;\r\n }\r\n\r\n return records.slice(records.length - maxRecords);\r\n}\r\n","import type { TelegramRuntimeConfig } from \"./config.js\";\r\nimport type { TelegramBotApiClient } from \"./botApiClient.js\";\r\nimport type { TelegramUpdate } from \"./types.js\";\r\nimport type { TelegramOffsetStoreLike } from \"./offsetStore.js\";\r\n\r\nexport class TelegramLongPollingSource {\r\n constructor(\r\n private readonly bot: TelegramBotApiClient,\r\n private readonly offsetStore: TelegramOffsetStoreLike,\r\n private readonly config: TelegramRuntimeConfig,\r\n ) {}\r\n\r\n async getUpdates(signal?: AbortSignal): Promise<TelegramUpdate[]> {\r\n const offset = await this.offsetStore.load();\r\n return this.bot.getUpdates({\r\n offset: offset ?? undefined,\r\n limit: this.config.polling.limit,\r\n timeoutSeconds: this.config.polling.timeoutSeconds,\r\n signal,\r\n });\r\n }\r\n\r\n async commit(updateId: number): Promise<void> {\r\n await this.offsetStore.save(updateId + 1);\r\n }\r\n}\r\n","export function chunkTelegramMessage(text: string, maxChars = 4_096): string[] {\r\n if (!text) {\r\n return [];\r\n }\r\n\r\n const limit = Math.max(1, Math.trunc(maxChars));\r\n if (text.length <= limit) {\r\n return [text];\r\n }\r\n\r\n const chunks: string[] = [];\r\n let remaining = text;\r\n\r\n while (remaining.length > limit) {\r\n const cut = findCutPoint(remaining, limit);\r\n chunks.push(remaining.slice(0, cut));\r\n remaining = remaining.slice(cut);\r\n }\r\n\r\n if (remaining.length > 0) {\r\n chunks.push(remaining);\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\nfunction findCutPoint(text: string, limit: number): number {\r\n for (const separator of [\"\\n\\n\", \"\\n\", \" \"]) {\r\n const cut = text.lastIndexOf(separator, limit);\r\n if (cut > 0) {\r\n return cut + separator.length <= limit ? cut + separator.length : cut;\r\n }\r\n }\r\n\r\n return limit;\r\n}\r\n","import path from \"node:path\";\r\n\r\nimport { AgentTurnError, getErrorMessage } from \"../agent/errors.js\";\r\nimport { runManagedAgentTurn } from \"../agent/managedTurn.js\";\r\nimport type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport type { RunTurnResult } from \"../agent/types.js\";\r\nimport { createRuntimeToolRegistry } from \"../tools/runtimeRegistry.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { isAbortError } from \"../utils/abort.js\";\r\nimport type {\r\n TelegramAttachmentStoreLike,\r\n} from \"./attachmentStore.js\";\r\nimport { buildFileTurnInput, buildTextTurnInput, downloadTelegramAttachment } from \"./inboundFiles.js\";\r\nimport type { TelegramLogger } from \"./logger.js\";\r\nimport { handleTelegramLocalCommand } from \"./localCommands.js\";\r\nimport { TelegramOutputPort } from \"./outputPort.js\";\r\nimport type { TelegramSessionBinding, TelegramSessionMapStoreLike } from \"./sessionMapStore.js\";\r\nimport { createTelegramSendFileTool } from \"./sendFileTool.js\";\r\nimport { TelegramTurnDisplay } from \"./turnDisplay.js\";\r\nimport { createLoggedTelegramCallbacks } from \"./turnLogging.js\";\r\nimport type { TelegramBotApiClient } from \"./botApiClient.js\";\r\nimport type { TelegramPrivateFileMessage, TelegramPrivateMessage } from \"./types.js\";\r\n\r\nexport interface TelegramActiveTurn {\r\n controller: AbortController;\r\n chatId: number;\r\n userId: number;\r\n sessionId: string;\r\n waitForVisibleMessages: () => Promise<void>;\r\n}\r\n\r\nexport async function runTelegramTurn(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n bot: TelegramBotApiClient;\r\n sessionStore: SessionStoreLike & {\r\n load(id: string): Promise<SessionRecord>;\r\n };\r\n sessionMapStore: TelegramSessionMapStoreLike;\r\n attachmentStore: TelegramAttachmentStoreLike;\r\n deliveryQueue: {\r\n flushDue(): Promise<void>;\r\n };\r\n logger: TelegramLogger;\r\n message: TelegramPrivateMessage | TelegramPrivateFileMessage;\r\n runTurn?: (input: ManagedTurnOptions) => Promise<RunTurnResult>;\r\n enqueueReply: (chatId: number, text: string) => Promise<void>;\r\n markQueuedTurnStarted: (peerKey: string) => void;\r\n consumePendingStop: (peerKey: string) => boolean;\r\n onActiveTurnStart: (peerKey: string, activeTurn: TelegramActiveTurn) => void;\r\n onActiveTurnEnd: (peerKey: string) => void;\r\n}): Promise<void> {\r\n let binding = await getOrCreateBinding(options.message, options);\r\n let session = await loadBoundSession(binding, options);\r\n const output = new TelegramOutputPort({\r\n chatId: options.message.chatId,\r\n messageChunkChars: options.config.telegram.messageChunkChars,\r\n enqueueReply: async (chatId, text) => options.enqueueReply(chatId, text),\r\n });\r\n options.logger.info(\"session ready\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n });\r\n\r\n try {\r\n if (options.message.kind === \"private_message\") {\r\n const localCommandResult = await handleTelegramLocalCommand(\r\n options.message.text,\r\n {\r\n cwd: options.cwd,\r\n session: session,\r\n config: options.config,\r\n },\r\n output,\r\n );\r\n\r\n if (localCommandResult === \"handled\") {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n return;\r\n }\r\n\r\n if (localCommandResult === \"multiline\") {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n output.warn(\"Telegram does not support interactive multiline mode. Send the full message directly.\");\r\n return;\r\n }\r\n }\r\n\r\n const display = new TelegramTurnDisplay({\r\n chatId: options.message.chatId,\r\n sendTyping: async (chatId) => {\r\n await options.bot.sendChatAction({\r\n chatId,\r\n action: \"typing\",\r\n });\r\n },\r\n enqueueVisibleMessage: async (target, text) => options.enqueueReply(target.chatId, text),\r\n typingIntervalMs: options.config.telegram.typingIntervalMs,\r\n });\r\n const controller = new AbortController();\r\n const shouldAbortOnStart = options.consumePendingStop(options.message.peerKey);\r\n options.onActiveTurnStart(options.message.peerKey, {\r\n controller,\r\n chatId: options.message.chatId,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n waitForVisibleMessages: async () => display.waitForDurableVisible(),\r\n });\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n\r\n const turnInput = await buildTurnInput(options.message, session.id, options);\r\n const callbacks = createLoggedTelegramCallbacks(display, options.logger, {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n });\r\n const toolRegistry = await createRuntimeToolRegistry(options.config, {\r\n includeTools: [\r\n createTelegramSendFileTool({\r\n chatId: options.message.chatId,\r\n deliveryQueue: options.deliveryQueue as never,\r\n logger: options.logger,\r\n }),\r\n ],\r\n });\r\n\r\n try {\r\n if (shouldAbortOnStart) {\r\n queueMicrotask(() => {\r\n if (!controller.signal.aborted) {\r\n controller.abort();\r\n }\r\n });\r\n }\r\n options.logger.info(\"starting turn\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n inputKind: options.message.kind === \"private_file_message\" ? \"file\" : \"text\",\r\n fileName: options.message.kind === \"private_file_message\" ? options.message.fileName : undefined,\r\n });\r\n const result = await (options.runTurn ?? runManagedAgentTurn)({\r\n input: turnInput,\r\n cwd: options.cwd,\r\n config: options.config,\r\n session,\r\n sessionStore: options.sessionStore,\r\n abortSignal: controller.signal,\r\n callbacks,\r\n toolRegistry,\r\n identity: {\r\n kind: \"lead\",\r\n name: \"lead\",\r\n },\r\n });\r\n session = result.session;\r\n if (result.paused && result.pauseReason) {\r\n output.warn(result.pauseReason);\r\n display.noteTerminalState();\r\n }\r\n options.logger.info(\"turn completed\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n detail: result.changedPaths.length > 0 ? `changed=${result.changedPaths.length}` : \"changed=0\",\r\n });\r\n } catch (error) {\r\n if (error instanceof AgentTurnError) {\r\n session = error.session;\r\n }\r\n\r\n if (isAbortError(error)) {\r\n display.noteTerminalState();\r\n output.warn(\"Turn interrupted. You can keep chatting.\");\r\n options.logger.info(\"turn stopped\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n });\r\n } else {\r\n display.noteTerminalState();\r\n output.error(getErrorMessage(error));\r\n output.info(\"The request failed, but the session is still alive. You can keep chatting.\");\r\n options.logger.error(\"turn failed\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: session.id,\r\n detail: getErrorMessage(error),\r\n });\r\n }\r\n } finally {\r\n options.onActiveTurnEnd(options.message.peerKey);\r\n await display.flush();\r\n display.dispose();\r\n await toolRegistry.close?.().catch(() => undefined);\r\n }\r\n } finally {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n binding = touchBinding(binding, session.id);\r\n await options.sessionMapStore.set(binding);\r\n await output.flush();\r\n }\r\n}\r\n\r\nasync function buildTurnInput(\r\n message: TelegramPrivateMessage | TelegramPrivateFileMessage,\r\n sessionId: string,\r\n options: {\r\n bot: TelegramBotApiClient;\r\n cwd: string;\r\n config: RuntimeConfig;\r\n attachmentStore: TelegramAttachmentStoreLike;\r\n logger: TelegramLogger;\r\n },\r\n): Promise<string> {\r\n if (message.kind === \"private_file_message\") {\r\n const attachment = await downloadTelegramAttachment({\r\n bot: options.bot,\r\n cwd: options.cwd,\r\n config: options.config.telegram,\r\n message,\r\n sessionId,\r\n logger: options.logger,\r\n });\r\n await options.attachmentStore.add(attachment);\r\n const recentAttachments = await options.attachmentStore.listByPeer(message.peerKey, 5);\r\n return buildFileTurnInput(message, attachment, recentAttachments, options.cwd);\r\n }\r\n\r\n const recentAttachments = await options.attachmentStore.listByPeer(message.peerKey, 5);\r\n return buildTextTurnInput(message.text, recentAttachments, options.cwd);\r\n}\r\n\r\nasync function getOrCreateBinding(\r\n message: TelegramPrivateMessage | TelegramPrivateFileMessage,\r\n options: {\r\n cwd: string;\r\n sessionStore: SessionStoreLike & { load(id: string): Promise<SessionRecord> };\r\n sessionMapStore: TelegramSessionMapStoreLike;\r\n },\r\n): Promise<TelegramSessionBinding> {\r\n const existing = await options.sessionMapStore.get(message.peerKey);\r\n if (existing) {\r\n return touchBinding(existing, existing.sessionId);\r\n }\r\n\r\n const session = await options.sessionStore.save(await options.sessionStore.create(options.cwd));\r\n const now = new Date().toISOString();\r\n const binding: TelegramSessionBinding = {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n chatId: message.chatId,\r\n sessionId: session.id,\r\n cwd: options.cwd,\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n await options.sessionMapStore.set(binding);\r\n return binding;\r\n}\r\n\r\nasync function loadBoundSession(\r\n binding: TelegramSessionBinding,\r\n options: {\r\n cwd: string;\r\n sessionStore: SessionStoreLike & { load(id: string): Promise<SessionRecord> };\r\n sessionMapStore: TelegramSessionMapStoreLike;\r\n },\r\n): Promise<SessionRecord> {\r\n try {\r\n return await options.sessionStore.load(binding.sessionId);\r\n } catch {\r\n const session = await options.sessionStore.save(await options.sessionStore.create(options.cwd));\r\n const nextBinding = touchBinding(binding, session.id);\r\n await options.sessionMapStore.set(nextBinding);\r\n return session;\r\n }\r\n}\r\n\r\nfunction touchBinding(binding: TelegramSessionBinding, sessionId: string): TelegramSessionBinding {\r\n return {\r\n ...binding,\r\n sessionId,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { RuntimeConfig } from \"../types.js\";\r\nimport type { TelegramBotApiClient } from \"./botApiClient.js\";\r\nimport type { TelegramAttachmentRecord } from \"./attachmentStore.js\";\r\nimport type { TelegramLogger } from \"./logger.js\";\r\nimport type { TelegramPrivateFileMessage } from \"./types.js\";\r\n\r\nconst DEFAULT_MAX_DOWNLOAD_BYTES = 45 * 1024 * 1024;\r\n\r\nexport async function downloadTelegramAttachment(options: {\r\n bot: TelegramBotApiClient;\r\n cwd: string;\r\n config: RuntimeConfig[\"telegram\"];\r\n message: TelegramPrivateFileMessage;\r\n sessionId: string;\r\n logger?: TelegramLogger;\r\n}): Promise<TelegramAttachmentRecord> {\r\n const descriptor = await options.bot.getFile({\r\n fileId: options.message.fileId,\r\n });\r\n const announcedSize = options.message.fileSize ?? descriptor.fileSize ?? undefined;\r\n const maxDownloadBytes = readConfiguredDownloadLimit(options.config);\r\n if (typeof announcedSize === \"number\" && announcedSize > maxDownloadBytes) {\r\n throw new Error(\r\n `Telegram file too large to download: ${options.message.fileName ?? options.message.fileId} (${announcedSize} bytes > ${maxDownloadBytes} bytes).`,\r\n );\r\n }\r\n\r\n const download = await options.bot.downloadFile(descriptor);\r\n if (download.byteLength > maxDownloadBytes) {\r\n throw new Error(\r\n `Telegram file too large after download: ${options.message.fileName ?? options.message.fileId} (${download.byteLength} bytes > ${maxDownloadBytes} bytes).`,\r\n );\r\n }\r\n\r\n const filesDir = path.join(options.config.stateDir, \"files\", sanitizePathSegment(options.message.peerKey));\r\n await fs.mkdir(filesDir, { recursive: true });\r\n const safeFileName = sanitizeFileName(options.message.fileName ?? `${options.message.fileUniqueId}.bin`);\r\n const localFilePath = path.join(filesDir, `${String(options.message.updateId).padStart(8, \"0\")}-${safeFileName}`);\r\n await fs.writeFile(localFilePath, download);\r\n\r\n const timestamp = new Date().toISOString();\r\n const record: TelegramAttachmentRecord = {\r\n id: `${options.message.peerKey}:${options.message.messageId}:${options.message.fileUniqueId}`,\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n messageId: options.message.messageId,\r\n updateId: options.message.updateId,\r\n sessionId: options.sessionId,\r\n telegramFileId: options.message.fileId,\r\n telegramFileUniqueId: options.message.fileUniqueId,\r\n telegramFilePath: descriptor.filePath,\r\n localFilePath,\r\n fileName: options.message.fileName,\r\n mimeType: options.message.mimeType,\r\n fileSize: download.byteLength,\r\n caption: options.message.text || undefined,\r\n createdAt: timestamp,\r\n updatedAt: timestamp,\r\n };\r\n options.logger?.info(\"downloaded inbound file\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n chatId: options.message.chatId,\r\n sessionId: options.sessionId,\r\n inputKind: \"file\",\r\n fileName: options.message.fileName,\r\n detail: `path=${localFilePath}`,\r\n });\r\n return record;\r\n}\r\n\r\nexport function buildTextTurnInput(\r\n input: string,\r\n recentAttachments: TelegramAttachmentRecord[],\r\n cwd: string,\r\n): string {\r\n if (recentAttachments.length === 0) {\r\n return input;\r\n }\r\n\r\n return [\r\n input,\r\n \"\",\r\n \"[Telegram context]\",\r\n \"Recent attachments from this chat are available locally. Use them only if they are relevant to the user's request.\",\r\n ...formatAttachmentLines(recentAttachments, cwd),\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function buildFileTurnInput(\r\n message: TelegramPrivateFileMessage,\r\n attachment: TelegramAttachmentRecord,\r\n recentAttachments: TelegramAttachmentRecord[],\r\n cwd: string,\r\n): string {\r\n const instruction =\r\n message.text ||\r\n \"The user sent a file in Telegram without extra instructions. Confirm receipt briefly, inspect the file if useful, and ask what they want done next.\";\r\n\r\n return [\r\n instruction,\r\n \"\",\r\n \"[Telegram attachment]\",\r\n \"The user uploaded a file in this chat. It has already been downloaded locally and is available to the normal file/document tools.\",\r\n ...formatAttachmentLines([attachment], cwd),\r\n \"\",\r\n \"[Recent Telegram attachments]\",\r\n ...formatAttachmentLines(recentAttachments, cwd),\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction formatAttachmentLines(records: TelegramAttachmentRecord[], cwd: string): string[] {\r\n if (records.length === 0) {\r\n return [\"- none\"];\r\n }\r\n\r\n return records.map((record, index) => {\r\n const displayPath = toDisplayPath(record.localFilePath, cwd);\r\n const size = typeof record.fileSize === \"number\" ? ` (${record.fileSize} bytes)` : \"\";\r\n const caption = record.caption ? `; caption=${record.caption}` : \"\";\r\n return `${index + 1}. ${record.fileName ?? path.basename(record.localFilePath)} -> ${displayPath}${size}${caption}`;\r\n });\r\n}\r\n\r\nfunction sanitizeFileName(fileName: string): string {\r\n const normalized = fileName.trim().replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]+/g, \"-\");\r\n return normalized || \"telegram-upload.bin\";\r\n}\r\n\r\nfunction sanitizePathSegment(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\");\r\n}\r\n\r\nfunction toDisplayPath(targetPath: string, cwd: string): string {\r\n const relative = path.relative(cwd, targetPath);\r\n return !relative.startsWith(\"..\") && !path.isAbsolute(relative) ? relative : targetPath;\r\n}\r\n\r\nfunction readConfiguredDownloadLimit(config: unknown): number {\r\n const value = (config as { maxDownloadBytes?: number } | undefined)?.maxDownloadBytes;\r\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\r\n return Math.trunc(value);\r\n }\r\n\r\n return DEFAULT_MAX_DOWNLOAD_BYTES;\r\n}\r\n","import { formatTodoBlock } from \"../agent/todos.js\";\r\nimport { reconcileBackgroundJobs } from \"../background/reconcile.js\";\r\nimport { BackgroundJobStore } from \"../background/store.js\";\r\nimport { loadProjectContext } from \"../context/projectContext.js\";\r\nimport { resetProjectRuntime } from \"../project/reset.js\";\r\nimport { TaskStore } from \"../tasks/store.js\";\r\nimport { MessageBus } from \"../team/messageBus.js\";\r\nimport { reconcileTeamState } from \"../team/reconcile.js\";\r\nimport { TeamStore } from \"../team/store.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\nimport { formatSessionRuntimeSummary } from \"../ui/runtimeSummary.js\";\r\nimport type { ShellOutputPort } from \"./shell.js\";\r\n\r\nexport interface LocalCommandContext {\r\n cwd: string;\r\n session: SessionRecord;\r\n config: RuntimeConfig;\r\n}\r\n\r\nexport type LocalCommandResult = \"continue\" | \"handled\" | \"quit\" | \"multiline\";\r\n\r\nconst EXIT_COMMANDS = new Set([\"q\", \"quit\", \"exit\", \"/q\", \"/quit\", \"/exit\", \"退出\", \"/退出\"]);\r\nconst RESET_COMMANDS = new Set([\"reset\", \"/reset\", \"重置\", \"/重置\"]);\r\nconst HELP_COMMANDS = new Set([\"/help\", \"/帮助\"]);\r\nconst SESSION_COMMANDS = new Set([\"/session\", \"/会话\"]);\r\nconst CONFIG_COMMANDS = new Set([\"/config\", \"/配置\"]);\r\nconst TODOS_COMMANDS = new Set([\"/todos\", \"/待办\"]);\r\nconst RUNTIME_COMMANDS = new Set([\"/runtime\", \"/stats\", \"/仪表盘\"]);\r\nconst TASKS_COMMANDS = new Set([\"/tasks\", \"/任务\"]);\r\nconst TEAM_COMMANDS = new Set([\"/team\", \"/队友\"]);\r\nconst BACKGROUND_COMMANDS = new Set([\"/background\", \"/后台\"]);\r\nconst INBOX_COMMANDS = new Set([\"/inbox\", \"/收件箱\"]);\r\nconst WORKTREES_COMMANDS = new Set([\"/worktrees\", \"/工作区\"]);\r\nconst MULTILINE_COMMANDS = new Set([\"/multi\", \"/多行\"]);\r\n\r\nexport function isExplicitExitCommand(input: string): boolean {\r\n return EXIT_COMMANDS.has(input.trim().toLowerCase());\r\n}\r\n\r\nexport async function handleLocalCommand(\r\n input: string,\r\n context: LocalCommandContext,\r\n output: ShellOutputPort,\r\n): Promise<LocalCommandResult> {\r\n const normalized = input.trim().toLowerCase();\r\n\r\n if (!normalized) {\r\n return \"handled\";\r\n }\r\n\r\n if (isExplicitExitCommand(normalized)) {\r\n output.info(\"Session saved.\");\r\n return \"quit\";\r\n }\r\n\r\n if (RESET_COMMANDS.has(normalized)) {\r\n await resetProjectRuntime({\r\n cwd: context.cwd,\r\n config: context.config,\r\n currentSessionId: context.session.id,\r\n });\r\n output.warn(\"Project runtime reset. Session closed.\");\r\n return \"quit\";\r\n }\r\n\r\n if (HELP_COMMANDS.has(normalized)) {\r\n output.plain(\r\n [\r\n \"/help /帮助 查看帮助\",\r\n \"/session /会话 查看当前会话 ID\",\r\n \"/config /配置 查看当前运行配置\",\r\n \"/todos /待办 查看当前 todo 状态\",\r\n \"/runtime /stats 查看当前 session 运行仪表盘摘要\",\r\n \"/tasks /任务 查看持久化任务板\",\r\n \"/team /队友 查看队友状态\",\r\n \"/background /后台 查看后台任务\",\r\n \"/worktrees /工作区 查看隔离工作区\",\r\n \"/inbox /收件箱 查看 lead 收件箱(不清空)\",\r\n \"/multi /多行 进入多行输入模式,用 ::end 提交,::cancel 取消\",\r\n \"/reset /重置 清空当前项目运行时状态并退出会话\",\r\n \"quit / 退出 退出会话\",\r\n \"q 退出会话\",\r\n \"/quit / /exit 退出会话\",\r\n \"\",\r\n \"其他输入会直接发送给 Athlete。\",\r\n ].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (MULTILINE_COMMANDS.has(normalized)) {\r\n return \"multiline\";\r\n }\r\n\r\n if (SESSION_COMMANDS.has(normalized)) {\r\n output.info(`Current session: ${context.session.id}`);\r\n return \"handled\";\r\n }\r\n\r\n if (CONFIG_COMMANDS.has(normalized)) {\r\n output.info(`model=${context.config.model} mode=${context.config.mode} baseUrl=${context.config.baseUrl}`);\r\n return \"handled\";\r\n }\r\n\r\n if (TODOS_COMMANDS.has(normalized)) {\r\n output.plain(formatTodoBlock(context.session.todoItems));\r\n return \"handled\";\r\n }\r\n\r\n if (RUNTIME_COMMANDS.has(normalized)) {\r\n output.plain(formatSessionRuntimeSummary(context.session));\r\n return \"handled\";\r\n }\r\n\r\n if (\r\n TASKS_COMMANDS.has(normalized) ||\r\n TEAM_COMMANDS.has(normalized) ||\r\n BACKGROUND_COMMANDS.has(normalized) ||\r\n INBOX_COMMANDS.has(normalized) ||\r\n WORKTREES_COMMANDS.has(normalized)\r\n ) {\r\n const projectContext = await loadProjectContext(context.cwd);\r\n const rootDir = projectContext.stateRootDir;\r\n\r\n if (TASKS_COMMANDS.has(normalized)) {\r\n await reconcileTeamState(rootDir).catch(() => null);\r\n output.plain(await new TaskStore(rootDir).summarize());\r\n return \"handled\";\r\n }\r\n\r\n if (TEAM_COMMANDS.has(normalized)) {\r\n await reconcileTeamState(rootDir).catch(() => null);\r\n output.plain(await new TeamStore(rootDir).summarizeMembers());\r\n return \"handled\";\r\n }\r\n\r\n if (BACKGROUND_COMMANDS.has(normalized)) {\r\n await reconcileBackgroundJobs(rootDir).catch(() => null);\r\n output.plain(await new BackgroundJobStore(rootDir).summarize());\r\n return \"handled\";\r\n }\r\n\r\n if (WORKTREES_COMMANDS.has(normalized)) {\r\n output.plain(await new WorktreeStore(rootDir).summarize());\r\n return \"handled\";\r\n }\r\n\r\n const inbox = await new MessageBus(rootDir).peekInbox(\"lead\");\r\n output.plain(\r\n inbox.length > 0\r\n ? inbox\r\n .slice(0, 20)\r\n .map((message) => `${message.type} from ${message.from}: ${message.content}`)\r\n .join(\"\\n\")\r\n : \"Inbox empty.\",\r\n );\r\n return \"handled\";\r\n }\r\n\r\n return \"continue\";\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\nimport process from \"node:process\";\r\n\r\nimport { execa } from \"execa\";\r\n\r\nimport type { ChangeRecord, RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { resolveProjectRoots } from \"../context/repoRoots.js\";\r\nimport { getProjectStatePaths } from \"./statePaths.js\";\r\nimport { WorktreeStore } from \"../worktrees/store.js\";\r\n\r\nconst PRESERVED_ATHLETE_ENTRIES = new Set([\".env\", \".env.example\"]);\r\n\r\nexport interface ResetProjectRuntimeInput {\r\n cwd: string;\r\n config: Pick<RuntimeConfig, \"paths\">;\r\n currentSessionId?: string;\r\n}\r\n\r\nexport interface ResetProjectRuntimeResult {\r\n rootDir: string;\r\n stateRootDir: string;\r\n removedSessionIds: string[];\r\n removedChangeIds: string[];\r\n removedWorktrees: string[];\r\n removedStateEntries: string[];\r\n preservedStateEntries: string[];\r\n terminatedPids: number[];\r\n}\r\n\r\nexport async function resetProjectRuntime(input: ResetProjectRuntimeInput): Promise<ResetProjectRuntimeResult> {\r\n const roots = await resolveProjectRoots(input.cwd);\r\n const statePaths = getProjectStatePaths(roots.stateRootDir);\r\n const athleteDir = statePaths.athleteDir;\r\n\r\n const [worktrees, teamMembers, backgroundJobs] = await Promise.all([\r\n readTrackedWorktrees(roots.stateRootDir),\r\n readTeamMembers(statePaths.teamConfigFile),\r\n readBackgroundJobs(statePaths.backgroundDir),\r\n ]);\r\n\r\n const terminatedPids = await terminateKnownProcesses([\r\n ...teamMembers.map((member) => member.pid),\r\n ...backgroundJobs.map((job) => job.pid),\r\n ]);\r\n\r\n const removedWorktrees = await removeTrackedWorktrees(roots.stateRootDir, worktrees);\r\n const removedSessionIds = await removeProjectSessions({\r\n sessionsDir: input.config.paths.sessionsDir,\r\n stateRootDir: roots.stateRootDir,\r\n currentSessionId: input.currentSessionId,\r\n });\r\n await waitForRemovedSessionFiles(input.config.paths.sessionsDir, removedSessionIds);\r\n const removedChangeIds = await removeProjectChanges({\r\n changesDir: input.config.paths.changesDir,\r\n stateRootDir: roots.stateRootDir,\r\n removedSessionIds,\r\n });\r\n const { removedEntries, preservedEntries } = await clearProjectAthleteDirectory(athleteDir);\r\n await waitForRemovedStateEntries(athleteDir, removedEntries);\r\n\r\n return {\r\n rootDir: roots.rootDir,\r\n stateRootDir: roots.stateRootDir,\r\n removedSessionIds,\r\n removedChangeIds,\r\n removedWorktrees,\r\n removedStateEntries: removedEntries,\r\n preservedStateEntries: preservedEntries,\r\n terminatedPids,\r\n };\r\n}\r\n\r\nasync function readTrackedWorktrees(rootDir: string): Promise<Array<{ name: string; path: string; status?: string }>> {\r\n const indexPath = getProjectStatePaths(rootDir).worktreeIndexFile;\r\n try {\r\n const raw = await fs.readFile(indexPath, \"utf8\");\r\n const parsed = JSON.parse(raw) as { items?: Array<{ name?: unknown; path?: unknown; status?: unknown }> };\r\n return Array.isArray(parsed.items)\r\n ? parsed.items\r\n .map((item) => ({\r\n name: String(item?.name ?? \"\").trim(),\r\n path: String(item?.path ?? \"\").trim(),\r\n status: typeof item?.status === \"string\" ? item.status : undefined,\r\n }))\r\n .filter((item) => item.name && item.path)\r\n : [];\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return [];\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function readTeamMembers(teamConfigFile: string): Promise<Array<{ pid?: number }>> {\r\n try {\r\n const raw = await fs.readFile(teamConfigFile, \"utf8\");\r\n const parsed = JSON.parse(raw) as { members?: Array<{ pid?: unknown }> };\r\n return Array.isArray(parsed.members)\r\n ? parsed.members.map((member) => ({\r\n pid: typeof member?.pid === \"number\" && Number.isFinite(member.pid) ? Math.trunc(member.pid) : undefined,\r\n }))\r\n : [];\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return [];\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function readBackgroundJobs(backgroundDir: string): Promise<Array<{ pid?: number }>> {\r\n try {\r\n const entries = await fs.readdir(backgroundDir, { withFileTypes: true });\r\n const records = await Promise.all(\r\n entries\r\n .filter((entry) => entry.isFile() && /^job_[a-z0-9]+\\.json$/i.test(entry.name))\r\n .map(async (entry) => {\r\n const raw = await fs.readFile(path.join(backgroundDir, entry.name), \"utf8\");\r\n const parsed = JSON.parse(raw) as { pid?: unknown };\r\n return {\r\n pid: typeof parsed.pid === \"number\" && Number.isFinite(parsed.pid) ? Math.trunc(parsed.pid) : undefined,\r\n };\r\n }),\r\n );\r\n return records;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return [];\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function terminateKnownProcesses(pids: Array<number | undefined>): Promise<number[]> {\r\n const uniquePids = [...new Set(\r\n pids\r\n .filter((value): value is number => typeof value === \"number\" && Number.isFinite(value) && value > 0)\r\n .map((value) => Math.trunc(value)),\r\n )];\r\n const terminated: number[] = [];\r\n\r\n for (const pid of uniquePids) {\r\n const killed = await terminateProcessTree(pid);\r\n if (killed || !isProcessAlive(pid)) {\r\n terminated.push(pid);\r\n }\r\n }\r\n\r\n return terminated;\r\n}\r\n\r\nasync function terminateProcessTree(pid: number): Promise<boolean> {\r\n if (!isProcessAlive(pid)) {\r\n return false;\r\n }\r\n\r\n if (process.platform === \"win32\") {\r\n await execa(\"taskkill\", [\"/PID\", String(pid), \"/T\", \"/F\"], {\r\n reject: false,\r\n timeout: 10_000,\r\n windowsHide: true,\r\n }).catch(() => null);\r\n await waitForProcessExit(pid, 40, 50);\r\n return !isProcessAlive(pid);\r\n }\r\n\r\n try {\r\n process.kill(pid, \"SIGTERM\");\r\n } catch {\r\n return false;\r\n }\r\n\r\n await waitForProcessExit(pid, 20, 50);\r\n if (!isProcessAlive(pid)) {\r\n return true;\r\n }\r\n\r\n try {\r\n process.kill(pid, \"SIGKILL\");\r\n } catch {\r\n return false;\r\n }\r\n\r\n await waitForProcessExit(pid, 20, 50);\r\n return !isProcessAlive(pid);\r\n}\r\n\r\nasync function removeTrackedWorktrees(\r\n rootDir: string,\r\n worktrees: Array<{ name: string; path: string; status?: string }>,\r\n): Promise<string[]> {\r\n const removed: string[] = [];\r\n const store = new WorktreeStore(rootDir);\r\n\r\n for (const worktree of worktrees) {\r\n if (!worktree.name || !worktree.path || worktree.status === \"removed\") {\r\n continue;\r\n }\r\n\r\n try {\r\n await store.remove(worktree.name, {\r\n force: true,\r\n });\r\n } catch {\r\n await fs.rm(worktree.path, { recursive: true, force: true }).catch(() => null);\r\n }\r\n\r\n removed.push(worktree.name);\r\n }\r\n\r\n return removed;\r\n}\r\n\r\nasync function removeProjectSessions(input: {\r\n sessionsDir: string;\r\n stateRootDir: string;\r\n currentSessionId?: string;\r\n}): Promise<string[]> {\r\n const removedIds: string[] = [];\r\n const stateRootDir = await canonicalizePathForComparison(input.stateRootDir);\r\n\r\n try {\r\n const entries = await fs.readdir(input.sessionsDir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\r\n continue;\r\n }\r\n\r\n const sessionId = path.basename(entry.name, \".json\");\r\n const absolutePath = path.join(input.sessionsDir, entry.name);\r\n const removeById = input.currentSessionId === sessionId;\r\n let removeByPath = false;\r\n\r\n if (!removeById) {\r\n const raw = await fs.readFile(absolutePath, \"utf8\");\r\n const parsed = JSON.parse(raw) as Pick<SessionRecord, \"cwd\">;\r\n removeByPath = await isSameOrDescendant(String(parsed.cwd ?? \"\"), stateRootDir);\r\n }\r\n\r\n if (!removeById && !removeByPath) {\r\n continue;\r\n }\r\n\r\n await fs.rm(absolutePath, { force: true });\r\n removedIds.push(sessionId);\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n\r\n return removedIds;\r\n}\r\n\r\nasync function removeProjectChanges(input: {\r\n changesDir: string;\r\n stateRootDir: string;\r\n removedSessionIds: string[];\r\n}): Promise<string[]> {\r\n const removedIds: string[] = [];\r\n const stateRootDir = await canonicalizePathForComparison(input.stateRootDir);\r\n const removedSessionIds = new Set(input.removedSessionIds);\r\n\r\n try {\r\n const entries = await fs.readdir(input.changesDir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\r\n continue;\r\n }\r\n\r\n const changeId = path.basename(entry.name, \".json\");\r\n const metadataPath = path.join(input.changesDir, entry.name);\r\n const raw = await fs.readFile(metadataPath, \"utf8\");\r\n const parsed = JSON.parse(raw) as Pick<ChangeRecord, \"cwd\" | \"sessionId\">;\r\n const remove =\r\n (typeof parsed.sessionId === \"string\" && removedSessionIds.has(parsed.sessionId)) ||\r\n (await isSameOrDescendant(String(parsed.cwd ?? \"\"), stateRootDir));\r\n if (!remove) {\r\n continue;\r\n }\r\n\r\n await fs.rm(metadataPath, { force: true });\r\n await fs.rm(path.join(input.changesDir, changeId), { recursive: true, force: true }).catch(() => null);\r\n removedIds.push(changeId);\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n\r\n return removedIds;\r\n}\r\n\r\nasync function clearProjectAthleteDirectory(athleteDir: string): Promise<{\r\n removedEntries: string[];\r\n preservedEntries: string[];\r\n}> {\r\n const removedEntries: string[] = [];\r\n const preservedEntries: string[] = [];\r\n\r\n try {\r\n const entries = await fs.readdir(athleteDir, { withFileTypes: true });\r\n for (const entry of entries) {\r\n const absolutePath = path.join(athleteDir, entry.name);\r\n if (PRESERVED_ATHLETE_ENTRIES.has(entry.name)) {\r\n preservedEntries.push(entry.name);\r\n continue;\r\n }\r\n\r\n await fs.rm(absolutePath, { recursive: true, force: true });\r\n removedEntries.push(entry.name);\r\n }\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n throw error;\r\n }\r\n }\r\n\r\n return {\r\n removedEntries,\r\n preservedEntries,\r\n };\r\n}\r\n\r\nasync function waitForRemovedStateEntries(\r\n athleteDir: string,\r\n removedEntries: string[],\r\n attempts = 20,\r\n delayMs = 50,\r\n): Promise<void> {\r\n for (let attempt = 0; attempt < attempts; attempt += 1) {\r\n const remaining = await Promise.all(\r\n removedEntries.map(async (entry) => ({\r\n entry,\r\n exists: await pathExists(path.join(athleteDir, entry)),\r\n })),\r\n );\r\n\r\n if (remaining.every((item) => item.exists === false)) {\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, delayMs));\r\n }\r\n}\r\n\r\nasync function waitForRemovedSessionFiles(\r\n sessionsDir: string,\r\n removedSessionIds: string[],\r\n attempts = 20,\r\n delayMs = 50,\r\n): Promise<void> {\r\n for (let attempt = 0; attempt < attempts; attempt += 1) {\r\n const remaining = await Promise.all(\r\n removedSessionIds.map(async (sessionId) => ({\r\n sessionId,\r\n exists: await pathExists(path.join(sessionsDir, `${sessionId}.json`)),\r\n })),\r\n );\r\n\r\n if (remaining.every((item) => item.exists === false)) {\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, delayMs));\r\n }\r\n}\r\n\r\nfunction isProcessAlive(pid: number): boolean {\r\n if (!Number.isFinite(pid) || pid <= 0) {\r\n return false;\r\n }\r\n\r\n try {\r\n process.kill(pid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function waitForProcessExit(pid: number, attempts: number, delayMs: number): Promise<void> {\r\n for (let attempt = 0; attempt < attempts; attempt += 1) {\r\n if (!isProcessAlive(pid)) {\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, delayMs));\r\n }\r\n}\r\n\r\nasync function pathExists(targetPath: string): Promise<boolean> {\r\n try {\r\n await fs.access(targetPath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function isSameOrDescendant(targetPath: string, possibleAncestor: string): Promise<boolean> {\r\n if (!targetPath.trim() || !possibleAncestor.trim()) {\r\n return false;\r\n }\r\n\r\n const resolvedTarget = await canonicalizePathForComparison(targetPath);\r\n const resolvedAncestor = await canonicalizePathForComparison(possibleAncestor);\r\n const relative = path.relative(resolvedAncestor, resolvedTarget);\r\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\r\n}\r\n\r\nasync function canonicalizePathForComparison(targetPath: string): Promise<string> {\r\n let candidate = path.resolve(targetPath);\r\n const tail: string[] = [];\r\n\r\n while (true) {\r\n try {\r\n const real = await fs.realpath(candidate);\r\n return tail.length > 0 ? path.join(real, ...tail.reverse()) : real;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\r\n return tail.length > 0 ? path.join(candidate, ...tail.reverse()) : candidate;\r\n }\r\n }\r\n\r\n const parent = path.dirname(candidate);\r\n if (parent === candidate) {\r\n return tail.length > 0 ? path.join(candidate, ...tail.reverse()) : candidate;\r\n }\r\n\r\n tail.push(path.basename(candidate));\r\n candidate = parent;\r\n }\r\n}\r\n","import { buildSessionRuntimeSummary } from \"../agent/runtimeMetrics.js\";\r\nimport type { SessionRecord } from \"../types.js\";\r\n\r\nexport function formatSessionRuntimeSummary(\r\n session: Pick<SessionRecord, \"runtimeStats\" | \"checkpoint\" | \"verificationState\">,\r\n): string {\r\n const summary = buildSessionRuntimeSummary(session);\r\n const lines = [\r\n `Health: ${formatHealth(summary.health.status, summary.health.reasons)}`,\r\n `Model requests: ${summary.modelRequests}`,\r\n `Model wait total: ${formatDuration(summary.modelWaitDurationMsTotal)}`,\r\n `Usage: ${formatUsage(summary)}`,\r\n `Tool calls: ${summary.toolCalls}`,\r\n `Tool duration total: ${formatDuration(summary.toolDurationMsTotal)}`,\r\n `Events: yields=${summary.yields} continuations=${summary.continuations} recoveries=${summary.recoveries} compressions=${summary.compressions}`,\r\n `Externalized results: ${summary.externalizedResults.count} (${formatBytes(summary.externalizedResults.byteLengthTotal)})`,\r\n `Slowest step: ${summary.slowestStep.label} (${formatDuration(summary.slowestStep.durationMsTotal)})`,\r\n ];\r\n\r\n if (summary.topTools.length > 0) {\r\n lines.push(\"Top tools:\");\r\n for (const tool of summary.topTools.slice(0, 5)) {\r\n lines.push(\r\n `- ${tool.name}: ${tool.callCount} call(s), ${formatDuration(tool.durationMsTotal)}, ok=${tool.okCount}, error=${tool.errorCount}`,\r\n );\r\n }\r\n }\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n\r\nfunction formatHealth(status: string, reasons: string[]): string {\r\n if (reasons.length === 0) {\r\n return status;\r\n }\r\n\r\n return `${status} (${reasons.join(\"; \")})`;\r\n}\r\n\r\nfunction formatUsage(summary: ReturnType<typeof buildSessionRuntimeSummary>): string {\r\n if (summary.usage.availability === \"unavailable\") {\r\n return `unavailable (${summary.usage.requestsWithoutUsage}/${summary.modelRequests || summary.usage.requestsWithoutUsage} requests)`;\r\n }\r\n\r\n const totals = `input=${summary.usage.inputTokensTotal} output=${summary.usage.outputTokensTotal} total=${summary.usage.totalTokensTotal}`;\r\n if (summary.usage.availability === \"partial\") {\r\n return `partial (${totals}; unavailable on ${summary.usage.requestsWithoutUsage} request(s))`;\r\n }\r\n\r\n return totals + (summary.usage.reasoningTokensTotal > 0 ? ` reasoning=${summary.usage.reasoningTokensTotal}` : \"\");\r\n}\r\n\r\nfunction formatDuration(durationMs: number): string {\r\n if (durationMs >= 1_000) {\r\n return `${(durationMs / 1_000).toFixed(durationMs >= 10_000 ? 1 : 2)}s`;\r\n }\r\n\r\n return `${durationMs}ms`;\r\n}\r\n\r\nfunction formatBytes(byteLength: number): string {\r\n if (byteLength >= 1_048_576) {\r\n return `${(byteLength / 1_048_576).toFixed(2)} MB`;\r\n }\r\n if (byteLength >= 1_024) {\r\n return `${(byteLength / 1_024).toFixed(1)} KB`;\r\n }\r\n\r\n return `${byteLength} B`;\r\n}\r\n","export const TELEGRAM_HELP_TEXT = [\r\n \"/help 查看 Telegram 使用说明\",\r\n \"/stop 停止当前正在执行的 Telegram 任务,bot 服务不会退出\",\r\n \"/session 查看当前 Telegram 会话绑定的 session ID\",\r\n \"/config 查看当前运行配置\",\r\n \"/todos 查看当前 todo 状态\",\r\n \"/runtime 查看当前 session 运行摘要\",\r\n \"/tasks 查看任务板\",\r\n \"/team 查看队友状态\",\r\n \"/background 查看后台任务\",\r\n \"/worktrees 查看隔离工作区\",\r\n \"/inbox 查看 lead 收件箱\",\r\n \"/multi Telegram 不支持交互式多行模式,请直接发送完整消息\",\r\n \"\",\r\n \"文件用法:\",\r\n \"- 直接把文件发到私聊,Athlete 会下载并接入当前 session。\",\r\n \"- 你可以说“分析我刚发的文件”或“把 README.md 发回给我”。\",\r\n \"- 需要停止当前任务时,使用 /stop。\",\r\n \"\",\r\n \"提示:本地终端里的退出/重置命令不会在 Telegram 执行。\",\r\n].join(\"\\n\");\r\n\r\nexport const TELEGRAM_BLOCKED_LOCAL_COMMAND_TEXT =\r\n \"本地终端的退出/重置命令不会在 Telegram 执行。Telegram 里请使用 /stop 停止当前任务。\";\r\n","import {\r\n handleLocalCommand as handleSharedLocalCommand,\r\n type LocalCommandContext,\r\n type LocalCommandResult,\r\n isExplicitExitCommand,\r\n} from \"../interaction/localCommands.js\";\r\nimport type { ShellOutputPort } from \"../interaction/shell.js\";\r\nimport {\r\n TELEGRAM_BLOCKED_LOCAL_COMMAND_TEXT,\r\n TELEGRAM_HELP_TEXT,\r\n} from \"./helpText.zh.js\";\r\n\r\nconst RESET_COMMANDS = new Set([\"reset\", \"/reset\", \"重置\", \"/重置\"]);\r\nconst HELP_COMMANDS = new Set([\"/help\", \"/帮助\"]);\r\n\r\nexport async function handleTelegramLocalCommand(\r\n input: string,\r\n context: LocalCommandContext,\r\n output: ShellOutputPort,\r\n): Promise<LocalCommandResult> {\r\n const normalized = input.trim().toLowerCase();\r\n\r\n if (!normalized) {\r\n return \"handled\";\r\n }\r\n\r\n if (HELP_COMMANDS.has(normalized)) {\r\n output.plain(TELEGRAM_HELP_TEXT);\r\n return \"handled\";\r\n }\r\n\r\n if (isExplicitExitCommand(normalized) || RESET_COMMANDS.has(normalized)) {\r\n output.warn(TELEGRAM_BLOCKED_LOCAL_COMMAND_TEXT);\r\n return \"handled\";\r\n }\r\n\r\n return handleSharedLocalCommand(input, context, output);\r\n}\r\n","import type { ShellOutputPort } from \"../interaction/shell.js\";\r\nimport { chunkTelegramMessage } from \"./messageChunking.js\";\r\n\r\nexport class TelegramOutputPort implements ShellOutputPort {\r\n private readonly pending: Promise<unknown>[] = [];\r\n\r\n constructor(\r\n private readonly options: {\r\n chatId: number;\r\n messageChunkChars: number;\r\n enqueueReply: (chatId: number, text: string) => Promise<void>;\r\n },\r\n ) {}\r\n\r\n plain(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n info(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n warn(text: string): void {\r\n this.queue(`Warning: ${text}`);\r\n }\r\n\r\n error(text: string): void {\r\n this.queue(`Error: ${text}`);\r\n }\r\n\r\n dim(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n heading(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n tool(text: string): void {\r\n this.queue(`Tool: ${text}`);\r\n }\r\n\r\n interrupt(text: string): void {\r\n this.queue(`Interrupt: ${text}`);\r\n }\r\n\r\n async flush(): Promise<void> {\r\n if (this.pending.length === 0) {\r\n return;\r\n }\r\n\r\n const tasks = this.pending.splice(0, this.pending.length);\r\n await Promise.all(tasks);\r\n }\r\n\r\n private queue(text: string): void {\r\n for (const chunk of chunkTelegramMessage(text, this.options.messageChunkChars)) {\r\n this.pending.push(this.options.enqueueReply(this.options.chatId, chunk));\r\n }\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { TelegramDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport type { TelegramLogger } from \"./logger.js\";\r\nimport { assertPathAllowed } from \"../utils/fs.js\";\r\nimport { okResult, parseArgs, readString } from \"../tools/shared.js\";\r\nimport type { RegisteredTool } from \"../tools/types.js\";\r\n\r\nconst DEFAULT_MAX_UPLOAD_BYTES = 45 * 1024 * 1024;\r\nconst MAX_CAPTION_CHARS = 900;\r\n\r\nexport function createTelegramSendFileTool(options: {\r\n chatId: number;\r\n deliveryQueue: TelegramDeliveryQueue;\r\n logger?: TelegramLogger;\r\n}): RegisteredTool {\r\n return {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"telegram_send_file\",\r\n description:\r\n \"Send a local workspace file back to the active Telegram private chat as a real Telegram document.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Path to the local file that should be sent to Telegram.\",\r\n },\r\n file_name: {\r\n type: \"string\",\r\n description: \"Optional Telegram filename override.\",\r\n },\r\n caption: {\r\n type: \"string\",\r\n description: \"Optional short caption shown under the Telegram document.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const stats = await fs.stat(resolved);\r\n\r\n if (!stats.isFile()) {\r\n throw new Error(`Only regular files can be sent to Telegram: ${resolved}`);\r\n }\r\n\r\n const maxUploadBytes = readConfiguredUploadLimit(context.config.telegram);\r\n if (stats.size > maxUploadBytes) {\r\n throw new Error(\r\n `File too large for Telegram delivery: ${resolved} (${stats.size} bytes > ${maxUploadBytes} bytes).`,\r\n );\r\n }\r\n\r\n const fileName =\r\n typeof args.file_name === \"string\" && args.file_name.trim()\r\n ? args.file_name.trim()\r\n : path.basename(resolved);\r\n const caption = normalizeCaption(typeof args.caption === \"string\" ? args.caption : undefined);\r\n\r\n await options.deliveryQueue.enqueueFile({\r\n chatId: options.chatId,\r\n filePath: resolved,\r\n fileName,\r\n caption,\r\n });\r\n await options.deliveryQueue.flushDue();\r\n options.logger?.info(\"queued file delivery\", {\r\n chatId: options.chatId,\r\n fileName,\r\n detail: `path=${resolved}`,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n chatId: options.chatId,\r\n fileName,\r\n path: resolved,\r\n size: stats.size,\r\n sentAs: \"telegram_document\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n };\r\n}\r\n\r\nfunction readConfiguredUploadLimit(config: unknown): number {\r\n const value = (config as { maxUploadBytes?: number } | undefined)?.maxUploadBytes;\r\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\r\n return Math.trunc(value);\r\n }\r\n\r\n return DEFAULT_MAX_UPLOAD_BYTES;\r\n}\r\n\r\nfunction normalizeCaption(value: string | undefined): string | undefined {\r\n const normalized = value?.trim();\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n return normalized.length <= MAX_CAPTION_CHARS ? normalized : normalized.slice(0, MAX_CAPTION_CHARS);\r\n}\r\n","import type { AgentCallbacks } from \"../agent/types.js\";\r\n\r\nexport interface VisibleTurnEvent {\r\n kind: \"assistant\" | \"tool_call\" | \"todo_preview\";\r\n text: string;\r\n}\r\n\r\nexport function createVisibleTurnCallbacks(options: {\r\n onActivity: () => void;\r\n onVisibleEvent: (event: VisibleTurnEvent) => void;\r\n shouldEmitEvent?: (event: VisibleTurnEvent) => boolean;\r\n}): AgentCallbacks {\r\n const assistantState = {\r\n bufferedDeltaText: \"\",\r\n finalizedByTextEvent: false,\r\n };\r\n\r\n const resetAssistantStage = (): void => {\r\n assistantState.bufferedDeltaText = \"\";\r\n assistantState.finalizedByTextEvent = false;\r\n };\r\n\r\n return {\r\n onModelWaitStart: () => {\r\n options.onActivity();\r\n },\r\n onStatus: () => {\r\n options.onActivity();\r\n },\r\n onAssistantDelta: (delta) => {\r\n options.onActivity();\r\n if (assistantState.finalizedByTextEvent) {\r\n resetAssistantStage();\r\n }\r\n\r\n assistantState.bufferedDeltaText += delta;\r\n },\r\n onAssistantText: (text) => {\r\n options.onActivity();\r\n emitAssistantStage(options, text);\r\n assistantState.bufferedDeltaText = \"\";\r\n assistantState.finalizedByTextEvent = true;\r\n },\r\n onAssistantDone: (text) => {\r\n options.onActivity();\r\n if (assistantState.bufferedDeltaText.length > 0) {\r\n emitAssistantStage(\r\n options,\r\n typeof text === \"string\" && text.length > 0 ? text : assistantState.bufferedDeltaText,\r\n );\r\n resetAssistantStage();\r\n return;\r\n }\r\n\r\n if (!assistantState.finalizedByTextEvent) {\r\n emitAssistantStage(options, text);\r\n }\r\n\r\n resetAssistantStage();\r\n },\r\n onReasoningDelta: () => {\r\n options.onActivity();\r\n },\r\n onReasoning: () => {\r\n options.onActivity();\r\n },\r\n onToolCall: (name) => {\r\n options.onActivity();\r\n emitNormalizedVisibleText(options, \"tool_call\", name);\r\n },\r\n onToolResult: (name, output) => {\r\n options.onActivity();\r\n if (name !== \"todo_write\") {\r\n return;\r\n }\r\n\r\n const preview = extractTodoPreview(output);\r\n emitExactVisibleText(options, \"todo_preview\", preview);\r\n },\r\n onToolError: () => {\r\n options.onActivity();\r\n },\r\n onModelWaitStop: () => {\r\n return;\r\n },\r\n };\r\n}\r\n\r\nexport function extractTodoPreview(rawOutput: string): string | null {\r\n try {\r\n const parsed = JSON.parse(rawOutput) as { preview?: unknown };\r\n if (typeof parsed.preview === \"string\" && parsed.preview.length > 0) {\r\n return parsed.preview;\r\n }\r\n } catch {\r\n return null;\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction emitAssistantText(\r\n options: {\r\n onVisibleEvent: (event: VisibleTurnEvent) => void;\r\n },\r\n rawText: string | null | undefined,\r\n): void {\r\n emitExactVisibleText(options, \"assistant\", rawText);\r\n}\r\n\r\nfunction emitAssistantStage(\r\n options: {\r\n onVisibleEvent: (event: VisibleTurnEvent) => void;\r\n },\r\n rawText: string | null | undefined,\r\n): void {\r\n emitAssistantText(options, rawText);\r\n}\r\n\r\nfunction emitNormalizedVisibleText(\r\n options: {\r\n onVisibleEvent: (event: VisibleTurnEvent) => void;\r\n shouldEmitEvent?: (event: VisibleTurnEvent) => boolean;\r\n },\r\n kind: VisibleTurnEvent[\"kind\"],\r\n rawText: string | null | undefined,\r\n): void {\r\n const text = normalizeVisibleText(rawText);\r\n if (!text) {\r\n return;\r\n }\r\n\r\n const event: VisibleTurnEvent = {\r\n kind,\r\n text,\r\n };\r\n if (options.shouldEmitEvent && !options.shouldEmitEvent(event)) {\r\n return;\r\n }\r\n options.onVisibleEvent(event);\r\n}\r\n\r\nfunction emitExactVisibleText(\r\n options: {\r\n onVisibleEvent: (event: VisibleTurnEvent) => void;\r\n shouldEmitEvent?: (event: VisibleTurnEvent) => boolean;\r\n },\r\n kind: VisibleTurnEvent[\"kind\"],\r\n rawText: string | null | undefined,\r\n): void {\r\n if (typeof rawText !== \"string\" || rawText.length === 0) {\r\n return;\r\n }\r\n\r\n const event: VisibleTurnEvent = {\r\n kind,\r\n text: rawText,\r\n };\r\n if (options.shouldEmitEvent && !options.shouldEmitEvent(event)) {\r\n return;\r\n }\r\n options.onVisibleEvent(event);\r\n}\r\n\r\nfunction normalizeVisibleText(value: string | null | undefined): string {\r\n if (typeof value !== \"string\") {\r\n return \"\";\r\n }\r\n\r\n return value.trim() ? value : \"\";\r\n}\r\n","import type { AgentCallbacks } from \"../agent/types.js\";\r\nimport { createVisibleTurnCallbacks, type VisibleTurnEvent } from \"./visibleEvents.js\";\r\n\r\nexport interface DurableTurnDisplayScheduler {\r\n cancel(): void;\r\n}\r\n\r\nexport class DurableTurnDisplay<TTarget> {\r\n public readonly callbacks: AgentCallbacks;\r\n private readonly typingTasks: Promise<unknown>[] = [];\r\n private typingHandle: DurableTurnDisplayScheduler | null = null;\r\n private visibleTail = Promise.resolve();\r\n private visibleFailure: unknown = null;\r\n private visibleVersion = 0;\r\n\r\n constructor(\r\n private readonly options: {\r\n target: TTarget;\r\n sendTyping: (target: TTarget) => Promise<void>;\r\n enqueueVisibleMessage: (target: TTarget, text: string) => Promise<void>;\r\n shouldEmitEvent?: (event: VisibleTurnEvent) => boolean;\r\n typingIntervalMs: number;\r\n scheduleTypingTick?: (\r\n callback: () => Promise<void> | void,\r\n intervalMs: number,\r\n ) => DurableTurnDisplayScheduler;\r\n },\r\n ) {\r\n this.callbacks = createVisibleTurnCallbacks({\r\n onActivity: () => {\r\n this.ensureTypingLoop();\r\n },\r\n onVisibleEvent: (event) => {\r\n this.enqueueVisibleText(event.text);\r\n },\r\n shouldEmitEvent: options.shouldEmitEvent,\r\n });\r\n }\r\n\r\n async flush(): Promise<void> {\r\n this.stopTypingLoop();\r\n await this.waitForDurableVisible();\r\n await this.waitForTyping();\r\n }\r\n\r\n dispose(): void {\r\n this.stopTypingLoop();\r\n }\r\n\r\n noteTerminalState(): void {\r\n return;\r\n }\r\n\r\n async waitForDurableVisible(): Promise<void> {\r\n while (true) {\r\n await new Promise<void>((resolve) => setImmediate(resolve));\r\n const visibleVersion = this.visibleVersion;\r\n const visibleTail = this.visibleTail;\r\n await visibleTail;\r\n\r\n if (this.visibleFailure) {\r\n throw this.visibleFailure;\r\n }\r\n\r\n if (visibleVersion === this.visibleVersion) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private ensureTypingLoop(): void {\r\n if (this.typingHandle) {\r\n return;\r\n }\r\n\r\n this.typingTasks.push(this.options.sendTyping(this.options.target).catch(() => undefined));\r\n this.typingHandle = (this.options.scheduleTypingTick ?? scheduleTypingTick)(\r\n () => this.options.sendTyping(this.options.target).catch(() => undefined),\r\n this.options.typingIntervalMs,\r\n );\r\n }\r\n\r\n private stopTypingLoop(): void {\r\n this.typingHandle?.cancel();\r\n this.typingHandle = null;\r\n }\r\n\r\n private enqueueVisibleText(text: string): void {\r\n this.visibleVersion += 1;\r\n this.visibleTail = this.visibleTail.then(async () => {\r\n if (this.visibleFailure) {\r\n return;\r\n }\r\n\r\n try {\r\n await this.options.enqueueVisibleMessage(this.options.target, text);\r\n } catch (error) {\r\n this.visibleFailure ??= error;\r\n }\r\n });\r\n }\r\n\r\n private async waitForTyping(): Promise<void> {\r\n if (this.typingTasks.length === 0) {\r\n return;\r\n }\r\n\r\n await Promise.all(this.typingTasks);\r\n }\r\n}\r\n\r\nfunction scheduleTypingTick(\r\n callback: () => Promise<void> | void,\r\n intervalMs: number,\r\n): DurableTurnDisplayScheduler {\r\n const handle = setInterval(() => {\r\n void callback();\r\n }, intervalMs);\r\n\r\n return {\r\n cancel() {\r\n clearInterval(handle);\r\n },\r\n };\r\n}\r\n","import {\r\n DurableTurnDisplay,\r\n type DurableTurnDisplayScheduler,\r\n} from \"../chat/durableTurnDisplay.js\";\r\n\r\nexport type TelegramTurnDisplayScheduler = DurableTurnDisplayScheduler;\r\n\r\nexport class TelegramTurnDisplay extends DurableTurnDisplay<{ chatId: number }> {\r\n constructor(\r\n options: {\r\n chatId: number;\r\n sendTyping: (chatId: number) => Promise<void>;\r\n enqueueVisibleMessage: (target: { chatId: number }, text: string) => Promise<void>;\r\n typingIntervalMs: number;\r\n scheduleTypingTick?: (\r\n callback: () => Promise<void> | void,\r\n intervalMs: number,\r\n ) => TelegramTurnDisplayScheduler;\r\n },\r\n ) {\r\n super({\r\n target: {\r\n chatId: options.chatId,\r\n },\r\n sendTyping: async (target) => options.sendTyping(target.chatId),\r\n enqueueVisibleMessage: options.enqueueVisibleMessage,\r\n typingIntervalMs: options.typingIntervalMs,\r\n scheduleTypingTick: options.scheduleTypingTick,\r\n });\r\n }\r\n}\r\n","import type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { TelegramLogger } from \"./logger.js\";\r\nimport { TelegramTurnDisplay } from \"./turnDisplay.js\";\r\n\r\nexport function createLoggedTelegramCallbacks(\r\n display: TelegramTurnDisplay,\r\n logger: TelegramLogger,\r\n context: {\r\n peerKey: string;\r\n userId: number;\r\n chatId: number;\r\n sessionId: string;\r\n },\r\n): ManagedTurnOptions[\"callbacks\"] {\r\n return {\r\n ...display.callbacks,\r\n onStatus: (text) => {\r\n logger.info(\"phase\", {\r\n ...context,\r\n detail: text,\r\n });\r\n display.callbacks.onStatus?.(text);\r\n },\r\n onToolCall: (name, args) => {\r\n logger.info(\"tool call\", {\r\n ...context,\r\n toolName: name,\r\n detail: summarizeText(args, 120),\r\n });\r\n display.callbacks.onToolCall?.(name, args);\r\n },\r\n onToolResult: (name, output) => {\r\n logger.info(\"tool finished\", {\r\n ...context,\r\n toolName: name,\r\n detail: `chars=${output.length}`,\r\n });\r\n display.callbacks.onToolResult?.(name, output);\r\n },\r\n onToolError: (name, error) => {\r\n logger.error(\"tool failed\", {\r\n ...context,\r\n toolName: name,\r\n detail: `chars=${error.length}`,\r\n });\r\n display.callbacks.onToolError?.(name, error);\r\n },\r\n };\r\n}\r\n\r\nexport function summarizeText(value: string, maxChars = 100): string {\r\n const normalized = value.replace(/\\s+/g, \" \").trim();\r\n if (!normalized) {\r\n return \"empty\";\r\n }\r\n\r\n return normalized.length <= maxChars ? normalized : `${normalized.slice(0, maxChars - 3)}...`;\r\n}\r\n","import type { TelegramClassifiedUpdate, TelegramUpdate } from \"./types.js\";\r\n\r\nexport interface TelegramUpdateFilterOptions {\r\n allowedUserIds: readonly number[];\r\n}\r\n\r\nexport function classifyTelegramUpdate(\r\n update: TelegramUpdate,\r\n options: TelegramUpdateFilterOptions,\r\n): TelegramClassifiedUpdate {\r\n const message = update.message;\r\n if (!message) {\r\n return {\r\n kind: \"ignore\",\r\n updateId: update.update_id,\r\n reason: \"unsupported_update\",\r\n raw: update,\r\n };\r\n }\r\n\r\n const userId = message.from?.id;\r\n const normalizedUserId = typeof userId === \"number\" && Number.isFinite(userId) ? Math.trunc(userId) : null;\r\n const chatId = message.chat.id;\r\n const chatType = message.chat.type;\r\n const text = (message.text ?? message.caption ?? \"\").trim();\r\n const document = message.document;\r\n\r\n if (chatType !== \"private\") {\r\n return {\r\n kind: \"ignore\",\r\n updateId: update.update_id,\r\n reason: \"non_private_chat\",\r\n chatId,\r\n userId: normalizedUserId ?? undefined,\r\n chatType,\r\n raw: update,\r\n };\r\n }\r\n\r\n if (normalizedUserId === null) {\r\n return {\r\n kind: \"ignore\",\r\n updateId: update.update_id,\r\n reason: \"empty_message\",\r\n chatId,\r\n userId: normalizedUserId ?? undefined,\r\n chatType,\r\n raw: update,\r\n };\r\n }\r\n\r\n if (!options.allowedUserIds.includes(normalizedUserId)) {\r\n return {\r\n kind: \"ignore\",\r\n updateId: update.update_id,\r\n reason: \"unauthorized_user\",\r\n chatId,\r\n userId: normalizedUserId,\r\n chatType,\r\n raw: update,\r\n };\r\n }\r\n\r\n if (document?.file_id && document.file_unique_id) {\r\n return {\r\n kind: \"private_file_message\",\r\n updateId: update.update_id,\r\n peerKey: `telegram:private:${chatId}`,\r\n userId: normalizedUserId,\r\n chatId,\r\n messageId: message.message_id,\r\n text,\r\n fileId: document.file_id,\r\n fileUniqueId: document.file_unique_id,\r\n fileName: document.file_name,\r\n mimeType: document.mime_type,\r\n fileSize: document.file_size,\r\n raw: update,\r\n };\r\n }\r\n\r\n if (!text) {\r\n return {\r\n kind: \"ignore\",\r\n updateId: update.update_id,\r\n reason: \"empty_message\",\r\n chatId,\r\n userId: normalizedUserId,\r\n chatType,\r\n raw: update,\r\n };\r\n }\r\n\r\n return {\r\n kind: \"private_message\",\r\n updateId: update.update_id,\r\n peerKey: `telegram:private:${chatId}`,\r\n userId: normalizedUserId,\r\n chatId,\r\n messageId: message.message_id,\r\n text,\r\n raw: update,\r\n };\r\n}\r\n","import { AgentTurnError, getErrorMessage } from \"../agent/errors.js\";\r\nimport { runManagedAgentTurn } from \"../agent/managedTurn.js\";\r\nimport type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport type { RunTurnResult } from \"../agent/types.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { isAbortError } from \"../utils/abort.js\";\r\nimport { handleLocalCommand, type LocalCommandResult } from \"./localCommands.js\";\r\nimport type { InteractionShell } from \"./shell.js\";\r\n\r\nexport interface InteractiveSessionDriverOptions {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n session: SessionRecord;\r\n sessionStore: SessionStoreLike;\r\n shell: InteractionShell;\r\n runTurn?: (options: ManagedTurnOptions) => Promise<RunTurnResult>;\r\n localCommandHandler?: typeof handleLocalCommand;\r\n}\r\n\r\nexport class InteractiveSessionDriver {\r\n private session: SessionRecord;\r\n private turnInFlight = false;\r\n private turnAbortController: AbortController | null = null;\r\n private lastInterruptNoticeAt = 0;\r\n\r\n constructor(private readonly options: InteractiveSessionDriverOptions) {\r\n this.session = options.session;\r\n }\r\n\r\n async run(): Promise<SessionRecord> {\r\n const releaseInterrupt = this.options.shell.input.bindInterrupt(() => {\r\n this.handleInterrupt();\r\n });\r\n\r\n try {\r\n while (true) {\r\n const prompt = await this.options.shell.input.readInput(\"> \");\r\n if (prompt.kind === \"closed\") {\r\n this.showInterruptNotice(\"This session will not exit automatically. Type quit or q to exit.\");\r\n continue;\r\n }\r\n\r\n const input = prompt.value.trim();\r\n if (!input) {\r\n continue;\r\n }\r\n\r\n const decision = await this.handleInput(input);\r\n if (decision === \"quit\") {\r\n return this.session;\r\n }\r\n }\r\n } finally {\r\n releaseInterrupt();\r\n }\r\n }\r\n\r\n private async handleInput(input: string): Promise<LocalCommandResult> {\r\n let localCommandResult: LocalCommandResult;\r\n try {\r\n localCommandResult = await (this.options.localCommandHandler ?? handleLocalCommand)(\r\n input,\r\n {\r\n cwd: this.options.cwd,\r\n session: this.session,\r\n config: this.options.config,\r\n },\r\n this.options.shell.output,\r\n );\r\n } catch (error) {\r\n this.options.shell.output.error(getErrorMessage(error));\r\n return \"handled\";\r\n }\r\n\r\n if (localCommandResult === \"continue\") {\r\n await this.runTurn(input);\r\n } else if (localCommandResult === \"multiline\") {\r\n await this.handleMultilineInput();\r\n }\r\n\r\n return localCommandResult;\r\n }\r\n\r\n private async handleMultilineInput(): Promise<void> {\r\n this.options.shell.output.info(\"Entered multiline mode. Use ::end to submit or ::cancel to cancel.\\n\");\r\n const multiline = await this.options.shell.input.readMultiline(\"… \");\r\n\r\n if (multiline.kind === \"cancel\") {\r\n this.options.shell.output.warn(\"Cancelled multiline input.\\n\");\r\n return;\r\n }\r\n\r\n if (multiline.kind === \"closed\") {\r\n this.options.shell.output.warn(\"Multiline input was interrupted.\\n\");\r\n return;\r\n }\r\n\r\n const value = multiline.value.trim();\r\n if (!value) {\r\n this.options.shell.output.warn(\"Multiline input was empty, nothing was sent.\\n\");\r\n return;\r\n }\r\n\r\n await this.runTurn(value);\r\n }\r\n\r\n private handleInterrupt(): void {\r\n if (this.turnInFlight && this.turnAbortController && !this.turnAbortController.signal.aborted) {\r\n this.turnAbortController.abort();\r\n this.showInterruptNotice(\"Interrupted the current turn. You can continue typing.\");\r\n return;\r\n }\r\n\r\n this.showInterruptNotice(\"This session will not exit automatically. Type quit or q to exit.\");\r\n }\r\n\r\n private showInterruptNotice(message: string): void {\r\n const now = Date.now();\r\n if (now - this.lastInterruptNoticeAt < 150) {\r\n return;\r\n }\r\n\r\n this.lastInterruptNoticeAt = now;\r\n this.options.shell.output.interrupt(message);\r\n }\r\n\r\n private async runTurn(input: string): Promise<void> {\r\n this.turnInFlight = true;\r\n const controller = new AbortController();\r\n this.turnAbortController = controller;\r\n const turnDisplay = this.options.shell.createTurnDisplay({\r\n cwd: this.options.cwd,\r\n config: this.options.config,\r\n abortSignal: controller.signal,\r\n });\r\n\r\n try {\r\n const result = await (this.options.runTurn ?? runManagedAgentTurn)({\r\n input,\r\n cwd: this.options.cwd,\r\n config: this.options.config,\r\n session: this.session,\r\n sessionStore: this.options.sessionStore,\r\n abortSignal: controller.signal,\r\n callbacks: turnDisplay.callbacks,\r\n identity: {\r\n kind: \"lead\",\r\n name: \"lead\",\r\n },\r\n });\r\n\r\n this.session = result.session;\r\n if (result.paused && result.pauseReason) {\r\n this.options.shell.output.warn(result.pauseReason);\r\n }\r\n } catch (error) {\r\n turnDisplay.flush();\r\n\r\n if (error instanceof AgentTurnError) {\r\n this.session = error.session;\r\n }\r\n\r\n if (isAbortError(error)) {\r\n this.options.shell.output.warn(\"Turn interrupted. You can keep chatting.\");\r\n } else {\r\n this.options.shell.output.error(getErrorMessage(error));\r\n this.options.shell.output.info(\"The request failed, but the session is still alive. You can keep chatting.\");\r\n }\r\n } finally {\r\n turnDisplay.dispose();\r\n this.turnInFlight = false;\r\n this.turnAbortController = null;\r\n }\r\n }\r\n}\r\n","import chalk from \"chalk\";\r\n\r\nimport type { ShellOutputPort } from \"../../interaction/shell.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../../types.js\";\r\n\r\nconst ATHLETE_BANNER = [\r\n \" █████╗ ████████╗██╗ ██╗██╗ ███████╗████████╗███████╗\",\r\n \"██╔══██╗╚══██╔══╝██║ ██║██║ ██╔════╝╚══██╔══╝██╔════╝\",\r\n \"███████║ ██║ ███████║██║ █████╗ ██║ █████╗ \",\r\n \"██╔══██║ ██║ ██╔══██║██║ ██╔══╝ ██║ ██╔══╝ \",\r\n \"██║ ██║ ██║ ██║ ██║███████╗███████╗ ██║ ███████╗\",\r\n \"╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝ ╚═╝ ╚══════╝\",\r\n].join(\"\\n\");\r\n\r\nexport function writeCliInteractiveIntro(options: {\r\n cwd: string;\r\n config: Pick<RuntimeConfig, \"mode\">;\r\n session: Pick<SessionRecord, \"id\">;\r\n output: ShellOutputPort;\r\n}): void {\r\n options.output.plain(chalk.bold(chalk.greenBright(ATHLETE_BANNER)));\r\n options.output.dim(`session: ${options.session.id}`);\r\n options.output.dim(`cwd: ${options.cwd}`);\r\n\r\n const modeLabel = options.config.mode === \"agent\" ? \"agent\" : \"read-only\";\r\n const modeSwitchHint = options.config.mode === \"agent\" ? \"athlete --mode read-only\" : \"athlete --mode agent\";\r\n options.output.dim(`Current mode: ${modeLabel}`);\r\n options.output.dim(`Switch mode: ${modeSwitchHint}`);\r\n options.output.dim(\"Commands:\");\r\n options.output.dim(\"/help 查看帮助\");\r\n options.output.dim(\"/runtime 查看会话运行摘要\");\r\n options.output.dim(\"/multi 进入多行输入\");\r\n options.output.dim(\"/tasks 查看任务板\");\r\n options.output.dim(\"/team 查看队友状态\");\r\n options.output.dim(\"/background 查看后台任务\");\r\n options.output.dim(\"/worktrees 查看工作区\");\r\n options.output.dim(\"/inbox 查看收件箱\");\r\n options.output.dim(\"/reset 重置运行时并退出\");\r\n options.output.dim(\"quit 退出\");\r\n options.output.dim(\"::end 提交多行输入\");\r\n options.output.dim(\"::cancel 取消多行输入\\n\");\r\n}\r\n","import type { ShellOutputPort } from \"../../interaction/shell.js\";\r\nimport { ui } from \"../../utils/console.js\";\r\nimport { writeStdout } from \"../../utils/stdio.js\";\r\n\r\nexport function createCliOutputPort(): ShellOutputPort {\r\n let lastInterruptAt = 0;\r\n\r\n return {\r\n plain: ui.plain,\r\n info: ui.info,\r\n warn: ui.warn,\r\n error: ui.error,\r\n dim: ui.dim,\r\n heading: ui.heading,\r\n tool: ui.tool,\r\n interrupt(message) {\r\n const now = Date.now();\r\n if (now - lastInterruptAt < 150) {\r\n return;\r\n }\r\n\r\n lastInterruptAt = now;\r\n writeStdout(\"\\n\");\r\n ui.warn(message);\r\n },\r\n };\r\n}\r\n","import readline from \"node:readline\";\r\n\r\nimport type { ShellInputPort } from \"../../interaction/shell.js\";\r\n\r\nexport async function readPersistentInput(\r\n promptLabel: string,\r\n onInterrupt: () => void,\r\n): Promise<string | null> {\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: true,\r\n });\r\n\r\n let settled = false;\r\n\r\n const cleanup = (): void => {\r\n rl.removeAllListeners(\"line\");\r\n rl.removeAllListeners(\"close\");\r\n rl.removeAllListeners(\"SIGINT\");\r\n };\r\n\r\n const finish = (value: string | null): void => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n cleanup();\r\n rl.close();\r\n resolve(value);\r\n };\r\n\r\n rl.on(\"line\", (line) => {\r\n finish(line);\r\n });\r\n\r\n rl.on(\"SIGINT\", () => {\r\n onInterrupt();\r\n rl.prompt();\r\n });\r\n\r\n rl.on(\"close\", () => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n cleanup();\r\n resolve(null);\r\n });\r\n\r\n rl.setPrompt(promptLabel);\r\n rl.prompt();\r\n });\r\n}\r\n\r\nexport type MultilineInputResult =\r\n | { kind: \"submit\"; value: string }\r\n | { kind: \"cancel\" }\r\n | { kind: \"eof\" };\r\n\r\nexport async function readMultilineInput(onInterrupt: () => void, promptLabel = \"… \"): Promise<MultilineInputResult> {\r\n return new Promise((resolve) => {\r\n const rl = readline.createInterface({\r\n input: process.stdin,\r\n output: process.stdout,\r\n terminal: true,\r\n });\r\n\r\n const lines: string[] = [];\r\n let settled = false;\r\n\r\n const cleanup = (): void => {\r\n rl.removeAllListeners(\"line\");\r\n rl.removeAllListeners(\"close\");\r\n rl.removeAllListeners(\"SIGINT\");\r\n };\r\n\r\n const finish = (value: MultilineInputResult): void => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n cleanup();\r\n rl.close();\r\n resolve(value);\r\n };\r\n\r\n rl.on(\"line\", (line) => {\r\n const trimmed = line.trim();\r\n if (trimmed === \"::end\") {\r\n finish({ kind: \"submit\", value: lines.join(\"\\n\") });\r\n return;\r\n }\r\n\r\n if (trimmed === \"::cancel\") {\r\n finish({ kind: \"cancel\" });\r\n return;\r\n }\r\n\r\n lines.push(line);\r\n rl.prompt();\r\n });\r\n\r\n rl.on(\"SIGINT\", () => {\r\n onInterrupt();\r\n rl.prompt();\r\n });\r\n\r\n rl.on(\"close\", () => {\r\n if (settled) {\r\n return;\r\n }\r\n\r\n settled = true;\r\n cleanup();\r\n resolve({ kind: \"eof\" });\r\n });\r\n\r\n rl.setPrompt(promptLabel);\r\n rl.prompt();\r\n });\r\n}\r\n\r\nexport function createReadlineInputPort(): ShellInputPort {\r\n const listeners = new Set<() => void>();\r\n const notifyInterrupt = (): void => {\r\n for (const listener of listeners) {\r\n listener();\r\n }\r\n };\r\n\r\n return {\r\n async readInput(promptLabel = \"> \") {\r\n const value = await readPersistentInput(promptLabel, notifyInterrupt);\r\n return value === null ? { kind: \"closed\" } : { kind: \"submit\", value };\r\n },\r\n async readMultiline(promptLabel = \"… \") {\r\n const result = await readMultilineInput(notifyInterrupt, promptLabel);\r\n if (result.kind === \"eof\") {\r\n return { kind: \"closed\" };\r\n }\r\n\r\n return result;\r\n },\r\n bindInterrupt(handler) {\r\n listeners.add(handler);\r\n return () => {\r\n listeners.delete(handler);\r\n };\r\n },\r\n };\r\n}\r\n","import type { AgentCallbacks } from \"../agent/types.js\";\r\nimport { writeStdout } from \"../utils/stdio.js\";\r\n\r\nconst ASCII_BLOCK_FRAMES = [\"[■ ]\", \"[ ■ ]\", \"[ ■ ]\", \"[ ■]\", \"[ ■ ]\", \"[ ■ ]\"] as const;\r\n\r\nexport interface WaitingSpinner {\r\n start(): void;\r\n stop(): void;\r\n isActive(): boolean;\r\n}\r\n\r\nexport function createWaitingSpinner(options: {\r\n label?: string;\r\n intervalMs?: number;\r\n enabled?: boolean;\r\n write?: (text: string) => void;\r\n} = {}): WaitingSpinner {\r\n const label = options.label ?? \"thinking\";\r\n const intervalMs = Math.max(40, options.intervalMs ?? 80);\r\n const enabled = options.enabled ?? process.stdout.isTTY;\r\n const frames = ASCII_BLOCK_FRAMES;\r\n const write = options.write ?? ((text: string) => {\r\n writeStdout(text);\r\n });\r\n\r\n let frameIndex = 0;\r\n let timer: NodeJS.Timeout | null = null;\r\n let active = false;\r\n let lastLength = 0;\r\n\r\n const render = (): void => {\r\n const frame = `${frames[frameIndex]} ${label}`;\r\n frameIndex = (frameIndex + 1) % frames.length;\r\n lastLength = frame.length;\r\n write(`\\r${frame}`);\r\n };\r\n\r\n const clear = (): void => {\r\n if (lastLength <= 0) {\r\n return;\r\n }\r\n write(`\\r${\" \".repeat(lastLength)}\\r`);\r\n lastLength = 0;\r\n };\r\n\r\n return {\r\n start(): void {\r\n if (!enabled || active) {\r\n return;\r\n }\r\n active = true;\r\n render();\r\n timer = setInterval(render, intervalMs);\r\n timer.unref?.();\r\n },\r\n stop(): void {\r\n if (!active) {\r\n return;\r\n }\r\n active = false;\r\n if (timer) {\r\n clearInterval(timer);\r\n timer = null;\r\n }\r\n clear();\r\n },\r\n isActive(): boolean {\r\n return active;\r\n },\r\n };\r\n}\r\n\r\nexport function wrapCallbacksWithSpinnerStop(\r\n callbacks: AgentCallbacks,\r\n stopSpinner: () => void,\r\n): AgentCallbacks {\r\n return {\r\n onStatus(text) {\r\n stopSpinner();\r\n callbacks.onStatus?.(text);\r\n },\r\n onAssistantDelta(delta) {\r\n stopSpinner();\r\n callbacks.onAssistantDelta?.(delta);\r\n },\r\n onAssistantDone(fullText) {\r\n stopSpinner();\r\n callbacks.onAssistantDone?.(fullText);\r\n },\r\n onAssistantText(text) {\r\n stopSpinner();\r\n callbacks.onAssistantText?.(text);\r\n },\r\n onReasoningDelta(delta) {\r\n stopSpinner();\r\n callbacks.onReasoningDelta?.(delta);\r\n },\r\n onReasoning(text) {\r\n stopSpinner();\r\n callbacks.onReasoning?.(text);\r\n },\r\n onToolCall(name, args) {\r\n stopSpinner();\r\n callbacks.onToolCall?.(name, args);\r\n },\r\n onToolResult(name, output) {\r\n stopSpinner();\r\n callbacks.onToolResult?.(name, output);\r\n },\r\n onToolError(name, error) {\r\n stopSpinner();\r\n callbacks.onToolError?.(name, error);\r\n },\r\n };\r\n}\r\n","import type { InteractionTurnDisplay } from \"../../interaction/shell.js\";\r\nimport { createWaitingSpinner, wrapCallbacksWithSpinnerStop } from \"../../ui/spinner.js\";\r\nimport { createStreamRenderer } from \"../../ui/streamRenderer.js\";\r\n\r\nexport function createCliTurnDisplay(options: {\r\n cwd: string;\r\n config: {\r\n showReasoning: boolean;\r\n };\r\n abortSignal: AbortSignal;\r\n}): InteractionTurnDisplay {\r\n const streamRenderer = createStreamRenderer(options.config, {\r\n cwd: options.cwd,\r\n assistantLeadingBlankLine: true,\r\n assistantTrailingNewlines: \"\\n\\n\",\r\n reasoningLeadingBlankLine: true,\r\n toolArgsMaxChars: 200,\r\n toolErrorLabel: \"failed, retrying via model\",\r\n abortSignal: options.abortSignal,\r\n });\r\n const waitingSpinner = createWaitingSpinner({ label: \"thinking\" });\r\n const callbacks = wrapCallbacksWithSpinnerStop(streamRenderer.callbacks, () => {\r\n waitingSpinner.stop();\r\n });\r\n\r\n callbacks.onModelWaitStart = () => {\r\n waitingSpinner.start();\r\n };\r\n callbacks.onModelWaitStop = () => {\r\n waitingSpinner.stop();\r\n };\r\n\r\n return {\r\n callbacks,\r\n flush() {\r\n waitingSpinner.stop();\r\n streamRenderer.flush();\r\n },\r\n dispose() {\r\n waitingSpinner.stop();\r\n },\r\n };\r\n}\r\n","import type { InteractionShell } from \"../../interaction/shell.js\";\r\nimport { createCliOutputPort } from \"./output.js\";\r\nimport { createReadlineInputPort } from \"./readlineInput.js\";\r\nimport { createCliTurnDisplay } from \"./turnDisplay.js\";\r\n\r\nexport function createCliInteractionShell(): InteractionShell {\r\n return {\r\n input: createReadlineInputPort(),\r\n output: createCliOutputPort(),\r\n createTurnDisplay(options) {\r\n return createCliTurnDisplay(options);\r\n },\r\n };\r\n}\r\n","import type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport { InteractiveSessionDriver } from \"../interaction/sessionDriver.js\";\r\nimport type { InteractiveSessionDriverOptions } from \"../interaction/sessionDriver.js\";\r\nimport type { InteractionShell } from \"../interaction/shell.js\";\r\nimport { writeCliInteractiveIntro } from \"../shell/cli/intro.js\";\r\nimport { createCliInteractionShell } from \"../shell/cli/shell.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\n\r\ninterface InteractiveOptions {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n session: SessionRecord;\r\n sessionStore: SessionStoreLike;\r\n}\r\n\r\nexport interface StartInteractiveChatDependencies {\r\n shell?: InteractionShell;\r\n createDriver?: (options: InteractiveSessionDriverOptions) => {\r\n run(): Promise<SessionRecord>;\r\n };\r\n writeIntro?: (options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n session: SessionRecord;\r\n shell: InteractionShell;\r\n }) => void;\r\n}\r\n\r\nexport async function startInteractiveChat(\r\n options: InteractiveOptions,\r\n dependencies: StartInteractiveChatDependencies = {},\r\n): Promise<void> {\r\n const shell = dependencies.shell ?? createCliInteractionShell();\r\n (dependencies.writeIntro ?? ((context) => {\r\n writeCliInteractiveIntro({\r\n cwd: context.cwd,\r\n config: context.config,\r\n session: context.session,\r\n output: context.shell.output,\r\n });\r\n }))({\r\n cwd: options.cwd,\r\n config: options.config,\r\n session: options.session,\r\n shell,\r\n });\r\n\r\n const driver =\r\n dependencies.createDriver?.({\r\n ...options,\r\n shell,\r\n }) ??\r\n new InteractiveSessionDriver({\r\n ...options,\r\n shell,\r\n });\r\n\r\n await driver.run();\r\n}\r\n","import fs from \"node:fs/promises\";\r\n\r\nimport type { Command } from \"commander\";\r\n\r\nimport { getErrorMessage } from \"../agent/errors.js\";\r\nimport { SessionStore } from \"../agent/sessionStore.js\";\r\nimport type { CliOverrides, RuntimeConfig } from \"../types.js\";\r\nimport { FileWeixinAttachmentStore } from \"./attachmentStore.js\";\r\nimport { OpenILinkWeixinClient } from \"./client.js\";\r\nimport { FileWeixinContextTokenStore } from \"./contextTokenStore.js\";\r\nimport { FileWeixinCredentialStore } from \"./credentialsStore.js\";\r\nimport { WeixinDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport { createConsoleWeixinLogger } from \"./logger.js\";\r\nimport { WeixinPollingSource } from \"./polling.js\";\r\nimport { acquireWeixinProcessLock } from \"./processLock.js\";\r\nimport { FileWeixinSessionMapStore } from \"./sessionMapStore.js\";\r\nimport { WeixinService } from \"./service.js\";\r\nimport { FileWeixinSyncBufStore } from \"./syncBufStore.js\";\r\n\r\nexport async function loginWeixin(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n}): Promise<void> {\r\n const runtime = options.config.weixin;\r\n const client = new OpenILinkWeixinClient({\r\n baseUrl: runtime.baseUrl,\r\n cdnBaseUrl: runtime.cdnBaseUrl,\r\n routeTag: runtime.routeTag,\r\n });\r\n const credentials = await client.loginWithQr({\r\n timeoutMs: runtime.qrTimeoutMs,\r\n onQrCode(content) {\r\n console.log(content);\r\n },\r\n onScanned() {\r\n console.log(\"[weixin] QR scanned. Confirm the login in Weixin.\");\r\n },\r\n onExpired(attempt, maxAttempts) {\r\n console.log(`[weixin] QR expired. Retrying ${attempt}/${maxAttempts}.`);\r\n },\r\n });\r\n\r\n await fs.mkdir(runtime.stateDir, { recursive: true });\r\n await new FileWeixinCredentialStore(runtime.credentialsFile).save(credentials);\r\n await new FileWeixinSyncBufStore(runtime.syncBufFile).clear();\r\n await fs.rm(runtime.contextTokenFile, { force: true }).catch(() => undefined);\r\n await fs.rm(runtime.deliveryQueueFile, { force: true }).catch(() => undefined);\r\n\r\n console.log(\r\n `[weixin] login complete user=${credentials.userId ?? \"unknown\"} bot=${credentials.botId ?? \"unknown\"} state=${runtime.stateDir}`,\r\n );\r\n}\r\n\r\nexport async function logoutWeixin(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n}): Promise<void> {\r\n const runtime = options.config.weixin;\r\n await new FileWeixinCredentialStore(runtime.credentialsFile).clear();\r\n await new FileWeixinSyncBufStore(runtime.syncBufFile).clear();\r\n await fs.rm(runtime.contextTokenFile, { force: true }).catch(() => undefined);\r\n await fs.rm(runtime.deliveryQueueFile, { force: true }).catch(() => undefined);\r\n\r\n console.log(`[weixin] logged out state=${runtime.stateDir}`);\r\n}\r\n\r\nexport async function createWeixinService(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n}): Promise<WeixinService> {\r\n const logger = createConsoleWeixinLogger();\r\n const credentials = options.config.weixin.credentials;\r\n if (!credentials?.token) {\r\n throw new Error(\"Weixin login required before serve. Run `athlete weixin login` first.\");\r\n }\r\n\r\n const client = new OpenILinkWeixinClient({\r\n token: credentials.token,\r\n baseUrl: credentials.baseUrl || options.config.weixin.baseUrl,\r\n cdnBaseUrl: credentials.cdnBaseUrl || options.config.weixin.cdnBaseUrl,\r\n routeTag: options.config.weixin.routeTag,\r\n });\r\n const syncBufStore = new FileWeixinSyncBufStore(options.config.weixin.syncBufFile);\r\n const contextTokenStore = new FileWeixinContextTokenStore(options.config.weixin.contextTokenFile);\r\n const deliveryQueue = new WeixinDeliveryQueue({\r\n storePath: options.config.weixin.deliveryQueueFile,\r\n target: client,\r\n contextTokenStore,\r\n deliveryConfig: options.config.weixin.delivery,\r\n onAccepted(entry) {\r\n logger.info(\"delivery sent\", {\r\n peerKey: entry.peerKey,\r\n userId: entry.userId,\r\n fileName: entry.kind === \"file\" ? entry.fileName : undefined,\r\n detail: `type=${entry.kind}`,\r\n });\r\n },\r\n onDeliveryFailed(entry, error) {\r\n logger.error(\"delivery failed\", {\r\n peerKey: entry.peerKey,\r\n userId: entry.userId,\r\n fileName: entry.kind === \"file\" ? entry.fileName : undefined,\r\n detail: getErrorMessage(error),\r\n });\r\n },\r\n onBlocked(entry, reason) {\r\n logger.info(\"delivery blocked\", {\r\n peerKey: entry.peerKey,\r\n userId: entry.userId,\r\n fileName: entry.kind === \"file\" ? entry.fileName : undefined,\r\n detail: reason,\r\n });\r\n },\r\n });\r\n\r\n return new WeixinService({\r\n cwd: options.cwd,\r\n config: options.config,\r\n client,\r\n sessionStore: new SessionStore(options.config.paths.sessionsDir),\r\n sessionMapStore: new FileWeixinSessionMapStore(options.config.weixin.sessionMapFile),\r\n syncBufStore,\r\n contextTokenStore,\r\n attachmentStore: new FileWeixinAttachmentStore(options.config.weixin.attachmentStoreFile),\r\n deliveryQueue,\r\n pollingSource: new WeixinPollingSource(client, syncBufStore, options.config.weixin),\r\n logger,\r\n });\r\n}\r\n\r\nexport function registerWeixinCommands(\r\n program: Command,\r\n dependencies: {\r\n getCliOverrides: () => CliOverrides;\r\n resolveRuntime: (overrides: CliOverrides) => Promise<{\r\n cwd: string;\r\n config: RuntimeConfig;\r\n paths: RuntimeConfig[\"paths\"];\r\n overrides: CliOverrides;\r\n }>;\r\n loginWeixin?: typeof loginWeixin;\r\n createWeixinService?: (options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n }) => Promise<{\r\n run(signal?: AbortSignal): Promise<void>;\r\n stop?(): void;\r\n }>;\r\n logoutWeixin?: typeof logoutWeixin;\r\n acquireProcessLock?: typeof acquireWeixinProcessLock;\r\n },\r\n): void {\r\n const weixinCommand = program.command(\"weixin\").description(\"Serve Weixin private-chat control.\");\r\n\r\n weixinCommand\r\n .command(\"login\")\r\n .description(\"Login to Weixin with QR code and persist credentials.\")\r\n .action(async () => {\r\n const runtime = await dependencies.resolveRuntime(dependencies.getCliOverrides());\r\n await (dependencies.loginWeixin ?? loginWeixin)({\r\n cwd: runtime.cwd,\r\n config: runtime.config,\r\n });\r\n });\r\n\r\n weixinCommand\r\n .command(\"serve\")\r\n .description(\"Run the Weixin private-chat service via long polling.\")\r\n .action(async () => {\r\n const runtime = await dependencies.resolveRuntime(dependencies.getCliOverrides());\r\n if (!runtime.config.weixin.credentials?.token) {\r\n throw new Error(\"Weixin login required before serve. Run `athlete weixin login` first.\");\r\n }\r\n\r\n if (runtime.config.weixin.allowedUserIds.length === 0) {\r\n throw new Error(\"Weixin whitelist is empty. Set ATHLETE_WEIXIN_ALLOWED_USER_IDS or config.weixin.allowedUserIds.\");\r\n }\r\n\r\n const lock = await (dependencies.acquireProcessLock ?? acquireWeixinProcessLock)({\r\n stateDir: runtime.config.weixin.stateDir,\r\n });\r\n const service = await (dependencies.createWeixinService ?? createWeixinService)({\r\n cwd: runtime.cwd,\r\n config: runtime.config,\r\n });\r\n console.log(\r\n `[weixin] starting private-chat service users=${runtime.config.weixin.allowedUserIds.join(\",\")} state=${runtime.config.weixin.stateDir}`,\r\n );\r\n const controller = new AbortController();\r\n const releaseSignals = bindShutdownSignals(() => {\r\n controller.abort();\r\n service.stop?.();\r\n });\r\n\r\n try {\r\n await service.run(controller.signal);\r\n } finally {\r\n releaseSignals();\r\n await lock.release();\r\n }\r\n });\r\n\r\n weixinCommand\r\n .command(\"logout\")\r\n .description(\"Clear the persisted Weixin login state.\")\r\n .action(async () => {\r\n const runtime = await dependencies.resolveRuntime(dependencies.getCliOverrides());\r\n await (dependencies.logoutWeixin ?? logoutWeixin)({\r\n cwd: runtime.cwd,\r\n config: runtime.config,\r\n });\r\n });\r\n}\r\n\r\nfunction bindShutdownSignals(onShutdown: () => void): () => void {\r\n const handler = () => {\r\n onShutdown();\r\n };\r\n process.once(\"SIGINT\", handler);\r\n process.once(\"SIGTERM\", handler);\r\n\r\n return () => {\r\n process.off(\"SIGINT\", handler);\r\n process.off(\"SIGTERM\", handler);\r\n };\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport type WeixinAttachmentMediaKind = \"image\" | \"video\" | \"file\" | \"voice\";\r\n\r\nexport interface WeixinAttachmentRecord {\r\n id: string;\r\n peerKey: string;\r\n userId: string;\r\n messageId: number;\r\n seq: number;\r\n sessionId: string;\r\n mediaKind: WeixinAttachmentMediaKind;\r\n localFilePath: string;\r\n fileName?: string;\r\n mimeType?: string;\r\n fileSize?: number;\r\n text?: string;\r\n contextToken?: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WeixinAttachmentStoreLike {\r\n add(record: WeixinAttachmentRecord): Promise<void>;\r\n getLatestByPeer(peerKey: string): Promise<WeixinAttachmentRecord | null>;\r\n listByPeer(peerKey: string, limit?: number): Promise<WeixinAttachmentRecord[]>;\r\n}\r\n\r\nexport class FileWeixinAttachmentStore implements WeixinAttachmentStoreLike {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(private readonly filePath: string) {}\r\n\r\n async add(record: WeixinAttachmentRecord): Promise<void> {\r\n await this.withLock(async () => {\r\n const records = await this.readAll();\r\n const next = records.filter((entry) => entry.id !== record.id);\r\n next.push(record);\r\n next.sort((left, right) => {\r\n if (left.updatedAt === right.updatedAt) {\r\n return left.id.localeCompare(right.id);\r\n }\r\n\r\n return left.updatedAt.localeCompare(right.updatedAt);\r\n });\r\n await this.writeAll(trimRecords(next, 200));\r\n });\r\n }\r\n\r\n async getLatestByPeer(peerKey: string): Promise<WeixinAttachmentRecord | null> {\r\n return this.withLock(async () => {\r\n const records = await this.readAll();\r\n const matches = records.filter((entry) => entry.peerKey === peerKey);\r\n return matches[matches.length - 1] ?? null;\r\n });\r\n }\r\n\r\n async listByPeer(peerKey: string, limit = 5): Promise<WeixinAttachmentRecord[]> {\r\n return this.withLock(async () => {\r\n const records = await this.readAll();\r\n const matches = records.filter((entry) => entry.peerKey === peerKey);\r\n return matches.slice(Math.max(0, matches.length - Math.max(1, limit))).reverse();\r\n });\r\n }\r\n\r\n private async readAll(): Promise<WeixinAttachmentRecord[]> {\r\n const payload = await readJsonFile<{ attachments?: WeixinAttachmentRecord[] } | null>(this.filePath, null);\r\n return Array.isArray(payload?.attachments) ? payload.attachments : [];\r\n }\r\n\r\n private async writeAll(records: WeixinAttachmentRecord[]): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n attachments: records,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n\r\nfunction trimRecords(records: WeixinAttachmentRecord[], maxRecords: number): WeixinAttachmentRecord[] {\r\n if (records.length <= maxRecords) {\r\n return records;\r\n }\r\n\r\n return records.slice(records.length - maxRecords);\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ClientConfig } from \"@openilink/openilink-sdk-node\";\r\nimport { decode as decodeSilk } from \"silk-wasm\";\r\n\r\nimport type { WeixinLoginState } from \"./credentialsStore.js\";\r\nimport type { WeixinPollingBatch, WeixinRawMessage } from \"./types.js\";\r\n\r\nexport interface WeixinTypingConfig {\r\n typingTicket: string | null;\r\n}\r\n\r\nexport interface WeixinQrLoginOptions {\r\n timeoutMs: number;\r\n onQrCode?: (content: string) => void;\r\n onScanned?: () => void;\r\n onExpired?: (attempt: number, maxAttempts: number) => void;\r\n}\r\n\r\nexport interface WeixinTextSendRequest {\r\n userId: string;\r\n contextToken: string;\r\n text: string;\r\n clientId: string;\r\n}\r\n\r\nexport interface WeixinMediaSendRequest {\r\n userId: string;\r\n contextToken: string;\r\n filePath: string;\r\n caption?: string;\r\n}\r\n\r\nexport interface WeixinFileSendRequest extends WeixinMediaSendRequest {\r\n fileName?: string;\r\n}\r\n\r\nexport interface WeixinClientLike {\r\n loginWithQr(options: WeixinQrLoginOptions): Promise<WeixinLoginState>;\r\n getUpdates(syncBuf?: string | null, timeoutMs?: number, signal?: AbortSignal): Promise<WeixinPollingBatch>;\r\n getTypingConfig(userId: string, contextToken: string): Promise<WeixinTypingConfig>;\r\n sendTyping(userId: string, typingTicket: string, status: number): Promise<void>;\r\n sendText(request: WeixinTextSendRequest): Promise<void>;\r\n sendImage(request: WeixinMediaSendRequest): Promise<void>;\r\n sendVideo(request: WeixinMediaSendRequest): Promise<void>;\r\n sendFile(request: WeixinFileSendRequest): Promise<void>;\r\n downloadMedia(media: { encrypt_query_param?: string; aes_key?: string; full_url?: string } | undefined): Promise<Uint8Array>;\r\n downloadVoice(voice: { media?: { encrypt_query_param?: string; aes_key?: string; full_url?: string }; sample_rate?: number } | undefined): Promise<Uint8Array>;\r\n}\r\n\r\nexport const WEIXIN_TYPING_STATUS = 1;\r\nconst WEIXIN_BOT_MESSAGE_TYPE = 2;\r\nconst WEIXIN_FINISHED_MESSAGE_STATE = 2;\r\nconst WEIXIN_TEXT_ITEM_TYPE = 1;\r\n\r\nexport class OpenILinkWeixinClient implements WeixinClientLike {\r\n private clientPromise: Promise<OpenILinkRuntimeClient> | null = null;\r\n private readonly runtimeOptions: {\r\n token?: string;\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n routeTag?: string;\r\n fetchImpl?: typeof fetch;\r\n };\r\n\r\n constructor(options: {\r\n token?: string;\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n routeTag?: string;\r\n fetchImpl?: typeof fetch;\r\n }) {\r\n this.runtimeOptions = options;\r\n }\r\n\r\n async loginWithQr(options: WeixinQrLoginOptions): Promise<WeixinLoginState> {\r\n const client = await this.getClient();\r\n const result = await client.loginWithQr(\r\n {\r\n on_qrcode: options.onQrCode,\r\n on_scanned: options.onScanned,\r\n on_expired: options.onExpired,\r\n },\r\n options.timeoutMs,\r\n );\r\n\r\n if (!result.connected || !result.bot_token) {\r\n throw new Error(result.message || \"OpeniLink QR login failed.\");\r\n }\r\n\r\n const now = new Date().toISOString();\r\n return {\r\n token: result.bot_token,\r\n baseUrl: result.base_url?.trim() || client.baseUrl.trim(),\r\n cdnBaseUrl: client.cdnBaseUrl.trim(),\r\n botId: result.bot_id?.trim() || undefined,\r\n userId: result.user_id?.trim() || undefined,\r\n connectedAt: now,\r\n updatedAt: now,\r\n };\r\n }\r\n\r\n async getUpdates(syncBuf?: string | null, timeoutMs?: number): Promise<WeixinPollingBatch> {\r\n const client = await this.getClient();\r\n const response = await client.getUpdates(syncBuf ?? undefined, timeoutMs);\r\n return {\r\n messages: Array.isArray(response.msgs) ? (response.msgs as WeixinRawMessage[]) : [],\r\n syncBuf: typeof response.sync_buf === \"string\" && response.sync_buf.trim() ? response.sync_buf : null,\r\n longPollingTimeoutMs:\r\n typeof response.longpolling_timeout_ms === \"number\" && Number.isFinite(response.longpolling_timeout_ms)\r\n ? Math.trunc(response.longpolling_timeout_ms)\r\n : undefined,\r\n };\r\n }\r\n\r\n async getTypingConfig(userId: string, contextToken: string): Promise<WeixinTypingConfig> {\r\n const client = await this.getClient();\r\n const response = await client.getConfig(userId, contextToken);\r\n return {\r\n typingTicket:\r\n typeof response.typing_ticket === \"string\" && response.typing_ticket.trim()\r\n ? response.typing_ticket\r\n : null,\r\n };\r\n }\r\n\r\n async sendTyping(userId: string, typingTicket: string, status: number): Promise<void> {\r\n const client = await this.getClient();\r\n await client.sendTyping(userId, typingTicket, status);\r\n }\r\n\r\n async sendText(request: WeixinTextSendRequest): Promise<void> {\r\n const client = await this.getClient();\r\n await client.sendMessage({\r\n from_user_id: \"\",\r\n to_user_id: request.userId,\r\n client_id: request.clientId,\r\n message_type: WEIXIN_BOT_MESSAGE_TYPE,\r\n message_state: WEIXIN_FINISHED_MESSAGE_STATE,\r\n context_token: request.contextToken,\r\n item_list: [\r\n {\r\n type: WEIXIN_TEXT_ITEM_TYPE,\r\n text_item: {\r\n text: request.text,\r\n },\r\n },\r\n ],\r\n });\r\n }\r\n\r\n async sendImage(request: WeixinMediaSendRequest): Promise<void> {\r\n await this.sendMedia(request);\r\n }\r\n\r\n async sendVideo(request: WeixinMediaSendRequest): Promise<void> {\r\n await this.sendMedia(request);\r\n }\r\n\r\n async sendFile(request: WeixinFileSendRequest): Promise<void> {\r\n await this.sendMedia(request, request.fileName);\r\n }\r\n\r\n async downloadMedia(media: { encrypt_query_param?: string; aes_key?: string; full_url?: string } | undefined): Promise<Uint8Array> {\r\n const client = await this.getClient();\r\n return client.downloadMedia(media);\r\n }\r\n\r\n async downloadVoice(voice: { media?: { encrypt_query_param?: string; aes_key?: string; full_url?: string }; sample_rate?: number } | undefined): Promise<Uint8Array> {\r\n const client = await this.getClient();\r\n return client.downloadVoice(voice);\r\n }\r\n\r\n private async sendMedia(request: WeixinMediaSendRequest, fileNameOverride?: string): Promise<void> {\r\n const client = await this.getClient();\r\n const fileName = fileNameOverride?.trim() || path.basename(request.filePath);\r\n const bytes = await fs.readFile(request.filePath);\r\n await client.sendMediaFile(\r\n request.userId,\r\n request.contextToken,\r\n bytes,\r\n fileName,\r\n request.caption?.trim() || undefined,\r\n );\r\n }\r\n\r\n private async getClient(): Promise<OpenILinkRuntimeClient> {\r\n this.clientPromise ??= this.createClient();\r\n return this.clientPromise;\r\n }\r\n\r\n private buildConfig(options: {\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n routeTag?: string;\r\n fetchImpl?: typeof fetch;\r\n }): ClientConfig {\r\n return {\r\n base_url: options.baseUrl,\r\n cdn_base_url: options.cdnBaseUrl,\r\n route_tag: options.routeTag?.trim() || undefined,\r\n fetch_impl: options.fetchImpl,\r\n silk_decoder: async (silkData, sampleRate) => {\r\n const decoded = await decodeSilk(silkData, sampleRate);\r\n return decoded.data;\r\n },\r\n };\r\n }\r\n\r\n private async createClient(): Promise<OpenILinkRuntimeClient> {\r\n const sdk = await loadOpenILinkSdk();\r\n return new sdk.Client(this.runtimeOptions.token ?? \"\", this.buildConfig(this.runtimeOptions));\r\n }\r\n}\r\n\r\ninterface OpenILinkRuntimeClient {\r\n baseUrl: string;\r\n cdnBaseUrl: string;\r\n sendMessage(message: Record<string, unknown>): Promise<void>;\r\n loginWithQr(\r\n callbacks?: {\r\n on_qrcode?: (url: string) => void;\r\n on_scanned?: () => void;\r\n on_expired?: (attempt: number, maxAttempts: number) => void;\r\n },\r\n timeoutMs?: number,\r\n ): Promise<{\r\n connected: boolean;\r\n bot_token?: string;\r\n bot_id?: string;\r\n base_url?: string;\r\n user_id?: string;\r\n message: string;\r\n }>;\r\n getUpdates(syncBuf?: string, timeoutMs?: number): Promise<{\r\n msgs?: unknown[];\r\n sync_buf?: string;\r\n longpolling_timeout_ms?: number;\r\n }>;\r\n getConfig(userId: string, contextToken: string): Promise<{\r\n typing_ticket?: string;\r\n }>;\r\n sendTyping(userId: string, typingTicket: string, status: number): Promise<void>;\r\n sendText(userId: string, text: string, contextToken: string): Promise<unknown>;\r\n sendMediaFile(\r\n userId: string,\r\n contextToken: string,\r\n data: Uint8Array | ArrayBuffer,\r\n fileName: string,\r\n caption?: string,\r\n ): Promise<unknown>;\r\n downloadMedia(media: { encrypt_query_param?: string; aes_key?: string; full_url?: string } | undefined): Promise<Uint8Array>;\r\n downloadVoice(voice: { media?: { encrypt_query_param?: string; aes_key?: string; full_url?: string }; sample_rate?: number } | undefined): Promise<Uint8Array>;\r\n}\r\n\r\nlet openILinkSdkPromise: Promise<{ Client: new (token?: string, config?: ClientConfig) => OpenILinkRuntimeClient }> | null = null;\r\n\r\nasync function loadOpenILinkSdk(): Promise<{ Client: new (token?: string, config?: ClientConfig) => OpenILinkRuntimeClient }> {\r\n openILinkSdkPromise ??=\r\n import(\"@openilink/openilink-sdk-node\") as unknown as Promise<{ Client: new (token?: string, config?: ClientConfig) => OpenILinkRuntimeClient }>;\r\n return openILinkSdkPromise;\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport type WeixinContextTokenStatus = \"active\" | \"invalid\";\r\n\r\nexport interface WeixinContextTokenRecord {\r\n peerKey: string;\r\n userId: string;\r\n contextToken: string;\r\n status: WeixinContextTokenStatus;\r\n updatedAt: string;\r\n invalidReason?: string;\r\n}\r\n\r\nexport interface WeixinContextTokenStoreLike {\r\n get(peerKey: string): Promise<WeixinContextTokenRecord | null>;\r\n set(record: WeixinContextTokenRecord): Promise<void>;\r\n markInvalid(peerKey: string, reason: string): Promise<void>;\r\n getUsableToken(peerKey: string): Promise<string | null>;\r\n list(): Promise<WeixinContextTokenRecord[]>;\r\n}\r\n\r\nexport class FileWeixinContextTokenStore implements WeixinContextTokenStoreLike {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(private readonly filePath: string) {}\r\n\r\n async get(peerKey: string): Promise<WeixinContextTokenRecord | null> {\r\n return this.withLock(async () => {\r\n const records = await this.readAll();\r\n return records.find((record) => record.peerKey === peerKey) ?? null;\r\n });\r\n }\r\n\r\n async set(record: WeixinContextTokenRecord): Promise<void> {\r\n await this.withLock(async () => {\r\n const records = await this.readAll();\r\n const next = records.filter((entry) => entry.peerKey !== record.peerKey);\r\n next.push({\r\n ...record,\r\n contextToken: record.contextToken.trim(),\r\n userId: record.userId.trim(),\r\n });\r\n next.sort((left, right) => left.peerKey.localeCompare(right.peerKey));\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async markInvalid(peerKey: string, reason: string): Promise<void> {\r\n await this.withLock(async () => {\r\n const records = await this.readAll();\r\n const existing = records.find((record) => record.peerKey === peerKey);\r\n if (!existing) {\r\n return;\r\n }\r\n\r\n const next = records\r\n .filter((record) => record.peerKey !== peerKey)\r\n .concat({\r\n ...existing,\r\n status: \"invalid\",\r\n invalidReason: reason,\r\n updatedAt: new Date().toISOString(),\r\n });\r\n next.sort((left, right) => left.peerKey.localeCompare(right.peerKey));\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async getUsableToken(peerKey: string): Promise<string | null> {\r\n const record = await this.get(peerKey);\r\n if (!record || record.status !== \"active\" || !record.contextToken.trim()) {\r\n return null;\r\n }\r\n\r\n return record.contextToken;\r\n }\r\n\r\n async list(): Promise<WeixinContextTokenRecord[]> {\r\n return this.withLock(async () => this.readAll());\r\n }\r\n\r\n private async readAll(): Promise<WeixinContextTokenRecord[]> {\r\n const payload = await readJsonFile<{ records?: WeixinContextTokenRecord[] } | null>(this.filePath, null);\r\n return Array.isArray(payload?.records) ? payload.records : [];\r\n }\r\n\r\n private async writeAll(records: WeixinContextTokenRecord[]): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n records,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n","import crypto from \"node:crypto\";\r\n\r\nimport type { WeixinConfig } from \"./config.js\";\r\nimport type { WeixinContextTokenStoreLike } from \"./contextTokenStore.js\";\r\nimport { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport class WeixinContextTokenDeliveryError extends Error {\r\n constructor(message: string) {\r\n super(message);\r\n this.name = \"WeixinContextTokenDeliveryError\";\r\n }\r\n}\r\n\r\nexport interface WeixinDeliveryTarget {\r\n sendText(request: { userId: string; contextToken: string; text: string; clientId: string }): Promise<void>;\r\n sendImage(request: { userId: string; contextToken: string; filePath: string; caption?: string }): Promise<void>;\r\n sendVideo(request: { userId: string; contextToken: string; filePath: string; caption?: string }): Promise<void>;\r\n sendFile(request: { userId: string; contextToken: string; filePath: string; fileName?: string; caption?: string }): Promise<void>;\r\n}\r\n\r\nexport type WeixinDeliveryBlockedReason = \"missing_context_token\" | \"context_token_invalid\";\r\n\r\ninterface WeixinDeliveryEntryBase {\r\n id: string;\r\n peerKey: string;\r\n userId: string;\r\n kind: \"text\" | \"image\" | \"video\" | \"file\";\r\n attemptCount: number;\r\n createdAt: number;\r\n nextAttemptAt: number;\r\n lastError?: string;\r\n blockedReason?: WeixinDeliveryBlockedReason;\r\n}\r\n\r\nexport interface WeixinTextDeliveryEntry extends WeixinDeliveryEntryBase {\r\n kind: \"text\";\r\n text: string;\r\n clientId: string;\r\n}\r\n\r\nexport interface WeixinImageDeliveryEntry extends WeixinDeliveryEntryBase {\r\n kind: \"image\";\r\n filePath: string;\r\n caption?: string;\r\n}\r\n\r\nexport interface WeixinVideoDeliveryEntry extends WeixinDeliveryEntryBase {\r\n kind: \"video\";\r\n filePath: string;\r\n caption?: string;\r\n}\r\n\r\nexport interface WeixinFileDeliveryEntry extends WeixinDeliveryEntryBase {\r\n kind: \"file\";\r\n filePath: string;\r\n fileName?: string;\r\n caption?: string;\r\n}\r\n\r\nexport type WeixinDeliveryEntry =\r\n | WeixinTextDeliveryEntry\r\n | WeixinImageDeliveryEntry\r\n | WeixinVideoDeliveryEntry\r\n | WeixinFileDeliveryEntry;\r\n\r\nexport class WeixinDeliveryQueue {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(\r\n private readonly options: {\r\n storePath: string;\r\n target: WeixinDeliveryTarget;\r\n contextTokenStore: WeixinContextTokenStoreLike;\r\n deliveryConfig: WeixinConfig[\"delivery\"];\r\n now?: () => number;\r\n onAccepted?: (entry: WeixinDeliveryEntry) => void;\r\n onDeliveryFailed?: (entry: WeixinDeliveryEntry, error: unknown) => void;\r\n onBlocked?: (entry: WeixinDeliveryEntry, reason: WeixinDeliveryBlockedReason) => void;\r\n },\r\n ) {}\r\n\r\n async enqueueText(input: { peerKey: string; userId: string; text: string }): Promise<WeixinTextDeliveryEntry> {\r\n return this.enqueue({\r\n peerKey: input.peerKey,\r\n userId: input.userId,\r\n kind: \"text\",\r\n text: input.text,\r\n clientId: buildWeixinTextClientId(),\r\n });\r\n }\r\n\r\n async enqueueImage(input: { peerKey: string; userId: string; filePath: string; caption?: string }): Promise<WeixinImageDeliveryEntry> {\r\n return this.enqueue({\r\n peerKey: input.peerKey,\r\n userId: input.userId,\r\n kind: \"image\",\r\n filePath: input.filePath,\r\n caption: input.caption,\r\n });\r\n }\r\n\r\n async enqueueVideo(input: { peerKey: string; userId: string; filePath: string; caption?: string }): Promise<WeixinVideoDeliveryEntry> {\r\n return this.enqueue({\r\n peerKey: input.peerKey,\r\n userId: input.userId,\r\n kind: \"video\",\r\n filePath: input.filePath,\r\n caption: input.caption,\r\n });\r\n }\r\n\r\n async enqueueFile(input: {\r\n peerKey: string;\r\n userId: string;\r\n filePath: string;\r\n fileName?: string;\r\n caption?: string;\r\n }): Promise<WeixinFileDeliveryEntry> {\r\n return this.enqueue({\r\n peerKey: input.peerKey,\r\n userId: input.userId,\r\n kind: \"file\",\r\n filePath: input.filePath,\r\n fileName: input.fileName,\r\n caption: input.caption,\r\n });\r\n }\r\n\r\n async flushDue(): Promise<void> {\r\n await this.withLock(async () => {\r\n const entries = await this.readEntries();\r\n const now = this.now();\r\n let dirty = false;\r\n const nextEntries: WeixinDeliveryEntry[] = [];\r\n\r\n for (const entry of entries) {\r\n if (entry.nextAttemptAt > now) {\r\n nextEntries.push(entry);\r\n continue;\r\n }\r\n\r\n const token = await this.options.contextTokenStore.getUsableToken(entry.peerKey);\r\n if (!token) {\r\n const blockedReason = await this.detectBlockedReason(entry.peerKey);\r\n if (entry.blockedReason !== blockedReason || entry.lastError !== blockedReason) {\r\n dirty = true;\r\n entry.blockedReason = blockedReason;\r\n entry.lastError = blockedReason;\r\n }\r\n nextEntries.push(entry);\r\n this.options.onBlocked?.(entry, blockedReason);\r\n continue;\r\n }\r\n\r\n try {\r\n await this.deliver(entry, token);\r\n dirty = true;\r\n this.options.onAccepted?.(entry);\r\n } catch (error) {\r\n if (isContextTokenDeliveryFailure(error)) {\r\n await this.options.contextTokenStore.markInvalid(entry.peerKey, getErrorMessage(error));\r\n if (entry.blockedReason !== \"context_token_invalid\" || entry.lastError !== getErrorMessage(error)) {\r\n dirty = true;\r\n }\r\n entry.blockedReason = \"context_token_invalid\";\r\n entry.lastError = getErrorMessage(error);\r\n nextEntries.push(entry);\r\n this.options.onBlocked?.(entry, \"context_token_invalid\");\r\n continue;\r\n }\r\n\r\n dirty = true;\r\n entry.attemptCount += 1;\r\n entry.blockedReason = undefined;\r\n entry.lastError = getErrorMessage(error);\r\n entry.nextAttemptAt = now + computeBackoffMs(entry.attemptCount, this.options.deliveryConfig);\r\n nextEntries.push(entry);\r\n this.options.onDeliveryFailed?.(entry, error);\r\n }\r\n }\r\n\r\n if (!dirty) {\r\n return;\r\n }\r\n\r\n await this.writeEntries(nextEntries);\r\n });\r\n }\r\n\r\n async listPending(): Promise<WeixinDeliveryEntry[]> {\r\n return this.withLock(async () => this.readEntries());\r\n }\r\n\r\n async confirmTextReceipt(input: { peerKey: string; clientId: string }): Promise<boolean> {\r\n return false;\r\n }\r\n\r\n private async enqueue<T extends WeixinDeliveryEntry>(\r\n entryLike: Omit<T, \"id\" | \"attemptCount\" | \"createdAt\" | \"nextAttemptAt\">,\r\n ): Promise<T> {\r\n return this.withLock(async () => {\r\n const entries = await this.readEntries();\r\n const now = this.now();\r\n const entry = {\r\n id: crypto.randomUUID(),\r\n attemptCount: 0,\r\n createdAt: now,\r\n nextAttemptAt: now,\r\n ...entryLike,\r\n } as T;\r\n entries.push(entry);\r\n entries.sort((left, right) => left.createdAt - right.createdAt);\r\n await this.writeEntries(entries);\r\n return entry;\r\n });\r\n }\r\n\r\n private async deliver(entry: WeixinDeliveryEntry, contextToken: string): Promise<void> {\r\n if (entry.kind === \"text\") {\r\n await this.options.target.sendText({\r\n userId: entry.userId,\r\n contextToken,\r\n text: entry.text,\r\n clientId: entry.clientId,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === \"image\") {\r\n await this.options.target.sendImage({\r\n userId: entry.userId,\r\n contextToken,\r\n filePath: entry.filePath,\r\n caption: entry.caption,\r\n });\r\n return;\r\n }\r\n\r\n if (entry.kind === \"video\") {\r\n await this.options.target.sendVideo({\r\n userId: entry.userId,\r\n contextToken,\r\n filePath: entry.filePath,\r\n caption: entry.caption,\r\n });\r\n return;\r\n }\r\n\r\n await this.options.target.sendFile({\r\n userId: entry.userId,\r\n contextToken,\r\n filePath: entry.filePath,\r\n fileName: entry.fileName,\r\n caption: entry.caption,\r\n });\r\n }\r\n\r\n private async detectBlockedReason(peerKey: string): Promise<WeixinDeliveryBlockedReason> {\r\n const record = await this.options.contextTokenStore.get(peerKey);\r\n return record?.status === \"invalid\" ? \"context_token_invalid\" : \"missing_context_token\";\r\n }\r\n\r\n private async readEntries(): Promise<WeixinDeliveryEntry[]> {\r\n const payload = await readJsonFile<{ entries?: WeixinDeliveryEntry[] } | null>(this.options.storePath, null);\r\n return Array.isArray(payload?.entries) ? payload.entries : [];\r\n }\r\n\r\n private async writeEntries(entries: WeixinDeliveryEntry[]): Promise<void> {\r\n await writeJsonFileAtomically(this.options.storePath, {\r\n entries,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n\r\n private now(): number {\r\n return this.options.now?.() ?? Date.now();\r\n }\r\n}\r\n\r\nfunction buildWeixinTextClientId(): string {\r\n return `athlete-weixin:${crypto.randomUUID()}`;\r\n}\r\n\r\nfunction computeBackoffMs(attemptCount: number, config: WeixinConfig[\"delivery\"]): number {\r\n const exponent = Math.max(0, Math.min(attemptCount - 1, config.maxRetries - 1));\r\n return Math.min(config.maxDelayMs, config.baseDelayMs * 2 ** exponent);\r\n}\r\n\r\nfunction isContextTokenDeliveryFailure(error: unknown): boolean {\r\n if (error instanceof WeixinContextTokenDeliveryError) {\r\n return true;\r\n }\r\n\r\n if (\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"name\" in error &&\r\n String((error as { name?: unknown }).name) === \"NoContextTokenError\"\r\n ) {\r\n return true;\r\n }\r\n\r\n if (\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"errMsg\" in error &&\r\n /context[_ -]?token/i.test(String((error as { errMsg?: unknown }).errMsg))\r\n ) {\r\n return true;\r\n }\r\n\r\n return /context[_ -]?token/i.test(getErrorMessage(error));\r\n}\r\n\r\nfunction getErrorMessage(error: unknown): string {\r\n return error instanceof Error ? error.message : String(error);\r\n}\r\n","export interface WeixinLogContext {\r\n peerKey?: string;\r\n userId?: string;\r\n sessionId?: string;\r\n inputKind?: \"text\" | \"image\" | \"video\" | \"file\" | \"voice\";\r\n fileName?: string;\r\n toolName?: string;\r\n detail?: string;\r\n}\r\n\r\nexport interface WeixinLogger {\r\n info(event: string, context?: WeixinLogContext): void;\r\n error(event: string, context?: WeixinLogContext): void;\r\n}\r\n\r\nexport function createConsoleWeixinLogger(): WeixinLogger {\r\n return {\r\n info(event, context) {\r\n console.log(formatWeixinLogLine(event, context));\r\n },\r\n error(event, context) {\r\n console.error(formatWeixinLogLine(event, context));\r\n },\r\n };\r\n}\r\n\r\nfunction formatWeixinLogLine(event: string, context: WeixinLogContext = {}): string {\r\n const fragments = [\"[weixin]\", event];\r\n if (context.userId) {\r\n fragments.push(`user=${context.userId}`);\r\n }\r\n if (context.peerKey) {\r\n fragments.push(`peer=${context.peerKey}`);\r\n }\r\n if (context.sessionId) {\r\n fragments.push(`session=${context.sessionId}`);\r\n }\r\n if (context.inputKind) {\r\n fragments.push(`input=${context.inputKind}`);\r\n }\r\n if (context.fileName) {\r\n fragments.push(`file=${context.fileName}`);\r\n }\r\n if (context.toolName) {\r\n fragments.push(`tool=${context.toolName}`);\r\n }\r\n if (context.detail) {\r\n fragments.push(context.detail);\r\n }\r\n return fragments.join(\" \");\r\n}\r\n","import type { WeixinClientLike } from \"./client.js\";\r\nimport type { WeixinRuntimeConfig } from \"./config.js\";\r\nimport type { WeixinSyncBufStoreLike } from \"./syncBufStore.js\";\r\nimport type { WeixinPollingBatch, WeixinPollingSourceLike } from \"./types.js\";\r\n\r\nexport class WeixinPollingSource implements WeixinPollingSourceLike {\r\n private loaded = false;\r\n private syncBuf: string | null = null;\r\n private timeoutMs: number;\r\n\r\n constructor(\r\n private readonly client: WeixinClientLike,\r\n private readonly syncBufStore: WeixinSyncBufStoreLike,\r\n private readonly config: WeixinRuntimeConfig,\r\n ) {\r\n this.timeoutMs = config.polling.timeoutMs;\r\n }\r\n\r\n async poll(signal?: AbortSignal): Promise<WeixinPollingBatch> {\r\n if (signal?.aborted) {\r\n return {\r\n messages: [],\r\n syncBuf: this.syncBuf,\r\n };\r\n }\r\n\r\n await this.ensureLoaded();\r\n const batch = await this.client.getUpdates(this.syncBuf, this.timeoutMs, signal);\r\n if (\r\n typeof batch.longPollingTimeoutMs === \"number\" &&\r\n Number.isFinite(batch.longPollingTimeoutMs) &&\r\n batch.longPollingTimeoutMs > 0\r\n ) {\r\n this.timeoutMs = Math.trunc(batch.longPollingTimeoutMs);\r\n }\r\n return batch;\r\n }\r\n\r\n async commit(syncBuf: string | null): Promise<void> {\r\n await this.ensureLoaded();\r\n if (!syncBuf) {\r\n return;\r\n }\r\n\r\n this.syncBuf = syncBuf;\r\n await this.syncBufStore.save(syncBuf);\r\n }\r\n\r\n private async ensureLoaded(): Promise<void> {\r\n if (this.loaded) {\r\n return;\r\n }\r\n\r\n this.syncBuf = await this.syncBufStore.load();\r\n this.loaded = true;\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport interface WeixinProcessLock {\r\n pidFilePath: string;\r\n release(): Promise<void>;\r\n}\r\n\r\nexport async function acquireWeixinProcessLock(options: {\r\n stateDir: string;\r\n processId?: number;\r\n isProcessAlive?: (processId: number) => Promise<boolean> | boolean;\r\n}): Promise<WeixinProcessLock> {\r\n const processId = options.processId ?? process.pid;\r\n const pidFilePath = path.join(options.stateDir, \"service.pid\");\r\n const isProcessAlive = options.isProcessAlive ?? defaultIsProcessAlive;\r\n\r\n await fs.mkdir(options.stateDir, { recursive: true });\r\n\r\n const existingPid = await readPidFile(pidFilePath);\r\n if (existingPid && existingPid !== processId && await isProcessAlive(existingPid)) {\r\n throw new Error(`Weixin service already running with PID ${existingPid}. Stop the existing process before starting a new one.`);\r\n }\r\n\r\n await fs.writeFile(pidFilePath, `${processId}\\n`, \"utf8\");\r\n\r\n return {\r\n pidFilePath,\r\n async release() {\r\n const currentPid = await readPidFile(pidFilePath);\r\n if (currentPid !== processId) {\r\n return;\r\n }\r\n\r\n await fs.rm(pidFilePath, { force: true });\r\n },\r\n };\r\n}\r\n\r\nasync function readPidFile(filePath: string): Promise<number | null> {\r\n try {\r\n const raw = await fs.readFile(filePath, \"utf8\");\r\n const parsed = Number.parseInt(raw.trim(), 10);\r\n return Number.isFinite(parsed) && parsed > 0 ? parsed : null;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return null;\r\n }\r\n throw error;\r\n }\r\n}\r\n\r\nasync function defaultIsProcessAlive(targetPid: number): Promise<boolean> {\r\n if (!Number.isFinite(targetPid) || targetPid <= 0) {\r\n return false;\r\n }\r\n\r\n try {\r\n process.kill(targetPid, 0);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface WeixinSessionBinding {\r\n peerKey: string;\r\n userId: string;\r\n sessionId: string;\r\n cwd: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface WeixinSessionMapStoreLike {\r\n get(peerKey: string): Promise<WeixinSessionBinding | null>;\r\n set(binding: WeixinSessionBinding): Promise<void>;\r\n delete(peerKey: string): Promise<void>;\r\n list(): Promise<WeixinSessionBinding[]>;\r\n}\r\n\r\nexport class FileWeixinSessionMapStore implements WeixinSessionMapStoreLike {\r\n private operationTail = Promise.resolve();\r\n\r\n constructor(private readonly filePath: string) {}\r\n\r\n async get(peerKey: string): Promise<WeixinSessionBinding | null> {\r\n return this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n return bindings.find((binding) => binding.peerKey === peerKey) ?? null;\r\n });\r\n }\r\n\r\n async set(binding: WeixinSessionBinding): Promise<void> {\r\n await this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n const next = bindings.filter((entry) => entry.peerKey !== binding.peerKey);\r\n next.push(binding);\r\n next.sort((left, right) => left.peerKey.localeCompare(right.peerKey));\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async delete(peerKey: string): Promise<void> {\r\n await this.withLock(async () => {\r\n const bindings = await this.readAll();\r\n const next = bindings.filter((entry) => entry.peerKey !== peerKey);\r\n if (next.length === bindings.length) {\r\n return;\r\n }\r\n\r\n await this.writeAll(next);\r\n });\r\n }\r\n\r\n async list(): Promise<WeixinSessionBinding[]> {\r\n return this.withLock(async () => this.readAll());\r\n }\r\n\r\n private async readAll(): Promise<WeixinSessionBinding[]> {\r\n const payload = await readJsonFile<{ bindings?: WeixinSessionBinding[] } | null>(this.filePath, null);\r\n return Array.isArray(payload?.bindings) ? payload.bindings : [];\r\n }\r\n\r\n private async writeAll(bindings: WeixinSessionBinding[]): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n bindings,\r\n });\r\n }\r\n\r\n private async withLock<T>(operation: () => Promise<T>): Promise<T> {\r\n const previous = this.operationTail;\r\n let release!: () => void;\r\n this.operationTail = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n\r\n await previous.catch(() => undefined);\r\n try {\r\n return await operation();\r\n } finally {\r\n release();\r\n }\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport type { RunTurnResult } from \"../agent/types.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { PerPeerCommandQueue } from \"./commandQueue.js\";\r\nimport { FileWeixinAttachmentStore, type WeixinAttachmentStoreLike } from \"./attachmentStore.js\";\r\nimport type { WeixinClientLike } from \"./client.js\";\r\nimport type { WeixinContextTokenStoreLike } from \"./contextTokenStore.js\";\r\nimport type { WeixinDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport { createConsoleWeixinLogger, type WeixinLogger } from \"./logger.js\";\r\nimport { chunkWeixinMessage } from \"./messageChunking.js\";\r\nimport { classifyWeixinMessage } from \"./messageClassifier.js\";\r\nimport { WeixinPollingSource } from \"./polling.js\";\r\nimport type { WeixinSessionMapStoreLike } from \"./sessionMapStore.js\";\r\nimport type { WeixinSyncBufStoreLike } from \"./syncBufStore.js\";\r\nimport { runWeixinTurn, type WeixinActiveTurn } from \"./turnRunner.js\";\r\nimport type { WeixinPollingSourceLike, WeixinPrivateTextMessage, WeixinRawMessage } from \"./types.js\";\r\nimport { packageWeixinVisibleReply } from \"./visibleReplyPackaging.js\";\r\n\r\nexport interface WeixinServiceOptions {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n client: WeixinClientLike;\r\n sessionStore: SessionStoreLike & {\r\n load(id: string): Promise<SessionRecord>;\r\n };\r\n sessionMapStore: WeixinSessionMapStoreLike;\r\n syncBufStore: WeixinSyncBufStoreLike;\r\n contextTokenStore: WeixinContextTokenStoreLike;\r\n deliveryQueue: WeixinDeliveryQueue;\r\n attachmentStore?: WeixinAttachmentStoreLike;\r\n commandQueue?: PerPeerCommandQueue;\r\n runTurn?: (options: ManagedTurnOptions) => Promise<RunTurnResult>;\r\n pollingSource?: WeixinPollingSourceLike;\r\n logger?: WeixinLogger;\r\n sleep?: (ms: number) => Promise<void>;\r\n}\r\n\r\nexport class WeixinService {\r\n private readonly pollingSource: WeixinPollingSourceLike;\r\n private readonly commandQueue: PerPeerCommandQueue;\r\n private readonly attachmentStore: WeixinAttachmentStoreLike;\r\n private readonly logger: WeixinLogger;\r\n private readonly inFlightTasks = new Set<Promise<void>>();\r\n private readonly activeTurns = new Map<string, WeixinActiveTurn>();\r\n private readonly pendingStopRequests = new Set<string>();\r\n private readonly pendingBatchCommits: Array<{\r\n syncBuf: string | null;\r\n messageKeys: string[];\r\n settled: boolean;\r\n error: unknown;\r\n }> = [];\r\n private readonly pendingMessageKeys = new Set<string>();\r\n private readonly queuedTurnCounts = new Map<string, number>();\r\n private stopped = false;\r\n\r\n constructor(private readonly options: WeixinServiceOptions) {\r\n this.commandQueue = options.commandQueue ?? new PerPeerCommandQueue();\r\n this.pollingSource =\r\n options.pollingSource ??\r\n new WeixinPollingSource(options.client, options.syncBufStore, options.config.weixin);\r\n this.attachmentStore =\r\n options.attachmentStore ??\r\n new FileWeixinAttachmentStore(\r\n options.config.weixin.attachmentStoreFile ?? path.join(options.config.weixin.stateDir, \"attachments.json\"),\r\n );\r\n this.logger = options.logger ?? createConsoleWeixinLogger();\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n this.abortAllActiveTurns(\"Weixin service stopping.\");\r\n }\r\n\r\n async run(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n this.logger.info(\"service online\", {\r\n detail: `state=${this.options.config.weixin.stateDir}`,\r\n });\r\n\r\n try {\r\n while (!this.stopped && !signal?.aborted) {\r\n try {\r\n await this.runPollIteration(signal);\r\n } catch (error) {\r\n if (signal?.aborted) {\r\n break;\r\n }\r\n\r\n this.logger.error(\"polling failure\", {\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n await this.sleep(this.options.config.weixin.polling.retryBackoffMs);\r\n }\r\n }\r\n } finally {\r\n await this.waitForIdle();\r\n }\r\n }\r\n\r\n async runOnce(signal?: AbortSignal): Promise<void> {\r\n await this.runCommittedIteration(signal);\r\n }\r\n\r\n private async runCommittedIteration(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n await this.options.deliveryQueue.flushDue();\r\n\r\n const batch = await this.pollingSource.poll(signal);\r\n const turnTasks: Promise<void>[] = [];\r\n for (const message of batch.messages) {\r\n const { task } = await this.processMessage(message);\r\n if (task) {\r\n turnTasks.push(task);\r\n }\r\n }\r\n if (turnTasks.length > 0) {\r\n await Promise.all(turnTasks);\r\n }\r\n if (batch.syncBuf) {\r\n await this.options.syncBufStore.save(batch.syncBuf);\r\n }\r\n await this.pollingSource.commit(batch.syncBuf);\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n private async runPollIteration(signal?: AbortSignal): Promise<void> {\r\n await this.ensureStateDirectory();\r\n await this.options.deliveryQueue.flushDue();\r\n\r\n const batch = await this.pollingSource.poll(signal);\r\n const turnTasks: Promise<void>[] = [];\r\n const messageKeys: string[] = [];\r\n\r\n for (const message of batch.messages) {\r\n const messageKey = getWeixinMessageKey(message);\r\n if (this.pendingMessageKeys.has(messageKey)) {\r\n continue;\r\n }\r\n\r\n this.pendingMessageKeys.add(messageKey);\r\n messageKeys.push(messageKey);\r\n\r\n const { task } = await this.processMessage(message);\r\n if (task) {\r\n turnTasks.push(task);\r\n }\r\n }\r\n\r\n this.queuePendingBatchCommit(batch.syncBuf, messageKeys, turnTasks);\r\n await this.drainPendingBatchCommits();\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n async waitForIdle(): Promise<void> {\r\n while (this.inFlightTasks.size > 0) {\r\n await Promise.allSettled([...this.inFlightTasks]);\r\n }\r\n }\r\n\r\n private async processMessage(message: WeixinRawMessage): Promise<{\r\n task: Promise<void> | null;\r\n }> {\r\n const classified = classifyWeixinMessage(message, {\r\n allowedUserIds: this.options.config.weixin.allowedUserIds,\r\n });\r\n\r\n if (classified.kind === \"ignore\") {\r\n return { task: null };\r\n }\r\n\r\n if (classified.kind === \"outbound_text_echo\") {\r\n return { task: null };\r\n }\r\n\r\n await this.captureContextToken(classified.peerKey, classified.userId, classified.contextToken);\r\n\r\n if (classified.kind === \"private_text_message\" && isStopCommand(classified.text)) {\r\n await this.handleStopCommand(classified);\r\n return { task: null };\r\n }\r\n\r\n this.logger.info(\"received inbound message\", {\r\n peerKey: classified.peerKey,\r\n userId: classified.userId,\r\n inputKind: classified.kind === \"private_text_message\" ? \"text\" : classified.mediaKind,\r\n fileName: classified.kind === \"private_file_message\" ? classified.fileName : undefined,\r\n });\r\n\r\n this.incrementQueuedTurns(classified.peerKey);\r\n const task = this.commandQueue.enqueue(classified.peerKey, async () => {\r\n await runWeixinTurn({\r\n cwd: this.options.cwd,\r\n config: this.options.config,\r\n client: this.options.client,\r\n sessionStore: this.options.sessionStore,\r\n sessionMapStore: this.options.sessionMapStore,\r\n attachmentStore: this.attachmentStore,\r\n deliveryQueue: this.options.deliveryQueue,\r\n logger: this.logger,\r\n message: classified,\r\n runTurn: this.options.runTurn,\r\n enqueueReply: (userId, text) => this.enqueueReply(userId, text),\r\n markQueuedTurnStarted: (peerKey) => this.decrementQueuedTurns(peerKey),\r\n consumePendingStop: (peerKey) => this.pendingStopRequests.delete(peerKey),\r\n onActiveTurnStart: (peerKey, activeTurn) => {\r\n this.activeTurns.set(peerKey, activeTurn);\r\n },\r\n onActiveTurnEnd: (peerKey) => {\r\n this.activeTurns.delete(peerKey);\r\n },\r\n });\r\n });\r\n return {\r\n task: this.trackTask(task, {\r\n peerKey: classified.peerKey,\r\n userId: classified.userId,\r\n }),\r\n };\r\n }\r\n\r\n private async captureContextToken(peerKey: string, userId: string, contextToken: string): Promise<void> {\r\n if (!contextToken) {\r\n return;\r\n }\r\n\r\n await this.options.contextTokenStore.set({\r\n peerKey,\r\n userId,\r\n contextToken,\r\n status: \"active\",\r\n updatedAt: new Date().toISOString(),\r\n });\r\n }\r\n\r\n private async handleStopCommand(message: WeixinPrivateTextMessage): Promise<void> {\r\n const activeTurn = this.activeTurns.get(message.peerKey);\r\n if (activeTurn && !activeTurn.controller.signal.aborted) {\r\n activeTurn.controller.abort();\r\n await this.enqueueReply(message.userId, \"Stopping the current Weixin task. The service stays online for your next request.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop requested\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n sessionId: activeTurn.sessionId,\r\n });\r\n return;\r\n }\r\n\r\n if (this.getQueuedTurnCount(message.peerKey) > 0) {\r\n this.pendingStopRequests.add(message.peerKey);\r\n await this.enqueueReply(message.userId, \"Stopping the current Weixin task. The service stays online for your next request.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop armed for queued turn\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n });\r\n return;\r\n }\r\n\r\n await this.enqueueReply(message.userId, \"No Weixin task is running right now.\");\r\n await this.options.deliveryQueue.flushDue();\r\n this.logger.info(\"stop requested with no active turn\", {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n });\r\n }\r\n\r\n private async enqueueReply(userId: string, text: string): Promise<void> {\r\n if (!text) {\r\n return;\r\n }\r\n\r\n const peerKey = `weixin:private:${userId}`;\r\n const payload = await packageWeixinVisibleReply({\r\n stateDir: this.options.config.weixin.stateDir,\r\n text,\r\n });\r\n\r\n if (payload.kind === \"file\") {\r\n await this.options.deliveryQueue.enqueueFile({\r\n peerKey,\r\n userId,\r\n filePath: payload.filePath,\r\n fileName: payload.fileName,\r\n });\r\n this.logger.info(\"queued file reply\", {\r\n peerKey,\r\n userId,\r\n fileName: payload.fileName,\r\n detail: summarizeText(text),\r\n });\r\n await this.options.deliveryQueue.flushDue();\r\n return;\r\n }\r\n\r\n for (const chunk of chunkWeixinMessage(payload.text, this.options.config.weixin.messageChunkChars)) {\r\n await this.options.deliveryQueue.enqueueText({\r\n peerKey,\r\n userId,\r\n text: chunk,\r\n });\r\n this.logger.info(\"queued text reply\", {\r\n peerKey,\r\n userId,\r\n detail: summarizeText(chunk),\r\n });\r\n }\r\n\r\n await this.options.deliveryQueue.flushDue();\r\n }\r\n\r\n private async ensureStateDirectory(): Promise<void> {\r\n await fs.mkdir(this.options.config.weixin.stateDir, { recursive: true });\r\n }\r\n\r\n private trackTask(\r\n task: Promise<void>,\r\n context: {\r\n peerKey: string;\r\n userId: string;\r\n },\r\n ): Promise<void> {\r\n const tracked = task\r\n .catch((error) => {\r\n this.logger.error(\"background task failure\", {\r\n ...context,\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n })\r\n .finally(async () => {\r\n this.inFlightTasks.delete(tracked);\r\n try {\r\n await this.options.deliveryQueue.flushDue();\r\n } catch (error) {\r\n this.logger.error(\"delivery flush failure\", {\r\n ...context,\r\n detail: error instanceof Error ? error.message : String(error),\r\n });\r\n throw error;\r\n }\r\n });\r\n this.inFlightTasks.add(tracked);\r\n return tracked;\r\n }\r\n\r\n private abortAllActiveTurns(message: string): void {\r\n for (const activeTurn of this.activeTurns.values()) {\r\n if (!activeTurn.controller.signal.aborted) {\r\n activeTurn.controller.abort(message);\r\n }\r\n }\r\n }\r\n\r\n private async sleep(ms: number): Promise<void> {\r\n if (!Number.isFinite(ms) || ms <= 0) {\r\n return;\r\n }\r\n\r\n if (this.options.sleep) {\r\n await this.options.sleep(ms);\r\n return;\r\n }\r\n\r\n await new Promise((resolve) => setTimeout(resolve, ms));\r\n }\r\n\r\n private incrementQueuedTurns(peerKey: string): void {\r\n this.queuedTurnCounts.set(peerKey, this.getQueuedTurnCount(peerKey) + 1);\r\n }\r\n\r\n private decrementQueuedTurns(peerKey: string): void {\r\n const nextCount = Math.max(0, this.getQueuedTurnCount(peerKey) - 1);\r\n if (nextCount === 0) {\r\n this.queuedTurnCounts.delete(peerKey);\r\n return;\r\n }\r\n\r\n this.queuedTurnCounts.set(peerKey, nextCount);\r\n }\r\n\r\n private getQueuedTurnCount(peerKey: string): number {\r\n return this.queuedTurnCounts.get(peerKey) ?? 0;\r\n }\r\n\r\n private queuePendingBatchCommit(\r\n syncBuf: string | null,\r\n messageKeys: string[],\r\n tasks: Promise<void>[],\r\n ): void {\r\n const entry = {\r\n syncBuf,\r\n messageKeys,\r\n settled: false,\r\n error: null as unknown,\r\n };\r\n\r\n Promise.all(tasks)\r\n .then(() => {\r\n entry.settled = true;\r\n })\r\n .catch((error) => {\r\n entry.error = error;\r\n entry.settled = true;\r\n });\r\n\r\n this.pendingBatchCommits.push(entry);\r\n }\r\n\r\n private async drainPendingBatchCommits(): Promise<void> {\r\n while (this.pendingBatchCommits.length > 0) {\r\n const next = this.pendingBatchCommits[0]!;\r\n if (!next.settled) {\r\n return;\r\n }\r\n\r\n if (next.error) {\r\n throw next.error;\r\n }\r\n\r\n if (next.syncBuf) {\r\n await this.options.syncBufStore.save(next.syncBuf);\r\n }\r\n await this.pollingSource.commit(next.syncBuf);\r\n this.pendingBatchCommits.shift();\r\n\r\n for (const messageKey of next.messageKeys) {\r\n this.pendingMessageKeys.delete(messageKey);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction isStopCommand(input: string): boolean {\r\n return input.trim().toLowerCase() === \"/stop\";\r\n}\r\n\r\nfunction summarizeText(value: string, maxChars = 100): string {\r\n const normalized = value.replace(/\\s+/g, \" \").trim();\r\n if (!normalized) {\r\n return \"empty\";\r\n }\r\n\r\n return normalized.length <= maxChars ? normalized : `${normalized.slice(0, maxChars - 3)}...`;\r\n}\r\n\r\nfunction getWeixinMessageKey(message: WeixinRawMessage): string {\r\n return `${message.seq}:${message.message_id}`;\r\n}\r\n","export class PerPeerCommandQueue {\r\n private readonly tails = new Map<string, Promise<void>>();\r\n\r\n async enqueue<T>(peerKey: string, task: () => Promise<T> | T): Promise<T> {\r\n const previous = this.tails.get(peerKey) ?? Promise.resolve();\r\n let release!: () => void;\r\n const current = new Promise<void>((resolve) => {\r\n release = resolve;\r\n });\r\n const tail = previous.catch(() => undefined).then(() => current);\r\n this.tails.set(peerKey, tail);\r\n\r\n await previous.catch(() => undefined);\r\n\r\n try {\r\n return await task();\r\n } finally {\r\n release();\r\n if (this.tails.get(peerKey) === tail) {\r\n this.tails.delete(peerKey);\r\n }\r\n }\r\n }\r\n}\r\n","export function chunkWeixinMessage(text: string, maxChars = 4_096): string[] {\r\n if (!text) {\r\n return [];\r\n }\r\n\r\n const limit = Math.max(1, Math.trunc(maxChars));\r\n if (Buffer.byteLength(text, \"utf8\") <= limit) {\r\n return [text];\r\n }\r\n\r\n const chunks: string[] = [];\r\n let remaining = text;\r\n\r\n while (Buffer.byteLength(remaining, \"utf8\") > limit) {\r\n const cut = findCutPoint(remaining, limit);\r\n chunks.push(remaining.slice(0, cut));\r\n remaining = remaining.slice(cut);\r\n }\r\n\r\n if (remaining) {\r\n chunks.push(remaining);\r\n }\r\n\r\n return chunks;\r\n}\r\n\r\nfunction findCutPoint(text: string, limit: number): number {\r\n let candidate = 0;\r\n let usedBytes = 0;\r\n\r\n for (const char of text) {\r\n const nextBytes = Buffer.byteLength(char, \"utf8\");\r\n if (usedBytes + nextBytes > limit) {\r\n break;\r\n }\r\n\r\n usedBytes += nextBytes;\r\n candidate += char.length;\r\n }\r\n\r\n const head = text.slice(0, candidate);\r\n for (const separator of [\"\\n\\n\", \"\\n\", \" \"]) {\r\n const cut = head.lastIndexOf(separator);\r\n if (cut > 0) {\r\n return cut + separator.length;\r\n }\r\n }\r\n\r\n return candidate > 0 ? candidate : 1;\r\n}\r\n","import type {\r\n WeixinClassifiedMessage,\r\n WeixinOutboundTextEchoMessage,\r\n WeixinPrivateFileMessage,\r\n WeixinPrivateImageMessage,\r\n WeixinPrivateTextMessage,\r\n WeixinPrivateVideoMessage,\r\n WeixinPrivateVoiceMessage,\r\n WeixinRawMessage,\r\n} from \"./types.js\";\r\n\r\nconst MESSAGE_TYPE_USER = 1;\r\nconst MESSAGE_TYPE_BOT = 2;\r\nconst ITEM_TYPE_TEXT = 1;\r\nconst ITEM_TYPE_IMAGE = 2;\r\nconst ITEM_TYPE_VOICE = 3;\r\nconst ITEM_TYPE_FILE = 4;\r\nconst ITEM_TYPE_VIDEO = 5;\r\n\r\nexport function classifyWeixinMessage(\r\n message: WeixinRawMessage,\r\n options: {\r\n allowedUserIds: string[];\r\n },\r\n): WeixinClassifiedMessage {\r\n const userId = String(message.from_user_id ?? \"\").trim();\r\n const recipientUserId = String(message.to_user_id ?? \"\").trim();\r\n const groupId = String(message.group_id ?? \"\").trim();\r\n const contextToken = String(message.context_token ?? \"\").trim();\r\n const itemList = Array.isArray(message.item_list) ? message.item_list : [];\r\n const messageType = toInteger(message.message_type);\r\n const text = extractText(itemList);\r\n\r\n if (groupId) {\r\n return {\r\n kind: \"ignore\",\r\n reason: \"group_chat_unsupported\",\r\n userId: userId || undefined,\r\n groupId,\r\n raw: message,\r\n };\r\n }\r\n\r\n if (messageType === MESSAGE_TYPE_BOT) {\r\n const clientId = String(message.client_id ?? \"\").trim();\r\n if (recipientUserId && options.allowedUserIds.includes(recipientUserId) && clientId && text) {\r\n const classified: WeixinOutboundTextEchoMessage = {\r\n kind: \"outbound_text_echo\",\r\n peerKey: `weixin:private:${recipientUserId}`,\r\n userId: recipientUserId,\r\n messageId: toInteger(message.message_id),\r\n seq: toInteger(message.seq),\r\n clientId,\r\n text,\r\n raw: message,\r\n };\r\n return classified;\r\n }\r\n\r\n return {\r\n kind: \"ignore\",\r\n reason: \"unsupported_message\",\r\n userId: recipientUserId || userId || undefined,\r\n raw: message,\r\n };\r\n }\r\n\r\n if (!userId || !options.allowedUserIds.includes(userId)) {\r\n return {\r\n kind: \"ignore\",\r\n reason: \"unauthorized_user\",\r\n userId: userId || undefined,\r\n raw: message,\r\n };\r\n }\r\n\r\n if (messageType !== 0 && messageType !== MESSAGE_TYPE_USER) {\r\n return {\r\n kind: \"ignore\",\r\n reason: \"unsupported_message\",\r\n userId,\r\n raw: message,\r\n };\r\n }\r\n\r\n const base = {\r\n peerKey: `weixin:private:${userId}`,\r\n userId,\r\n messageId: toInteger(message.message_id),\r\n seq: toInteger(message.seq),\r\n contextToken,\r\n text,\r\n raw: message,\r\n };\r\n\r\n const imageItem = itemList.find((item) => item.type === ITEM_TYPE_IMAGE && item.image_item?.media);\r\n if (imageItem?.image_item?.media) {\r\n const classified: WeixinPrivateImageMessage = {\r\n ...base,\r\n kind: \"private_image_message\",\r\n mediaKind: \"image\",\r\n media: imageItem.image_item.media,\r\n };\r\n return classified;\r\n }\r\n\r\n const fileItem = itemList.find((item) => item.type === ITEM_TYPE_FILE && item.file_item?.media);\r\n if (fileItem?.file_item?.media) {\r\n const classified: WeixinPrivateFileMessage = {\r\n ...base,\r\n kind: \"private_file_message\",\r\n mediaKind: \"file\",\r\n media: fileItem.file_item.media,\r\n fileName: normalizeOptionalString(fileItem.file_item.file_name),\r\n fileSize: parseOptionalInteger(fileItem.file_item.len),\r\n };\r\n return classified;\r\n }\r\n\r\n const videoItem = itemList.find((item) => item.type === ITEM_TYPE_VIDEO && item.video_item?.media);\r\n if (videoItem?.video_item?.media) {\r\n const classified: WeixinPrivateVideoMessage = {\r\n ...base,\r\n kind: \"private_video_message\",\r\n mediaKind: \"video\",\r\n media: videoItem.video_item.media,\r\n };\r\n return classified;\r\n }\r\n\r\n const voiceItem = itemList.find((item) => item.type === ITEM_TYPE_VOICE && item.voice_item?.media);\r\n if (voiceItem?.voice_item?.media) {\r\n const classified: WeixinPrivateVoiceMessage = {\r\n ...base,\r\n kind: \"private_voice_message\",\r\n mediaKind: \"voice\",\r\n media: voiceItem.voice_item.media,\r\n voiceTranscript: normalizeOptionalString(voiceItem.voice_item.text),\r\n sampleRate: toPositiveInteger(voiceItem.voice_item.sample_rate),\r\n voice: voiceItem.voice_item,\r\n };\r\n return classified;\r\n }\r\n\r\n if (base.text) {\r\n const classified: WeixinPrivateTextMessage = {\r\n ...base,\r\n kind: \"private_text_message\",\r\n };\r\n return classified;\r\n }\r\n\r\n if (itemList.some((item) => item.type === ITEM_TYPE_TEXT || item.type === ITEM_TYPE_VOICE)) {\r\n return {\r\n kind: \"ignore\",\r\n reason: \"empty_message\",\r\n userId,\r\n raw: message,\r\n };\r\n }\r\n\r\n return {\r\n kind: \"ignore\",\r\n reason: itemList.length > 0 ? \"unsupported_message\" : \"empty_message\",\r\n userId,\r\n raw: message,\r\n };\r\n}\r\n\r\nfunction extractText(itemList: ReadonlyArray<{ type?: number; text_item?: { text?: string }; voice_item?: { text?: string } }>): string {\r\n for (const item of itemList) {\r\n if (item.type === ITEM_TYPE_TEXT) {\r\n const text = normalizeOptionalString(item.text_item?.text);\r\n if (text) {\r\n return text;\r\n }\r\n }\r\n }\r\n\r\n for (const item of itemList) {\r\n if (item.type === ITEM_TYPE_VOICE) {\r\n const transcript = normalizeOptionalString(item.voice_item?.text);\r\n if (transcript) {\r\n return transcript;\r\n }\r\n }\r\n }\r\n\r\n return \"\";\r\n}\r\n\r\nfunction normalizeOptionalString(value: unknown): string | undefined {\r\n if (typeof value !== \"string\") {\r\n return undefined;\r\n }\r\n\r\n const normalized = value.trim();\r\n return normalized || undefined;\r\n}\r\n\r\nfunction parseOptionalInteger(value: unknown): number | undefined {\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n return Math.trunc(value);\r\n }\r\n if (typeof value === \"string\") {\r\n const parsed = Number.parseInt(value.trim(), 10);\r\n return Number.isFinite(parsed) ? parsed : undefined;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction toInteger(value: unknown): number {\r\n if (typeof value === \"number\" && Number.isFinite(value)) {\r\n return Math.trunc(value);\r\n }\r\n return 0;\r\n}\r\n\r\nfunction toPositiveInteger(value: unknown): number | undefined {\r\n const parsed = parseOptionalInteger(value);\r\n return typeof parsed === \"number\" && parsed > 0 ? parsed : undefined;\r\n}\r\n","import { AgentTurnError, getErrorMessage } from \"../agent/errors.js\";\r\nimport { runManagedAgentTurn } from \"../agent/managedTurn.js\";\r\nimport type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { SessionStoreLike } from \"../agent/sessionStore.js\";\r\nimport type { RunTurnResult } from \"../agent/types.js\";\r\nimport { createRuntimeToolRegistry } from \"../tools/runtimeRegistry.js\";\r\nimport type { RuntimeConfig, SessionRecord } from \"../types.js\";\r\nimport { isAbortError } from \"../utils/abort.js\";\r\nimport type { WeixinAttachmentStoreLike } from \"./attachmentStore.js\";\r\nimport { WEIXIN_TYPING_STATUS, type WeixinClientLike } from \"./client.js\";\r\nimport type { WeixinDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport {\r\n buildWeixinMediaTurnInput,\r\n buildWeixinTextTurnInput,\r\n downloadWeixinAttachment,\r\n} from \"./inboundFiles.js\";\r\nimport { handleWeixinLocalCommand } from \"./localCommands.js\";\r\nimport type { WeixinLogger } from \"./logger.js\";\r\nimport { WeixinOutputPort } from \"./outputPort.js\";\r\nimport { createWeixinSendFileTool } from \"./sendFileTool.js\";\r\nimport type { WeixinSessionBinding, WeixinSessionMapStoreLike } from \"./sessionMapStore.js\";\r\nimport { WeixinTurnDisplay } from \"./turnDisplay.js\";\r\nimport { createLoggedWeixinCallbacks } from \"./turnLogging.js\";\r\nimport type { WeixinPrivateMessage } from \"./types.js\";\r\n\r\nexport interface WeixinActiveTurn {\r\n controller: AbortController;\r\n userId: string;\r\n sessionId: string;\r\n waitForVisibleMessages: () => Promise<void>;\r\n}\r\n\r\nexport async function runWeixinTurn(options: {\r\n cwd: string;\r\n config: RuntimeConfig;\r\n client: WeixinClientLike;\r\n sessionStore: SessionStoreLike & { load(id: string): Promise<SessionRecord> };\r\n sessionMapStore: WeixinSessionMapStoreLike;\r\n attachmentStore: WeixinAttachmentStoreLike;\r\n deliveryQueue: WeixinDeliveryQueue;\r\n logger: WeixinLogger;\r\n message: WeixinPrivateMessage;\r\n runTurn?: (input: ManagedTurnOptions) => Promise<RunTurnResult>;\r\n enqueueReply: (userId: string, text: string) => Promise<void>;\r\n markQueuedTurnStarted: (peerKey: string) => void;\r\n consumePendingStop: (peerKey: string) => boolean;\r\n onActiveTurnStart: (peerKey: string, activeTurn: WeixinActiveTurn) => void;\r\n onActiveTurnEnd: (peerKey: string) => void;\r\n}): Promise<void> {\r\n let binding = await getOrCreateBinding(options.message, options);\r\n let session = await loadBoundSession(binding, options);\r\n const output = new WeixinOutputPort({\r\n userId: options.message.userId,\r\n messageChunkChars: options.config.weixin.messageChunkChars,\r\n enqueueReply: async (userId, text) => options.enqueueReply(userId, text),\r\n });\r\n options.logger.info(\"session ready\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n });\r\n\r\n try {\r\n if (options.message.kind === \"private_text_message\") {\r\n const localCommandResult = await handleWeixinLocalCommand(\r\n options.message.text,\r\n {\r\n cwd: options.cwd,\r\n session,\r\n config: options.config,\r\n },\r\n output,\r\n );\r\n\r\n if (localCommandResult === \"handled\") {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n return;\r\n }\r\n\r\n if (localCommandResult === \"multiline\") {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n output.warn(\"Weixin does not support interactive multiline mode. Send the full message directly.\");\r\n return;\r\n }\r\n }\r\n\r\n let typingConfigPromise: Promise<string | null> | null = null;\r\n const resolveTypingTicket = async (): Promise<string | null> => {\r\n typingConfigPromise ??= options.client.getTypingConfig(\r\n options.message.userId,\r\n options.message.contextToken,\r\n )\r\n .then((result) => result.typingTicket)\r\n .catch(() => null);\r\n return typingConfigPromise;\r\n };\r\n const display = new WeixinTurnDisplay({\r\n userId: options.message.userId,\r\n sendTyping: async (userId) => {\r\n const typingTicket = await resolveTypingTicket();\r\n if (!typingTicket) {\r\n return;\r\n }\r\n\r\n await options.client.sendTyping(userId, typingTicket, WEIXIN_TYPING_STATUS);\r\n },\r\n enqueueVisibleMessage: async (target, text) => options.enqueueReply(target.userId, text),\r\n typingIntervalMs: options.config.weixin.typingIntervalMs,\r\n });\r\n const controller = new AbortController();\r\n const shouldAbortOnStart = options.consumePendingStop(options.message.peerKey);\r\n options.onActiveTurnStart(options.message.peerKey, {\r\n controller,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n waitForVisibleMessages: async () => display.waitForDurableVisible(),\r\n });\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n\r\n const turnInput = await buildTurnInput(options.message, session.id, options);\r\n const callbacks = createLoggedWeixinCallbacks(display, options.logger, {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n });\r\n const toolRegistry = await createRuntimeToolRegistry(options.config, {\r\n includeTools: [\r\n createWeixinSendFileTool({\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n deliveryQueue: options.deliveryQueue,\r\n logger: options.logger,\r\n }),\r\n ],\r\n });\r\n\r\n try {\r\n if (shouldAbortOnStart) {\r\n queueMicrotask(() => {\r\n if (!controller.signal.aborted) {\r\n controller.abort();\r\n }\r\n });\r\n }\r\n\r\n options.logger.info(\"starting turn\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n inputKind: options.message.kind === \"private_text_message\" ? \"text\" : options.message.mediaKind,\r\n fileName: options.message.kind === \"private_file_message\" ? options.message.fileName : undefined,\r\n });\r\n const result = await (options.runTurn ?? runManagedAgentTurn)({\r\n input: turnInput,\r\n cwd: options.cwd,\r\n config: options.config,\r\n session,\r\n sessionStore: options.sessionStore,\r\n abortSignal: controller.signal,\r\n callbacks,\r\n toolRegistry,\r\n identity: {\r\n kind: \"lead\",\r\n name: \"lead\",\r\n },\r\n });\r\n session = result.session;\r\n if (result.paused && result.pauseReason) {\r\n output.warn(result.pauseReason);\r\n display.noteTerminalState();\r\n }\r\n options.logger.info(\"turn completed\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n detail: result.changedPaths.length > 0 ? `changed=${result.changedPaths.length}` : \"changed=0\",\r\n });\r\n } catch (error) {\r\n if (error instanceof AgentTurnError) {\r\n session = error.session;\r\n }\r\n\r\n if (isAbortError(error)) {\r\n display.noteTerminalState();\r\n output.warn(\"Turn interrupted. You can keep chatting.\");\r\n options.logger.info(\"turn stopped\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n });\r\n } else {\r\n display.noteTerminalState();\r\n output.error(getErrorMessage(error));\r\n output.info(\"The request failed, but the session is still alive. You can keep chatting.\");\r\n options.logger.error(\"turn failed\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n sessionId: session.id,\r\n detail: getErrorMessage(error),\r\n });\r\n }\r\n } finally {\r\n options.onActiveTurnEnd(options.message.peerKey);\r\n await display.flush();\r\n display.dispose();\r\n await toolRegistry.close?.().catch(() => undefined);\r\n }\r\n } finally {\r\n options.markQueuedTurnStarted(options.message.peerKey);\r\n binding = touchBinding(binding, session.id);\r\n await options.sessionMapStore.set(binding);\r\n await output.flush();\r\n }\r\n}\r\n\r\nasync function buildTurnInput(\r\n message: WeixinPrivateMessage,\r\n sessionId: string,\r\n options: {\r\n client: WeixinClientLike;\r\n cwd: string;\r\n config: RuntimeConfig;\r\n attachmentStore: WeixinAttachmentStoreLike;\r\n logger: WeixinLogger;\r\n },\r\n): Promise<string> {\r\n if (message.kind === \"private_text_message\") {\r\n const recentAttachments = await options.attachmentStore.listByPeer(message.peerKey, 5);\r\n return buildWeixinTextTurnInput(message.text, recentAttachments, options.cwd);\r\n }\r\n\r\n const attachment = await downloadWeixinAttachment({\r\n client: options.client,\r\n cwd: options.cwd,\r\n config: options.config.weixin,\r\n message,\r\n sessionId,\r\n logger: options.logger,\r\n });\r\n await options.attachmentStore.add(attachment);\r\n const recentAttachments = await options.attachmentStore.listByPeer(message.peerKey, 5);\r\n return buildWeixinMediaTurnInput(message, attachment, recentAttachments, options.cwd);\r\n}\r\n\r\nasync function getOrCreateBinding(\r\n message: WeixinPrivateMessage,\r\n options: {\r\n cwd: string;\r\n sessionStore: SessionStoreLike & { load(id: string): Promise<SessionRecord> };\r\n sessionMapStore: WeixinSessionMapStoreLike;\r\n },\r\n): Promise<WeixinSessionBinding> {\r\n const existing = await options.sessionMapStore.get(message.peerKey);\r\n if (existing) {\r\n return touchBinding(existing, existing.sessionId);\r\n }\r\n\r\n const session = await options.sessionStore.save(await options.sessionStore.create(options.cwd));\r\n const now = new Date().toISOString();\r\n const binding: WeixinSessionBinding = {\r\n peerKey: message.peerKey,\r\n userId: message.userId,\r\n sessionId: session.id,\r\n cwd: options.cwd,\r\n createdAt: now,\r\n updatedAt: now,\r\n };\r\n await options.sessionMapStore.set(binding);\r\n return binding;\r\n}\r\n\r\nasync function loadBoundSession(\r\n binding: WeixinSessionBinding,\r\n options: {\r\n cwd: string;\r\n sessionStore: SessionStoreLike & { load(id: string): Promise<SessionRecord> };\r\n sessionMapStore: WeixinSessionMapStoreLike;\r\n },\r\n): Promise<SessionRecord> {\r\n try {\r\n return await options.sessionStore.load(binding.sessionId);\r\n } catch {\r\n const session = await options.sessionStore.save(await options.sessionStore.create(options.cwd));\r\n const nextBinding = touchBinding(binding, session.id);\r\n await options.sessionMapStore.set(nextBinding);\r\n return session;\r\n }\r\n}\r\n\r\nfunction touchBinding(binding: WeixinSessionBinding, sessionId: string): WeixinSessionBinding {\r\n return {\r\n ...binding,\r\n sessionId,\r\n updatedAt: new Date().toISOString(),\r\n };\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { WeixinAttachmentRecord } from \"./attachmentStore.js\";\r\nimport type { WeixinClientLike } from \"./client.js\";\r\nimport type { WeixinRuntimeConfig } from \"./config.js\";\r\nimport type { WeixinLogger } from \"./logger.js\";\r\nimport type {\r\n WeixinPrivateFileMessage,\r\n WeixinPrivateImageMessage,\r\n WeixinPrivateMessage,\r\n WeixinPrivateVideoMessage,\r\n WeixinPrivateVoiceMessage,\r\n} from \"./types.js\";\r\n\r\nconst DEFAULT_MAX_DOWNLOAD_BYTES = 45 * 1024 * 1024;\r\n\r\nexport async function downloadWeixinAttachment(options: {\r\n client: WeixinClientLike;\r\n cwd: string;\r\n config: Pick<WeixinRuntimeConfig, \"stateDir\">;\r\n message: WeixinPrivateImageMessage | WeixinPrivateFileMessage | WeixinPrivateVideoMessage | WeixinPrivateVoiceMessage;\r\n sessionId: string;\r\n logger?: WeixinLogger;\r\n}): Promise<WeixinAttachmentRecord> {\r\n const bytes = options.message.kind === \"private_voice_message\"\r\n ? await options.client.downloadVoice({\r\n media: options.message.media,\r\n sample_rate: options.message.sampleRate,\r\n })\r\n : await options.client.downloadMedia(options.message.media);\r\n const maxDownloadBytes = readConfiguredDownloadLimit(options.config);\r\n if (bytes.byteLength > maxDownloadBytes) {\r\n throw new Error(\r\n `Weixin attachment too large to download: ${options.message.mediaKind} (${bytes.byteLength} bytes > ${maxDownloadBytes} bytes).`,\r\n );\r\n }\r\n\r\n const filesDir = path.join(options.config.stateDir, \"files\", sanitizePathSegment(options.message.peerKey));\r\n await fs.mkdir(filesDir, { recursive: true });\r\n const localFilePath = path.join(filesDir, buildAttachmentFileName(options.message));\r\n await fs.writeFile(localFilePath, bytes);\r\n\r\n const timestamp = new Date().toISOString();\r\n const record: WeixinAttachmentRecord = {\r\n id: `${options.message.peerKey}:${options.message.messageId}:${options.message.mediaKind}`,\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n messageId: options.message.messageId,\r\n seq: options.message.seq,\r\n sessionId: options.sessionId,\r\n mediaKind: options.message.mediaKind,\r\n localFilePath,\r\n fileName: readAttachmentFileName(options.message),\r\n fileSize: bytes.byteLength,\r\n text: options.message.text || undefined,\r\n contextToken: options.message.contextToken,\r\n createdAt: timestamp,\r\n updatedAt: timestamp,\r\n };\r\n if (options.message.kind === \"private_voice_message\" && options.message.voiceTranscript) {\r\n record.text = options.message.voiceTranscript;\r\n }\r\n\r\n options.logger?.info(\"downloaded inbound attachment\", {\r\n peerKey: options.message.peerKey,\r\n userId: options.message.userId,\r\n inputKind: options.message.mediaKind,\r\n fileName: record.fileName,\r\n detail: `path=${localFilePath}`,\r\n });\r\n return record;\r\n}\r\n\r\nexport function buildWeixinTextTurnInput(\r\n input: string,\r\n recentAttachments: WeixinAttachmentRecord[],\r\n cwd: string,\r\n): string {\r\n if (recentAttachments.length === 0) {\r\n return input;\r\n }\r\n\r\n return [\r\n input,\r\n \"\",\r\n \"[Weixin context]\",\r\n \"Recent attachments from this Weixin chat are available locally. Use them only if they are relevant to the current request.\",\r\n ...formatAttachmentLines(recentAttachments, cwd),\r\n ].join(\"\\n\");\r\n}\r\n\r\nexport function buildWeixinMediaTurnInput(\r\n message: WeixinPrivateMessage,\r\n attachment: WeixinAttachmentRecord,\r\n recentAttachments: WeixinAttachmentRecord[],\r\n cwd: string,\r\n): string {\r\n const instruction =\r\n message.text ||\r\n \"The user sent media in Weixin without extra instructions. Confirm receipt briefly, inspect it if useful, and ask what they want done next.\";\r\n\r\n return [\r\n instruction,\r\n \"\",\r\n \"[Weixin attachment]\",\r\n \"The user uploaded media in this Weixin private chat. It has already been downloaded locally and is available to the normal file/document tools.\",\r\n ...formatAttachmentLines([attachment], cwd),\r\n \"\",\r\n \"[Recent Weixin attachments]\",\r\n ...formatAttachmentLines(recentAttachments, cwd),\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction formatAttachmentLines(records: WeixinAttachmentRecord[], cwd: string): string[] {\r\n if (records.length === 0) {\r\n return [\"- none\"];\r\n }\r\n\r\n return records.map((record, index) => {\r\n const displayPath = toDisplayPath(record.localFilePath, cwd);\r\n const size = typeof record.fileSize === \"number\" ? ` (${record.fileSize} bytes)` : \"\";\r\n const extra = record.text ? `; note=${record.text}` : \"\";\r\n return `${index + 1}. ${record.fileName ?? path.basename(record.localFilePath)} -> ${displayPath}${size}${extra}`;\r\n });\r\n}\r\n\r\nfunction buildAttachmentFileName(\r\n message: WeixinPrivateImageMessage | WeixinPrivateFileMessage | WeixinPrivateVideoMessage | WeixinPrivateVoiceMessage,\r\n): string {\r\n const prefix = `${String(message.seq || message.messageId).padStart(8, \"0\")}-${message.mediaKind}`;\r\n if (message.kind === \"private_file_message\" && message.fileName) {\r\n return `${prefix}-${sanitizeFileName(message.fileName)}`;\r\n }\r\n if (message.kind === \"private_voice_message\") {\r\n return `${prefix}.wav`;\r\n }\r\n if (message.kind === \"private_video_message\") {\r\n return `${prefix}.mp4`;\r\n }\r\n return `${prefix}.bin`;\r\n}\r\n\r\nfunction readAttachmentFileName(\r\n message: WeixinPrivateImageMessage | WeixinPrivateFileMessage | WeixinPrivateVideoMessage | WeixinPrivateVoiceMessage,\r\n): string | undefined {\r\n if (message.kind === \"private_file_message\" && message.fileName) {\r\n return sanitizeFileName(message.fileName);\r\n }\r\n if (message.kind === \"private_voice_message\") {\r\n return `voice-${message.messageId}.wav`;\r\n }\r\n if (message.kind === \"private_video_message\") {\r\n return `video-${message.messageId}.mp4`;\r\n }\r\n if (message.kind === \"private_image_message\") {\r\n return `image-${message.messageId}.bin`;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction sanitizeFileName(fileName: string): string {\r\n const normalized = fileName.trim().replace(/[<>:\"/\\\\|?*\\u0000-\\u001f]+/g, \"-\");\r\n return normalized || \"weixin-upload.bin\";\r\n}\r\n\r\nfunction sanitizePathSegment(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\");\r\n}\r\n\r\nfunction toDisplayPath(targetPath: string, cwd: string): string {\r\n const relative = path.relative(cwd, targetPath);\r\n return !relative.startsWith(\"..\") && !path.isAbsolute(relative) ? relative : targetPath;\r\n}\r\n\r\nfunction readConfiguredDownloadLimit(config: unknown): number {\r\n const value = (config as { maxDownloadBytes?: number } | undefined)?.maxDownloadBytes;\r\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\r\n return Math.trunc(value);\r\n }\r\n return DEFAULT_MAX_DOWNLOAD_BYTES;\r\n}\r\n","export const WEIXIN_HELP_TEXT = [\r\n \"/help 查看 Weixin 使用说明\",\r\n \"/stop 停止当前正在执行的 Weixin 任务,服务不会退出\",\r\n \"/session 查看当前 Weixin 会话绑定的 session ID\",\r\n \"/config 查看当前运行配置\",\r\n \"/todos 查看当前 todo 状态\",\r\n \"/runtime 查看当前 session 运行摘要\",\r\n \"/tasks 查看任务板\",\r\n \"/team 查看队友状态\",\r\n \"/background 查看后台任务\",\r\n \"/worktrees 查看隔离工作区\",\r\n \"/inbox 查看 lead 收件箱\",\r\n \"/multi Weixin 不支持交互式多行模式,请直接发送完整消息\",\r\n \"\",\r\n \"媒体用法:\",\r\n \"- 直接把图片、视频、文件或语音发到私聊,Athlete 会下载并接入当前 session。\",\r\n \"- 你可以说“分析我刚发的文件”或“把 report.pdf 发回给我”。\",\r\n \"- 需要停止当前任务时,使用 /stop。\",\r\n \"\",\r\n \"提示:本地终端里的退出/重置命令不会在 Weixin 执行。\",\r\n].join(\"\\n\");\r\n\r\nexport const WEIXIN_BLOCKED_LOCAL_COMMAND_TEXT =\r\n \"本地终端的退出/重置命令不会在 Weixin 执行。Weixin 里请使用 /stop 停止当前任务。\";\r\n","import {\r\n handleLocalCommand as handleSharedLocalCommand,\r\n type LocalCommandContext,\r\n type LocalCommandResult,\r\n isExplicitExitCommand,\r\n} from \"../interaction/localCommands.js\";\r\nimport type { ShellOutputPort } from \"../interaction/shell.js\";\r\nimport { WEIXIN_BLOCKED_LOCAL_COMMAND_TEXT, WEIXIN_HELP_TEXT } from \"./helpText.zh.js\";\r\n\r\nconst RESET_COMMANDS = new Set([\"reset\", \"/reset\", \"重置\", \"/重置\"]);\r\nconst HELP_COMMANDS = new Set([\"/help\", \"/帮助\"]);\r\n\r\nexport async function handleWeixinLocalCommand(\r\n input: string,\r\n context: LocalCommandContext,\r\n output: ShellOutputPort,\r\n): Promise<LocalCommandResult> {\r\n const normalized = input.trim().toLowerCase();\r\n if (!normalized) {\r\n return \"handled\";\r\n }\r\n\r\n if (HELP_COMMANDS.has(normalized)) {\r\n output.plain(WEIXIN_HELP_TEXT);\r\n return \"handled\";\r\n }\r\n\r\n if (isExplicitExitCommand(normalized) || RESET_COMMANDS.has(normalized)) {\r\n output.warn(WEIXIN_BLOCKED_LOCAL_COMMAND_TEXT);\r\n return \"handled\";\r\n }\r\n\r\n return handleSharedLocalCommand(input, context, output);\r\n}\r\n","import type { ShellOutputPort } from \"../interaction/shell.js\";\r\nimport { chunkWeixinMessage } from \"./messageChunking.js\";\r\n\r\nexport class WeixinOutputPort implements ShellOutputPort {\r\n private readonly pending: Promise<unknown>[] = [];\r\n\r\n constructor(\r\n private readonly options: {\r\n userId: string;\r\n messageChunkChars: number;\r\n enqueueReply: (userId: string, text: string) => Promise<void>;\r\n },\r\n ) {}\r\n\r\n plain(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n info(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n warn(text: string): void {\r\n this.queue(`Warning: ${text}`);\r\n }\r\n\r\n error(text: string): void {\r\n this.queue(`Error: ${text}`);\r\n }\r\n\r\n dim(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n heading(text: string): void {\r\n this.queue(text);\r\n }\r\n\r\n tool(text: string): void {\r\n this.queue(`Tool: ${text}`);\r\n }\r\n\r\n interrupt(text: string): void {\r\n this.queue(`Interrupt: ${text}`);\r\n }\r\n\r\n async flush(): Promise<void> {\r\n if (this.pending.length === 0) {\r\n return;\r\n }\r\n\r\n const tasks = this.pending.splice(0, this.pending.length);\r\n await Promise.all(tasks);\r\n }\r\n\r\n private queue(text: string): void {\r\n for (const chunk of chunkWeixinMessage(text, this.options.messageChunkChars)) {\r\n this.pending.push(this.options.enqueueReply(this.options.userId, chunk));\r\n }\r\n }\r\n}\r\n","import fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nimport type { WeixinDeliveryQueue } from \"./deliveryQueue.js\";\r\nimport type { WeixinLogger } from \"./logger.js\";\r\nimport { assertPathAllowed } from \"../utils/fs.js\";\r\nimport { okResult, parseArgs, readString } from \"../tools/shared.js\";\r\nimport type { RegisteredTool } from \"../tools/types.js\";\r\n\r\nconst DEFAULT_MAX_UPLOAD_BYTES = 45 * 1024 * 1024;\r\nconst MAX_CAPTION_CHARS = 900;\r\n\r\nexport function createWeixinSendFileTool(options: {\r\n peerKey: string;\r\n userId: string;\r\n deliveryQueue: WeixinDeliveryQueue;\r\n logger?: WeixinLogger;\r\n}): RegisteredTool {\r\n return {\r\n definition: {\r\n type: \"function\",\r\n function: {\r\n name: \"weixin_send_file\",\r\n description:\r\n \"Send a local workspace image, video, or file back to the active Weixin private chat. The channel auto-routes supported media kinds and rejects unsupported voice output.\",\r\n parameters: {\r\n type: \"object\",\r\n properties: {\r\n path: {\r\n type: \"string\",\r\n description: \"Path to the local file that should be sent to Weixin.\",\r\n },\r\n file_name: {\r\n type: \"string\",\r\n description: \"Optional Weixin filename override for file deliveries.\",\r\n },\r\n caption: {\r\n type: \"string\",\r\n description: \"Optional short caption sent with the media.\",\r\n },\r\n },\r\n required: [\"path\"],\r\n additionalProperties: false,\r\n },\r\n },\r\n },\r\n async execute(rawArgs, context) {\r\n const args = parseArgs(rawArgs);\r\n const targetPath = readString(args.path, \"path\");\r\n const resolved = assertPathAllowed(targetPath, context.cwd, context.config);\r\n const stats = await fs.stat(resolved);\r\n\r\n if (!stats.isFile()) {\r\n throw new Error(`Only regular files can be sent to Weixin: ${resolved}`);\r\n }\r\n\r\n const maxUploadBytes = readConfiguredUploadLimit(context.config.weixin);\r\n if (stats.size > maxUploadBytes) {\r\n throw new Error(`File too large for Weixin delivery: ${resolved} (${stats.size} bytes > ${maxUploadBytes} bytes).`);\r\n }\r\n\r\n const fileName =\r\n typeof args.file_name === \"string\" && args.file_name.trim()\r\n ? args.file_name.trim()\r\n : path.basename(resolved);\r\n const caption = normalizeCaption(typeof args.caption === \"string\" ? args.caption : undefined);\r\n const mime = mimeFromFilename(fileName) || mimeFromFilename(path.basename(resolved));\r\n\r\n if (mime && mime.startsWith(\"audio/\")) {\r\n throw new Error(\"Weixin outbound voice/audio is not supported by Athlete because the upstream SDK does not expose a stable voice-send API.\");\r\n }\r\n\r\n if (mime && isImageMime(mime)) {\r\n await options.deliveryQueue.enqueueImage({\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n filePath: resolved,\r\n caption,\r\n });\r\n await options.deliveryQueue.flushDue();\r\n options.logger?.info(\"queued media delivery\", {\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n fileName,\r\n detail: `kind=image path=${resolved}`,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n userId: options.userId,\r\n path: resolved,\r\n fileName,\r\n size: stats.size,\r\n sentAs: \"weixin_image\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n if (mime && isVideoMime(mime)) {\r\n await options.deliveryQueue.enqueueVideo({\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n filePath: resolved,\r\n caption,\r\n });\r\n await options.deliveryQueue.flushDue();\r\n options.logger?.info(\"queued media delivery\", {\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n fileName,\r\n detail: `kind=video path=${resolved}`,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n userId: options.userId,\r\n path: resolved,\r\n fileName,\r\n size: stats.size,\r\n sentAs: \"weixin_video\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n }\r\n\r\n await options.deliveryQueue.enqueueFile({\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n filePath: resolved,\r\n fileName,\r\n caption,\r\n });\r\n await options.deliveryQueue.flushDue();\r\n options.logger?.info(\"queued media delivery\", {\r\n peerKey: options.peerKey,\r\n userId: options.userId,\r\n fileName,\r\n detail: `kind=file path=${resolved}`,\r\n });\r\n\r\n return okResult(\r\n JSON.stringify(\r\n {\r\n ok: true,\r\n userId: options.userId,\r\n path: resolved,\r\n fileName,\r\n size: stats.size,\r\n sentAs: \"weixin_file\",\r\n },\r\n null,\r\n 2,\r\n ),\r\n );\r\n },\r\n };\r\n}\r\n\r\nfunction readConfiguredUploadLimit(config: unknown): number {\r\n const value = (config as { maxUploadBytes?: number } | undefined)?.maxUploadBytes;\r\n if (typeof value === \"number\" && Number.isFinite(value) && value > 0) {\r\n return Math.trunc(value);\r\n }\r\n\r\n return DEFAULT_MAX_UPLOAD_BYTES;\r\n}\r\n\r\nfunction normalizeCaption(value: string | undefined): string | undefined {\r\n const normalized = value?.trim();\r\n if (!normalized) {\r\n return undefined;\r\n }\r\n\r\n return normalized.length <= MAX_CAPTION_CHARS ? normalized : normalized.slice(0, MAX_CAPTION_CHARS);\r\n}\r\n\r\nfunction mimeFromFilename(fileName: string): string {\r\n const extension = path.extname(fileName).trim().toLowerCase();\r\n switch (extension) {\r\n case \".png\":\r\n return \"image/png\";\r\n case \".jpg\":\r\n case \".jpeg\":\r\n return \"image/jpeg\";\r\n case \".gif\":\r\n return \"image/gif\";\r\n case \".webp\":\r\n return \"image/webp\";\r\n case \".bmp\":\r\n return \"image/bmp\";\r\n case \".mp4\":\r\n return \"video/mp4\";\r\n case \".mov\":\r\n return \"video/quicktime\";\r\n case \".mkv\":\r\n return \"video/x-matroska\";\r\n case \".avi\":\r\n return \"video/x-msvideo\";\r\n case \".mp3\":\r\n return \"audio/mpeg\";\r\n case \".wav\":\r\n return \"audio/wav\";\r\n case \".aac\":\r\n return \"audio/aac\";\r\n case \".m4a\":\r\n return \"audio/mp4\";\r\n case \".pdf\":\r\n return \"application/pdf\";\r\n default:\r\n return \"\";\r\n }\r\n}\r\n\r\nfunction isImageMime(mime: string): boolean {\r\n return mime.startsWith(\"image/\");\r\n}\r\n\r\nfunction isVideoMime(mime: string): boolean {\r\n return mime.startsWith(\"video/\");\r\n}\r\n","import {\r\n DurableTurnDisplay,\r\n type DurableTurnDisplayScheduler,\r\n} from \"../chat/durableTurnDisplay.js\";\r\n\r\nexport type WeixinTurnDisplayScheduler = DurableTurnDisplayScheduler;\r\n\r\nexport class WeixinTurnDisplay extends DurableTurnDisplay<{ userId: string }> {\r\n constructor(\r\n options: {\r\n userId: string;\r\n sendTyping: (userId: string) => Promise<void>;\r\n enqueueVisibleMessage: (target: { userId: string }, text: string) => Promise<void>;\r\n typingIntervalMs: number;\r\n scheduleTypingTick?: (\r\n callback: () => Promise<void> | void,\r\n intervalMs: number,\r\n ) => WeixinTurnDisplayScheduler;\r\n },\r\n ) {\r\n super({\r\n target: {\r\n userId: options.userId,\r\n },\r\n sendTyping: async (target) => options.sendTyping(target.userId),\r\n enqueueVisibleMessage: options.enqueueVisibleMessage,\r\n shouldEmitEvent: (event) => event.kind !== \"tool_call\",\r\n typingIntervalMs: options.typingIntervalMs,\r\n scheduleTypingTick: options.scheduleTypingTick,\r\n });\r\n }\r\n}\r\n","import type { ManagedTurnOptions } from \"../agent/managedTurn.js\";\r\nimport type { WeixinLogger } from \"./logger.js\";\r\nimport { WeixinTurnDisplay } from \"./turnDisplay.js\";\r\n\r\nexport function createLoggedWeixinCallbacks(\r\n display: WeixinTurnDisplay,\r\n logger: WeixinLogger,\r\n context: {\r\n peerKey: string;\r\n userId: string;\r\n sessionId: string;\r\n },\r\n): ManagedTurnOptions[\"callbacks\"] {\r\n return {\r\n ...display.callbacks,\r\n onStatus: (text) => {\r\n logger.info(\"phase\", {\r\n ...context,\r\n detail: text,\r\n });\r\n display.callbacks.onStatus?.(text);\r\n },\r\n onToolCall: (name, args) => {\r\n logger.info(\"tool call\", {\r\n ...context,\r\n toolName: name,\r\n detail: summarizeText(args, 120),\r\n });\r\n display.callbacks.onToolCall?.(name, args);\r\n },\r\n onToolResult: (name, output) => {\r\n logger.info(\"tool finished\", {\r\n ...context,\r\n toolName: name,\r\n detail: `chars=${output.length}`,\r\n });\r\n display.callbacks.onToolResult?.(name, output);\r\n },\r\n onToolError: (name, error) => {\r\n logger.error(\"tool failed\", {\r\n ...context,\r\n toolName: name,\r\n detail: `chars=${error.length}`,\r\n });\r\n display.callbacks.onToolError?.(name, error);\r\n },\r\n };\r\n}\r\n\r\nexport function summarizeText(value: string, maxChars = 100): string {\r\n const normalized = value.replace(/\\s+/g, \" \").trim();\r\n if (!normalized) {\r\n return \"empty\";\r\n }\r\n\r\n return normalized.length <= maxChars ? normalized : `${normalized.slice(0, maxChars - 3)}...`;\r\n}\r\n","import crypto from \"node:crypto\";\r\nimport fs from \"node:fs/promises\";\r\nimport path from \"node:path\";\r\n\r\nexport const WEIXIN_INLINE_VISIBLE_TEXT_MAX_CHARS = 5_000;\r\n\r\nexport type WeixinVisibleReplyPayload =\r\n | {\r\n kind: \"text\";\r\n text: string;\r\n }\r\n | {\r\n kind: \"file\";\r\n filePath: string;\r\n fileName: string;\r\n };\r\n\r\nexport async function packageWeixinVisibleReply(options: {\r\n stateDir: string;\r\n text: string;\r\n inlineTextMaxChars?: number;\r\n}): Promise<WeixinVisibleReplyPayload> {\r\n const inlineTextMaxChars = options.inlineTextMaxChars ?? WEIXIN_INLINE_VISIBLE_TEXT_MAX_CHARS;\r\n if (options.text.length <= inlineTextMaxChars) {\r\n return {\r\n kind: \"text\",\r\n text: options.text,\r\n };\r\n }\r\n\r\n const outboundDir = path.join(options.stateDir, \"outbound-replies\");\r\n await fs.mkdir(outboundDir, { recursive: true });\r\n const fileName = `athlete-reply-${Date.now()}-${crypto.randomUUID().slice(0, 8)}.txt`;\r\n const filePath = path.join(outboundDir, fileName);\r\n await fs.writeFile(filePath, options.text, \"utf8\");\r\n\r\n return {\r\n kind: \"file\",\r\n filePath,\r\n fileName,\r\n };\r\n}\r\n","import { readJsonFile, writeJsonFileAtomically } from \"./storage.js\";\r\n\r\nexport interface WeixinSyncBufStoreLike {\r\n load(): Promise<string | null>;\r\n save(syncBuf: string): Promise<void>;\r\n clear(): Promise<void>;\r\n}\r\n\r\nexport class FileWeixinSyncBufStore implements WeixinSyncBufStoreLike {\r\n constructor(private readonly filePath: string) {}\r\n\r\n async load(): Promise<string | null> {\r\n const payload = await readJsonFile<{ syncBuf?: string } | null>(this.filePath, null);\r\n if (!payload || typeof payload.syncBuf !== \"string\" || !payload.syncBuf.trim()) {\r\n return null;\r\n }\r\n\r\n return payload.syncBuf;\r\n }\r\n\r\n async save(syncBuf: string): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, {\r\n syncBuf,\r\n });\r\n }\r\n\r\n async clear(): Promise<void> {\r\n await writeJsonFileAtomically(this.filePath, null);\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,SAAS,qBAAqB,SAAoC;AACvE,QAAM,iBAAiB,iBAAAA,QAAK,QAAQ,OAAO;AAC3C,QAAM,aAAa,iBAAAA,QAAK,KAAK,gBAAgB,UAAU;AACvD,QAAM,UAAU,iBAAAA,QAAK,KAAK,YAAY,MAAM;AAC5C,QAAM,eAAe,iBAAAA,QAAK,KAAK,YAAY,WAAW;AACtD,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,eAAe,iBAAAA,QAAK,KAAK,SAAS,YAAY;AAAA,IAC9C,UAAU,iBAAAA,QAAK,KAAK,SAAS,OAAO;AAAA,IACpC,gBAAgB,iBAAAA,QAAK,KAAK,SAAS,gBAAgB;AAAA,IACnD,wBAAwB,iBAAAA,QAAK,KAAK,SAAS,aAAa;AAAA,IACxD,gBAAgB,iBAAAA,QAAK,KAAK,SAAS,aAAa;AAAA,IAChD,aAAa,iBAAAA,QAAK,KAAK,SAAS,UAAU;AAAA,IAC1C,UAAU,iBAAAA,QAAK,KAAK,YAAY,OAAO;AAAA,IACvC,gBAAgB,iBAAAA,QAAK,KAAK,YAAY,cAAc;AAAA,IACpD;AAAA,IACA,mBAAmB,iBAAAA,QAAK,KAAK,cAAc,YAAY;AAAA,IACvD,oBAAoB,iBAAAA,QAAK,KAAK,cAAc,cAAc;AAAA,EAC5D;AACF;AAEA,eAAsB,8BAA8B,SAA6C;AAC/F,QAAM,QAAQ,qBAAqB,OAAO;AAC1C,QAAM,gBAAAC,QAAG,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACjD,QAAM,gBAAAA,QAAG,MAAM,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AACvD,QAAM,gBAAAA,QAAG,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,gBAAAA,QAAG,MAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AACrD,QAAM,gBAAAA,QAAG,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,gBAAAA,QAAG,MAAM,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,gBAAAA,QAAG,MAAM,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AACtD,SAAO;AACT;AArDA,qBACA;AADA;AAAA;AAAA;AAAA,sBAAe;AACf,uBAAiB;AAAA;AAAA;;;ACDjB,IAEa,uBAEA;AAJb;AAAA;AAAA;AAEO,IAAM,wBAAwB;AAE9B,IAAM,yBAAyB,CAAC,YAAY,eAAe;AAAA;AAAA;;;AC+HlE,SAAS,cAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEA,SAAS,oBACP,KACyE;AACzE,MAAI,CAAC,OAAO,OAAO,QAAQ,YAAY,MAAM,QAAQ,GAAG,GAAG;AACzD,WAAO,EAAE,IAAI,OAAO,OAAO,qCAAqC;AAAA,EAClE;AAEA,QAAM,UAAU;AAChB,MAAI,CAAC,OAAO,UAAU,QAAQ,eAAe,GAAG;AAC9C,WAAO,EAAE,IAAI,OAAO,OAAO,sCAAsC;AAAA,EACnE;AACA,MAAI,QAAQ,oBAAoB,uBAAuB;AACrD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,+BAA+B,QAAQ,eAAe,cAAc,qBAAqB;AAAA,IAClG;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ,SAAS,YAAY,CAAC,oBAAoB,SAAS,QAAQ,IAAuB,GAAG;AACtG,WAAO,EAAE,IAAI,OAAO,OAAO,yBAAyB,OAAO,QAAQ,QAAQ,EAAE,CAAC,GAAG;AAAA,EACnF;AAEA,MAAI,OAAO,QAAQ,SAAS,YAAY,CAAC,QAAQ,KAAK,KAAK,GAAG;AAC5D,WAAO,EAAE,IAAI,OAAO,OAAO,gCAAgC;AAAA,EAC7D;AAEA,MAAI,QAAQ,OAAO,WAAc,OAAO,QAAQ,OAAO,YAAY,CAAC,QAAQ,GAAG,KAAK,IAAI;AACtF,WAAO,EAAE,IAAI,OAAO,OAAO,0BAA0B;AAAA,EACvD;AAEA,MAAI,OAAO,QAAQ,YAAY,UAAU;AACvC,WAAO,EAAE,IAAI,OAAO,OAAO,2BAA2B;AAAA,EACxD;AAEA,MAAI,OAAO,QAAQ,cAAc,YAAY,CAAC,OAAO,SAAS,QAAQ,SAAS,GAAG;AAChF,WAAO,EAAE,IAAI,OAAO,OAAO,gCAAgC;AAAA,EAC7D;AAEA,QAAM,iBAAiB,wBAAwB,QAAQ,IAAuB,KAAK,CAAC;AACpF,aAAW,SAAS,gBAAgB;AAClC,UAAM,QAAS,QAA+C,KAAe;AAC7E,QAAI,UAAU,WAAW;AACvB,UAAI,OAAO,UAAU,WAAW;AAC9B,eAAO,EAAE,IAAI,OAAO,OAAO,2CAA2C;AAAA,MACxE;AACA;AAAA,IACF;AAEA,QAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAAG;AAC9C,aAAO,EAAE,IAAI,OAAO,OAAO,2BAA2B,OAAO,KAAK,CAAC,IAAI;AAAA,IACzE;AAAA,EACF;AAEA,MAAI,QAAQ,iBAAiB,QAAW;AACtC,QAAI,OAAO,QAAQ,iBAAiB,YAAY,CAAC,uBAAuB,SAAS,QAAQ,YAAY,GAAG;AACtG,aAAO,EAAE,IAAI,OAAO,OAAO,yBAAyB,OAAO,QAAQ,gBAAgB,EAAE,CAAC,GAAG;AAAA,IAC3F;AAAA,EACF;AACA,MAAI,QAAQ,cAAc,WAAc,OAAO,QAAQ,cAAc,YAAY,CAAC,QAAQ,UAAU,KAAK,IAAI;AAC3G,WAAO,EAAE,IAAI,OAAO,OAAO,qBAAqB;AAAA,EAClD;AACA,MAAI,QAAQ,YAAY,UAAa,OAAO,QAAQ,YAAY,UAAU;AACxE,WAAO,EAAE,IAAI,OAAO,OAAO,mBAAmB;AAAA,EAChD;AACA,MAAI,QAAQ,aAAa,UAAa,OAAO,QAAQ,aAAa,UAAU;AAC1E,WAAO,EAAE,IAAI,OAAO,OAAO,oBAAoB;AAAA,EACjD;AACA,MAAI,QAAQ,UAAU,WAAc,OAAO,QAAQ,UAAU,YAAY,CAAC,QAAQ,MAAM,KAAK,IAAI;AAC/F,WAAO,EAAE,IAAI,OAAO,OAAO,iBAAiB;AAAA,EAC9C;AACA,MAAI,QAAQ,cAAc,WAAc,OAAO,QAAQ,cAAc,YAAY,CAAC,QAAQ,UAAU,KAAK,IAAI;AAC3G,WAAO,EAAE,IAAI,OAAO,OAAO,qBAAqB;AAAA,EAClD;AACA,MAAI,QAAQ,aAAa,WAAc,CAAC,OAAO,SAAS,QAAQ,QAAQ,KAAK,CAAC,OAAO,UAAU,QAAQ,QAAQ,IAAI;AACjH,WAAO,EAAE,IAAI,OAAO,OAAO,oBAAoB;AAAA,EACjD;AAEA,SAAO,EAAE,IAAI,MAAM,QAAQ;AAC7B;AAEA,SAAS,0BAA0B,OAAe,KAAiC;AACjF,QAAM,aACJ,OAAO,QAAQ,WACX,SAAS,KAAK,gCAAgC,IAC9C,SAAS,cAAc,GAAG,GAAG,gCAAgC;AAEnE,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,mBAAmB,KAAK;AAAA,OAAU,UAAU;AAAA,IACrD,WAAW,KAAK,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,cAAc,MAA2E;AAChG,MAAI;AACF,WAAO,EAAE,IAAI,MAAM,OAAO,KAAK,MAAM,IAAI,EAAa;AAAA,EACxD,SAAS,OAAO;AACd,WAAO,EAAE,IAAI,OAAO,OAAO,OAAQ,MAAgC,WAAW,KAAK,EAAE;AAAA,EACvF;AACF;AAEA,SAAS,cAAc,OAAwB;AAC7C,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO,OAAO,SAAS,EAAE;AAAA,EAC3B;AACF;AAEA,SAAS,SAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AA5PA,IAAAC,kBACAC,mBAMM,qBAOA,yBAOA,kCAEO;AAvBb;AAAA;AAAA;AAAA,IAAAD,mBAAe;AACf,IAAAC,oBAAiB;AAEjB;AACA;AAGA,IAAM,sBAAyC;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,IAAM,0BAAyF;AAAA,MAC7F,SAAS,CAAC;AAAA,MACV,WAAW,CAAC;AAAA,MACZ,mBAAmB,CAAC,SAAS,WAAW;AAAA,MACxC,kBAAkB,CAAC,gBAAgB,WAAW;AAAA,MAC9C,mBAAmB,CAAC,gBAAgB,aAAa,SAAS;AAAA,IAC5D;AACA,IAAM,mCAAmC;AAElC,IAAM,aAAN,MAAiB;AAAA,MACtB,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,KACJ,QACA,IACA,SACA,OAAwB,WACxB,QAAoC,CAAC,GACT;AAC5B,YAAI,CAAC,oBAAoB,SAAS,IAAI,GAAG;AACvC,gBAAM,IAAI,MAAM,yBAAyB,IAAI,EAAE;AAAA,QACjD;AAEA,cAAM,eAAe,cAAc,EAAE;AACrC,YAAI,CAAC,cAAc;AACjB,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AAEA,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,UAA6B;AAAA,UACjC,iBAAiB;AAAA,UACjB;AAAA,UACA,MAAM,cAAc,MAAM,KAAK;AAAA,UAC/B,IAAI;AAAA,UACJ,SAAS,OAAO,WAAW,EAAE;AAAA,UAC7B,WAAW,KAAK,IAAI;AAAA,UACpB,cAAc,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe;AAAA,UAC5E,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,UACnE,SAAS,OAAO,MAAM,YAAY,WAAW,MAAM,UAAU;AAAA,UAC7D,SAAS,OAAO,MAAM,YAAY,YAAY,MAAM,UAAU;AAAA,UAC9D,UAAU,OAAO,MAAM,aAAa,WAAW,MAAM,WAAW;AAAA,UAChE,OAAO,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ;AAAA,UACvD,WAAW,OAAO,MAAM,cAAc,WAAW,MAAM,YAAY;AAAA,UACnE,UAAU,OAAO,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,QAAQ,IAAI,KAAK,MAAM,MAAM,QAAQ,IAAI;AAAA,QACjH;AACA,cAAM,aAAa,oBAAoB,OAAO;AAC9C,YAAI,CAAC,WAAW,IAAI;AAClB,gBAAM,IAAI,MAAM,kCAAkC,WAAW,KAAK,EAAE;AAAA,QACtE;AAEA,cAAM,YAAY,kBAAAC,QAAK,KAAK,MAAM,UAAU,GAAG,YAAY,QAAQ;AACnE,cAAM,iBAAAC,QAAG,WAAW,MAAM,gBAAgB,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,GAAM,MAAM;AAChF,cAAM,iBAAAA,QAAG,WAAW,WAAW,GAAG,KAAK,UAAU,OAAO,CAAC;AAAA,GAAM,MAAM;AACrE,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,UAAU,MAA4C;AAC1D,cAAM,YAAY,kBAAAD,QAAK,KAAK,qBAAqB,KAAK,OAAO,EAAE,UAAU,GAAG,cAAc,IAAI,KAAK,MAAM,QAAQ;AACjH,cAAM,WAAW,MAAM,KAAK,UAAU,IAAI;AAC1C,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,iBAAAC,QAAG,UAAU,WAAW,IAAI,MAAM;AACxC,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,UAAU,MAA4C;AAC1D,cAAM,YAAY,kBAAAD,QAAK,KAAK,qBAAqB,KAAK,OAAO,EAAE,UAAU,GAAG,cAAc,IAAI,KAAK,MAAM,QAAQ;AACjH,YAAI;AACF,gBAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,WAAW,MAAM;AAC/C,gBAAM,QAAQ,IACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACjB,gBAAM,WAAgC,CAAC;AAEvC,qBAAW,QAAQ,OAAO;AACxB,kBAAM,SAAS,cAAc,IAAI;AACjC,gBAAI,CAAC,OAAO,IAAI;AACd,uBAAS,KAAK,0BAA0B,iBAAiB,OAAO,KAAK,IAAI,IAAI,CAAC;AAC9E;AAAA,YACF;AAEA,kBAAM,aAAa,oBAAoB,OAAO,KAAK;AACnD,gBAAI,CAAC,WAAW,IAAI;AAClB,uBAAS,KAAK,0BAA0B,WAAW,OAAO,OAAO,KAAK,CAAC;AACvE;AAAA,YACF;AAEA,qBAAS,KAAK,WAAW,OAAO;AAAA,UAClC;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,mBAAO,CAAC;AAAA,UACV;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,UAAU,QAAgB,SAAiB,YAAuC;AACtF,YAAI,QAAQ;AACZ,mBAAW,aAAa,YAAY;AAClC,cAAI,cAAc,SAAS,MAAM,cAAc,MAAM,GAAG;AACtD;AAAA,UACF;AAEA,gBAAM,KAAK,KAAK,QAAQ,WAAW,SAAS,WAAW;AACvD,mBAAS;AAAA,QACX;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AC5HA,eAAsB,WAAW,YAAsC;AACrE,MAAI;AACF,UAAM,iBAAAC,QAAG,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,gBAAgB,WAAmB,KAAqB;AACtE,MAAI,kBAAAC,QAAK,WAAW,SAAS,GAAG;AAC9B,WAAO,kBAAAA,QAAK,UAAU,SAAS;AAAA,EACjC;AAEA,SAAO,kBAAAA,QAAK,QAAQ,KAAK,SAAS;AACpC;AAEO,SAAS,kBAAkB,YAAoB,KAAa,QAA+B;AAChG,QAAM,WAAW,gBAAgB,YAAY,GAAG;AAEhD,MAAI,OAAO,aAAa,SAAS,GAAG,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,OAAO,aAAa,IAAI,CAAC,SAAS,gBAAgB,MAAM,GAAG,CAAC;AAEjF,aAAW,QAAQ,cAAc;AAC/B,UAAM,WAAW,kBAAAA,QAAK,SAAS,MAAM,QAAQ;AAC7C,QAAI,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,kBAAAA,QAAK,WAAW,QAAQ,GAAG;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AACxE;AAEA,eAAsB,sBAAsB,UAAiC;AAC3E,QAAM,iBAAAD,QAAG,MAAM,kBAAAC,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D;AAEO,SAAS,aAAa,OAAe,UAA0B;AACpE,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AAAA;AAAA,iBAAsB,MAAM,SAAS,QAAQ;AACjF;AAEO,SAAS,0BAA0B,SAAiB,YAAY,GAAW;AAChF,SAAO,QACJ,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,UAAU,GAAG,OAAO,YAAY,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,EAC9E,KAAK,IAAI;AACd;AA1DA,IAAAC,kBACAC;AADA;AAAA;AAAA;AAAA,IAAAD,mBAAe;AACf,IAAAC,oBAAiB;AAAA;AAAA;;;AC0BjB,eAAsB,qBAAqB,SAAuD;AAChG,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,UAAU,IAAI,CAAC;AAC/D,MAAI,aAAsC;AAC1C,QAAM,oBAAoB,4BAA4B,QAAQ,OAAO;AAErE,WAAS,UAAU,GAAG,WAAW,UAAU,WAAW,GAAG;AACvD,iBAAa,MAAM,eAAe;AAAA,MAChC,GAAG;AAAA,MACH,SAAS;AAAA,IACX,CAAC;AAED,UAAM,UAAU,WAAW,aAAa,KAAK,CAAC,WAAW,YAAY,CAAC,WAAW;AACjF,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,YAAY,WAAW,UAAU;AAC5C,aAAO;AAAA,IACT;AAEA,UAAM,MAAM,QAAQ,iBAAiB,SAAS,QAAQ,WAAW;AAAA,EACnE;AAEA,SAAO,cAAc;AAAA,IACnB,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,YAAY;AAAA,EACd;AACF;AAEA,eAAe,eAAe,SAAuD;AACnF,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,UAAU;AACd,MAAI,aAAoC;AACxC,MAAI,iBAAwC;AAE5C,QAAM,aAAa,cAAc,QAAQ,SAAS,QAAQ,KAAK,QAAQ,WAAW,QAAQ,WAAW;AAErG,QAAM,cAAc,MAAM;AACxB,QAAI,YAAY;AACd,mBAAa,UAAU;AACvB,mBAAa;AAAA,IACf;AACA,QAAI,gBAAgB;AAClB,mBAAa,cAAc;AAC3B,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,SAAS;AACX;AAAA,IACF;AAEA,QAAI,YAAY;AACd,mBAAa,UAAU;AAAA,IACzB;AAEA,QAAI,QAAQ,iBAAiB,GAAG;AAC9B,mBAAa,WAAW,MAAM;AAC5B,kBAAU;AACV,YAAI;AACF,qBAAW,KAAK,SAAS;AAAA,QAC3B,QAAQ;AAAA,QAER;AACA,YAAI,wBAAwB,GAAG;AAC7B,cAAI,gBAAgB;AAClB,yBAAa,cAAc;AAAA,UAC7B;AACA,2BAAiB,WAAW,MAAM;AAChC,gBAAI;AACF,kBAAI,OAAO,WAAW,aAAa,UAAU;AAC3C,2BAAW,KAAK,SAAS;AAAA,cAC3B;AAAA,YACF,QAAQ;AAAA,YAER;AAAA,UACF,GAAG,qBAAqB;AAAA,QAC1B;AAAA,MACF,GAAG,QAAQ,cAAc;AAAA,IAC3B;AAAA,EACF;AAEA,kBAAgB;AAEhB,MAAI,WAAW,KAAK;AAClB,eAAW,IAAI,GAAG,QAAQ,eAAe;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,SAAS,MAAM;AACrB,gBAAY;AAEZ,WAAO;AAAA,MACL,UAAU,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,MAClE,QAAQ,aAAa,OAAO,OAAO,IAAI,gBAAgB;AAAA,MACvD,UAAU,QAAS,OAAkC,QAAQ;AAAA,MAC7D;AAAA,MACA,UAAU;AAAA,MACV,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF,SAAS,OAAO;AACd,gBAAY;AAEZ,WAAO;AAAA,MACL,UAAU,aAAa,KAAK;AAAA,MAC5B,QAAQ,aAAa,kBAAkB,KAAK,GAAG,gBAAgB;AAAA,MAC/D,UAAU,gBAAgB,KAAK;AAAA,MAC/B;AAAA,MACA,UAAU;AAAA,MACV,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,EACF;AACF;AAEA,SAAS,cAAc,SAAiB,KAAa,WAAmB,aAA2B;AACjG,SAAO,QAAQ,aAAa,cACxB,oBAAM,kBAAkB,CAAC,WAAW,cAAc,mBAAmB,wBAAwB,OAAO,CAAC,GAAG;AAAA,IACtG;AAAA,IACA,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,EACV,CAAC,QACD,oBAAM,aAAa,CAAC,OAAO,OAAO,GAAG;AAAA,IACnC;AAAA,IACA,SAAS;AAAA,IACT,cAAc;AAAA,IACd,KAAK;AAAA,IACL,QAAQ;AAAA,EACV,CAAC;AACP;AAEA,SAAS,wBAAwB,SAAyB;AACxD,QAAM,UAAU;AAAA,IACd;AAAA,IACA,OAAO,OAAO;AAAA,IACd;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACX,SAAO,OAAO,KAAK,SAAS,SAAS,EAAE,SAAS,QAAQ;AAC1D;AAEA,SAAS,4BAA4B,SAAyB;AAC5D,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,wBAAwB,OAAO;AAClD,SAAO,kBAAkB,UAAU;AACrC;AAEA,SAAS,wBAAwB,SAAyB;AACxD,MAAI,wBAAwB,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,cAAc,OAAO;AACtC,QAAM,qBAAqB,SAAS,IAAI,CAAC,YAAY,wBAAwB,OAAO,CAAC;AACrF,SAAO,qBAAqB,kBAAkB;AAChD;AAEA,SAAS,wBAAwB,SAA0B;AACzD,SAAO,kEAAkE,KAAK,OAAO;AACvF;AAEA,SAAS,cAAc,SAA2B;AAChD,QAAM,WAAqB,CAAC;AAC5B,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAI,SAAS,OAAO,CAAC,UAAU;AAC7B,iBAAW,CAAC;AACZ,iBAAW;AACX;AAAA,IACF;AACA,QAAI,SAAS,OAAQ,CAAC,UAAU;AAC9B,iBAAW,CAAC;AACZ,iBAAW;AACX;AAAA,IACF;AACA,QAAI,CAAC,YAAY,CAAC,YAAY,SAAS,OAAO,QAAQ,OAAO,QAAQ,CAAC,MAAM,KAAK;AAC/E,UAAI,QAAQ,KAAK,GAAG;AAClB,iBAAS,KAAK,QAAQ,KAAK,CAAC;AAAA,MAC9B;AACA,gBAAU;AACV,eAAS;AACT;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,MAAI,QAAQ,KAAK,GAAG;AAClB,aAAS,KAAK,QAAQ,KAAK,CAAC;AAAA,EAC9B;AAEA,SAAO,SAAS,SAAS,IAAI,WAAW,CAAC,OAAO;AAClD;AAEA,SAAS,qBAAqB,UAA4B;AACxD,MAAI,SAAS,UAAU,GAAG;AACxB,WAAO,SAAS,CAAC,KAAK;AAAA,EACxB;AAEA,MAAI,SAAS,SAAS,CAAC,KAAK;AAC5B,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvD,UAAM,UAAU,SAAS,KAAK;AAC9B,cAAU,eAAe,OAAO;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,SAAyB;AACxD,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,YAAY;AACpC,MAAI,QAAQ,WAAW,eAAe,KAAK,QAAQ,WAAW,UAAU,GAAG;AACzE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,IAAI,GAAG;AAC5B,WAAO,mBAAmB,OAAO;AAAA,EACnC;AACA,MAAI,QAAQ,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,GAAG;AAC5D,WAAO,sBAAsB,OAAO;AAAA,EACtC;AACA,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,WAAO,uBAAuB,OAAO;AAAA,EACvC;AACA,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,WAAO,qBAAqB,OAAO;AAAA,EACrC;AACA,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,WAAO,qBAAqB,OAAO;AAAA,EACrC;AACA,MAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,WAAO,sBAAsB,OAAO;AAAA,EACtC;AACA,MAAI,QAAQ,WAAW,MAAM,GAAG;AAC9B,WAAO,oBAAoB,OAAO;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAyB;AACnD,QAAM,OAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AACvC,QAAM,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AACtD,QAAM,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AACvD,QAAM,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,GAAG,CAAC;AACrD,QAAMC,SAAO,MAAM,CAAC;AAEpB,MAAI,UAAU;AACd,MAAI,OAAO;AACT,eAAW;AAAA,EACb;AACA,MAAIA,QAAM;AACR,eAAW,iBAAiB,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAyB;AACtD,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,MAAI,aAAa;AACjB,QAAM,QAAQ,KAAK,OAAO,CAAC,QAAQ;AACjC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,YAAY,QAAQ,YAAY,aAAa;AAC/C,mBAAa;AACb,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AAED,QAAM,qBAAqB,cAAc,MAAM,KAAK,CAACA,WAASA,OAAK,SAAS,GAAG,CAAC;AAChF,MAAI,CAAC,oBAAoB;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY,KAAK;AAClC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,SAAS,IAAI,CAACA,WAAS,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC;AAC1F,SAAO,6CAA6C,gBAAgB,KAAK,IAAI,CAAC;AAChF;AAEA,SAAS,uBAAuB,SAAyB;AACvD,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,KAAK,UAAU,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAC/D,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AACpD,QAAM,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AAElD,MAAI,UAAU;AACd,MAAI,SAAS;AACX,eAAW;AAAA,EACb;AACA,MAAI,OAAO;AACT,eAAW;AAAA,EACb;AAEA,aAAW,iBAAiB,MAAM,IAAI,CAACA,WAAS,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACvG,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAyB;AACrD,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAC/D,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAChE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AACpD,QAAM,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AAClD,QAAM,cAAc,MAAM,MAAM,SAAS,CAAC;AAC1C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,MAAM,GAAG,EAAE;AAEjC,MAAI,UAAU;AACd,MAAI,SAAS;AACX,eAAW;AAAA,EACb;AACA,MAAI,OAAO;AACT,eAAW;AAAA,EACb;AAEA,aAAW,UAAU,QAAQ,IAAI,CAACA,WAAS,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAClG,aAAW,iBAAiB,gBAAgB,qBAAqB,WAAW,CAAC,CAAC;AAC9E,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAyB;AACrD,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,KAAK,SAAS,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,GAAG,CAAC;AAC/D,QAAM,QAAQ,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,WAAW,GAAG,CAAC;AAChE,MAAI,MAAM,SAAS,GAAG;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,KAAK,IAAI,CAAC;AAClD,QAAM,cAAc,MAAM,MAAM,SAAS,CAAC;AAC1C,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AACA,QAAM,UAAU,MAAM,MAAM,GAAG,EAAE;AAEjC,MAAI,UAAU;AACd,MAAI,OAAO;AACT,eAAW;AAAA,EACb;AAEA,aAAW,UAAU,QAAQ,IAAI,CAACA,WAAS,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AAClG,aAAW,iBAAiB,gBAAgB,qBAAqB,WAAW,CAAC,CAAC;AAC9E,SAAO;AACT;AAEA,SAAS,sBAAsB,SAAyB;AACtD,QAAM,OAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AACvC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY,IAAI;AACjC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,SAAS,IAAI,CAACA,WAAS,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC;AAChF,SAAO,wCAAwC,MAAM,KAAK,IAAI,CAAC;AACjE;AAEA,SAAS,oBAAoB,SAAyB;AACpD,QAAM,OAAO,UAAU,OAAO,EAAE,MAAM,CAAC;AACvC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,QAAMA,SAAO,KAAK,CAAC;AACnB,MAAI,CAACA,QAAM;AACT,WAAO;AAAA,EACT;AACA,SAAO,4BAA4B,gBAAgB,qBAAqBA,MAAI,CAAC,CAAC;AAChF;AAEA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,QAAgC;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,QAAM,UAAU;AAChB,SAAO,QAAQ,QAAQ,SAAS,CAAC,OAAO,QAAQ,SAAS;AACvD,UAAM,cAAc,MAAM,OAAO,IAAI,EAAE,YAAY,CAAC;AACpD,QAAI,CAAC,aAAa;AAChB,aAAO;AAAA,IACT;AACA,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AACA,WAAO,GAAG,MAAM,IAAI,WAAW;AAAA,EACjC,CAAC;AACH;AAEA,SAAS,UAAU,SAA2B;AAC5C,QAAM,OAAiB,CAAC;AACxB,MAAI,UAAU;AACd,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,OAAO,QAAQ,OAAO,KAAK;AACjC,QAAI,SAAS,OAAO,CAAC,UAAU;AAC7B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,SAAS,OAAQ,CAAC,UAAU;AAC9B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,CAAC,YAAY,CAAC,YAAY,KAAK,KAAK,IAAI,GAAG;AAC7C,UAAI,SAAS;AACX,aAAK,KAAK,OAAO;AACjB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,MAAI,SAAS;AACX,SAAK,KAAK,OAAO;AAAA,EACnB;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAA2B;AAC9C,SAAO,MAAM,QAAQ,CAACA,WAAS,aAAaA,MAAI,CAAC;AACnD;AAEA,SAAS,aAAa,OAAyB;AAC7C,QAAM,QAAQ,eAAe,KAAK;AAClC,MAAI,UAAU,IAAI;AAChB,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,QAAM,MAAM,kBAAkB,OAAO,KAAK;AAC1C,MAAI,QAAQ,IAAI;AACd,WAAO,CAAC,KAAK;AAAA,EACf;AAEA,QAAM,SAAS,MAAM,MAAM,GAAG,KAAK;AACnC,QAAM,SAAS,MAAM,MAAM,MAAM,CAAC;AAClC,QAAM,OAAO,MAAM,MAAM,QAAQ,GAAG,GAAG;AACvC,QAAM,QAAQ,gBAAgB,IAAI;AAClC,QAAM,iBAAiB,aAAa,MAAM;AAE1C,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AACxB,eAAW,gBAAgB,aAAa,IAAI,GAAG;AAC7C,iBAAW,QAAQ,gBAAgB;AACjC,gBAAQ,KAAK,GAAG,MAAM,GAAG,YAAY,GAAG,IAAI,EAAE;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,OAAuB;AAC7C,MAAI,WAAW;AACf,MAAI,WAAW;AACf,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,SAAS,OAAO,CAAC,UAAU;AAC7B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,SAAS,OAAQ,CAAC,UAAU;AAC9B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,CAAC,YAAY,CAAC,YAAY,SAAS,KAAK;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAe,OAAuB;AAC/D,MAAI,QAAQ;AACZ,MAAI,WAAW;AACf,MAAI,WAAW;AAEf,WAAS,QAAQ,OAAO,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACxD,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,SAAS,OAAO,CAAC,UAAU;AAC7B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,SAAS,OAAQ,CAAC,UAAU;AAC9B,iBAAW,CAAC;AACZ;AAAA,IACF;AACA,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,eAAS;AAAA,IACX,WAAW,SAAS,KAAK;AACvB,eAAS;AACT,UAAI,UAAU,GAAG;AACf,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAyB;AAChD,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU;AACd,MAAI,QAAQ;AAEZ,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,SAAS,KAAK;AAChB,eAAS;AACT,iBAAW;AACX;AAAA,IACF;AACA,QAAI,SAAS,KAAK;AAChB,eAAS;AACT,iBAAW;AACX;AAAA,IACF;AACA,QAAI,SAAS,OAAO,UAAU,GAAG;AAC/B,YAAM,KAAK,OAAO;AAClB,gBAAU;AACV;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,MAAI,SAAS;AACX,UAAM,KAAK,OAAO;AAAA,EACpB;AAEA,SAAO,MAAM,SAAS,IAAI,QAAQ,CAAC,KAAK;AAC1C;AAEA,SAAS,qBAAqB,OAAuB;AACnD,MAAI,MAAM,SAAS,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,QAAQ,OAAO,IAAI;AAClC;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,UAAU,MAAM,QAAQ,MAAM,IAAI;AACxC,SAAO,IAAI,OAAO;AACpB;AAEA,SAAS,gBAAgB,OAAyB;AAChD,SAAO,QAAS,MAAiC,QAAQ;AAC3D;AAEA,SAAS,aAAa,OAA+B;AACnD,QAAM,WAAY,MAAiC;AACnD,SAAO,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IAAI,KAAK,MAAM,QAAQ,IAAI;AAC5F;AAEA,SAAS,kBAAkB,OAAwB;AACjD,QAAM,MAAO,MAA4B;AACzC,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAW,MAAgC;AACjD,SAAO,OAAO,YAAY,YAAY,QAAQ,SAAS,IAAI,UAAU;AACvE;AAEA,SAAS,MAAM,IAAY,QAAqC;AAC9D,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,WAAW,SAAS,EAAE;AACpC,QAAI,QAAQ;AACV,aAAO;AAAA,QACL;AAAA,QACA,MAAM;AACJ,uBAAa,KAAK;AAClB,iBAAO,OAAO,UAAU,IAAI,MAAM,wBAAwB,CAAC;AAAA,QAC7D;AAAA,QACA,EAAE,MAAM,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF,CAAC;AACH;AA7pBA,kBAwBM,kBACA;AAzBN;AAAA;AAAA;AAAA,mBAAsB;AAEtB;AAsBA,IAAM,mBAAmB;AACzB,IAAM,wBAAwB;AAAA;AAAA;;;ACuG9B,SAAS,cACP,KACA,SAIS;AACT,MAAI,QAAQ,eAAe,cAAc,IAAI,WAAW,MAAM,cAAc,QAAQ,WAAW,GAAG;AAChG,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,KAAK;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,kBAAAC,QAAK,QAAQ,QAAQ,GAAG;AACtC,QAAM,SAAS,kBAAAA,QAAK,QAAQ,IAAI,GAAG;AACnC,SAAO,mBAAmB,OAAO,MAAM,KAAK,mBAAmB,QAAQ,KAAK;AAC9E;AAEA,SAAS,mBAAmB,YAAoB,kBAAmC;AACjF,QAAM,WAAW,kBAAAA,QAAK,SAAS,kBAAkB,UAAU;AAC3D,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,kBAAAA,QAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,aAAa,KAA+C;AACnE,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,IAAI,YAAY,IAAI,EAAE,KAAK,YAAY;AAAA,IACvC,SAAS,cAAc,IAAI,OAAO;AAAA,IAClC,KAAK,cAAc,IAAI,GAAG;AAAA,IAC1B,aAAa,cAAc,IAAI,WAAW,KAAK;AAAA,IAC/C,QAAQ,gBAAgB,IAAI,MAAM;AAAA,IAClC,WAAW,iBAAiB,IAAI,SAAS;AAAA,IACzC,gBAAgB,iBAAiB,IAAI,kBAAkB,IAAI,SAAS;AAAA,IACpE,KAAK,OAAO,IAAI,QAAQ,YAAY,OAAO,SAAS,IAAI,GAAG,IAAI,KAAK,MAAM,IAAI,GAAG,IAAI;AAAA,IACrF,UAAU,OAAO,IAAI,aAAa,YAAY,OAAO,SAAS,IAAI,QAAQ,IAAI,KAAK,MAAM,IAAI,QAAQ,IAAI;AAAA,IACzG,QAAQ,OAAO,IAAI,WAAW,YAAY,IAAI,OAAO,SAAS,IAAI,IAAI,SAAS;AAAA,IAC/E,WAAW,OAAO,IAAI,cAAc,YAAY,IAAI,YAAY,IAAI,YAAY;AAAA,IAChF,WAAW,OAAO,IAAI,cAAc,YAAY,IAAI,YAAY,IAAI,YAAY;AAAA,IAChF,YAAY,OAAO,IAAI,eAAe,YAAY,IAAI,aAAa,IAAI,aAAa;AAAA,EACtF;AACF;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,iBAAiB,OAAwB;AAChD,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAO,KAAK,IAAI,KAAS,KAAK,MAAM,KAAK,CAAC,CAAC;AAC7D;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEA,SAAS,YAAY,OAAwB;AAC3C,SAAO,OAAO,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,gBAAgB,EAAE;AAC5E;AAEA,SAAS,cAAsB;AAC7B,SAAO,mBAAAC,QAAO,WAAW,EAAE,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG,CAAC;AACzD;AAEA,SAAS,aAAa,QAAqC;AACzD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAtNA,wBACAC,kBACAC,mBAKa;AAPb;AAAA;AAAA;AAAA,yBAAmB;AACnB,IAAAD,mBAAe;AACf,IAAAC,oBAAiB;AAEjB;AAGO,IAAM,qBAAN,MAAyB;AAAA,MAC9B,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,OAAO,OAMoB;AAC/B,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,cAAM,MAAM,aAAa;AAAA,UACvB,IAAI,YAAY;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,KAAK,MAAM;AAAA,UACX,aAAa,MAAM;AAAA,UACnB,QAAQ;AAAA,UACR,WAAW,MAAM;AAAA,UACjB,gBAAgB,MAAM;AAAA,UACtB,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AACD,cAAM,KAAK,KAAK,GAAG;AACnB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,OAA6C;AACtD,cAAM,WAAW,KAAK,WAAW,KAAK;AACtC,YAAI;AACF,gBAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,UAAU,MAAM;AAC9C,iBAAO,aAAa,KAAK,MAAM,GAAG,CAAwB;AAAA,QAC5D,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,kBAAM,IAAI,MAAM,kBAAkB,KAAK,aAAa;AAAA,UACtD;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,KAAwD;AACjE,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,aAAa,aAAa,GAAG;AACnC,cAAM,iBAAAA,QAAG,UAAU,kBAAAJ,QAAK,KAAK,MAAM,eAAe,OAAO,WAAW,EAAE,OAAO,GAAG,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAClI,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAO,OAAe,KAA2C;AACrE,cAAM,MAAM,MAAM,KAAK,KAAK,KAAK;AACjC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,KAAK,OAAO,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,IAAI;AAAA,UAC9C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,SACJ,OACA,OAK8B;AAC9B,cAAM,MAAM,MAAM,KAAK,KAAK,KAAK;AACjC,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,QAAQ,MAAM;AAAA,UACd,UAAU,OAAO,MAAM,aAAa,YAAY,OAAO,SAAS,MAAM,QAAQ,IAAI,KAAK,MAAM,MAAM,QAAQ,IAAI;AAAA,UAC/G,QAAQ,OAAO,MAAM,WAAW,WAAW,MAAM,SAAS,IAAI;AAAA,UAC9D,WAAW;AAAA,UACX,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,OAAuC;AAC3C,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,UAAU,MAAM,iBAAAI,QAAG,QAAQ,MAAM,eAAe,EAAE,eAAe,KAAK,CAAC;AAC7E,cAAM,OAAO,MAAM,QAAQ;AAAA,UACzB,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,yBAAyB,KAAK,MAAM,IAAI,CAAC,EAC7E,IAAI,OAAO,UAAU;AACpB,kBAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,kBAAAJ,QAAK,KAAK,MAAM,eAAe,MAAM,IAAI,GAAG,MAAM;AAChF,mBAAO,aAAa,KAAK,MAAM,GAAG,CAAwB;AAAA,UAC5D,CAAC;AAAA,QACL;AACA,eAAO,KAAK,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC;AAAA,MACjF;AAAA,MAEA,MAAM,aAAa,UAGf,CAAC,GAAmC;AACtC,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,eAAO,KAAK,OAAO,CAAC,QAAQ,cAAc,KAAK,OAAO,CAAC;AAAA,MACzD;AAAA,MAEA,MAAM,UAAU,UAGZ,CAAC,GAAoB;AACvB,cAAM,OAAO,MAAM,KAAK,aAAa,OAAO;AAC5C,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO;AAAA,QACT;AAEA,eAAO,KACJ,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,QAAQ;AACZ,gBAAM,SAAS,aAAa,IAAI,MAAM;AACtC,gBAAM,OAAO,OAAO,IAAI,aAAa,WAAW,SAAS,IAAI,QAAQ,KAAK;AAC1E,iBAAO,GAAG,MAAM,IAAI,IAAI,EAAE,KAAK,IAAI,WAAW,IAAI,IAAI,OAAO,GAAG,IAAI;AAAA,QACtE,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAAA,MAEQ,WAAW,OAAuB;AACxC,eAAO,kBAAAA,QAAK,KAAK,qBAAqB,KAAK,OAAO,EAAE,eAAe,OAAO,YAAY,KAAK,CAAC,OAAO;AAAA,MACrG;AAAA,IACF;AAAA;AAAA;;;AC9GO,SAAS,gBAAgB,OAAwB;AACtD,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,QAAM,SAAU,MAA+B;AAC/C,QAAM,QAAQ,QAAQ,YAAY;AAElC,MACE,WAAW,OACX,MAAM,SAAS,sBAAsB,KACrC,MAAM,SAAS,uBAAuB,KACtC,MAAM,SAAS,iBAAiB,KAChC,MAAM,SAAS,oBAAoB,GACnC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAhCA,IAEa;AAFb;AAAA;AAAA;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,MAC/B;AAAA,MAET,YAAY,SAAiB,SAAwB,SAA+B;AAClF,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,UAAU;AAEf,YAAI,WAAW,WAAW,SAAS;AACjC,eAAK,QAAQ,QAAQ;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACKO,SAAS,qBAAqB,WAA2B;AAC9D,SAAO,oBAAAK,QAAO,WAAW,MAAM,EAAE,OAAO,UAAU,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,KAAK;AACtF;AAEO,SAASC,eAAc,OAAwB;AACpD,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEO,SAAS,QAAQ,OAAuB;AAC7C,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEO,SAASC,UAAS,OAA2B,UAAsC;AACxF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,UAAU,WAAW,QAAQ,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACvE;AAEO,SAAS,eAAe,QAAkB,OAAyB;AACxE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAmB,CAAC;AAE1B,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,aAAaD,eAAc,OAAO,KAAK,CAAC;AAC9C,QAAI,CAAC,cAAc,KAAK,IAAI,UAAU,GAAG;AACvC;AAAA,IACF;AAEA,SAAK,IAAI,UAAU;AACnB,WAAO,QAAQ,UAAU;AACzB,QAAI,OAAO,UAAU,OAAO;AAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAgB,UAA0B;AAC3E,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,QAAQ;AACxE;AAEO,SAAS,gBAAgB,KAAgE;AAC9F,MAAI,OAAO,QAAQ,YAAY,IAAI,KAAK,EAAE,WAAW,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,OAAoC;AAC7D,QAAM,aAAaA,eAAc,KAAK;AACtC,SAAO,cAAc;AACvB;AAEO,SAAS,YAAY,KAAa,WAA2B;AAClE,MAAI,CAAC,kBAAAE,QAAK,WAAW,SAAS,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,kBAAAA,QAAK,SAAS,KAAK,SAAS;AAC7C,SAAO,YAAY,CAAC,SAAS,WAAW,IAAI,IAAI,WAAW;AAC7D;AAEO,SAAS,WAAW,QAA0B;AACnD,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI;AAClD;AAEO,SAAS,mBAAmB,WAAqE;AACtG,QAAM,SAAsC,CAAC;AAC7C,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,YAAY,WAAW;AAChC,UAAM,aAAa,kBAAkB,QAAQ;AAC7C,QAAI,CAAC,YAAY;AACf;AAAA,IACF;AAEA,UAAM,MAAM;AAAA,MACV,WAAW;AAAA,MACX,WAAW,YAAY;AAAA,MACvB,WAAW,eAAe;AAAA,MAC1B,WAAW,QAAQ;AAAA,MACnB,WAAW;AAAA,IACb,EAAE,KAAK,GAAG;AACV,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AAEA,SAAK,IAAI,GAAG;AACZ,WAAO,KAAK,UAAU;AACtB,QAAI,OAAO,UAAU,eAAe;AAClC;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,WACwC;AACxC,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,eAAe,UAAU,SAAS,CAAC,GAAG,eAAe;AACnE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAASD,UAASD,eAAc,UAAU,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI,CAAC,IAAI,iBAAiB;AAAA,IAClG,cAAc,eAAe,UAAU,gBAAgB,CAAC,GAAG,eAAe;AAAA,IAC1E,WAAW,mBAAmB,UAAU,aAAa,CAAC,CAAC;AAAA,IACvD,YAAY,mBAAmB,UAAU,aAAY,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,EAC/E;AACF;AAEO,SAAS,cACd,MACA,QACA,WACuB;AACvB,QAAM,QAAQ,eAAe,MAAM,OAAO,MAAM;AAChD,SAAO;AAAA,IACL;AAAA,IACA,QAAQA,eAAc,MAAM,MAAM,KAAK;AAAA,IACvC,kBACE,UAAU,cACV,OAAO,MAAM,qBAAqB,YAClC,OAAO,SAAS,KAAK,gBAAgB,IACjC,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,gBAAgB,CAAC,IAC7C;AAAA,IACN,WAAW,mBAAmB,MAAM,WAAW,SAAS;AAAA,EAC1D;AACF;AAEO,SAAS,kBAAkB,QAAoE;AACpG,SAAO,mBAAmB,OAAO,KAAK,CAAC;AACzC;AAEA,SAAS,kBAAkB,UAAmF;AAC5G,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,SAAS;AACtB,MAAI,SAAS,8BAA8B,SAAS,kBAAkB,SAAS,gBAAgB;AAC7F,WAAO;AAAA,EACT;AAEA,QAAM,QAAQA,eAAc,SAAS,KAAK,KAAKA,eAAc,SAAS,IAAI,KAAKA,eAAc,SAAS,WAAW;AACjH,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAOC,UAAS,OAAO,eAAe;AAAA,IACtC,UAAUD,eAAc,SAAS,QAAQ,KAAK;AAAA,IAC9C,MAAMA,eAAc,SAAS,IAAI,KAAK;AAAA,IACtC,aAAaA,eAAc,SAAS,WAAW,KAAK;AAAA,IACpD,SAASC,UAASD,eAAc,SAAS,OAAO,GAAG,iBAAiB,KAAK;AAAA,IACzE,SAASC,UAASD,eAAc,SAAS,OAAO,GAAG,iBAAiB,KAAK;AAAA,IACzE,QAAQA,eAAc,SAAS,MAAM,KAAK;AAAA,EAC5C;AACF;AAEA,SAAS,eACP,OACA,QACwB;AACxB,MAAI,WAAW,aAAa;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,kBAAkB,UAAU,YAAY,UAAU,aAAa,QAAQ;AAC1F;AAjNA,IAAAG,qBACAC,mBAUa,qBACA,eACA,iBACA,iBACA,iBACA,mBACA;AAjBb;AAAA;AAAA;AAAA,IAAAD,sBAAmB;AACnB,IAAAC,oBAAiB;AAUV,IAAM,sBAAsB;AAC5B,IAAM,gBAAgB;AACtB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAAA;AAAA;;;ACP1B,SAAS,qBAAqB,aAAY,oBAAI,KAAK,GAAE,YAAY,GAAc;AACpF,SAAO;AAAA,IACL,aAAa,CAAC;AAAA,IACd,gBAAgB,CAAC;AAAA,IACjB,kBAAkB,CAAC;AAAA,IACnB,UAAU,CAAC;AAAA,IACX,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,gBAAgB,UAA2B,UAAiC;AAC1F,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,YAAY,cAAc,QAAQ,KAAK,UAAU;AACvD,QAAM,mBACJ,OAAO,UAAU,cAAc,YAC/B,OAAO,cAAc,YACrBC,SAAQ,SAAS,SAAS,EAAE,YAAY,MAAMA,SAAQ,SAAS,EAAE,YAAY;AAE/E,MAAI,kBAAkB;AACpB,WAAO;AAAA,MACL;AAAA,MACA,aAAa,CAAC;AAAA,MACd,gBAAgB,CAAC;AAAA,MACjB,kBAAkB,CAAC;AAAA,MACnB,UAAU,CAAC;AAAA,MACX,eAAe;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAaC,gBAAe,mBAAmB,QAAQ,GAAG,gBAAgB;AAAA,IAC1E,gBAAgBA,gBAAe,sBAAsB,QAAQ,GAAG,mBAAmB;AAAA,IACnF,kBAAkBA,gBAAe,wBAAwB,QAAQ,GAAG,qBAAqB;AAAA,IACzF,UAAUA,gBAAe,gBAAgB,QAAQ,GAAG,YAAY;AAAA,IAChE,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,mBAAmB,WAAyD;AAC1F,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW,OAAO,UAAU,cAAc,WAAW,UAAU,YAAY;AAAA,IAC3E,aAAaA,gBAAe,UAAU,eAAe,CAAC,GAAG,gBAAgB;AAAA,IACzE,gBAAgBA,gBAAe,UAAU,kBAAkB,CAAC,GAAG,mBAAmB;AAAA,IAClF,kBAAkBA,gBAAe,UAAU,oBAAoB,CAAC,GAAG,qBAAqB;AAAA,IACxF,UAAUA,gBAAe,UAAU,YAAY,CAAC,GAAG,YAAY;AAAA,IAC/D,eACE,OAAO,UAAU,kBAAkB,YAAY,UAAU,cAAc,SAAS,IAC5E,UAAU,iBACV,oBAAI,KAAK,GAAE,YAAY;AAAA,EAC/B;AACF;AAEO,SAAS,qBAAqB,WAA0C;AAC7E,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ;AAAA,IACZ,UAAU,YAAY,gBAAgB,UAAU,SAAS,KAAK;AAAA,IAC9D,mBAAmBC,YAAW,UAAU,WAAW,CAAC;AAAA,IACpD,sBAAsBA,YAAW,UAAU,cAAc,CAAC;AAAA,IAC1D,wBAAwBA,YAAW,UAAU,gBAAgB,CAAC;AAAA,IAC9D,eAAeA,YAAW,UAAU,QAAQ,CAAC;AAAA,IAC7C,iBAAiB,UAAU,aAAa;AAAA,EAC1C;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,kBAAkB,SAA6C;AAC7E,SAAO,OAAO,YAAY,YAAY,QAAQ,KAAK,EAAE,YAAY,EAAE,WAAW,eAAe;AAC/F;AAEO,SAAS,wBAAwB,SAA6C;AACnF,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,aAAaF,SAAQ,OAAO,EAAE,YAAY;AAChD,MAAI,CAAC,cAAc,kBAAkB,UAAU,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,SACE,sFAAsF,KAAK,UAAU,KACrG,uFAAuF,KAAK,UAAU,KACtG,qCAAqC,KAAK,UAAU;AAExD;AAEO,SAAS,uBAAuB,MAAsB;AAC3D,SAAO,GAAG,eAAe,IAAI,IAAI,GAAG,KAAK;AAC3C;AAEO,SAAS,uBAAuB,SAAuC;AAC5E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,SAAS,SAAS;AAAA,IAC1E,UAAU,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAAA,IAChE,WAAW;AAAA,MACT,QAAQ,aAAa,gBAAgB,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC,CAAC;AAAA,IAC9F;AAAA,EACF;AACF;AAEA,SAAS,cAAc,UAA+C;AACpE,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,SAAS,SAAS,UAAU,kBAAkB,QAAQ,OAAO,KAAK,wBAAwB,QAAQ,OAAO,GAAG;AAC9G;AAAA,IACF;AAEA,UAAM,aAAaA,SAAQ,QAAQ,WAAW,EAAE;AAChD,QAAI,YAAY;AACd,aAAOG,UAAS,YAAY,GAAG;AAAA,IACjC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,UAAqC;AAC/D,QAAM,QAAkB,CAAC;AAEzB,aAAW,WAAW,UAAU;AAC9B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,eAAe,QAAQ,YAAY,QAAQ;AAC9D,iBAAW,YAAY,QAAQ,YAAY;AACzC,cAAM,SAASC,iBAAgB,SAAS,SAAS,SAAS;AAC1D,8BAAsB,QAAQ,KAAK;AAAA,MACrC;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,YAAM,SAASA,iBAAgB,QAAQ,WAAW,EAAE;AACpD,4BAAsB,QAAQ,KAAK;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,MACJ,IAAI,CAAC,UAAU,kBAAkB,KAAK,CAAC,EACvC,OAAO,OAAO;AACnB;AAEA,SAAS,sBAAsB,UAAqC;AAClE,QAAM,UAAoB,CAAC;AAE3B,aAAW,WAAW,UAAU;AAC9B,QAAI,SAAS,SAAS,eAAe,CAAC,QAAQ,YAAY,QAAQ;AAChE;AAAA,IACF;AAEA,UAAM,QAAQ,QAAQ,WAAW,IAAI,CAAC,aAAa,SAAS,SAAS,IAAI,EAAE,KAAK,IAAI;AACpF,QAAI,OAAO;AACT,cAAQ,KAAK,QAAQ,KAAK,EAAE;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,UAAqC;AACpE,QAAM,UAAoB,CAAC;AAE3B,aAAW,WAAW,UAAU;AAC9B,QAAI,SAAS,SAAS,UAAU,CAAC,QAAQ,MAAM;AAC7C;AAAA,IACF;AAEA,UAAM,SAASA,iBAAgB,QAAQ,WAAW,EAAE;AACpD,QAAI,UAAU,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,SAAS,GAAG;AACzE;AAAA,IACF;AAEA,YAAQ,KAAK,sBAAsB,QAAQ,MAAM,MAAM,CAAC;AAAA,EAC1D;AAEA,SAAO,QAAQ,OAAO,OAAO;AAC/B;AAEA,SAAS,gBAAgB,UAAqC;AAC5D,QAAM,WAAqB,CAAC;AAE5B,aAAW,WAAW,UAAU;AAC9B,QAAI,SAAS,SAAS,QAAQ;AAC5B;AAAA,IACF;AAEA,UAAM,SAASA,iBAAgB,QAAQ,WAAW,EAAE;AACpD,QAAI,CAAC,UAAU,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,WAAW,GAAG;AAC5E;AAAA,IACF;AAEA,aAAS,KAAK,GAAG,QAAQ,QAAQ,MAAM,KAAKD,UAASH,SAAQ,OAAO,KAAK,GAAG,GAAG,CAAC,EAAE;AAAA,EACpF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAkB,SAAiD;AAChG,QAAM,YAAY,kBAAkB,SAAS,SAAS,IAAI,CAAC;AAE3D,MAAI,aAAa,aAAa;AAC5B,UAAM,UAAU,OAAO,SAAS,YAAY,WAAW,QAAQ,UAAU;AACzE,UAAM,WAAW,OAAO,SAAS,aAAa,WAAW,QAAQ,WAAW;AAC5E,WAAO,aAAaG,UAASH,SAAQ,OAAO,GAAG,GAAG,CAAC,UAAU,QAAQ;AAAA,EACvE;AAEA,MAAI,aAAa,gBAAgB;AAC/B,UAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,QAAQ,SAAS;AACzE,WAAO,gBAAgB,KAAK;AAAA,EAC9B;AAEA,MAAI,aAAa,cAAc;AAC7B,UAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,QAAQ,SAAS;AACzE,WAAO,cAAc,KAAK,QAAQ,UAAU,IAAI,MAAM,KAAK;AAAA,EAC7D;AAEA,MAAI,aAAa,eAAe;AAC9B,UAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,QAAQ,SAAS;AACzE,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,MAAI,aAAa,cAAc;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,WAAW;AACb,WAAO,GAAG,QAAQ,IAAIG,UAAS,WAAW,GAAG,CAAC;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAgB,QAAwB;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,OAAO;AACxB,4BAAsB,MAAM,MAAM;AAAA,IACpC;AACA;AAAA,EACF;AAEA,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,QAAI,OAAO,SAAS,YAAY,cAAc,GAAG,GAAG;AAClD,aAAO,KAAK,IAAI;AAChB;AAAA,IACF;AAEA,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,iBAAW,UAAU,MAAM;AACzB,8BAAsB,QAAQ,MAAM;AAAA,MACtC;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,4BAAsB,MAAM,MAAM;AAAA,IACpC;AAAA,EACF;AACF;AAEA,SAAS,cAAc,KAAsB;AAC3C,SAAO,QAAQ,UAAU,QAAQ,SAAS,IAAI,SAAS,MAAM;AAC/D;AAEA,SAAS,SAAS,OAAoC;AACpD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAASC,iBAAgB,KAA6C;AACpE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,OAA+C;AACxE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,IAAI,GAAG;AACjE,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,KAAK;AACxB,WAAOD,UAAS,SAAS,GAAG;AAAA,EAC9B;AAEA,SAAO,QAAQ,SAAS,kBAAAE,QAAK,GAAG,KAAK,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,GAAG,IAC9E,UACA;AACN;AAEA,SAASJ,gBAAe,QAAkB,OAAyB;AACjE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAmB,CAAC;AAE1B,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,QAAQ,OAAO,KAAK,GAAG,KAAK;AAClC,QAAI,CAAC,SAAS,KAAK,IAAI,KAAK,GAAG;AAC7B;AAAA,IACF;AAEA,SAAK,IAAI,KAAK;AACd,WAAO,QAAQ,KAAK;AACpB,QAAI,OAAO,UAAU,OAAO;AAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASD,SAAQ,OAAuB;AACtC,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAASG,UAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAEA,SAASD,YAAW,QAA0B;AAC5C,SAAO,OAAO,SAAS,IAAI,OAAO,KAAK,KAAK,IAAI;AAClD;AAtWA,IAAAI,mBAIM,kBACA,qBACA,uBACA,cACA;AARN;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAIjB,IAAM,mBAAmB;AACzB,IAAM,sBAAsB;AAC5B,IAAM,wBAAwB;AAC9B,IAAM,eAAe;AACrB,IAAM,kBAAkB;AAAA;AAAA;;;ACDjB,SAAS,6BAA6B,aAAY,oBAAI,KAAK,GAAE,YAAY,GAAsB;AACpG,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,eAAe;AAAA,IACf,cAAc;AAAA,IACd,cAAc,CAAC;AAAA,IACf,WAAW;AAAA,EACb;AACF;AAEO,SAAS,2BAA2B,OAAqE;AAC9G,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,QAAQC,iBAAgB,MAAM,MAAM;AAAA,IACpC,UAAU,iBAAiB,MAAM,UAAU,GAAG,IAAI,CAAC;AAAA,IACnD,eAAe,iBAAiB,MAAM,eAAe,GAAG,IAAI,CAAC;AAAA,IAC7D,iBAAiB,iBAAiB,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAAA,IACjE,aAAa,iBAAiB,MAAM,aAAa,GAAG,IAAI,oBAAoB;AAAA,IAC5E,eAAe,iBAAiB,MAAM,eAAe,GAAG,IAAI,uBAAuB;AAAA,IACnF,cAAc,iBAAiB,MAAM,cAAc,GAAG,IAAI,qBAAqB;AAAA,IAC/E,cAAc,oBAAoB,MAAM,gBAAgB,CAAC,GAAG,iBAAiB;AAAA,IAC7E,aAAaC,eAAc,MAAM,WAAW,KAAK;AAAA,IACjD,UAAUA,eAAc,MAAM,QAAQ,KAAK;AAAA,IAC3C,cAAc,OAAO,MAAM,iBAAiB,YAAY,OAAO,SAAS,MAAM,YAAY,IACtF,KAAK,MAAM,MAAM,YAAY,IAC7B,MAAM,iBAAiB,OACrB,OACA;AAAA,IACN,sBAAsBA,eAAc,MAAM,oBAAoB,KAAK;AAAA,IACnE,aAAaA,eAAc,MAAM,WAAW,KAAK;AAAA,IACjD,WAAW,OAAO,MAAM,cAAc,YAAY,MAAM,YAAY,MAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EAC/G;AACF;AAEO,SAAS,kCAAkC,SAAuC;AACvF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,mBAAmB,2BAA2B,QAAQ,iBAAiB,KAAK,6BAA6B;AAAA,EAC3G;AACF;AAEO,SAAS,yBACd,OACA,QAEI,CAAC,GACL,aAAY,oBAAI,KAAK,GAAE,YAAY,GAChB;AACnB,QAAM,UAAU,2BAA2B,KAAK,KAAK,6BAA6B,SAAS;AAC3F,QAAM,eAAe,oBAAoB;AAAA,IACvC,GAAI,MAAM,gBAAgB,CAAC;AAAA,IAC3B,GAAG,QAAQ;AAAA,EACb,GAAG,iBAAiB;AAEpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,UAAU;AAAA,IACV,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,aAAa;AAAA,IACb;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,SAAS,0BACd,OACA,SACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GAChB;AACnB,QAAM,UAAU,2BAA2B,KAAK,KAAK,6BAA6B,SAAS;AAC3F,QAAM,UAAUA,eAAc,QAAQ,OAAO,KAAK;AAClD,QAAM,OAAOA,eAAc,QAAQ,IAAI,KAAK;AAC5C,QAAM,WAAW,OAAO,QAAQ,aAAa,YAAY,OAAO,SAAS,QAAQ,QAAQ,IACrF,KAAK,MAAM,QAAQ,QAAQ,IAC3B,QAAQ,aAAa,OACnB,OACA;AACN,QAAM,SAAS,QAAQ,QAAQ,WAAW,OAAO,aAAa,YAAY,aAAa,EAAE;AAEzF,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,UAAU,QAAQ,WAAW;AAAA,MAC7B,eAAe;AAAA,MACf,iBAAiB;AAAA,MACjB,cAAc,CAAC;AAAA,MACf,aAAa;AAAA,MACb,UAAU;AAAA,MACV,cAAc;AAAA,MACd,sBAAsB;AAAA,MACtB,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,IAAI,IAAI,OAAO,QAAQ,CAAC,IAAI,QAAQ,YAAY,CAAC;AACtE,QAAM,kBAAkB,QAAQ,yBAAyB,YAAY,QAAQ,kBAAkB,IAAI;AACnG,QAAM,WAAW,QAAQ,WAAW;AACpC,QAAM,eAAe,YAAY,QAAQ,eAAe,mBAAmB,QAAQ;AAEnF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,eAAe,kBAAkB;AAAA,IACzC;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,IACV,cAAc;AAAA,IACd,sBAAsB;AAAA,IACtB,aAAa,eACT,iBAAiB,SAAS,MAAM,UAAU,UAAU,eAAe,IACnE;AAAA,IACJ,WAAW;AAAA,EACb;AACF;AAEO,SAAS,yBACd,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GAChB;AACnB,QAAM,UAAU,2BAA2B,KAAK,KAAK,6BAA6B,SAAS;AAC3F,QAAM,gBAAgB,QAAQ,gBAAgB;AAC9C,QAAM,eAAe,QAAQ,aAAa,KAAK,iBAAiB,QAAQ;AAExE,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,eAAe,kBAAkB,QAAQ,WAAW,SAAS,aAAa,QAAQ;AAAA,IAC1F;AAAA,IACA,aAAa,eACT,wJACA,QAAQ;AAAA,IACZ,WAAW;AAAA,EACb;AACF;AAEO,SAAS,uBACd,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GAChB;AACnB,QAAM,UAAU,2BAA2B,KAAK,KAAK,6BAA6B,SAAS;AAC3F,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ,QAAQ,aAAa,SAAS,IAAI,aAAa;AAAA,IACvD,aAAa;AAAA,IACb,WAAW;AAAA,EACb;AACF;AAEO,SAAS,uBAAuB,OAA+C;AACpF,QAAM,SAAS,2BAA2B,KAAK,GAAG;AAClD,SAAO,WAAW,cAAc,WAAW;AAC7C;AAEO,SAAS,2BAA2B,OAA+C;AACxF,SAAO,2BAA2B,KAAK,GAAG,WAAW;AACvD;AAEO,SAAS,6BAA6B,OAA8C;AACzF,QAAM,aAAa,2BAA2B,KAAK,KAAK,6BAA6B;AACrF,QAAM,UAAU,WAAW,aAAa,SAAS,IAAI,WAAW,aAAa,KAAK,KAAK,IAAI;AAC3F,QAAM,OAAO,WAAW,cACpB,GAAG,WAAW,YAAY,cAAc,KAAK,WAAW,WAAW,UAAU,OAAO,WAAW,gBAAgB,SAAS,CAAC,MACzH;AACJ,QAAM,QAAQ,WAAW,eAAe;AAExC,SAAO;AAAA,IACL,aAAa,WAAW,MAAM;AAAA,IAC9B,oBAAoB,OAAO;AAAA,IAC3B,eAAe,WAAW,QAAQ,IAAI,WAAW,WAAW;AAAA,IAC5D,kBAAkB,WAAW,eAAe,IAAI,WAAW,aAAa;AAAA,IACxE,gBAAgB,WAAW,aAAa,IAAI,WAAW,YAAY;AAAA,IACnE,mBAAmB,IAAI;AAAA,IACvB,mBAAmB,KAAK;AAAA,IACxB,iBAAiB,WAAW,SAAS;AAAA,EACvC,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,iBACP,SACA,MACA,UACA,UACA,iBACQ;AACR,SAAO,gCAAgC,QAAQ,0BAA0B,eAAe,qDAAqD,IAAI,KAAK,OAAO,YAAY,SAAS,CAAC,MAAM,OAAO;AAClM;AAEA,SAASD,iBAAgB,OAAoC;AAC3D,QAAM,aAAaC,eAAc,KAAK;AACtC,SAAO,eAAe,cAAc,eAAe,YAAY,eAAe,kBAAkB,aAAa;AAC/G;AAEA,SAAS,oBAAoB,QAAkB,OAAyB;AACtE,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAmB,CAAC;AAE1B,WAAS,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC1D,UAAM,QAAQA,eAAc,OAAO,KAAK,CAAC;AACzC,QAAI,CAAC,SAAS,KAAK,IAAI,KAAK,GAAG;AAC7B;AAAA,IACF;AAEA,SAAK,IAAI,KAAK;AACd,WAAO,QAAQ,KAAK;AACpB,QAAI,OAAO,UAAU,OAAO;AAC1B;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAgB,KAAa,KAAa,UAA0B;AAC5F,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAASA,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAnPA,IAEM,mBACA,sBACA,yBACA;AALN;AAAA;AAAA;AAEA,IAAM,oBAAoB;AAC1B,IAAM,uBAAuB;AAC7B,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAAA;AAAA;;;ACDvB,SAAS,qBAAqB,SAAkC;AACrE,QAAM,kBAAkB,QAAQ,aAAa,CAAC,GAC3C,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAC5C,IAAI,CAAC,SAASC,eAAc,KAAK,IAAI,CAAC,EACtC,OAAO,OAAO;AACjB,MAAI,eAAe,SAAS,GAAG;AAC7B,WAAO,eAAe,gBAAgB,mBAAmB;AAAA,EAC3D;AACA,QAAM,mBAAmB,QAAQ,WAAW,oBAAoB,CAAC;AACjE,SAAO,eAAe,kBAAkB,mBAAmB;AAC7D;AAEO,SAAS,kBACd,SACA,YACoB;AACpB,MAAI,WAAW,WAAW,aAAa;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,QAAQ,aAAa,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,WAAW,aAAa;AAC7F,MAAI,gBAAgB,MAAM;AACxB,WAAOA,eAAc,eAAe,IAAI,KAAK;AAAA,EAC/C;AACA,MAAI,WAAW,KAAK,UAAU,YAAY;AACxC,WAAO,WAAW,YAAY;AAAA,EAChC;AACA,MAAI,WAAW,iBAAiB,SAAS;AACvC,WAAO,WAAW,gBAAgB;AAAA,EACpC;AACA,QAAM,qBAAqB,QAAQ,WAAW,iBAAiB,CAAC;AAChE,SAAOA,eAAc,kBAAkB,KAAK;AAC9C;AAEO,SAAS,eACd,SACA,YACoB;AACpB,MAAI,WAAW,WAAW,aAAa;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,QAAQ,aAAa,CAAC,GAAG,KAAK,CAAC,SAAS,KAAK,WAAW,SAAS;AACtF,MAAI,aAAa,MAAM;AACrB,WAAOA,eAAc,YAAY,IAAI,KAAK;AAAA,EAC5C;AACA,MAAI,uBAAuB,QAAQ,iBAAiB,MAAM,QAAQ,mBAAmB,cAAc,UAAU,KAAK,GAAG;AACnH,WAAO,iCAAiC,QAAQ,mBAAmB,cAAc,MAAM,GAAG,CAAC,EAAE,KAAK,KAAK,CAAC;AAAA,EAC1G;AAEA,QAAM,eAAe,IAAI,KAAK,WAAW,kBAAkB,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AAChG,QAAM,sBAAsB,QAAQ,WAAW,kBAAkB,CAAC,GAAG,KAAK,CAAC,WAAW;AACpF,UAAM,aAAaA,eAAc,MAAM;AACvC,WAAO,cAAc,CAAC,aAAa,IAAI,WAAW,YAAY,CAAC;AAAA,EACjE,CAAC;AACD,MAAI,oBAAoB;AACtB,WAAOA,eAAc,kBAAkB,KAAK;AAAA,EAC9C;AACA,OAAK,WAAW,iBAAiB,UAAU,UAAU,KAAK,GAAG;AAC3D,WAAO;AAAA,EACT;AACA,OAAK,WAAW,iBAAiB,MAAM,UAAU,KAAK,GAAG;AACvD,WAAO,yDAAyD,WAAW,iBAAiB,MAAM,KAAK,IAAI,CAAC;AAAA,EAC9G;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,SAAqD;AAC9F,SAAO,eAAe,QAAQ,mBAAmB,gBAAgB,CAAC,GAAG,aAAa,EAAE,IAAI,CAAC,iBAAiB;AAAA,IACxG,MAAM;AAAA,IACN,OAAOC,UAAS,YAAY,QAAQ,KAAK,WAAW,GAAG,eAAe;AAAA,IACtE,MAAM;AAAA,EACR,EAAE;AACJ;AAEO,SAAS,kCACd,UACA,WACwC;AACxC,MAAI,gBAAgB,SAAS,SAAS;AACtC,SAAO,iBAAiB,KAAK,SAAS,aAAa,GAAG,SAAS,QAAQ;AACrE,qBAAiB;AAAA,EACnB;AAEA,MAAI,gBAAgB,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI,aAAa;AACjB,SAAO,cAAc,KAAK,SAAS,UAAU,GAAG,SAAS,QAAQ;AAC/D,kBAAc;AAAA,EAChB;AAEA,QAAM,eAAe,SAClB,MAAM,aAAa,GAAG,gBAAgB,CAAC,EACvC,OAAO,CAAC,YAAY,QAAQ,SAAS,MAAM;AAC9C,QAAM,YAAY,aACf,IAAI,CAAC,YAAYD,eAAc,QAAQ,IAAI,CAAC,EAC5C,OAAO,OAAO;AAEjB,SAAO,eAAe,WAAW,cAAc,QAAW,SAAS;AACrE;AAEO,SAAS,eACd,WACA,cACA,cACA,WACwC;AACxC,QAAM,QAAQ,eAAe,WAAW,eAAe;AACvD,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,QAAM,YAAY;AAAA,IAChB,aAAa,QAAQ,CAAC,YAAY,2BAA2B,OAAO,CAAC;AAAA,EACvE;AACA,QAAM,oBAAoB;AAAA,IACxB;AAAA,MACE,GAAI,gBAAgB,CAAC;AAAA,MACrB,GAAG,aACA,IAAI,CAAC,YAAY,oBAAoB,OAAO,CAAC,EAC7C,OAAO,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,aAAa,aAAa,SAAS,CAAC,GAAG;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,sBAAsB,OAAO,mBAAmB,SAAS;AAAA,IAClE,cAAc;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,2BAA2B,SAAqD;AACvF,QAAM,UAAU,gBAAgB,QAAQ,OAAO;AAC/C,QAAM,YAAyC,CAAC;AAEhD,QAAM,eAAe,QAAQ,0BAA0B,uBAAuB,OAAO;AACrF,MAAI,cAAc;AAChB,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,OAAO,mBAAmB,QAAQ,MAAM,SAAS,aAAa,WAAW;AAAA,MACzE,UAAUA,eAAc,QAAQ,IAAI,KAAK;AAAA,MACzC,MAAM,WAAW,SAAS,IAAI;AAAA,MAC9B,aAAa,aAAa;AAAA,MAC1B,SAASC,UAAS,WAAW,SAAS,OAAO,KAAK,aAAa,SAAS,iBAAiB;AAAA,MACzF,SAASA,UAAS,WAAW,SAAS,OAAO,GAAG,iBAAiB;AAAA,MACjE,QAAQ,aAAa;AAAA,IACvB,CAAC;AAAA,EACH,WAAW,YAAY,WAAW,QAAQ,OAAO,KAAK,WAAW,QAAQ,IAAI,IAAI;AAC/E,cAAU,KAAK;AAAA,MACb,MAAM;AAAA,MACN,OAAO,mBAAmB,QAAQ,MAAM,SAAS,WAAW,QAAQ,IAAI,CAAC;AAAA,MACzE,UAAUD,eAAc,QAAQ,IAAI,KAAK;AAAA,MACzC,MAAM,WAAW,QAAQ,IAAI;AAAA,MAC7B,SAASC,UAAS,WAAW,QAAQ,OAAO,GAAG,iBAAiB;AAAA,MAChE,SAASA,UAAS,WAAW,QAAQ,OAAO,GAAG,iBAAiB;AAAA,IAClE,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,SAA4C;AACvE,QAAM,UAAU,gBAAgB,QAAQ,OAAO;AAC/C,SAAO,WAAW,SAAS,IAAI,KAAK,WAAW,SAAS,aAAa;AACvE;AAEA,SAAS,sBACP,WACA,cACA,WACQ;AACR,QAAM,YAAY,CAAC,OAAO,UAAU,KAAK,IAAI,CAAC,EAAE;AAEhD,MAAI,aAAa,SAAS,GAAG;AAC3B,cAAU,KAAK,WAAW,aAAa,KAAK,KAAK,CAAC,EAAE;AAAA,EACtD;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,cAAU,KAAK,aAAa,UAAU,IAAI,CAAC,aAAa,SAAS,KAAK,EAAE,KAAK,KAAK,CAAC,EAAE;AAAA,EACvF;AACA,SAAOA,UAAS,UAAU,KAAK,IAAI,GAAG,iBAAiB;AACzD;AAEA,SAAS,mBACP,UACA,SACA,cACQ;AACR,QAAM,UACJ,WAAW,SAAS,IAAI,KACxB,WAAW,SAAS,KAAK,KACzB,WAAW,SAAS,OAAO,KAC3B,gBACA,YACA;AAEF,SAAOA,UAAS,QAAQ,OAAO,GAAG,eAAe;AACnD;AAEA,SAAS,uBACP,SAC6C;AAC7C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AACA,QAAM,cAAc,WAAW,QAAQ,WAAW;AAClD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,YACE,OAAO,QAAQ,eAAe,YAAY,OAAO,SAAS,QAAQ,UAAU,IACxE,KAAK,MAAM,QAAQ,UAAU,IAC7B;AAAA,IACN,YACE,OAAO,QAAQ,eAAe,YAAY,OAAO,SAAS,QAAQ,UAAU,IACxE,KAAK,MAAM,QAAQ,UAAU,IAC7B;AAAA,IACN,SAAS,WAAW,QAAQ,OAAO,KAAK;AAAA,IACxC,QAAQ,WAAW,QAAQ,MAAM,KAAK;AAAA,EACxC;AACF;AA1OA;AAAA;AAAA;AAAA;AAEA;AAAA;AAAA;;;ACQO,SAAS,sBAAsB,aAAY,oBAAI,KAAK,GAAE,YAAY,GAAsB;AAC7F,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,gBAAgB,CAAC;AAAA,IACjB,MAAM;AAAA,MACJ,OAAO;AAAA,MACP,WAAW;AAAA,IACb;AAAA,IACA,mBAAmB,CAAC;AAAA,IACpB,WAAW;AAAA,EACb;AACF;AAEO,SAAS,6BACd,WACA,WACmB;AACnB,SAAO;AAAA,IACL,GAAG,sBAAsB,SAAS;AAAA,IAClC;AAAA,IACA,sBAAsB,YAAY,qBAAqB,SAAS,IAAI;AAAA,EACtE;AACF;AAEO,SAAS,4BACd,SACA,WACmB;AACnB,QAAM,kBAAkB,kCAAkC,QAAQ,UAAU,SAAS;AAErF,SAAO;AAAA,IACL,GAAG,6BAA6BC,eAAc,QAAQ,WAAW,SAAS,KAAK,QAAW,SAAS;AAAA,IACnG,gBAAgB,qBAAqB,OAAO;AAAA,IAC5C,aAAa,kBAAkB,SAAS;AAAA,MACtC,GAAG,sBAAsB,SAAS;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,IACD,UAAU,eAAe,SAAS;AAAA,MAChC,GAAG,sBAAsB,SAAS;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,IACD;AAAA,IACA,mBAAmB;AAAA,MACjB,iBAAiB,aAAa,CAAC;AAAA,MAC/B,2BAA2B,OAAO;AAAA,IACpC;AAAA,EACF;AACF;AA1DA;AAAA;AAAA;AACA;AAOA;AAAA;AAAA;;;ACqBO,SAAS,oBACd,YACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACJ;AAC/B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,YAAYC,eAAc,WAAW,SAAS,KAAK;AACzD,QAAM,SAAS,WAAW,WAAW,cAAc,cAAc;AAEjE,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,sBACEA,eAAc,WAAW,oBAAoB,MAAM,YAAY,qBAAqB,SAAS,IAAI;AAAA,IACnG;AAAA,IACA,gBAAgB,eAAe,WAAW,kBAAkB,CAAC,GAAG,CAAC;AAAA,IACjE,aAAa,WAAW,cAAc,SAAYA,eAAc,WAAW,WAAW,KAAK;AAAA,IAC3F,UAAU,WAAW,cAAc,SAAYA,eAAc,WAAW,QAAQ,KAAK;AAAA,IACrF,iBAAiB,mBAAmB,WAAW,eAAe;AAAA,IAC9D,MAAM,cAAc,WAAW,MAAM,QAAQ,SAAS;AAAA,IACtD,mBACE,WAAW,cACP,CAAC,IACD,mBAAmB,WAAW,qBAAqB,CAAC,CAAC;AAAA,IAC3D,WAAW,mBAAmB,WAAW,WAAW,SAAS;AAAA,EAC/D;AACF;AAEO,SAAS,2BAA2B,SAAuC;AAChF,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,YAAYA,eAAc,QAAQ,WAAW,SAAS,KAAK;AACjE,QAAM,cAAc,YAAY,qBAAqB,SAAS,IAAI;AAClE,QAAM,aAAa,oBAAoB,QAAQ,YAAY,SAAS;AACpE,QAAM,mBACJ,QAAQ,YAAY,wBAAwB,WAAW,KAAK,YAAY,yBAAyB;AAEnG,MAAI,aAAa,mBACb,6BAA6B,WAAW,SAAS,IACjD,cAAc,4BAA4B,SAAS,SAAS;AAEhE,MAAI,WAAW;AACb,eAAW,YAAY;AACvB,eAAW,uBAAuB;AAAA,EACpC,OAAO;AACL,eAAW,YAAY;AACvB,eAAW,uBAAuB;AAAA,EACpC;AAEA,MAAI,CAAC,oBAAoB,WAAW,eAAe,WAAW,GAAG;AAC/D,eAAW,iBAAiB,qBAAqB,OAAO;AAAA,EAC1D;AAEA,MAAI,WAAW,WAAW,eAAe,CAAC,kBAAkB;AAC1D,eAAW,cAAc,WAAW,eAAe,kBAAkB,SAAS,UAAU;AACxF,eAAW,WAAW,WAAW,YAAY,eAAe,SAAS,UAAU;AAC/E,eAAW,oBAAoB;AAAA,MAC7B,WAAW;AAAA,MACX,WAAW,iBAAiB,aAAa,CAAC;AAAA,MAC1C,2BAA2B,OAAO;AAAA,IACpC;AAAA,EACF;AAEA,MAAI,kBAAkB;AACpB,eAAW,SAAS;AACpB,eAAW,cAAc;AACzB,eAAW,WAAW;AACtB,eAAW,kBAAkB;AAC7B,eAAW,oBAAoB,CAAC;AAAA,EAClC;AAEA,aAAW,OAAO,cAAc,WAAW,MAAM,WAAW,QAAQ,SAAS;AAC7E,aAAW,YAAY,mBAAmB,WAAW,WAAW,SAAS;AAEzE,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,wBACd,SACA,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,aAAa,2BAA2B,OAAO,EAAE,cAAc,sBAAsB,SAAS;AACpG,QAAM,QACJ,kBAAkB,KAAK,IACnB,iBACA,wBAAwB,KAAK,IAC3B,WACA;AAER,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAG;AAAA,MACH,MAAM;AAAA,QACJ;AAAA,QACA,QACE,UAAU,iBACN,yBACA,UAAU,WACR,mBACA;AAAA,QACR,WAAW;AAAA,MACb;AAAA,MACA,aACE,WAAW,WAAW,cAClB,SACA,WAAW,eAAe,kBAAkB,SAAS,UAAU;AAAA,MACrE,UACE,WAAW,WAAW,cAClB,SACA,WAAW,YAAY,eAAe,SAAS,UAAU;AAAA,MAC/D,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,uBACd,SACA,qBACA,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,aAAa,2BAA2B,OAAO,EAAE,cAAc,sBAAsB,SAAS;AAEpG,MAAI,WAAW,WAAW,aAAa;AACrC,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAG;AAAA,MACH,aAAa,WAAW,eAAe,kBAAkB,SAAS,UAAU,KAAK,WAAW;AAAA,MAC5F,UACE,WAAW,YACX,eAAe,SAAS,UAAU,KAClC;AAAA,MACF,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,QAAQA,eAAe,OAAiC,WAAW,KAAK,KAAK;AAAA,QAC7E,kBAAkB;AAAA,QAClB,WAAW;AAAA,MACb;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,oBACd,SACA,aACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,aAAa,2BAA2B,OAAO,EAAE,cAAc,sBAAsB,SAAS;AAEpG,MAAI,WAAW,WAAW,aAAa;AACrC,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAG;AAAA,MACH,aACE,WAAW,eACX,kBAAkB,SAAS,UAAU,KACrC;AAAA,MACF,UACE,WAAW,YACX,eAAe,SAAS,UAAU,KAClC;AAAA,MACF,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,QAAQA,eAAc,WAAW,KAAK;AAAA,QACtC,WAAW;AAAA,MACb;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,wBACd,SACA,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,aAAa,2BAA2B,OAAO,EAAE,cAAc,sBAAsB,SAAS;AACpG,QAAM,kBAAkB,eAAe,MAAM,WAAW,MAAM,cAAc,MAAM,cAAc,SAAS;AACzG,QAAM,QAAQ,WAAW,KAAK,UAAU,aAAa,WAAW,WAAW,KAAK;AAEhF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAG;AAAA,MACH,gBAAgB,qBAAqB,OAAO;AAAA,MAC5C,aACE,WAAW,WAAW,cAClB,SACA,kBAAkB,SAAS;AAAA,QACzB,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,MACP,UACE,WAAW,WAAW,cAClB,SACA,eAAe,SAAS;AAAA,QACtB,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,MACP;AAAA,MACA,mBACE,WAAW,WAAW,cAClB,CAAC,IACD;AAAA,QACE,iBAAiB,aAAa,CAAC;AAAA,QAC/B,WAAW;AAAA,QACX,2BAA2B,OAAO;AAAA,MACpC;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,QACA,QACE,UAAU,WACN,SACA,WAAW,KAAK;AAAA,QACtB,WAAW;AAAA,MACb;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,wBACd,SACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,aAAa,2BAA2B,OAAO,EAAE,cAAc,sBAAsB,SAAS;AAEpG,SAAO;AAAA,IACL,GAAG;AAAA,IACH,YAAY;AAAA,MACV,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,gBACE,WAAW,eAAe,SAAS,IAAI,WAAW,iBAAiB,qBAAqB,OAAO;AAAA,MACjG,aAAa;AAAA,MACb,UAAU;AAAA,MACV,mBAAmB,CAAC;AAAA,MACpB,MAAM;AAAA,QACJ,OAAO;AAAA,QACP,WAAW;AAAA,MACb;AAAA,MACA,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAtSA;AAAA;AAAA;AAAA;AAEA;AACA;AAOA;AAWA;AAAA;AAAA;;;AChBO,SAAS,iCACd,UACA,YACQ;AACR,QAAM,WAAW,8BAA8B,QAAQ;AACvD,QAAM,aAAa,oBAAoB,UAAU;AAEjD,MAAI,CAAC,YAAY,WAAW;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,UAAU,SAAS,aACf,kBACA,UAAU,SAAS,aACjB,sBACA;AACR,QAAM,QAAQ;AAAA,IACZ,iCAAiC,OAAO;AAAA,IACxC,cAAc,WAAW,SAAS;AAAA,EACpC;AAEA,MAAI,WAAW,eAAe,SAAS,GAAG;AACxC,UAAM,KAAK,oBAAoB,WAAW,eAAe,KAAK,KAAK,CAAC,EAAE;AAAA,EACxE;AACA,MAAI,WAAW,aAAa;AAC1B,UAAM,KAAK,iBAAiB,WAAW,WAAW,EAAE;AAAA,EACtD;AACA,MAAI,WAAW,UAAU;AACvB,UAAM,KAAK,mBAAmB,WAAW,QAAQ,EAAE;AAAA,EACrD;AACA,MAAI,WAAW,iBAAiB,SAAS;AACvC,UAAM,KAAK,sBAAsB,WAAW,gBAAgB,OAAO,EAAE;AAAA,EACvE;AACA,MAAI,WAAW,kBAAkB,SAAS,GAAG;AAC3C,UAAM;AAAA,MACJ,uBAAuB,WAAW,kBAC/B,MAAM,GAAG,CAAC,EACV,IAAI,sBAAsB,EAC1B,KAAK,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,QAAM;AAAA,IACJ;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,sBAAsB,YAAmD;AACvF,QAAM,aAAa,oBAAoB,UAAU;AACjD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,gBAAgB,WAAW,aAAa,MAAM;AAAA,IAC9C,aAAa,WAAW,MAAM;AAAA,IAC9B,oBAAoB,mBAAmB,WAAW,IAAI,CAAC;AAAA,IACvD,sBAAsB,WAAW,WAAW,cAAc,CAAC;AAAA,IAC3D,mBAAmB,WAAW,eAAe,MAAM;AAAA,IACnD,gBAAgB,WAAW,YAAY,MAAM;AAAA,IAC7C,wBAAwB,WAAW,iBAAiB,WAAW,MAAM;AAAA,IACrE,yBAAyB,gBAAgB,WAAW,iBAAiB,CAAC;AAAA,IACtE,iBAAiB,WAAW,SAAS;AAAA,EACvC,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,8BAA8B,UAA6C;AACzF,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,MAAqC;AAC/D,QAAM,mBACJ,OAAO,KAAK,qBAAqB,YAAY,OAAO,SAAS,KAAK,gBAAgB,IAC9E,cAAc,KAAK,gBAAgB,KACnC;AAEN,SAAO,KAAK,SAAS,GAAG,KAAK,KAAK,GAAG,gBAAgB,KAAK,KAAK,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,gBAAgB;AAC7G;AAEA,SAAS,gBAAgB,WAAgD;AACvE,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,UAAU,IAAI,sBAAsB,EAAE,KAAK,KAAK;AACzD;AAEA,SAAS,uBAAuB,UAA6C;AAC3E,QAAM,SAAS,SAAS,eAAe,SAAS,QAAQ,SAAS;AACjE,SAAO,GAAG,SAAS,IAAI,KAAK,MAAM;AACpC;AAzGA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;;;ACqBO,SAAS,wBAAwB,aAAY,oBAAI,KAAK,GAAE,YAAY,GAAwB;AACjG,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,MACL,cAAc;AAAA,MACd,qBAAqB;AAAA,MACrB,OAAO;AAAA,QACL,mBAAmB;AAAA,QACnB,sBAAsB;AAAA,QACtB,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,kBAAkB;AAAA,QAClB,sBAAsB;AAAA,MACxB;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,QAAQ,CAAC;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,mBAAmB;AAAA,MACnB,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,kBAAkB;AAAA,IACpB;AAAA,IACA,yBAAyB;AAAA,MACvB,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,SAAS,sBACd,cACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACd;AACrB,QAAM,OAAO,wBAAwB,SAAS;AAC9C,QAAM,QAAQ,cAAc,OAAO;AAEnC,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO;AAAA,MACL,cAAc,gBAAgB,cAAc,OAAO,YAAY;AAAA,MAC/D,qBAAqB,gBAAgB,cAAc,OAAO,mBAAmB;AAAA,MAC7E,OAAO;AAAA,QACL,mBAAmB,gBAAgB,OAAO,iBAAiB;AAAA,QAC3D,sBAAsB,gBAAgB,OAAO,oBAAoB;AAAA,QACjE,kBAAkB,gBAAgB,OAAO,gBAAgB;AAAA,QACzD,mBAAmB,gBAAgB,OAAO,iBAAiB;AAAA,QAC3D,kBAAkB,gBAAgB,OAAO,gBAAgB;AAAA,QACzD,sBAAsB,gBAAgB,OAAO,oBAAoB;AAAA,MACnE;AAAA,IACF;AAAA,IACA,OAAO;AAAA,MACL,WAAW,gBAAgB,cAAc,OAAO,SAAS;AAAA,MACzD,iBAAiB,gBAAgB,cAAc,OAAO,eAAe;AAAA,MACrE,QAAQ,iBAAiB,cAAc,OAAO,MAAM;AAAA,IACtD;AAAA,IACA,QAAQ;AAAA,MACN,mBAAmB,gBAAgB,cAAc,QAAQ,iBAAiB;AAAA,MAC1E,YAAY,gBAAgB,cAAc,QAAQ,UAAU;AAAA,MAC5D,eAAe,gBAAgB,cAAc,QAAQ,aAAa;AAAA,MAClE,kBAAkB,gBAAgB,cAAc,QAAQ,gBAAgB;AAAA,IAC1E;AAAA,IACA,yBAAyB;AAAA,MACvB,OAAO,gBAAgB,cAAc,yBAAyB,KAAK;AAAA,MACnE,iBAAiB,gBAAgB,cAAc,yBAAyB,eAAe;AAAA,IACzF;AAAA,IACA,WAAWC,oBAAmB,cAAc,WAAW,KAAK,SAAS;AAAA,EACvE;AACF;AAEO,SAAS,6BAA6B,SAAuC;AAClF,SAAO,EAAE,GAAG,SAAS,cAAc,sBAAsB,QAAQ,YAAY,EAAE;AACjF;AAEO,SAAS,qBACd,SACA,OACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,MAAI,CAAC,kBAAkB,KAAK,KAAK,CAAC,wBAAwB,KAAK,GAAG;AAChE,WAAO,iBAAiB,SAAS,sBAAsB,QAAQ,cAAc,SAAS,CAAC;AAAA,EACzF;AAEA,SAAO,iBAAiB,SAAS,qBAAqB,SAAS;AACjE;AAEO,SAAS,iBAAiB,SAAwB,aAAY,oBAAI,KAAK,GAAE,YAAY,GAAkB;AAC5G,SAAO,iBAAiB,SAAS,cAAc,SAAS;AAC1D;AAEO,SAAS,oBACd,SACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,SAAO,iBAAiB,SAAS,iBAAiB,SAAS;AAC7D;AAEO,SAAS,uBACd,SACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,SAAO,iBAAiB,SAAS,oBAAoB,SAAS;AAChE;AAEO,SAAS,yBACd,SACA,SACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,iBAAiB,SAAS,sBAAsB,QAAQ,cAAc,SAAS,CAAC;AAAA,EACzF;AAEA,QAAM,eAAe,sBAAsB,QAAQ,cAAc,SAAS;AAC1E,aAAW,UAAU,SAAS;AAC5B,iBAAa,MAAM,gBAAgB;AACnC,iBAAa,MAAM,uBAAuB,gBAAgB,OAAO,UAAU;AAE3E,QAAI,SAAS,OAAO,KAAK,GAAG;AAC1B,mBAAa,MAAM,MAAM,qBAAqB;AAC9C,mBAAa,MAAM,MAAM,oBAAoB,gBAAgB,OAAO,OAAO,WAAW;AACtF,mBAAa,MAAM,MAAM,qBAAqB,gBAAgB,OAAO,OAAO,YAAY;AACxF,mBAAa,MAAM,MAAM,oBAAoB,gBAAgB,OAAO,OAAO,WAAW;AACtF,mBAAa,MAAM,MAAM,wBAAwB,gBAAgB,OAAO,OAAO,eAAe;AAAA,IAChG,OAAO;AACL,mBAAa,MAAM,MAAM,wBAAwB;AAAA,IACnD;AAAA,EACF;AAEA,eAAa,YAAY;AACzB,SAAO,iBAAiB,SAAS,YAAY;AAC/C;AAEO,SAAS,yBACd,SACA,QACA,aAAY,oBAAI,KAAK,GAAE,YAAY,GACpB;AACf,QAAM,eAAe,sBAAsB,QAAQ,cAAc,SAAS;AAC1E,QAAM,WAAW,kBAAkB,OAAO,QAAQ;AAClD,QAAM,YAAY,aAAa,MAAM,OAAO,QAAQ,KAAK,qBAAqB;AAE9E,eAAa,MAAM,aAAa;AAChC,eAAa,MAAM,mBAAmB,gBAAgB,OAAO,UAAU;AACvE,YAAU,aAAa;AACvB,YAAU,mBAAmB,gBAAgB,OAAO,UAAU;AAC9D,MAAI,OAAO,IAAI;AACb,cAAU,WAAW;AAAA,EACvB,OAAO;AACL,cAAU,cAAc;AAAA,EAC1B;AACA,eAAa,MAAM,OAAO,QAAQ,IAAI;AAEtC,MAAI,OAAO,wBAAwB;AACjC,iBAAa,wBAAwB,SAAS;AAC9C,iBAAa,wBAAwB,mBAAmB,gBAAgB,OAAO,uBAAuB,UAAU;AAAA,EAClH;AAEA,eAAa,YAAY;AACzB,SAAO,iBAAiB,SAAS,YAAY;AAC/C;AAEA,SAAS,iBACP,OACyC;AACzC,QAAM,UAAU,OAAO,QAAQ,SAAS,CAAC,CAAC;AAC1C,SAAO,OAAO,YAAY,QAAQ,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,kBAAkB,GAAG,GAAG,mBAAmB,KAAK,CAAC,CAAC,CAAC;AAC9G;AAEA,SAAS,mBAAmB,OAAqE;AAC/F,SAAO;AAAA,IACL,WAAW,gBAAgB,OAAO,SAAS;AAAA,IAC3C,iBAAiB,gBAAgB,OAAO,eAAe;AAAA,IACvD,SAAS,gBAAgB,OAAO,OAAO;AAAA,IACvC,YAAY,gBAAgB,OAAO,UAAU;AAAA,EAC/C;AACF;AAEA,SAAS,iBACP,SACA,OACA,WACe;AACf,QAAM,eAAe,sBAAsB,QAAQ,cAAc,SAAS;AAC1E,eAAa,OAAO,KAAK,KAAK;AAC9B,eAAa,YAAY;AACzB,SAAO,iBAAiB,SAAS,YAAY;AAC/C;AAEA,SAAS,iBAAiB,SAAwB,cAAkD;AAClG,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,uBAAgD;AACvD,SAAO;AAAA,IACL,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;AAEA,SAAS,SAAS,OAAmD;AACnE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,EACT,EAAE,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AACvE;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM,KAAK,IAAI;AAChG;AAEA,SAASA,oBAAmB,OAAgB,UAA0B;AACpE,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,QAAQ;AACxE;AAEA,SAAS,kBAAkB,OAAuB;AAChD,QAAM,aAAa,OAAO,SAAS,EAAE,EAAE,KAAK;AAC5C,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AAhQA,IAAAC,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC8CO,SAAS,2BACd,SACuB;AACvB,QAAM,QAAQ,sBAAsB,QAAQ,YAAY;AACxD,QAAM,WAAW,OAAO,QAAQ,MAAM,MAAM,MAAM,EAC/C,IAAI,CAAC,CAAC,MAAM,SAAS,OAAO;AAAA,IAC3B;AAAA,IACA,GAAGC,oBAAmB,SAAS;AAAA,EACjC,EAAE,EACD;AAAA,IAAK,CAAC,MAAM,UACX,MAAM,kBAAkB,KAAK,mBAC7B,MAAM,YAAY,KAAK,aACvB,KAAK,KAAK,cAAc,MAAM,IAAI;AAAA,EACpC;AAEF,QAAM,oBAAoB;AAAA,IACxB,MAAM,MAAM,MAAM;AAAA,IAClB,MAAM,MAAM,MAAM;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,QAAQ,YAAY,SAAS,MAAM,OAAO,aAAa;AAAA,IACvD,OAAO;AAAA,MACL,cAAc;AAAA,MACd,mBAAmB,MAAM,MAAM,MAAM;AAAA,MACrC,sBAAsB,MAAM,MAAM,MAAM;AAAA,MACxC,kBAAkB,MAAM,MAAM,MAAM;AAAA,MACpC,mBAAmB,MAAM,MAAM,MAAM;AAAA,MACrC,kBAAkB,MAAM,MAAM,MAAM;AAAA,MACpC,sBAAsB,MAAM,MAAM,MAAM;AAAA,IAC1C;AAAA,IACA,eAAe,MAAM,MAAM;AAAA,IAC3B,0BAA0B,MAAM,MAAM;AAAA,IACtC,WAAW,MAAM,MAAM;AAAA,IACvB,qBAAqB,MAAM,MAAM;AAAA,IACjC,QAAQ,MAAM,OAAO;AAAA,IACrB,eAAe,MAAM,OAAO;AAAA,IAC5B,YAAY,MAAM,OAAO;AAAA,IACzB,cAAc,MAAM,OAAO;AAAA,IAC3B,qBAAqB;AAAA,MACnB,OAAO,MAAM,wBAAwB;AAAA,MACrC,iBAAiB,MAAM,wBAAwB;AAAA,IACjD;AAAA,IACA;AAAA,IACA,aAAa,gBAAgB,MAAM,MAAM,qBAAqB,QAAQ;AAAA,EACxE;AACF;AAEA,SAAS,YACP,SACA,eACiC;AACjC,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAa,QAAQ,YAAY,MAAM,UAAU;AAEvD,MAAI,YAAY;AACd,YAAQ,KAAK,qCAAqC;AAAA,EACpD;AACA,MAAI,QAAQ,mBAAmB,WAAW,iBAAiB;AACzD,YAAQ,KAAK,uCAAuC;AAAA,EACtD,WAAW,QAAQ,mBAAmB,WAAW,YAAY;AAC3D,YAAQ,KAAK,gCAAgC;AAAA,EAC/C;AACA,MAAI,gBAAgB,GAAG;AACrB,YAAQ,KAAK,+BAA+B,aAAa,UAAU;AAAA,EACrE;AAEA,MAAI,YAAY;AACd,WAAO,EAAE,QAAQ,cAAc,QAAQ;AAAA,EACzC;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,EAAE,QAAQ,WAAW,QAAQ;AAAA,EACtC;AAEA,SAAO,EAAE,QAAQ,WAAW,SAAS,CAAC,EAAE;AAC1C;AAEA,SAAS,qBACP,mBACA,sBAC0B;AAC1B,MAAI,sBAAsB,GAAG;AAC3B,WAAO;AAAA,EACT;AACA,MAAI,yBAAyB,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAASA,oBAAmB,WAA6D;AACvF,SAAO;AAAA,IACL,WAAW,UAAU;AAAA,IACrB,iBAAiB,UAAU;AAAA,IAC3B,SAAS,UAAU;AAAA,IACnB,YAAY,UAAU;AAAA,EACxB;AACF;AAEA,SAAS,gBACP,0BACA,UACsC;AACtC,QAAM,UAAU,SAAS,CAAC;AAC1B,MAAI,CAAC,WAAW,4BAA4B,GAAG;AAC7C,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,4BAA4B,QAAQ,iBAAiB;AACnE,WAAO;AAAA,MACL,KAAK;AAAA,MACL,OAAO;AAAA,MACP,iBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,KAAK,QAAQ,QAAQ,IAAI;AAAA,IACzB,OAAO,QAAQ,QAAQ,IAAI;AAAA,IAC3B,iBAAiB,QAAQ;AAAA,EAC3B;AACF;AA3KA;AAAA;AAAA;AACA,IAAAC;AAAA;AAAA;;;ACDA;AAAA;AAAA;AAAA,IAAAC;AAkBA;AAAA;AAAA;;;ACbO,SAAS,gBAAgB,UAA2B,WAAuB,CAAC,GAAe;AAChG,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,SAAS,SAAS,UAAU,QAAQ,SAAS,gBAAgB,OAAO,QAAQ,YAAY,UAAU;AACpG;AAAA,IACF;AAEA,UAAM,SAASC,eAAc,QAAQ,OAAO;AAC5C,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,EAAE,WAAW,SAAS;AACjE;AAAA,IACF;AAEA,QAAI;AACF,aAAO,mBAAoB,OAA+B,KAAK;AAAA,IACjE,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,SAAO,mBAAmB,QAAQ;AACpC;AAEO,SAAS,mBAAmB,OAA4B;AAC7D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,MAAM,SAAS,gBAAgB;AACjC,UAAM,IAAI,MAAM,4BAA4B,cAAc,GAAG;AAAA,EAC/D;AAEA,QAAM,aAAyB,CAAC;AAChC,QAAM,UAAU,oBAAI,IAAY;AAChC,MAAI,kBAAkB;AAEtB,aAAW,SAAS,OAAO;AACzB,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,YAAM,IAAI,MAAM,mCAAmC;AAAA,IACrD;AAEA,UAAM,SAAS;AACf,UAAM,KAAK,OAAO,OAAO,MAAM,EAAE,EAAE,KAAK;AACxC,UAAM,OAAO,gBAAgB,OAAO,IAAI;AACxC,UAAM,SAAS,oBAAoB,OAAO,MAAM;AAEhD,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,aAAa,EAAE,oBAAoB;AAAA,IACrD;AAEA,QAAI,QAAQ,IAAI,EAAE,GAAG;AACnB,YAAM,IAAI,MAAM,2BAA2B,EAAE,GAAG;AAAA,IAClD;AAEA,YAAQ,IAAI,EAAE;AAEd,QAAI,WAAW,eAAe;AAC5B,yBAAmB;AACnB,UAAI,kBAAkB,GAAG;AACvB,cAAM,IAAI,MAAM,wCAAwC;AAAA,MAC1D;AAAA,IACF;AAEA,eAAW,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAuC;AACrE,QAAM,QAAQ,mBAAmB,KAAK;AACtC,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,GAAG,aAAa,KAAK,MAAM,CAAC,KAAK,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE;AAC1F,QAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAAE;AACtE,QAAM,KAAK,eAAe,SAAS,IAAI,MAAM,MAAM,YAAY;AAC/D,SAAO,MAAM,KAAK,IAAI;AACxB;AAYO,SAAS,mBAAmB,OAAwC;AACzE,SAAO,mBAAmB,KAAK,EAAE,KAAK,CAAC,SAAS,KAAK,WAAW,WAAW;AAC7E;AASA,SAAS,oBAAoB,OAA4B;AACvD,QAAM,aAAa,OAAO,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY;AAC1D,MAAI,eAAe,aAAa,eAAe,iBAAiB,eAAe,aAAa;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,wBAAwB,OAAO,SAAS,EAAE,CAAC,GAAG;AAChE;AAEA,SAAS,gBAAgB,OAAwB;AAC/C,QAAM,aAAa,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjE,MAAI,WAAW,UAAU,qBAAqB;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,WAAW,MAAM,GAAG,mBAAmB,CAAC;AACpD;AAEA,SAAS,aAAa,QAA4B;AAChD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASA,eAAc,KAAsB;AAC3C,MAAI;AACF,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AArJA,IAEM,gBACA;AAHN;AAAA;AAAA;AAEA,IAAM,iBAAiB;AACvB,IAAM,sBAAsB;AAAA;AAAA;;;ACiH5B,eAAsB,oBAAoB,KAAqC;AAC7E,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,SAAO,qBAAqB;AAAA,IAC1B,IAAI,gBAAgB;AAAA,IACpB,WAAW;AAAA,IACX,WAAW;AAAA,IACX;AAAA,IACA,cAAc;AAAA,IACd,UAAU,CAAC;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,WAAW,qBAAqB,SAAS;AAAA,IACzC,YAAY,sBAAsB,SAAS;AAAA,IAC3C,mBAAmB,6BAA6B,SAAS;AAAA,IACzD,cAAc,wBAAwB,SAAS;AAAA,EACjD,CAAC;AACH;AAEA,SAAS,qBAAqB,SAAuC;AACnE,QAAM,qBAAqB,MAAM,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,WAAW,CAAC;AACjF,QAAM,yBAAyB,kCAAkC,OAAO,EAAE;AAC1E,QAAM,WAAW;AAAA,IACf,GAAG;AAAA,IACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,OAAO,QAAQ,SAAS,mBAAmB,kBAAkB;AAAA,IAC7D,cAAc,mBAAmB;AAAA,IACjC,UAAU;AAAA,IACV,WAAW,gBAAgB,oBAAoB,QAAQ,aAAa,CAAC,CAAC;AAAA,IACtE,WAAW,gBAAgB,oBAAoB,QAAQ,SAAS;AAAA,IAChE,mBAAmB;AAAA,EACrB;AAEA,SAAO,6BAA6B,2BAA2B,QAAQ,CAAC;AAC1E;AAEA,SAAS,6BAA6B,SAAuC;AAC3E,QAAM,aAAa,6BAA6B;AAAA,IAC9C,kCAAkC,uBAAgC,OAAO,CAAC;AAAA,EAC5E,CAAC;AACD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW,gBAAgB,WAAW,YAAY,CAAC,GAAG,WAAW,aAAa,CAAC,CAAC;AAAA,EAClF;AACF;AAEA,SAAS,kBAA0B;AACjC,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE;AACzE,QAAM,SAAS,oBAAAC,QAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AAC7C,SAAO,GAAG,IAAI,IAAI,MAAM;AAC1B;AAEA,SAAS,mBAAmB,UAA+C;AACzE,QAAM,mBAAmB,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,UAAU,QAAQ,OAAO;AAC9F,MAAI,CAAC,kBAAkB,SAAS;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,iBAAiB,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACtE,SAAO,WAAW,MAAM,GAAG,EAAE;AAC/B;AA9KA,IAAAC,qBACAC,kBACAC,mBAkBa,cAuDA;AA3Eb;AAAA;AAAA;AAAA,IAAAF,sBAAmB;AACnB,IAAAC,mBAAe;AACf,IAAAC,oBAAiB;AAGjB;AACA;AACA;AACA;AACA;AAWO,IAAM,eAAN,MAA+C;AAAA,MACpD,YAA6B,aAAqB;AAArB;AAAA,MAAsB;AAAA,MAEnD,MAAM,OAAO,KAAqC;AAChD,eAAO,oBAAoB,GAAG;AAAA,MAChC;AAAA,MAEA,MAAM,KAAK,SAAgD;AACzD,cAAM,UAAU,qBAAqB,OAAO;AAC5C,cAAM,iBAAAC,QAAG,MAAM,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AACpD,cAAM,iBAAAA,QAAG,UAAU,KAAK,QAAQ,QAAQ,EAAE,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC5F,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,IAAoC;AAC7C,cAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,KAAK,QAAQ,EAAE,GAAG,MAAM;AACtD,eAAO,6BAA6B,KAAK,MAAM,GAAG,CAAkB;AAAA,MACtE;AAAA,MAEA,MAAM,aAA4C;AAChD,cAAM,WAAW,MAAM,KAAK,KAAK,CAAC;AAClC,eAAO,SAAS,CAAC,KAAK;AAAA,MACxB;AAAA,MAEA,MAAM,KAAK,QAAQ,IAA8B;AAC/C,cAAM,iBAAAA,QAAG,MAAM,KAAK,aAAa,EAAE,WAAW,KAAK,CAAC;AACpD,cAAM,UAAU,MAAM,iBAAAA,QAAG,QAAQ,KAAK,aAAa,EAAE,eAAe,KAAK,CAAC;AAE1E,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC,EAChE,IAAI,OAAO,UAAU;AACpB,kBAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,kBAAAC,QAAK,KAAK,KAAK,aAAa,MAAM,IAAI,GAAG,MAAM;AAC7E,mBAAO,6BAA6B,KAAK,MAAM,GAAG,CAAkB;AAAA,UACtE,CAAC;AAAA,QACL;AAEA,eAAO,SACJ,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC,EACnE,MAAM,GAAG,KAAK;AAAA,MACnB;AAAA,MAEA,MAAM,eAAe,SAAwB,UAAmD;AAC9F,cAAM,OAAO,qBAAqB;AAAA,UAChC,GAAG;AAAA,UACH,UAAU,CAAC,GAAG,QAAQ,UAAU,GAAG,QAAQ;AAAA,QAC7C,CAAC;AACD,eAAO,KAAK,KAAK,IAAI;AAAA,MACvB;AAAA,MAEQ,QAAQ,IAAoB;AAClC,eAAO,kBAAAA,QAAK,KAAK,KAAK,aAAa,GAAG,EAAE,OAAO;AAAA,MACjD;AAAA,IACF;AAEO,IAAM,qBAAN,MAAqD;AAAA,MACzC,WAAW,oBAAI,IAA2B;AAAA,MAE3D,MAAM,OAAO,KAAqC;AAChD,eAAO,oBAAoB,GAAG;AAAA,MAChC;AAAA,MAEA,MAAM,KAAK,SAAgD;AACzD,cAAM,WAAW,qBAAqB,OAAO;AAC7C,aAAK,SAAS,IAAI,SAAS,IAAI,QAAQ;AACvC,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,IAAoC;AAC7C,cAAM,UAAU,KAAK,SAAS,IAAI,EAAE;AACpC,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,oBAAoB,EAAE,EAAE;AAAA,QAC1C;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,aAA4C;AAChD,cAAM,WAAW,MAAM,KAAK,KAAK,CAAC;AAClC,eAAO,SAAS,CAAC,KAAK;AAAA,MACxB;AAAA,MAEA,MAAM,KAAK,QAAQ,IAA8B;AAC/C,eAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC,EAC9B,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC,EACnE,MAAM,GAAG,KAAK;AAAA,MACnB;AAAA,MAEA,MAAM,eAAe,SAAwB,UAAmD;AAC9F,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,UAAU,CAAC,GAAG,QAAQ,UAAU,GAAG,QAAQ;AAAA,QAC7C,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACkEA,SAAS,iBAAyB;AAChC,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,YAAY,EAAE,EAAE,MAAM,GAAG,EAAE;AACzE,QAAM,SAAS,oBAAAC,QAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AAC7C,SAAO,GAAG,IAAI,IAAI,MAAM;AAC1B;AAxLA,IAAAC,qBACAC,kBACAC,mBA2Ba;AA7Bb,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAH,sBAAmB;AACnB,IAAAC,mBAAe;AACf,IAAAC,oBAAiB;AA2BV,IAAM,cAAN,MAAkB;AAAA,MACvB,YAA6B,YAAoB;AAApB;AAAA,MAAqB;AAAA,MAElD,MAAM,OAAO,OAAiD;AAC5D,cAAM,KAAK,eAAe;AAC1B,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,cAAM,UAAU,kBAAAE,QAAK,KAAK,KAAK,YAAY,EAAE;AAE7C,cAAM,iBAAAC,QAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAE3C,cAAM,aAAa,MAAM,QAAQ;AAAA,UAC/B,MAAM,WAAW,IAAI,OAAO,WAAW,UAAU;AAC/C,kBAAM,qBAAqB,MAAM,KAAK;AAAA,cACpC;AAAA,cACA,GAAG,KAAK;AAAA,cACR,UAAU;AAAA,YACZ;AACA,kBAAM,oBAAoB,MAAM,KAAK;AAAA,cACnC;AAAA,cACA,GAAG,KAAK;AAAA,cACR,UAAU;AAAA,YACZ;AAEA,kBAAMC,UAAgC;AAAA,cACpC,MAAM,UAAU;AAAA,cAChB,MAAM,UAAU;AAAA,cAChB,QAAQ,UAAU;AAAA,cAClB,SAAS,UAAU;AAAA,YACrB;AAEA,gBAAI,oBAAoB;AACtB,cAAAA,QAAO,qBAAqB;AAC5B,cAAAA,QAAO,cAAc,UAAU,YAAY;AAAA,YAC7C;AAEA,gBAAI,mBAAmB;AACrB,cAAAA,QAAO,oBAAoB;AAC3B,cAAAA,QAAO,aAAa,UAAU,WAAW;AAAA,YAC3C;AAEA,mBAAOA;AAAA,UACT,CAAC;AAAA,QACH;AAEA,cAAM,SAAuB;AAAA,UAC3B;AAAA,UACA,WAAW;AAAA,UACX,WAAW,MAAM;AAAA,UACjB,KAAK,MAAM;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf;AAAA,QACF;AAEA,cAAM,iBAAAD,QAAG,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AACnD,cAAM,iBAAAA,QAAG,UAAU,KAAK,gBAAgB,EAAE,GAAG,GAAG,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC3F,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,QAAQ,IAA6B;AAC9C,cAAM,iBAAAA,QAAG,MAAM,KAAK,YAAY,EAAE,WAAW,KAAK,CAAC;AACnD,cAAM,UAAU,MAAM,iBAAAA,QAAG,QAAQ,KAAK,YAAY,EAAE,eAAe,KAAK,CAAC;AAEzE,cAAM,UAAU,MAAM,QAAQ;AAAA,UAC5B,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,OAAO,CAAC,EAChE,IAAI,OAAO,UAAU,KAAK,KAAK,kBAAAD,QAAK,SAAS,MAAM,MAAM,OAAO,CAAC,CAAC;AAAA,QACvE;AAEA,eAAO,QACJ,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC,EACnE,MAAM,GAAG,KAAK;AAAA,MACnB;AAAA,MAEA,MAAM,KAAK,IAAmC;AAC5C,cAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,KAAK,gBAAgB,EAAE,GAAG,MAAM;AAC9D,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB;AAAA,MAEA,MAAM,qBAAmD;AACvD,cAAM,UAAU,MAAM,KAAK,KAAK,GAAG;AACnC,eAAO,QAAQ,KAAK,CAAC,WAAW,CAAC,OAAO,QAAQ,KAAK;AAAA,MACvD;AAAA,MAEA,MAAM,KAAK,UAA8C;AACvD,cAAM,SAAS,WAAW,MAAM,KAAK,KAAK,QAAQ,IAAI,MAAM,KAAK,mBAAmB;AACpF,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,YAAI,OAAO,UAAU;AACnB,gBAAM,IAAI,MAAM,UAAU,OAAO,EAAE,0BAA0B,OAAO,QAAQ,GAAG;AAAA,QACjF;AAEA,cAAM,gBAA0B,CAAC;AAEjC,iBAAS,QAAQ,OAAO,WAAW,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACrE,gBAAM,YAAY,OAAO,WAAW,KAAK;AACzC,cAAI,CAAC,WAAW;AACd;AAAA,UACF;AAEA,wBAAc,KAAK,UAAU,IAAI;AAEjC,cAAI,UAAU,oBAAoB;AAChC,kBAAM,SAAS,MAAM,KAAK,aAAa,UAAU,kBAAkB;AACnE,kBAAM,iBAAAA,QAAG,MAAM,kBAAAD,QAAK,QAAQ,UAAU,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAChE,kBAAM,iBAAAC,QAAG,UAAU,UAAU,MAAM,MAAM;AACzC;AAAA,UACF;AAEA,gBAAM,iBAAAA,QAAG,GAAG,UAAU,MAAM,EAAE,OAAO,KAAK,CAAC;AAAA,QAC7C;AAEA,cAAM,UAAwB;AAAA,UAC5B,GAAG;AAAA,UACH,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC;AACA,cAAM,iBAAAA,QAAG,UAAU,KAAK,gBAAgB,QAAQ,EAAE,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAEpG,eAAO;AAAA,UACL,QAAQ;AAAA,UACR,eAAe,cAAc,QAAQ;AAAA,QACvC;AAAA,MACF;AAAA,MAEQ,gBAAgB,IAAoB;AAC1C,eAAO,kBAAAD,QAAK,KAAK,KAAK,YAAY,GAAG,EAAE,OAAO;AAAA,MAChD;AAAA,MAEA,MAAc,cACZ,SACA,OACA,QAC6B;AAC7B,YAAI,CAAC,QAAQ;AACX,iBAAO;AAAA,QACT;AAEA,cAAM,WAAW,GAAG,KAAK;AACzB,cAAM,eAAe,kBAAAA,QAAK,KAAK,SAAS,QAAQ;AAChD,cAAM,iBAAAC,QAAG,UAAU,cAAc,MAAM;AACvC,eAAO,kBAAAD,QAAK,SAAS,KAAK,YAAY,YAAY;AAAA,MACpD;AAAA,MAEA,MAAc,aAAa,cAAuC;AAChE,eAAO,iBAAAC,QAAG,SAAS,kBAAAD,QAAK,KAAK,KAAK,YAAY,YAAY,CAAC;AAAA,MAC7D;AAAA,IACF;AAAA;AAAA;;;ACzJO,SAAS,cACd,MACA,SACA,UAII,CAAC,GACU;AACf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,YAAY,QAAQ;AAAA,IACpB,kBAAkB,QAAQ;AAAA,IAC1B,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAEO,SAAS,kBACd,YACA,SACA,MACA,UAEI,CAAC,GACU;AACf,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,cAAc;AAAA,IACd;AAAA,IACA,wBAAwB,QAAQ;AAAA,IAChC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAEO,SAAS,qBAAqB,SAAsC;AACzE,QAAM,YAAa,QAA4C;AAC/D,SAAO,OAAO,cAAc,YAAY,UAAU,SAAS,IAAI,YAAY;AAC7E;AAEO,SAAS,qBAAqB,SAAiC;AACpE,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,QACf,IAAI,CAAC,SAAS;AACb,QAAI,QAAQ,OAAO,SAAS,YAAY,UAAU,QAAQ,OAAO,KAAK,SAAS,UAAU;AACvF,aAAO,KAAK;AAAA,IACd;AAEA,WAAO;AAAA,EACT,CAAC,EACA,OAAO,OAAO;AAEjB,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,EAAE,IAAI;AACrD;AAEO,SAAS,cACd,SACA,SAC4B;AAC5B,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAS,QAAQ,WAAW;AAAA,MAC5B,cAAc,QAAQ,gBAAgB;AAAA,IACxC;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,eAAe,QAAQ,YAAY,QAAQ;AAC9D,UAAM,mBAA4C;AAAA,MAChD,MAAM;AAAA,MACN,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,IACtB;AAEA,QAAI,QAAQ,oBAAoB,QAAQ,kBAAkB;AACxD,uBAAiB,oBAAoB,QAAQ;AAAA,IAC/C;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,cAAuC;AAAA,IAC3C,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ,WAAW;AAAA,IAC5B,MAAM,QAAQ;AAAA,EAChB;AAEA,MAAI,QAAQ,SAAS,eAAe,QAAQ,oBAAoB,QAAQ,kBAAkB;AACxF,gBAAY,oBAAoB,QAAQ;AAAA,EAC1C;AAEA,SAAO;AACT;AAEO,SAAS,oBAAgD,UAAuB;AACrF,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,QAAI,SAAS,KAAK,GAAG,SAAS,QAAQ;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,0BACd,UACA,YACQ;AACR,MAAI,QAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,SAAS,SAAS,CAAC,CAAC;AAEjE,SAAO,QAAQ,KAAK,SAAS,KAAK,GAAG,SAAS,QAAQ;AACpD,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEO,SAAS,0BAA0B,OAAwB;AAChE,SAAO,UAAU,uBAAuB,UAAU;AACpD;AAEO,SAAS,+BACd,UACA,OACS;AACT,SAAO,SAAS,KAAK,GAAG,SAAS,eAAe,QAAQ,oBAAoB,QAAQ;AACtF;AAEO,SAAS,sCACd,UACA,OACA,OACS;AACT,SACE,0BAA0B,KAAK,KAC/B,+BAA+B,UAAU,KAAK,KAC9C,QAAQ,SAAS,KAAK,GAAG,gBAAgB;AAE7C;AAxKA;AAAA;AAAA;AAAA;AAAA;;;ACEO,SAAS,uBACd,kBACA,cACQ;AACR,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA,iBAAiB,aAAa,cAAc,QAAQ;AAAA,IACpD;AAAA,IACA;AAAA,IACA;AAAA,MACE,CAAC,GAAG,aAAa,gBAAgB,GAAG,aAAa,iBAAiB,GAAG,aAAa,WAAW;AAAA,MAC7F;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,sBAAsB,SAAS,IACxC,aAAa,sBAAsB,IAAI,CAAC,UAAU,KAAK,MAAM,IAAI,EAAE,EAAE,KAAK,IAAI,IAC9E;AAAA,IACJ;AAAA,IACA;AAAA,IACA,iBAAiB,kBAAkB,SAAS;AAAA,EAC9C;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,iBAAiB,QAAuB,MAAiD;AAChG,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,IAAI,CAAC,UAAU,gBAAgB,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI;AACtE;AAEA,SAAS,gBAAgB,OAAoB,MAAiD;AAC5F,QAAM,SAAS;AAAA,IACb,QAAQ,MAAM,QAAQ;AAAA,IACtB,MAAM,WAAW,SAAS,IAAI,UAAU,MAAM,WAAW,KAAK,GAAG,CAAC,KAAK;AAAA,IACvE,MAAM,MAAM,SAAS,IAAI,SAAS,MAAM,MAAM,KAAK,GAAG,CAAC,KAAK;AAAA,IAC5D,MAAM,UAAU,SAAS,IAAI,SAAS,MAAM,UAAU,KAAK,GAAG,CAAC,KAAK;AAAA,IACpE,MAAM,OAAO,SAAS,IAAI,UAAU,MAAM,OAAO,KAAK,GAAG,CAAC,KAAK;AAAA,IAC/D,MAAM,MAAM,SAAS,SAAS,IAAI,YAAY,MAAM,MAAM,SAAS,KAAK,GAAG,CAAC,KAAK;AAAA,IACjF,MAAM,MAAM,aAAa,SAAS,IAAI,gBAAgB,MAAM,MAAM,aAAa,KAAK,GAAG,CAAC,KAAK;AAAA,EAC/F,EAAE,OAAO,OAAO;AAChB,QAAM,cACJ,MAAM,SAAS,SAAS,SAAS,IAAI,aAAa,MAAM,SAAS,SAAS,KAAK,GAAG,CAAC,KAAK;AAC1F,QAAM,SAAS,SAAS,WAAW,eAAe,SAAS,aAAa,aAAa;AAErF,SAAO,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM,WAAW,KAAK,OAAO,KAAK,IAAI,CAAC,IAAI,WAAW;AAC3F;AAnDA,IAAAG,eAAA;AAAA;AAAA;AAAA;AAAA;;;ACgCO,SAAS,wBACd,KACA,QACA,gBACA,WACA,WACA,mBACA,eAAmC,CAAC,GACpC,mBACA,YACc;AACd,QAAM,eAAe,OAAO,aAAa,KAAK,IAAI;AAClD,QAAM,eAAe;AAAA,IACnB,eAAe;AAAA,IACf,qBAAqB;AAAA,MACnB,SAAS,CAAC;AAAA,MACV,aAAa,CAAC;AAAA,MACd,kBAAkB,CAAC;AAAA,MACnB,iBAAiB,CAAC;AAAA,MAClB,gBAAgB,CAAC;AAAA,MACjB,uBAAuB,CAAC;AAAA,MACxB,cAAc,CAAC;AAAA,MACf,kBAAkB,oBAAI,IAAY;AAAA,IACpC;AAAA,EACF;AACA,QAAM,oBACJ,eAAe,gBAAgB,KAAK,EAAE,SAAS,IAC3C,eAAe,kBACf;AACN,QAAM,iBAAiB,qBAAqB,SAAS;AACrD,QAAM,YAAY,gBAAgB,SAAS;AAC3C,QAAM,oBAAoB,6BAA6B,iBAAiB;AACxE,QAAM,kBAAkB,sBAAsB,UAAU;AACxD,QAAM,WAAW,aAAa;AAC9B,QAAM,aAAa,UAAU,SAAS;AACtC,QAAM,iBAAiB,aAAa,aAAa,KAAK,KAAK;AAC3D,QAAM,YAAY,aAAa,aAAa,KAAK,KAAK;AACtD,QAAM,gBAAgB,aAAa,iBAAiB,KAAK,KAAK;AAC9D,QAAM,kBAAkB,aAAa,mBAAmB,KAAK,KAAK;AAClE,QAAM,gBAAgB,aAAa,iBAAiB,KAAK,KAAK;AAC9D,QAAM,0BAA0B,aAAa,2BAA2B,KAAK,KAAK;AAClF,QAAM,cAAc;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,aACA,CAAC,IACD;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,aACA,CAAC,IACD;AAAA,MACE;AAAA,MACA;AAAA,IACF;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,oBACJ,OAAO,SAAS,UACZ;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,EACF;AACN,QAAM,gBACJ,UAAU,SAAS,aACf;AAAA,IACE,uBAAuB,SAAS,IAAI,qBAAqB,SAAS,QAAQ,SAAS;AAAA,IACnF;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA,UAAU,SAAS,aACnB;AAAA,IACE,uBAAuB,SAAS,IAAI,gBAAgB,SAAS,QAAQ,YAAY;AAAA,IACjF,gBAAgB,SAAS,YAAY,SAAS;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,EACF;AAEN,QAAM,eAAe;AAAA,IACnB;AAAA,MACE;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,IACX,kBAAkB,mBAAmB,CAAC,UAAU,GAAG,aAAa,GAAG,mBAAmB,GAAG,aAAa,EAAE,KAAK,IAAI,CAAC;AAAA,IAClH,kBAAkB,wBAAwB,iBAAiB;AAAA,EAC7D;AAEA,QAAM,gBAAgB;AAAA,IACpB;AAAA,MACE;AAAA,MACA;AAAA,QACE,8BAA8B,GAAG;AAAA,QACjC,iBAAiB,eAAe,OAAO;AAAA,QACvC,uBAAuB,eAAe,YAAY;AAAA,QAClD,kBAAkB,YAAY;AAAA,QAC9B,SAAS,OAAO,IAAI;AAAA,QACpB,UAAU,OAAO,KAAK;AAAA,QACtB,UAAS,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,MACnC,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,IACA,CAAC,aACG,kBAAkB,yBAAyB,cAAc,IACzD;AAAA,IACJ,CAAC,aACG,kBAAkB,sBAAsB,SAAS,IACjD;AAAA,IACJ,CAAC,aACG,kBAAkB,sBAAsB,iBAAiB,IACzD;AAAA,IACJ,CAAC,aACG,kBAAkB,sBAAsB,eAAe,IACvD;AAAA,IACJ,CAAC,aACG,kBAAkB,yBAAyB,cAAc,IACzD;AAAA,IACJ,CAAC,aACG,kBAAkB,cAAc,SAAS,IACzC;AAAA,IACJ,CAAC,aACG,kBAAkB,kBAAkB,aAAa,IACjD;AAAA,IACJ,CAAC,aACG,kBAAkB,qBAAqB,aAAa,IACpD;AAAA,IACJ,CAAC,aACG,kBAAkB,uBAAuB,uBAAuB,IAChE;AAAA,IACJ,CAAC,aACG,kBAAkB,mBAAmB,eAAe,IACpD;AAAA,IACJ,kBAAkB,uBAAuB,YAAY;AAAA,EACvD,EAAE,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBACd,cACA,SACc;AACd,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,cAAc,CAAC,GAAI,aAAa,gBAAgB,CAAC,GAAI,OAAO;AAAA,EAC9D;AACF;AAEO,SAAS,mBAAmB,cAAoC;AACrE,QAAM,WAAW;AAAA,IACf;AAAA,IACA,WAAW,aAAa,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,IACA,WAAW,aAAa,aAAa;AAAA,EACvC;AAEA,OAAK,aAAa,gBAAgB,CAAC,GAAG,SAAS,GAAG;AAChD,aAAS,KAAK,IAAI,mCAAmC,WAAW,aAAa,gBAAgB,CAAC,CAAC,CAAC;AAAA,EAClG;AAEA,SAAO,SAAS,KAAK,IAAI,EAAE,KAAK;AAClC;AAEA,SAAS,kBAAkB,OAAe,SAAyB;AACjE,SAAO,GAAG,KAAK;AAAA,EAAM,OAAO;AAC9B;AAEA,SAAS,WAAW,QAA0B;AAC5C,SAAO,OAAO,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,MAAM;AACtE;AArPA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA,IAAAC;AAAA;AAAA;;;ACFO,SAAS,mBACd,UACA,KACA,UACQ;AACR,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,YAAsB,CAAC;AAE7B,mBAAa,WAAW,MAAM,WAAW,OAAO,EAAE,CAAC;AACnD,mBAAa,WAAW,QAAQ,WAAW,OAAO,IAAI,CAAC;AACvD,mBAAa,WAAW,gBAAgB,gBAAgB,OAAO,YAAY,CAAC;AAC5E,mBAAa,WAAW,eAAe,WAAW,OAAO,WAAW,CAAC;AACrE,mBAAa,WAAW,QAAQ,WAAW,OAAO,IAAI,CAAC;AACvD,mBAAa,WAAW,iBAAiB,WAAW,OAAO,aAAa,CAAC;AACzE,mBAAa,WAAW,UAAU,WAAW,OAAO,MAAM,CAAC;AAC3D,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,CAAC;AACzD,mBAAa,WAAW,YAAY,WAAW,OAAO,QAAQ,CAAC;AAC/D,mBAAa,WAAW,UAAU,WAAW,OAAO,MAAM,CAAC;AAC3D,mBAAa,WAAW,UAAU,WAAW,OAAO,MAAM,CAAC;AAC3D,mBAAa,WAAW,iBAAiB,WAAW,OAAO,aAAa,CAAC;AACzE,mBAAa,WAAW,iBAAiB,WAAW,OAAO,aAAa,CAAC;AACzE,mBAAa,WAAW,QAAQ,WAAW,OAAO,IAAI,CAAC;AACvD,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,CAAC;AACzD,mBAAa,WAAW,QAAQ,WAAW,OAAO,IAAI,CAAC;AACvD,mBAAa,WAAW,aAAa,WAAW,OAAO,SAAS,CAAC;AACjE,mBAAa,WAAW,WAAW,oBAAoB,OAAO,OAAO,KAAK,WAAW,OAAO,YAAY,CAAC;AACzG,mBAAa,WAAW,WAAW,oBAAoB,OAAO,OAAO,KAAK,WAAW,OAAO,YAAY,CAAC;AACzG,mBAAa,WAAW,UAAU,oBAAoB,OAAO,MAAM,KAAK,WAAW,OAAO,WAAW,CAAC;AACtG,mBAAa,WAAW,YAAY,WAAW,OAAO,QAAQ,CAAC;AAC/D,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,CAAC;AACzD,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,UAAU,CAAC;AAC1F,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,KAAK,WAAW,OAAO,UAAU,CAAC;AAC1F,mBAAa,WAAW,YAAY,WAAW,OAAO,QAAQ,CAAC;AAC/D,mBAAa,WAAW,kBAAkB,WAAW,OAAO,cAAc,CAAC;AAC3E,mBAAa,WAAW,wBAAwB,WAAW,OAAO,oBAAoB,CAAC;AACvF,mBAAa,WAAW,YAAY,WAAW,OAAO,QAAQ,CAAC;AAC/D,mBAAa,WAAW,SAAS,WAAW,OAAO,KAAK,CAAC;AACzD,mBAAa,WAAW,aAAa,WAAW,OAAO,SAAS,CAAC;AACjE,mBAAa,WAAW,UAAU,WAAW,OAAO,MAAM,CAAC;AAC3D,mBAAa,WAAW,QAAQ,WAAW,OAAO,IAAI,CAAC;AACvD,mBAAa,WAAW,UAAU,WAAW,OAAO,MAAM,CAAC;AAC3D,mBAAa,WAAW,YAAY,WAAW,OAAO,QAAQ,CAAC;AAC/D,mBAAa,WAAW,SAAS,oBAAoB,OAAO,KAAK,CAAC;AAClE,mBAAa,WAAW,WAAW,oBAAoB,OAAO,OAAO,CAAC;AACtE,mBAAa,WAAW,YAAY,oBAAoB,OAAO,QAAQ,CAAC;AACxE,mBAAa,WAAW,QAAQ,oBAAoB,OAAO,IAAI,CAAC;AAChE,mBAAa,WAAW,UAAU,oBAAoB,OAAO,MAAM,CAAC;AACpE,mBAAa,WAAW,aAAa,oBAAoB,OAAO,SAAS,CAAC;AAC1E,mBAAa,WAAW,WAAWC,UAASC,SAAQ,WAAW,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG,CAAC;AAC3F,mBAAa,WAAW,WAAWD,UAASC,SAAQ,WAAW,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG,CAAC;AAC3F,mBAAa,WAAW,WAAWD,UAASC,SAAQ,WAAW,OAAO,OAAO,KAAK,EAAE,GAAG,GAAG,CAAC;AAC3F,mBAAa,WAAW,iBAAiB,oBAAoB,OAAO,aAAa,CAAC;AAElF,YAAM,UAAU,UAAU,OAAO,OAAO,EAAE,KAAK,IAAI;AACnD,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAOD,UAAS,SAAS,QAAQ;AAAA,MACnC;AAAA,IACF;AAAA,EACF,QAAQ;AACN,QAAI,YAAY,IAAI,KAAK,EAAE,WAAW,GAAG,GAAG;AAC1C,aAAOA,UAAS,GAAG,QAAQ,mCAAmC,QAAQ;AAAA,IACxE;AAAA,EACF;AAEA,SAAOA,UAASC,SAAQ,GAAG,GAAG,QAAQ;AACxC;AAEO,SAAS,wBAAwB,KAAa,UAA0B;AAC7E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAOD,UAAS,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,SAASC,SAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI,GAAG,QAAQ;AAAA,IACtG;AAEA,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,YAAM,SAAS;AAEf,YAAM,iBAAiB,qBAAqB,OAAO,OAAO;AAC1D,UAAI,gBAAgB;AAClB,eAAOD,UAAS,gBAAgB,QAAQ;AAAA,MAC1C;AAEA,YAAM,iBAAiB,qBAAqB,OAAO,OAAO;AAC1D,UAAI,gBAAgB;AAClB,eAAOA,UAAS,gBAAgB,QAAQ;AAAA,MAC1C;AAEA,iBAAW,OAAO,sBAAsB;AACtC,cAAM,QAAQ,OAAO,GAAG;AACxB,YAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,iBAAOA,UAAS,eAAe,KAAK,GAAG,QAAQ;AAAA,QACjD;AAAA,MACF;AAEA,YAAM,gBAAgBC,SAAQ,KAAK,UAAU,MAAM,CAAC;AACpD,UAAI,cAAc,SAAS,GAAG;AAC5B,eAAOD,UAAS,eAAe,QAAQ;AAAA,MACzC;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAOA,UAAS,eAAe,GAAG,GAAG,QAAQ;AAC/C;AAEO,SAAS,+BAA+B,KAAa,UAA0B;AACpF,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,OAAO,gBAAgB,UAAU;AAC5G,YAAM,YAAqC,CAAC;AAE5C,iBAAW,WAAW,QAAQ,cAAc;AAC5C,iBAAW,WAAW,QAAQ,MAAM;AACpC,iBAAW,WAAW,QAAQ,aAAa;AAC3C,iBAAW,WAAW,QAAQ,YAAY;AAC1C,iBAAW,WAAW,QAAQ,YAAY;AAC1C,iBAAW,WAAW,QAAQ,IAAI;AAClC,iBAAW,WAAW,QAAQ,MAAM;AACpC,iBAAW,WAAW,QAAQ,eAAe;AAC7C,iBAAW,WAAW,QAAQ,QAAQ;AACtC,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,cAAc;AAC5C,iBAAW,WAAW,QAAQ,cAAc;AAC5C,iBAAW,WAAW,QAAQ,aAAa;AAC3C,iBAAW,WAAW,QAAQ,UAAU;AACxC,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,OAAO;AACrC,iBAAW,WAAW,QAAQ,WAAW;AACzC,iBAAW,WAAW,QAAQ,QAAQ;AACtC,iBAAW,WAAW,QAAQ,MAAM;AACpC,iBAAW,WAAW,QAAQ,QAAQ;AACtC,iBAAW,WAAW,QAAQ,UAAU;AACxC,iBAAW,WAAW,QAAQ,QAAQ;AAEtC,YAAM,UAAU,WAAW,OAAO,OAAO;AACzC,UAAI,SAAS;AACX,kBAAU,UAAUA,UAASC,SAAQ,OAAO,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,WAAW,IAAI,CAAC,CAAC;AAAA,MAC3F;AAEA,YAAM,UAAU,WAAW,OAAO,OAAO;AACzC,UAAI,SAAS;AACX,kBAAU,UAAUD;AAAA,UAClB,eAAe,OAAO;AAAA,UACtB,KAAK,IAAI,IAAI,KAAK,MAAM,WAAW,IAAI,CAAC;AAAA,QAC1C;AAAA,MACF;AAEA,UAAI,gBAAgB,KAAK,UAAU,WAAW,MAAM,CAAC;AACrD,UAAI,cAAc,UAAU,UAAU;AACpC,eAAO;AAAA,MACT;AAEA,aAAO,UAAU;AACjB,sBAAgB,KAAK,UAAU,WAAW,MAAM,CAAC;AACjD,UAAI,cAAc,UAAU,UAAU;AACpC,eAAO;AAAA,MACT;AAEA,aAAO,UAAU;AACjB,sBAAgB,KAAK,UAAU,WAAW,MAAM,CAAC;AACjD,UAAI,cAAc,UAAU,UAAU;AACpC,eAAO;AAAA,MACT;AAEA,aAAO,KAAK;AAAA,QACV;AAAA,UACE,cAAc,OAAO,iBAAiB;AAAA,UACtC,aAAa,OAAO;AAAA,UACpB,SAASA,UAASC,SAAQ,WAAW,OAAO,OAAO,KAAK,EAAE,GAAG,KAAK,IAAI,IAAI,WAAW,EAAE,CAAC;AAAA,QAC1F;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,mBAAmB,QAAW,KAAK,QAAQ;AACpD;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,aAAa,WAAW,OAAO,IAAI;AACzC,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,KAAK,MAAM,OAAO,IAAI,IAAI;AACzE,UAAM,OAAO,WAAW,OAAO,IAAI;AACnC,QAAI,CAAC,cAAc,CAAC,MAAM;AACxB,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,cAAc,SAAS,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE,IAAI,QAAQ,EAAE,GAAG,KAAK;AAAA,EAClF,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,aAAa,WAAW,OAAO,IAAI;AACzC,UAAM,OAAO,WAAW,OAAO,IAAI;AACnC,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,WAAO,OAAO,GAAG,IAAI,IAAI,UAAU,KAAK;AAAA,EAC1C,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,SAAS,IAAI,EAAE,KAAK;AAC3C;AAEA,SAASA,SAAQ,OAAuB;AACtC,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAASD,UAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAEA,SAAS,WAAW,OAAoC;AACtD,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,SAAS;AAC1B;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,MAAM,MAAM;AAC5B;AAEA,SAAS,aAAa,WAAqB,KAAa,OAAiC;AACvF,MAAI,CAAC,OAAO;AACV;AAAA,EACF;AAEA,YAAU,KAAK,GAAG,GAAG,IAAI,KAAK,EAAE;AAClC;AAEA,SAAS,WACP,QACA,QACA,KACM;AACN,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;AAjTA,IAAM;AAAN;AAAA;AAAA;AAAA,IAAM,uBAAuB,CAAC,WAAW,mBAAmB,WAAW,QAAQ;AAAA;AAAA;;;ACwBxE,SAAS,oBACd,cACA,UACA,QAIqB;AACrB,QAAM,eAAe,KAAK,IAAI,KAAO,OAAO,eAAe;AAC3D,MAAI,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,QAAQ,OAAO,qBAAqB,CAAC;AAEnF,SAAO,MAAM;AACX,UAAM,eAAe,kBAAkB,UAAU,SAAS;AAC1D,UAAM,gBAAgB,SAAS,MAAM,GAAG,KAAK,IAAI,GAAG,SAAS,SAAS,aAAa,MAAM,CAAC;AAC1F,UAAM,UACJ,cAAc,SAAS,IACnB,sBAAsB,eAAe,OAAO,mBAAmB,IAC/D;AACN,UAAM,gBAAgB,cAAc,cAAc,OAAO;AAEzD,QAAI,cAAc,oBAAoB,cAAc,KAAK;AACzD,QAAI,kBAAkB,oBAAoB,eAAe,aAAa,OAAO,KAAK;AAClF,QAAI,iBAAiB,0BAA0B,eAAe;AAE9D,QAAI,kBAAkB,cAAc;AAClC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY,QAAQ,OAAO;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,kBAAc,oBAAoB,cAAc,IAAI;AACpD,sBAAkB,oBAAoB,eAAe,aAAa,OAAO,KAAK;AAC9E,qBAAiB,0BAA0B,eAAe;AAE1D,QAAI,kBAAkB,cAAc;AAClC,aAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,YAAY,mBAAmB;AACjC,kBAAY,KAAK,IAAI,mBAAmB,YAAY,CAAC;AACrD;AAAA,IACF;AAEA,UAAM,kBAAkB,UACpBE,UAAS,SAAS,KAAK,IAAI,MAAO,KAAK,MAAM,OAAO,sBAAsB,GAAG,CAAC,CAAC,IAC/E;AACJ,UAAM,eAAe,kBAAkB,UAAU,iBAAiB;AAClE,UAAM,mBAAmB;AAAA,MACvB,cAAc,cAAc,eAAe;AAAA,MAC3C,oBAAoB,cAAc,IAAI;AAAA,MACtC,OAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,gBAAgB,0BAA0B,gBAAgB;AAAA,MAC1D,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAA2B,WAAoC;AACxF,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,aAAa,KAAK,IAAI,GAAG,SAAS,SAAS,SAAS;AAC1D,QAAM,iBAAiB,0BAA0B,UAAU,UAAU;AACrE,SAAO,SAAS,MAAM,cAAc;AACtC;AAEA,SAAS,oBACP,cACA,UACA,OAC8B;AAC9B,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS,mBAAmB,YAAY;AAAA,IAC1C;AAAA,IACA,GAAG,SAAS;AAAA,MAAI,CAAC,SAAS,UACxB,cAAc,SAAS;AAAA,QACrB,kBAAkB,sCAAsC,UAAU,OAAO,KAAK;AAAA,MAChF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAA2B,YAAsC;AAC5F,QAAM,iBAAiB,KAAK,IAAI,GAAG,SAAS,SAAS,wBAAwB;AAE7E,SAAO,SAAS,IAAI,CAAC,SAAS,UAAU;AACtC,QAAI,SAAS,gBAAgB;AAC3B,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,mBAAmB,QAAQ,MAAM,QAAQ,WAAW,IAAI,aAAa,MAAM,GAAG;AAAA,MACzF;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,aAAa;AAChC,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAASA,UAAS,QAAQ,WAAW,IAAI,aAAa,MAAM,GAAG;AAAA,QAC/D,kBAAkB,+BAA+B,UAAU,KAAK,IAC5D,QAAQ,mBACR;AAAA,MACN;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,QAAQ;AAC3B,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAASA,UAAS,QAAQ,WAAW,IAAI,aAAa,MAAM,GAAG;AAAA,MACjE;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,sBAAsB,UAA2B,UAA0B;AAClF,QAAM,eAAyB,CAAC;AAChC,QAAM,aAAa,sBAAsB,QAAQ;AACjD,MAAI,aAAa;AAEjB,aAAW,WAAW,YAAY;AAChC,UAAM,OAAO,uBAAuB,OAAO;AAC3C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,IAAI;AAC1B,QAAI,aAAa,SAAS,QAAQ,GAAG;AACnC;AAAA,IACF;AAEA,UAAM,YAAY,aAAa,SAAS,SAAS;AACjD,QAAI,YAAY,UAAU;AACxB;AAAA,IACF;AAEA,iBAAa,KAAK,QAAQ;AAC1B,iBAAa;AAAA,EACf;AAEA,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,KAAK,IAAI;AAC/B;AAEA,SAAS,sBAAsB,UAA4C;AACzE,QAAM,YAAY,SAAS,KAAK,CAAC,YAAY,QAAQ,SAAS,MAAM;AACpE,QAAM,SAAS,SAAS,MAAM,CAAC,yBAAyB;AAExD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,WAAW,GAAG,OAAO,OAAO,CAAC,YAAY,YAAY,SAAS,CAAC;AACzE;AAEA,SAAS,uBAAuB,SAAgC;AAC9D,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,eAAeA,UAASC,SAAQ,QAAQ,WAAW,EAAE,GAAG,GAAG,CAAC;AAAA,EACrE;AAEA,MAAI,QAAQ,SAAS,eAAe,QAAQ,YAAY,QAAQ;AAC9D,UAAM,QAAQ,QAAQ,WAAW,IAAI,CAAC,aAAa,SAAS,SAAS,IAAI,EAAE,KAAK,IAAI;AACpF,UAAM,UAAUD,UAASC,SAAQ,QAAQ,WAAW,EAAE,GAAG,GAAG;AAC5D,WAAO,UACH,4BAA4B,KAAK,eAAe,OAAO,KACvD,4BAA4B,KAAK;AAAA,EACvC;AAEA,MAAI,QAAQ,SAAS,aAAa;AAChC,WAAO,mBAAmBD,UAASC,SAAQ,QAAQ,WAAW,EAAE,GAAG,GAAG,CAAC;AAAA,EACzE;AAEA,MAAI,QAAQ,SAAS,QAAQ;AAC3B,WAAO,QAAQ,QAAQ,QAAQ,SAAS,cAAc;AAAA,MACpD,QAAQ;AAAA,MACR,QAAQ,WAAW;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,0BAA0B,UAAgD;AACjF,SAAO,SAAS,OAAO,CAAC,OAAO,YAAY,QAAQ,KAAK,UAAU,OAAO,EAAE,QAAQ,CAAC;AACtF;AAEA,SAAS,cAAc,cAAqC,SAAoD;AAC9G,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,iBAAiB,UAAU;AACpC,WAAO,GAAG,YAAY;AAAA;AAAA;AAAA,EAAwC,OAAO;AAAA,EACvE;AAEA,SAAO,mBAAmB,cAAc,OAAO;AACjD;AAEA,SAAS,mBAAmB,cAA6C;AACvE,SAAO,OAAO,iBAAiB,WAAW,eAAe,mBAAmB,YAAY;AAC1F;AAEA,SAASA,SAAQ,OAAuB;AACtC,SAAO,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACzC;AAEA,SAASD,UAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAnQA,IAaM,mBACA,0BACA;AAfN;AAAA;AAAA;AAEA;AAMA;AACA;AAIA,IAAM,oBAAoB;AAC1B,IAAM,2BAA2B;AACjC,IAAM,4BAA4B;AAAA;AAAA;;;ACG3B,SAAS,4BAA4B,aAAsB,UAA2B;AAC3F,SAAO,eAAe,CAAC,oBAAoB,IAAI,QAAQ;AACzD;AAEO,SAAS,2BAA2B,QAAoH;AAC7J,SAAO,CAAC,OAAO,6BAA6B,CAAC,OAAO,8BAA8B,OAAO,aAAa,SAAS;AACjH;AAEO,SAAS,uCAAuC,QAAiC;AACtF,SACE,OAAO,SAAS,SAAS,UACzB,mBAAmB,OAAO,QAAQ,SAAS,KAC3C,CAAC,2BAA2B,MAAM,KAClC,qBAAqB,MAAM;AAE/B;AAEO,SAAS,iCACd,aACA,QAC0B;AAC1B,MAAI,CAAC,yBAAyB,MAAM,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,sBAAsB,CAAC,mBAAmB,OAAO,QAAQ,SAAS;AACxE,SAAO,YAAY,OAAO,CAAC,SAAS;AAClC,UAAM,OAAO,KAAK,SAAS;AAC3B,QAAI,yBAAyB,IAAI,IAAI,GAAG;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,gBAAgB,qBAAqB;AAChD,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,yBACP,QACS;AACT,SACE,OAAO,aAAa,OAAO,MAC1B,OAAO,mBAAmB,cAAc,UAAU,KAAK,MACvD,OAAO,mBAAmB,YAAY,KAAK;AAEhD;AAEA,SAAS,qBACP,QACS;AACT,QAAM,wBAAwB,CAAC,uBAAuB,OAAO,iBAAiB;AAC9E,QAAM,2BACJ,OAAO,8BACP,OAAO,aAAa,OAAO,MAC1B,OAAO,mBAAmB,YAAY,KAAK;AAE9C,SAAO,yBAAyB;AAClC;AA9EA,IAMM,0BACA;AAPN;AAAA;AAAA;AAAA;AACA;AAKA,IAAM,2BAA2B,oBAAI,IAAI,CAAC,aAAa,YAAY,aAAa,CAAC;AACjF,IAAM,sBAAsB,oBAAI,IAAI,CAAC,GAAG,0BAA0B,YAAY,CAAC;AAAA;AAAA;;;ACGxE,SAAS,kCAAkC,OAKnB;AAC7B,MAAI,CAAC,MAAM,YAAY,MAAM,aAAa,aAAa;AACrD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,YAAY,MAAM,OAAO;AAC5C,QAAM,uBAAuB,cAAc,UAAU;AACrD,QAAM,yBAAyB,MAAM,aAAa,IAAI,aAAa;AACnE,MAAI,CAAC,wBAAwB,CAAC,mBAAmB,sBAAsB,sBAAsB,GAAG;AAC9F,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,8BAA8B,oBAAoB,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS,aAAa,UAAU;AAAA,IAChC,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,yBAAyB,SAIvC;AACA,SAAO;AAAA,IACL,sBAAsB,QAAQ,mBAAmB,YAAY,KAAK;AAAA,IAClE,kBAAkB,QAAQ,mBAAmB,WAAW;AAAA,IACxD,sBAAsB,uBAAuB,QAAQ,iBAAiB;AAAA,EACxE;AACF;AAEA,eAAsB,2BAA2B,OAGT;AACtC,MAAI,MAAM,aAAa,WAAW,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,aAAW,eAAe,MAAM,cAAc;AAC5C,UAAM,iBAAiB,cAAc,WAAW;AAChD,QAAI,CAAC,8BAA8B,cAAc,GAAG;AAClD,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,kBAAAE,QAAK,WAAW,WAAW,IAAI,cAAc,kBAAAA,QAAK,QAAQ,MAAM,KAAK,WAAW;AACrG,QAAI;AACF,YAAM,OAAO,MAAM,iBAAAC,QAAG,KAAK,YAAY;AACvC,UAAI,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,GAAG;AACpC,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,SAAS,iBAAiB,MAAM,aAAa,KAAK,IAAI,CAAC;AAAA,IACvD,UAAU;AAAA,IACV,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,YAAY,SAAgC;AACnD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,OAA8B;AACnD,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,UAAU,EAAE,EAAE,KAAK,EAAE,YAAY;AAC1F;AAEA,SAAS,mBAAmB,YAAoB,cAAiC;AAC/E,SAAO,aAAa,KAAK,CAAC,gBAAgB,gBAAgB,cAAc,YAAY,SAAS,IAAI,UAAU,EAAE,CAAC;AAChH;AAEA,SAAS,8BAA8B,OAAwB;AAC7D,QAAM,YAAY,kBAAAD,QAAK,MAAM,QAAQ,KAAK;AAC1C,MAAI,CAAC,oCAAoC,IAAI,SAAS,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,MAAM,GAAG,EAAE,KAAK,OAAO;AAClD,SAAO,CAAC,gBAAgB,CAAC,6BAA6B,IAAI,YAAY;AACxE;AA/GA,IAAAE,kBACAC,mBAMM,qCACA;AARN;AAAA;AAAA;AAAA,IAAAD,mBAAe;AACf,IAAAC,oBAAiB;AAEjB;AAIA,IAAM,sCAAsC,oBAAI,IAAI,CAAC,OAAO,MAAM,CAAC;AACnE,IAAM,+BAA+B,oBAAI,IAAI,CAAC,YAAY,eAAe,QAAQ,WAAW,OAAO,OAAO,CAAC;AAAA;AAAA;;;ACc3G,eAAsB,iCACpB,QAWA;AACA,QAAM,mBAAmB,cAAc,aAAa,OAAO,SAAS,WAAW,IAAI;AAAA,IACjF,kBAAkB,OAAO,SAAS;AAAA,EACpC,CAAC;AACD,QAAM,uBAAuB,uBAAuB,OAAO,iBAAiB;AAC5E,QAAM,2BAA2B,2BAA2B,OAAO,iBAAiB;AACpF,QAAM,uBAAuB,OAAO,mBAAmB,YAAY,KAAK;AACxE,QAAM,mBAAmB,OAAO,mBAAmB,WAAW;AAC9D,QAAM,uBAAuB,2BAA2B;AAAA,IACtD,cAAc,OAAO;AAAA,IACrB,2BAA2B,OAAO;AAAA,IAClC,4BAA4B,OAAO;AAAA,EACrC,CAAC;AACD,QAAM,wBAAwB,uCAAuC;AAAA,IACnE,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,IAChB,cAAc,OAAO;AAAA,IACrB,2BAA2B,OAAO;AAAA,IAClC,4BAA4B,OAAO;AAAA,IACnC,mBAAmB,OAAO;AAAA,EAC5B,CAAC;AAED,MAAI,wBAAwB,CAAC,qBAAqB;AAChD,UAAM,mBAAmB,MAAM,2BAA2B;AAAA,MACxD,KAAK,OAAO,QAAQ;AAAA,MACpB,cAAc,OAAO,mBAAmB,gBAAgB,CAAC;AAAA,IAC3D,CAAC;AACD,QAAI,kBAAkB;AACpB,YAAMC,WAAU,MAAM,OAAO,QAAQ,aAAa,KAAK;AAAA,QACrD,GAAG,OAAO;AAAA,QACV,mBAAmB,0BAA0B,OAAO,QAAQ,mBAAmB,gBAAgB;AAAA,MACjG,CAAC;AACD,aAAO,iCAAiC;AAAA,QACtC,GAAG;AAAA,QACH,SAAAA;AAAA,QACA,mBAAmBA,SAAQ;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,0BAA0B;AAC5B,UAAMA,WAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,OAAO,SAAS,CAAC,gBAAgB,CAAC;AACnG,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,QACN,SAAAA;AAAA,QACA,cAAc,CAAC,GAAG,OAAO,YAAY;AAAA,QACrC,uBAAuB;AAAA,QACvB,oBAAoB;AAAA,QACpB,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,aAAa,OAAO,mBAAmB;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MACE,OAAO,SAAS,SAAS,UACzB,mBAAmB,OAAO,QAAQ,SAAS,KAC3C,CAAC,wBACD,CAAC,uBACD;AACA,UAAMA,WAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,OAAO,SAAS;AAAA,MAC/E;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,WAAW,WAAW,iEAAiE;AACtG,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAAA;AAAA,MACA,4BAA4B,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,MAAI,wBAAwB,CAAC,qBAAqB;AAChD,UAAM,iBAAiB,OAAO,aAAa,OAAO,IAC9C,KAAK,CAAC,GAAG,OAAO,YAAY,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,MACpD;AACJ,UAAM,WAAW,OAAO,6BACpB,gCAAgC,cAAc,mDAC9C,wBAAwB,cAAc;AAC1C,UAAM,oBAAoB,yBAAyB,OAAO,QAAQ,iBAAiB;AACnF,UAAM,cAAc,MAAM,OAAO,QAAQ,aAAa,KAAK;AAAA,MACzD,GAAG,OAAO;AAAA,MACV;AAAA,IACF,CAAC;AACD,QAAI,2BAA2B,iBAAiB,GAAG;AACjD,YAAMA,WAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,aAAa,CAAC,gBAAgB,CAAC;AAChG,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,SAAAA;AAAA,UACA,cAAc,CAAC,GAAG,OAAO,YAAY;AAAA,UACrC,uBAAuB;AAAA,UACvB,oBAAoB;AAAA,UACpB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,aAAa,kBAAkB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAEA,UAAMA,WAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,aAAa;AAAA,MAC5E;AAAA,MACA,cAAc,QAAQ,uBAAuB,QAAQ,CAAC;AAAA,IACxD,CAAC;AACD,WAAO,QAAQ,WAAW,WAAW,uEAAuE;AAC5G,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAAA;AAAA,MACA,4BAA4B;AAAA,IAC9B;AAAA,EACF;AAEA,MAAI,wBAAwB,uBAAuB,CAAC,kBAAkB;AACpE,UAAMA,WAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,OAAO,SAAS;AAAA,MAC/E;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,WAAW,WAAW,+DAA+D;AACpG,WAAO;AAAA,MACL,MAAM;AAAA,MACN,SAAAA;AAAA,MACA,4BAA4B;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,UAAU,MAAM,OAAO,QAAQ,aAAa;AAAA,IAChD;AAAA,MACE,MAAM,OAAO,QAAQ,aAAa,eAAe,OAAO,SAAS,CAAC,gBAAgB,CAAC;AAAA,IACrF;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,MACN;AAAA,MACA,cAAc,CAAC,GAAG,OAAO,YAAY;AAAA,MACrC,uBAAuB;AAAA,MACvB,oBAAoB;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,sBAA8B,WAAsC;AAC3G,SAAO,UAAU,SAAS,KAAK,wBAAwB,KAAK,uBAAuB,MAAM;AAC3F;AAEO,SAAS,uBAAuB,UAA6B,SAA+B;AACjG,MAAI,SAAS,oBAAoB,QAAQ,OAAO,iBAAiB,CAAC,SAAS,0BAA0B;AACnG,YAAQ,WAAW,cAAc,SAAS,gBAAgB;AAAA,EAC5D;AACF;AAEO,SAAS,yBAAyB,UAA6B,SAA+B;AACnG,MAAI,SAAS,WAAW,CAAC,SAAS,0BAA0B;AAC1D,YAAQ,WAAW,kBAAkB,SAAS,OAAO;AAAA,EACvD;AAEA,MAAI,SAAS,SAAS;AACpB,YAAQ,WAAW,kBAAkB,SAAS,OAAO;AAAA,EACvD;AACF;AA/MA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AAAA;;;ACFO,SAAS,2BAA2B,UAAgD;AACzF,QAAM,oBAAoBC,eAAc,SAAS,OAAO;AACxD,MAAI,mBAAmB;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,SAAS,UAAU,SAAS,GAAG;AACjC,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,mBAAmB,sBAAsB,SAAS,gBAAgB;AACxE,MAAI,CAAC,kBAAkB;AACrB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,IACT,0BAA0B;AAAA,EAC5B;AACF;AAEA,SAAS,sBAAsB,kBAAqD;AAClF,QAAM,sBAAsBA,eAAc,gBAAgB;AAC1D,MAAI,CAAC,qBAAqB;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,oBAAoB,UAAU,gCAAgC,sBAAsB,mBAAmB,GAAG;AAC5G,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,oBACd,MAAM,IAAI,EACV,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,GAAG,EAAE;AAER,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,UAAU,gCAAgC,sBAAsB,QAAQ,GAAG;AACtF,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAwB;AACrD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,YAAY;AAChC,MACE,MAAM,WAAW,YAAY,KAC7B,MAAM,WAAW,WAAW,KAC5B,MAAM,WAAW,SAAS,KAC1B,MAAM,WAAW,SAAS,KAC1B,MAAM,WAAW,MAAM,KACvB,MAAM,SAAS,MAAM,KACrB,MAAM,SAAS,WAAW,GAC1B;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASA,eAAc,OAAiD;AACtE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,QAAQ,SAAS,IAAI,EAAE,KAAK;AACrD,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;AA1FA,IAEM;AAFN;AAAA;AAAA;AAEA,IAAM,+BAA+B;AAAA;AAAA;;;ACF9B,SAAS,iBAAiB,UAAU,qBAA4B;AACrE,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,QAAM,OAAO;AACb,EAAC,MAA4B,OAAO;AACpC,SAAO;AACT;AAEO,SAAS,aAAa,OAAyB;AACpD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,OAAO;AAC1B,QAAI,MAAM,SAAS,cAAc;AAC/B,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,OAAQ,MAA6B,QAAQ,EAAE;AAC5D,QAAI,SAAS,eAAe,SAAS,iBAAiB,SAAS,WAAW;AACxE,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAM,QAAQ,YAAY;AAC1C,QAAI,QAAQ,SAAS,OAAO,KAAK,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,WAAW,KAAK,QAAQ,SAAS,UAAU,GAAG;AAC7H,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,YAAY,SAAS,WAAW,OAAO;AAC1D,WAAO,aAAc,MAA8B,KAAK;AAAA,EAC1D;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAAiC,SAAwB;AACtF,MAAI,QAAQ,SAAS;AACnB,UAAM,iBAAiB,WAAW,mBAAmB;AAAA,EACvD;AACF;AAEO,SAAS,gBAAgB,IAAY,QAAqC;AAC/E,MAAI,CAAC,QAAQ;AACX,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,iBAAW,SAAS,EAAE;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,MAAI,OAAO,SAAS;AAClB,WAAO,QAAQ,OAAO,iBAAiB,eAAe,CAAC;AAAA,EACzD;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,QAAQ,WAAW,MAAM;AAC7B,aAAO,oBAAoB,SAAS,OAAO;AAC3C,cAAQ;AAAA,IACV,GAAG,EAAE;AAEL,UAAM,UAAU,MAAM;AACpB,mBAAa,KAAK;AAClB,aAAO,oBAAoB,SAAS,OAAO;AAC3C,aAAO,iBAAiB,eAAe,CAAC;AAAA,IAC1C;AAEA,WAAO,iBAAiB,SAAS,OAAO;AAAA,EAC1C,CAAC;AACH;AAlEA;AAAA;AAAA;AAAA;AAAA;;;ACSA,eAAsB,eAAkB,WAA6B,aAAuC;AAC1G,MAAI;AAEJ,WAAS,UAAU,GAAG,WAAW,iBAAiB,WAAW,GAAG;AAC9D,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,SAAS,OAAO;AACd,UAAI,aAAa,KAAK,GAAG;AACvB,cAAM;AAAA,MACR;AAEA,kBAAY;AACZ,UAAI,CAAC,oBAAoB,KAAK,KAAK,YAAY,iBAAiB;AAC9D;AAAA,MACF;AAEA,YAAM,gBAAgB,0BAA0B,SAAS,WAAW;AAAA,IACtE;AAAA,EACF;AAEA,QAAM;AACR;AAEO,SAAS,oBAAoB,OAAyB;AAC3D,QAAM,SAAU,MAA8B;AAC9C,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,UAAU;AAAA,EACzE;AAEA,QAAM,UAAU,OAAQ,MAAgC,WAAW,KAAK,EAAE,YAAY;AACtF,SACE,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,SAAS,KAC1B,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,YAAY,KAC7B,QAAQ,SAAS,cAAc,KAC/B,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,aAAa,KAC9B,QAAQ,SAAS,YAAY,KAC7B,QAAQ,SAAS,YAAY;AAEjC;AAEO,SAAS,qBAAqB,OAAyB;AAC5D,QAAM,SAAU,MAA8B;AAC9C,QAAM,UAAU,OAAQ,MAAgC,WAAW,KAAK,EAAE,YAAY;AAEtF,SACE,WAAW,QACV,QAAQ,SAAS,qBAAqB,KACrC,QAAQ,SAAS,gBAAgB,KACjC,QAAQ,SAAS,gBAAgB,KACjC,QAAQ,SAAS,MAAM;AAE7B;AAEO,SAAS,qBAAqB,OAAyB;AAC5D,QAAM,SAAU,MAA8B;AAC9C,QAAM,UAAU,OAAQ,MAAgC,WAAW,KAAK,EAAE,YAAY;AAEtF,SACE,WAAW,QACV,QAAQ,SAAS,gBAAgB,KAChC,QAAQ,SAAS,wBAAwB,KACzC,QAAQ,SAAS,gBAAgB,KACjC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,YAAY;AAEnC;AAEO,SAAS,yBAAyB,OAAyB;AAChE,QAAM,UAAU,OAAQ,MAAgC,WAAW,KAAK,EAAE,YAAY;AAEtF,SACE,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,WAAW,KAC5B,QAAQ,SAAS,yBAAyB,KAC1C,QAAQ,SAAS,uBAAuB,KACxC,QAAQ,SAAS,wBAAwB;AAE7C;AAEO,SAAS,iCACd,UAC8B;AAC9B,SAAO,SAAS,IAAI,CAAC,SAAS,UAAU;AACtC,QAAI,UAAU,KAAK,QAAQ,SAAS,UAAU;AAC5C,YAAM,UAAU,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AACxE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SACE,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA,MAEd;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,YAAY,UAAU;AAClE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS,kBAAkB,QAAQ,OAAO;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;AAEO,SAAS,8BACd,UAC8B;AAC9B,QAAM,gBAAgB,SAAS,CAAC;AAChC,QAAM,OAAO,SAAS,MAAM,CAAC;AAC7B,QAAM,kBAAkB,oBAAoB,IAAI;AAChD,QAAM,YAAY,0BAA0B,MAAM,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;AAC/E,QAAM,cAAc,KAAK,MAAM,SAAS,EAAE,IAAI,CAAC,SAAS,OAAO,UAAU;AACvE,UAAM,cAAc,YAAY;AAChC,UAAM,WAAW,SAAS,KAAK,IAAI,GAAG,MAAM,SAAS,CAAC;AAEtD,QAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,YAAY,UAAU;AAClE,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,+BAA+B,QAAQ,SAAS,WAAW,MAAM,GAAG;AAAA,MAC/E;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,aAAa;AAChC,YAAM,SAAkC;AAAA,QACtC,GAAG;AAAA,MACL;AAEA,UAAI,OAAO,OAAO,YAAY,UAAU;AACtC,eAAO,UAAU,YAAY,OAAO,SAAS,WAAW,OAAQ,GAAG;AAAA,MACrE;AAEA,UAAI,eAAe,iBAAiB;AAClC,eAAO,OAAO;AAAA,MAChB;AAEA,aAAO;AAAA,IACT;AAEA,SAAK,QAAQ,SAAS,UAAU,QAAQ,SAAS,aAAa,OAAO,QAAQ,YAAY,UAAU;AACjG,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS,YAAY,QAAQ,SAAS,WAAW,MAAQ,GAAG;AAAA,MAC9D;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AAED,MAAI,CAAC,iBAAiB,cAAc,SAAS,UAAU;AACrD,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,MACE,GAAG;AAAA,MACH,SACE,OAAO,cAAc,YAAY,WAC7B,YAAY,cAAc,SAAS,IAAM,IACzC,cAAc;AAAA,IACtB;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEA,SAAS,kBAAkB,KAAqB;AAC9C,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,UAAM,WAAW,EAAE,GAAG,OAAO;AAE7B,QAAI,aAAa,UAAU;AACzB,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,aAAa,UAAU;AACzB,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,YAAY,UAAU;AACxB,eAAS,SAAS;AAAA,IACpB;AACA,QAAI,MAAM,QAAQ,SAAS,OAAO,GAAG;AACnC,eAAS,UAAU,SAAS,QAAQ,IAAI,CAAC,SAAS;AAChD,YAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,EAAE,GAAI,KAAiC;AACrD,YAAI,UAAU,OAAO;AACnB,gBAAM,OAAO;AAAA,QACf;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,aAAS,YAAY;AACrB,WAAO,KAAK,UAAU,UAAU,MAAM,CAAC;AAAA,EACzC,QAAQ;AACN,WAAO,KAAK;AAAA,MACV;AAAA,QACE,WAAW;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,OAAe,UAA0B;AAC5D,SAAO,MAAM,UAAU,WAAW,QAAQ,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACvE;AA7NA,IAMM,iBACA;AAPN;AAAA;AAAA;AAEA;AACA;AACA;AAEA,IAAM,kBAAkB;AACxB,IAAM,0BAA0B;AAAA;AAAA;;;ACchC,eAAsB,uBACpB,QACA,UACA,OACA,OACA,WACA,aACA,iBAC4B;AAC5B,MAAI;AACF,WAAO,MAAM,SAAS,QAAQ,UAAU,OAAO,OAAO,WAAW,OAAO,aAAa,eAAe;AAAA,EACtG,SAAS,OAAO;AACd,QAAI,aAAa,KAAK,GAAG;AACvB,YAAM;AAAA,IACR;AAEA,QAAI,UAAU,uBAAuB,OAAO,UAAU,yBAAyB,KAAK,GAAG;AACrF,aAAO,SAAS,QAAQ,UAAU,iBAAiB,OAAO,WAAW,MAAM,aAAa,eAAe;AAAA,IACzG;AAEA,QAAI,qBAAqB,KAAK,GAAG;AAC/B,YAAM,oBAAoB,8BAA8B,QAAQ;AAChE,aAAO,SAAS,QAAQ,mBAAmB,OAAO,OAAO,WAAW,OAAO,aAAa,eAAe;AAAA,IACzG;AAEA,QAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,YAAM;AAAA,IACR;AAEA,UAAM,oBAAoB,iCAAiC,QAAQ;AACnE,WAAO,SAAS,QAAQ,mBAAmB,OAAO,OAAO,WAAW,OAAO,aAAa,eAAe;AAAA,EACzG;AACF;AAEA,eAAe,SACb,QACA,UACA,OACA,OACA,WACA,eACA,aACA,iBAC4B;AAC5B,MAAI;AACF,WAAO,2BAA2B,MAAM;AAAA,MACtC,MAAM,gCAAgC,QAAQ,UAAU,OAAO,OAAO,WAAW,eAAe,aAAa,eAAe;AAAA,MAC5H;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,aAAa,KAAK,GAAG;AACvB,YAAM;AAAA,IACR;AAEA,WAAO,2BAA2B,MAAM;AAAA,MACtC,MAAM,mCAAmC,QAAQ,UAAU,OAAO,OAAO,eAAe,aAAa,eAAe;AAAA,MACpH;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,gCACb,QACA,UACA,OACA,OACA,WACA,eACA,aACA,iBAC4B;AAC5B,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI;AACJ,iBAAe,aAAa,2BAA2B;AACvD,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,KAAK,YAAY;AAAA,MAC3C;AAAA,QACE,GAAG,iBAAiB,OAAO,UAAU,OAAO,MAAM,aAAa;AAAA,QAC/D,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,aAAa,SAAS;AACxB,kBAAY,MAA0C;AACtD,YAAM,iBAAiB,mBAAmB;AAAA,IAC5C;AAEA,QAAI,UAAU;AACd,QAAI,mBAAmB;AACvB,UAAM,gBAAgB,oBAAI,IAA6D;AAEvF,qBAAiB,SAAS,QAgBtB;AACF,UAAI,aAAa,SAAS;AACxB,oBAAY,MAA0C;AACtD,cAAM,iBAAiB,mBAAmB;AAAA,MAC5C;AAEA,cAAQ,qBAAqB,MAAM,KAAK,KAAK;AAC7C,YAAM,QAAQ,MAAM,UAAU,CAAC,GAAG;AAClC,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,UAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,SAAS,GAAG;AACjE,mBAAW,MAAM;AACjB,mBAAW,mBAAmB,MAAM,OAAO;AAAA,MAC7C;AAEA,UAAI,OAAO,MAAM,sBAAsB,YAAY,MAAM,kBAAkB,SAAS,GAAG;AACrF,4BAAoB,MAAM;AAC1B,mBAAW,mBAAmB,MAAM,iBAAiB;AAAA,MACvD;AAEA,UAAI,MAAM,QAAQ,MAAM,UAAU,GAAG;AACnC,mBAAW,YAAY,MAAM,YAAY;AACvC,gBAAM,QAAQ,OAAO,SAAS,UAAU,WAAW,SAAS,QAAQ;AACpE,gBAAM,WAAW,cAAc,IAAI,KAAK,KAAK;AAAA,YAC3C,IAAI,SAAS,MAAM,QAAQ,KAAK;AAAA,YAChC,MAAM;AAAA,YACN,WAAW;AAAA,UACb;AAEA,cAAI,SAAS,IAAI;AACf,qBAAS,KAAK,SAAS;AAAA,UACzB;AAEA,cAAI,SAAS,UAAU,MAAM;AAC3B,qBAAS,QAAQ,SAAS,SAAS;AAAA,UACrC;AAEA,cAAI,SAAS,UAAU,WAAW;AAChC,qBAAS,aAAa,SAAS,SAAS;AAAA,UAC1C;AAEA,wBAAc,IAAI,OAAO,QAAQ;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS,QAAQ,SAAS,IAAI,UAAU;AAAA,MACxC,kBAAkB,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,MACnE,0BAA0B,QAAQ,SAAS;AAAA,MAC3C,0BAA0B,iBAAiB,SAAS;AAAA,MACpD,WAAW,CAAC,GAAG,cAAc,QAAQ,CAAC,EACnC,KAAK,CAAC,MAAM,UAAU,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,EACxC,IAAI,CAAC,CAAC,EAAE,QAAQ,OAAO;AAAA,QACtB,IAAI,SAAS;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,SAAS;AAAA,UACf,WAAW,SAAS;AAAA,QACtB;AAAA,MACF,EAAE;AAAA,IACN;AAAA,EACF,UAAE;AACA,sBAAkB;AAAA,MAChB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,mCACb,QACA,UACA,OACA,OACA,gBAAgB,OAChB,aACA,iBAC4B;AAC5B,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI;AACJ,iBAAe,aAAa,iBAAiB;AAC7C,MAAI;AACF,UAAM,aAAa,MAAM,OAAO,KAAK,YAAY;AAAA,MAC/C;AAAA,QACE,GAAG,iBAAiB,OAAO,UAAU,OAAO,OAAO,aAAa;AAAA,QAChE,QAAQ;AAAA,MACV;AAAA,IACF;AACA,YAAQ,qBAAsB,WAAmC,KAAK;AAEtE,UAAM,UAAU,WAAW,QAAQ,CAAC,GAAG;AACvC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,WAAO;AAAA,MACL,SACE,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU,qBAAqB,QAAQ,OAAO;AAAA,MAC9F,kBAAkB,qBAAqB,OAAO;AAAA,MAC9C,0BAA0B;AAAA,MAC1B,0BAA0B;AAAA,MAC1B,YAAY,QAAQ,cAAc,CAAC,GAChC,OAAO,CAAC,SAAwD,KAAK,SAAS,UAAU,EACxF,IAAI,CAAC,UAAU;AAAA,QACd,IAAI,KAAK;AAAA,QACT,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM,KAAK,SAAS;AAAA,UACpB,WAAW,KAAK,SAAS;AAAA,QAC3B;AAAA,MACF,EAAE;AAAA,IACN;AAAA,EACF,UAAE;AACA,sBAAkB;AAAA,MAChB,YAAY,KAAK,IAAI,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBACP,OACA,UACA,OACA,QACA,eACyB;AACzB,QAAM,OAAgC;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO,SAAS,SAAS;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,iBAAiB,UAAU,iBAAiB;AAC9C,SAAK,WAAW,EAAE,MAAM,UAAU;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,QAA4D;AAC/E,MAAI;AACF,YAAQ,YAAY,MAAM;AAAA,EAC5B,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,qBAAqB,OAAmD;AAC/E,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAUf,QAAM,WAAkC;AAAA,IACtC,aAAa,gBAAgB,OAAO,iBAAiB,OAAO,YAAY;AAAA,IACxE,cAAc,gBAAgB,OAAO,qBAAqB,OAAO,aAAa;AAAA,IAC9E,aAAa,gBAAgB,OAAO,YAAY;AAAA,IAChD,iBAAiB;AAAA,MACf,OAAO,2BAA2B,oBAClC,OAAO,uBAAuB;AAAA,IAChC;AAAA,EACF;AAEA,SAAO,OAAO,OAAO,QAAQ,EAAE,KAAK,CAAC,UAAU,OAAO,UAAU,QAAQ,IAAI,WAAW;AACzF;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,SAAS,IAAI,KAAK,MAAM,KAAK,IAAI;AACjG;AAvTA;AAAA;AAAA;AAMA;AACA;AACA;AASA;AAAA;AAAA;;;ACoBA,SAAS,uBAAuB,UAAkC;AAChE,SAAO,GAAG,SAAS,SAAS,IAAI,IAAI,kBAAkB,SAAS,SAAS,SAAS,CAAC;AACpF;AAEA,SAAS,kBAAkB,KAAqB;AAC9C,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,KAAK,UAAU,cAAc,MAAM,CAAC;AAAA,EAC7C,QAAQ;AACN,WAAO,IAAI,KAAK,EAAE,QAAQ,QAAQ,GAAG;AAAA,EACvC;AACF;AAEA,SAAS,cAAc,OAAyB;AAC9C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC;AAAA,EAChD;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EACjB,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,MAAM,KAAK,cAAc,KAAK,CAAC,EACnD,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,CAAC;AAAA,EACxD;AACF;AAhEA,IAEM,0BAEO;AAJb;AAAA;AAAA;AAEA,IAAM,2BAA2B;AAE1B,IAAM,gBAAN,MAAoB;AAAA,MACR,SAAS,oBAAI,IAAoB;AAAA,MAElD,QAAc;AACZ,aAAK,OAAO,MAAM;AAAA,MACpB;AAAA,MAEA,iBAAiB,UAAsD;AACrE,cAAM,YAAY,uBAAuB,QAAQ;AACjD,cAAM,aAAa,KAAK,OAAO,IAAI,SAAS,KAAK,KAAK;AACtD,aAAK,OAAO,IAAI,WAAW,SAAS;AAEpC,YAAI,aAAa,0BAA0B;AACzC,iBAAO;AAAA,QACT;AAEA,eAAO;AAAA,UACL,IAAI;AAAA,UACJ,QAAQ,KAAK;AAAA,YACX;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,+BAA+B,SAAS,SAAS,IAAI;AAAA,cAC5D,MAAM;AAAA,cACN,MAAM;AAAA,cACN,eAAe;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACfO,SAAS,0BAA0B,SAAqC;AAC7E,QAAM,aAAa,QAAQ,KAAK;AAChC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,KAAK,CAAC,UAAU,MAAM,MAAM,KAAK,UAAU,CAAC,GAAG;AAC5E;AA3BA,IAAM;AAAN;AAAA;AAAA;AAAA,IAAM,sBAGD;AAAA,MACH,EAAE,MAAM,aAAa,OAAO,qDAAqD;AAAA,MACjF,EAAE,MAAM,aAAa,OAAO,8CAA8C;AAAA,MAC1E,EAAE,MAAM,qBAAqB,OAAO,6FAA6F;AAAA,MACjI,EAAE,MAAM,iBAAiB,OAAO,sCAAsC;AAAA,MACtE,EAAE,MAAM,cAAc,OAAO,mCAAmC;AAAA,MAChE,EAAE,MAAM,aAAa,OAAO,sCAAsC;AAAA,MAClE,EAAE,MAAM,YAAY,OAAO,+BAA+B;AAAA,MAC1D,EAAE,MAAM,cAAc,OAAO,uCAAuC;AAAA,MACpE,EAAE,MAAM,aAAa,OAAO,gCAAgC;AAAA,MAC5D,EAAE,MAAM,cAAc,OAAO,iCAAiC;AAAA,MAC9D,EAAE,MAAM,aAAa,OAAO,gCAAgC;AAAA,MAC5D,EAAE,MAAM,UAAU,OAAO,cAAc;AAAA,MACvC,EAAE,MAAM,WAAW,OAAO,oBAAoB;AAAA,MAC9C,EAAE,MAAM,cAAc,OAAO,uBAAuB;AAAA,IACtD;AAAA;AAAA;;;AC0BO,SAAS,gBAAgB,SAAwC;AACtE,QAAM,aAAa,QAAQ,KAAK;AAChC,QAAM,iBAAiB,0BAA0B,UAAU;AAC3D,QAAM,aAAa,mBAAmB,KAAK,CAAC,YAAY,QAAQ,KAAK,UAAU,CAAC;AAChF,QAAM,aAAa,kBAAkB,KAAK,CAAC,YAAY,QAAQ,KAAK,UAAU,CAAC;AAC/E,QAAM,gBACJ,QAAQ,cAAc,KAAK,sBAAsB,KAAK,CAAC,YAAY,QAAQ,KAAK,UAAU,CAAC;AAE7F,MAAI,OAAoB;AACxB,MAAI,gBAAgB;AAClB,WAAO;AAAA,EACT,WAAW,YAAY;AACrB,WAAO;AAAA,EACT,WAAW,YAAY;AACrB,WAAO;AAAA,EACT,WAAW,eAAe;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,cAAc,CAAC,cAAc,CAAC;AAAA,IAC9B,kBAAkB,iBAAiB,CAAC;AAAA,IACpC,WAAW,cAAc,QAAQ,cAAc;AAAA,EACjD;AACF;AAzEA,IAeM,oBAUA,mBAWA;AApCN;AAAA;AAAA;AAAA;AAeA,IAAM,qBAA+B;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,oBAA8B;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,wBAAkC;AAAA,MACtC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;AC3BO,SAAS,qBACd,UACA,SACA,SACA,UACsC;AACtC,MAAI,SAAS,SAAS,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,oBAAoB,IAAI,QAAQ,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,eAAe,aAAa,kBAAkB;AAC7D,UAAM,UAAU,oBAAoB,OAAO;AAC3C,QAAI,SAAS;AACX,YAAM,iBAAiB,gBAAgB,OAAO;AAC9C,UAAI,eAAe,cAAc,eAAe,gBAAgB;AAC9D,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,MAAI,mBAAmB,QAAQ,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,KAAK;AAAA,MACX;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAAgC;AAClE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAlEA,IAKM;AALN;AAAA;AAAA;AAAA;AAGA;AAEA,IAAM,sBAAsB,oBAAI,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA;AAAA;;;ACHM,SAAS,uBAAuB,OAAyB;AAC9D,MAAI,oBAAoB,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,OAAQ,MAA6B,QAAQ,EAAE;AAC5D,QAAM,UAAU,OAAQ,MAAgC,WAAW,KAAK,EAAE,YAAY;AAEtF,SACE,SAAS,gBACT,SAAS,kBACT,SAAS,eACT,SAAS,6BACT,SAAS,6BACT,SAAS,oBACT,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,gBAAgB,KACjC,QAAQ,SAAS,kBAAkB,KACnC,QAAQ,SAAS,oBAAoB,KACrC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,iBAAiB,KAClC,QAAQ,SAAS,WAAW,KAC5B,QAAQ,SAAS,yBAAyB,KAC1C,QAAQ,SAAS,2BAA2B;AAEhD;AAEO,SAAS,iBAAiB,iBAAyB,qBAAqC;AAC7F,MAAI,oBAAoB,uBAAuB,uBAAuB,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,2BACd,QACA,OACA,qBACuB;AACvB,QAAM,aAAa,KAAK,IAAI,GAAG,KAAK,MAAM,sBAAsB,CAAC,CAAC;AAClE,QAAM,UAAU,CAAC,GAAG,MAAM,KAAK,MAAM,GAAG;AACxC,QAAM,SAAS,QAAQ,UAAU,KAAK;AAEtC,SAAO;AAAA,IACL;AAAA,IACA,uBAAuB,KAAK,IAAI,GAAG,KAAK,MAAM,OAAO,wBAAwB,MAAM,CAAC;AAAA,IACpF,iBAAiB,KAAK,IAAI,KAAO,KAAK,MAAM,OAAO,kBAAkB,MAAM,CAAC;AAAA,IAC5E,qBAAqB,KAAK,IAAI,KAAO,KAAK,MAAM,OAAO,sBAAsB,KAAK,IAAI,KAAK,MAAM,CAAC,CAAC;AAAA,EACrG;AACF;AAEO,SAAS,oBACd,OACA,qBACA,SACA,iBACA,cACA,eACQ;AACR,QAAM,YAAY;AAAA,IAChB,yBAAyB,kBAAkB,gBAAgB,KAAK,GAAG,GAAG,CAAC;AAAA,IACvE,oBAAoB,YAAY,OAAO,CAAC;AAAA,IACxC,UAAU,mBAAmB;AAAA,EAC/B;AAEA,MAAI,iBAAiB,iBAAiB;AACpC,cAAU,KAAK,iBAAiB,YAAY,EAAE;AAAA,EAChD;AAEA,MAAI,sBAAsB,GAAG;AAC3B,cAAU;AAAA,MACR,kBAAkB,cAAc,qBAAqB,IAAI,cAAc,eAAe,IAAI,cAAc,mBAAmB;AAAA,IAC7H;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,GAAG;AAC3B;AAEO,SAAS,uBAAuB,qBAAqC;AAC1E,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,sBAAsB,CAAC,CAAC;AACjE,SAAO,KAAK,IAAI,KAAQ,MAAS,KAAK,QAAS;AACjD;AAEA,eAAsBC,OAAM,IAAY,QAAqC;AAC3E,iBAAe,QAAQ,qBAAqB;AAC5C,QAAM,gBAAgB,IAAI,MAAM;AAClC;AAEA,SAAS,YAAY,IAAoB;AACvC,MAAI,KAAK,QAAU,GAAG;AACpB,WAAO,GAAG,KAAK,GAAK;AAAA,EACtB;AAEA,SAAO,GAAG,EAAE;AACd;AAEA,SAAS,kBAAkB,OAAe,UAA0B;AAClE,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAjHA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;AC+CA,SAAS,sBAAgD;AACvD,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB,uBAAuB;AAAA,IACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;AAEA,SAAS,gBAAgB,QAA4D;AACnF,SAAO;AAAA,IACL,oBAAoB,QAAQ,OAAO,kBAAkB;AAAA,IACrD,uBAAuB,QAAQ,OAAO,qBAAqB;AAAA,IAC3D,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EAClH;AACF;AA/DA,IAAAC,kBAKa;AALb;AAAA;AAAA;AAAA,IAAAA,mBAAe;AAEf;AAGO,IAAM,0BAAN,MAA8B;AAAA,MACnC,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,OAA0C;AAC9C,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,YAAI;AACF,gBAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,MAAM,wBAAwB,MAAM;AAClE,iBAAO,gBAAgB,KAAK,MAAM,GAAG,CAA6B;AAAA,QACpE,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,kBAAM,UAAU,oBAAoB;AACpC,kBAAM,KAAK,KAAK,OAAO;AACvB,mBAAO;AAAA,UACT;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,QAAqE;AAC9E,cAAM,aAAa,gBAAgB,MAAM;AACzC,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,iBAAAA,QAAG,UAAU,MAAM,wBAAwB,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACnG,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAO,SAAqI;AAChJ,cAAM,UAAU,MAAM,KAAK,KAAK;AAChC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,GAAG;AAAA,UACH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,YAA6B;AACjC,cAAM,SAAS,MAAM,KAAK,KAAK;AAC/B,eAAO;AAAA,UACL,qBAAqB,OAAO,qBAAqB,YAAY,QAAQ;AAAA,UACrE,wBAAwB,OAAO,wBAAwB,YAAY,QAAQ;AAAA,UAC3E,iBAAiB,OAAO,SAAS;AAAA,QACnC,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA;AAAA;;;ACoFA,SAAS,yBAAyB,QAAsD;AACtF,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,IAAIC,aAAY,OAAO,EAAE,KAAK,gBAAgB;AAAA,IAC9C,MAAM,cAAc,OAAO,IAAI;AAAA,IAC/B,MAAMC,eAAc,OAAO,IAAI,KAAK;AAAA,IACpC,IAAIA,eAAc,OAAO,EAAE,KAAK;AAAA,IAChC,SAASC,eAAc,OAAO,OAAO,KAAK;AAAA,IAC1C,SAASA,eAAc,OAAO,OAAO;AAAA,IACrC,QAAQC,iBAAgB,OAAO,MAAM;AAAA,IACrC,UAAU,kBAAkB,OAAO,QAAQ;AAAA,IAC3C,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,IACzF,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,EAC3F;AACF;AAEA,SAAS,cAAc,OAAqC;AAC1D,QAAM,aAAaD,eAAc,KAAK;AACtC,QAAM,OAAO,uBAAuB,KAAK,CAAC,UAAU,UAAU,UAAU;AACxE,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,kCAAkC,OAAO,SAAS,EAAE,CAAC,EAAE;AAAA,EACzE;AAEA,SAAO;AACT;AAEA,SAASC,iBAAgB,OAAuC;AAC9D,QAAM,aAAaD,eAAc,KAAK;AACtC,MAAI,eAAe,aAAa,eAAe,cAAc,eAAe,YAAY;AACtF,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAoD;AAC7E,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,MAAI,OAAO,OAAO,YAAY,WAAW;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,OAAO,OAAO,gBAAgB,YAAY,OAAO,cAAc,OAAO,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC/H,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,UAAUA,eAAc,OAAO,QAAQ;AAAA,IACvC,aAAaD,eAAc,OAAO,WAAW,KAAK;AAAA,IAClD;AAAA,EACF;AACF;AAEA,SAAS,kBAA0B;AACjC,SAAO,oBAAAG,QAAO,WAAW,EAAE,MAAM,GAAG,CAAC;AACvC;AAEA,SAASJ,aAAY,OAAwB;AAC3C,SAAO,OAAO,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,gBAAgB,EAAE;AAC5E;AAEA,SAASC,eAAc,OAAwB;AAC7C,SAAOC,eAAc,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACjD;AAEA,SAASA,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEA,SAAS,aAAa,QAAuC;AAC3D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASG,UAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AA1NA,IAAAC,qBACAC,kBACAC,oBAWa;AAbb;AAAA;AAAA;AAAA,IAAAF,sBAAmB;AACnB,IAAAC,mBAAe;AACf,IAAAC,qBAAiB;AAEjB;AACA;AAQO,IAAM,uBAAN,MAA2B;AAAA,MAChC,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,OAAO,OAMsB;AACjC,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,cAAM,SAAS,yBAAyB;AAAA,UACtC,IAAI,gBAAgB;AAAA,UACpB,MAAM,MAAM;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,IAAI,MAAM;AAAA,UACV,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AACD,cAAM,KAAK,KAAK,MAAM;AACtB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,WAA0D;AACnE,cAAM,WAAW,KAAK,eAAe,SAAS;AAC9C,YAAI;AACF,gBAAM,MAAM,MAAM,iBAAAC,QAAG,SAAS,UAAU,MAAM;AAC9C,iBAAO,yBAAyB,KAAK,MAAM,GAAG,CAA0B;AAAA,QAC1E,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,mBAAO;AAAA,UACT;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,YAAY,WAAmD;AACnE,cAAM,UAAU,MAAM,KAAK,KAAK,SAAS;AACzC,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI,MAAM,6BAA6B,SAAS,EAAE;AAAA,QAC1D;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,QACJ,WACA,OAKgC;AAChC,cAAM,UAAU,MAAM,KAAK,YAAY,SAAS;AAChD,YAAI,QAAQ,WAAW,WAAW;AAChC,gBAAM,IAAI,MAAM,oBAAoB,SAAS,eAAe,QAAQ,MAAM,GAAG;AAAA,QAC/E;AAEA,cAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,cAAM,OAAO,yBAAyB;AAAA,UACpC,GAAG;AAAA,UACH,QAAQ,MAAM,UAAU,aAAa;AAAA,UACrC,UAAU;AAAA,YACR,SAAS,MAAM;AAAA,YACf,UAAU,MAAM;AAAA,YAChB,aAAa,MAAM;AAAA,YACnB,aAAa;AAAA,UACf;AAAA,UACA,WAAW;AAAA,QACb,CAAC;AACD,cAAM,KAAK,KAAK,IAAI;AACpB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OAAyC;AAC7C,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,UAAU,MAAM,iBAAAA,QAAG,QAAQ,MAAM,aAAa,EAAE,eAAe,KAAK,CAAC;AAC3E,cAAM,WAAW,MAAM,QAAQ;AAAA,UAC7B,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,+BAA+B,KAAK,MAAM,IAAI,CAAC,EACnF,IAAI,OAAO,UAAU;AACpB,kBAAM,MAAM,MAAM,iBAAAA,QAAG,SAAS,mBAAAC,QAAK,KAAK,MAAM,aAAa,MAAM,IAAI,GAAG,MAAM;AAC9E,mBAAO,yBAAyB,KAAK,MAAM,GAAG,CAA0B;AAAA,UAC1E,CAAC;AAAA,QACL;AAEA,eAAO,SAAS,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC;AAAA,MACrF;AAAA,MAEA,MAAM,UAAU,QAAQ,IAAqB;AAC3C,cAAM,WAAW,MAAM,KAAK,KAAK;AACjC,YAAI,SAAS,WAAW,GAAG;AACzB,iBAAO;AAAA,QACT;AAEA,eAAO,SACJ,MAAM,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC,EACvC,IAAI,CAAC,YAAY;AAChB,gBAAM,SAAS,aAAa,QAAQ,MAAM;AAC1C,gBAAM,QAAQ,GAAG,QAAQ,IAAI,OAAO,QAAQ,EAAE;AAC9C,iBAAO,GAAG,MAAM,IAAI,QAAQ,IAAI,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAIL,UAAS,QAAQ,SAAS,EAAE,CAAC;AAAA,QAC1F,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,MAAc,KAAK,SAA+C;AAChE,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,iBAAAI,QAAG,UAAU,KAAK,eAAe,QAAQ,IAAI,MAAM,WAAW,GAAG,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,MACxH;AAAA,MAEQ,eAAe,WAAmB,UAAU,qBAAqB,KAAK,OAAO,EAAE,aAAqB;AAC1G,eAAO,mBAAAC,QAAK,KAAK,SAAS,WAAWV,aAAY,SAAS,CAAC,OAAO;AAAA,MACpE;AAAA,IACF;AAAA;AAAA;;;ACoRA,SAAS,oBAAoB,MAA8B;AACzD,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,SAASW,iBAAgB,KAAK,MAAM;AAE1C,SAAO;AAAA,IACL,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,EAAE,CAAC;AAAA,IACnC,SAASC,eAAc,KAAK,OAAO;AAAA,IACnC,aAAaA,eAAc,KAAK,WAAW;AAAA,IAC3C;AAAA,IACA,WAAW,cAAc,KAAK,aAAa,CAAC,CAAC;AAAA,IAC7C,QAAQ,cAAc,KAAK,UAAU,CAAC,CAAC;AAAA,IACvC,WAAW,uBAAuB,KAAK,SAAS;AAAA,IAChD,UAAUA,eAAc,KAAK,QAAQ;AAAA,IACrC,OAAOA,eAAc,KAAK,KAAK;AAAA,IAC/B,UAAUA,eAAc,KAAK,QAAQ;AAAA,IACrC,WAAW,OAAO,KAAK,cAAc,YAAY,KAAK,YAAY,KAAK,YAAY;AAAA,IACnF,WAAW,OAAO,KAAK,cAAc,YAAY,KAAK,YAAY,KAAK,YAAY;AAAA,EACrF;AACF;AAEA,SAASD,iBAAgB,OAA2B;AAClD,MAAI,UAAU,aAAa,UAAU,iBAAiB,UAAU,aAAa;AAC3E,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,QAA4B;AACjD,SAAO,CAAC,GAAG,IAAI,IAAI,OAAO,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC,EAAE,IAAI,CAAC,UAAU,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC,EACnG,OAAO,CAAC,UAAU,QAAQ,CAAC,EAC3B,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AACvC;AAEA,SAASC,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEA,SAAS,uBAAuB,OAA4B;AAC1D,SAAO,mBAAmB,KAAK;AACjC;AAEA,SAAS,kBAAkB,OAA4B;AACrD,SAAO,uBAAuB,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,IAClD,GAAG;AAAA,IACH,QAAQ;AAAA,EACV,EAAE;AACJ;AAEA,SAAS,WAAW,OAA+C;AACjE,QAAM,QAAQ,oBAAI,IAAyB;AAC3C,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,MAAM,IAAI,KAAK,EAAE,GAAG;AACvB,YAAM,IAAI,KAAK,IAAI,oBAAI,IAAI,CAAC;AAAA,IAC9B;AAEA,eAAW,iBAAiB,KAAK,QAAQ;AACvC,YAAM,IAAI,KAAK,EAAE,GAAG,IAAI,aAAa;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,OAAiC,OAAe,QAAyB;AAC3F,QAAM,QAAQ,CAAC,KAAK;AACpB,QAAM,UAAU,oBAAI,IAAY;AAEhC,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,MAAM;AAC5B,QAAI,OAAO,YAAY,YAAY,QAAQ,IAAI,OAAO,GAAG;AACvD;AAAA,IACF;AAEA,QAAI,YAAY,QAAQ;AACtB,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,OAAO;AACnB,eAAW,QAAQ,MAAM,IAAI,OAAO,KAAK,CAAC,GAAG;AAC3C,UAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AA3eA,IAAAC,mBACAC,oBAOa;AARb,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAF,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AACA;AAIO,IAAM,YAAN,MAAgB;AAAA,MACrB,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,OACJ,SACA,cAAc,IACd,UAEI,CAAC,GACgB;AACrB,cAAM,oBAAoBF,eAAc,OAAO;AAC/C,YAAI,CAAC,mBAAmB;AACtB,gBAAM,IAAI,MAAM,2BAA2B;AAAA,QAC7C;AAEA,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,SAAU,MAAM,KAAK,SAAS,MAAM,QAAQ,IAAK;AACvD,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,cAAM,OAAmB;AAAA,UACvB,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,aAAaA,eAAc,WAAW;AAAA,UACtC,QAAQ;AAAA,UACR,WAAW,CAAC;AAAA,UACZ,QAAQ,CAAC;AAAA,UACT,UAAUA,eAAc,QAAQ,QAAQ;AAAA,UACxC,OAAO;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,QACb;AACA,cAAM,KAAK,KAAK,IAAI;AACpB,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,QAAqC;AAC9C,cAAM,WAAW,KAAK,YAAY,MAAM;AACxC,YAAI;AACF,gBAAM,MAAM,MAAM,kBAAAI,QAAG,SAAS,UAAU,MAAM;AAC9C,iBAAO,oBAAoB,KAAK,MAAM,GAAG,CAAe;AAAA,QAC1D,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,kBAAM,IAAI,MAAM,QAAQ,MAAM,aAAa;AAAA,UAC7C;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,KAAK,MAAuC;AAChD,cAAM,8BAA8B,KAAK,OAAO;AAChD,cAAM,aAAa,oBAAoB,IAAI;AAC3C,cAAM,kBAAAA,QAAG,UAAU,KAAK,YAAY,WAAW,EAAE,GAAG,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACtG,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OACJ,QACA,SAQqB;AACrB,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,cAAM,eAAe,cAAc,QAAQ,gBAAgB,CAAC,CAAC;AAC7D,cAAM,YAAY,cAAc,QAAQ,aAAa,CAAC,CAAC;AACvD,cAAM,KAAK,8BAA8B,QAAQ,cAAc,SAAS;AAExE,cAAM,aAAa,QAAQ,UAAU,KAAK;AAC1C,cAAM,gBAAgB,cAAc,CAAC,GAAG,KAAK,WAAW,GAAG,YAAY,CAAC;AACxE,cAAM,aAAa,cAAc,CAAC,GAAG,KAAK,QAAQ,GAAG,SAAS,CAAC;AAC/D,cAAM,gBACJ,eAAe,cACX,kBAAkB,KAAK,SAAS,IAChC,uBAAuB,KAAK,SAAS;AAC3C,cAAM,eAAe,OAAO,QAAQ,aAAa,WAAWJ,eAAc,QAAQ,QAAQ,IAAI,KAAK;AACnG,cAAM,YAAY,OAAO,QAAQ,UAAU,WAAWA,eAAc,QAAQ,KAAK,IAAI,KAAK;AAC1F,cAAM,eAAe,OAAO,QAAQ,aAAa,WAAWA,eAAc,QAAQ,QAAQ,IAAI,KAAK;AAEnG,YAAI,KAAK,WAAW,eAAe,eAAe,aAAa;AAC7D,gBAAM,IAAI,MAAM,QAAQ,MAAM,+CAA+C;AAAA,QAC/E;AAEA,YAAI,eAAe,iBAAiB,cAAc,SAAS,GAAG;AAC5D,gBAAM,IAAI,MAAM,QAAQ,MAAM,kBAAkB,cAAc,KAAK,IAAI,CAAC,oBAAoB;AAAA,QAC9F;AAEA,YAAI,aAAa,cAAc,SAAS,GAAG;AACzC,gBAAM,IAAI,MAAM,QAAQ,MAAM,kBAAkB,cAAc,KAAK,IAAI,CAAC,uBAAuB;AAAA,QACjG;AAEA,YAAI,eAAe,eAAe,cAAc,SAAS,GAAG;AAC1D,gBAAM,IAAI,MAAM,QAAQ,MAAM,wBAAwB,cAAc,KAAK,IAAI,CAAC,GAAG;AAAA,QACnF;AAEA,YAAI,gBAAgB,aAAa,cAAc,cAAc;AAC3D,gBAAM,IAAI,MAAM,QAAQ,MAAM,mBAAmB,YAAY,SAAS,SAAS,GAAG;AAAA,QACpF;AAEA,cAAM,OAAmB;AAAA,UACvB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,UAAU;AAAA,UACV,OAAO;AAAA,UACP,UAAU;AAAA,UACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAEA,cAAM,KAAK,KAAK,IAAI;AACpB,cAAM,QAAQ,IAAI;AAAA,UAChB,GAAG,aAAa,IAAI,OAAO,cAAc,KAAK,aAAa,WAAW,MAAM,CAAC;AAAA,UAC7E,GAAG,UAAU,IAAI,OAAO,kBAAkB,KAAK,iBAAiB,eAAe,MAAM,CAAC;AAAA,QACxF,CAAC;AAED,YAAI,KAAK,WAAW,eAAe,KAAK,WAAW,aAAa;AAC9D,gBAAM,KAAK,gBAAgB,MAAM;AAAA,QACnC;AAEA,eAAO,KAAK,KAAK,MAAM;AAAA,MACzB;AAAA,MAEA,MAAM,MAAM,QAAgB,OAAoC;AAC9D,cAAM,kBAAkBA,eAAc,KAAK;AAC3C,YAAI,CAAC,iBAAiB;AACpB,gBAAM,IAAI,MAAM,yBAAyB;AAAA,QAC3C;AAEA,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,YAAI,KAAK,WAAW,aAAa;AAC/B,gBAAM,IAAI,MAAM,QAAQ,MAAM,wBAAwB;AAAA,QACxD;AAEA,YAAI,KAAK,UAAU,SAAS,GAAG;AAC7B,gBAAM,IAAI,MAAM,QAAQ,MAAM,kBAAkB,KAAK,UAAU,KAAK,IAAI,CAAC,GAAG;AAAA,QAC9E;AAEA,YAAI,KAAK,YAAY,KAAK,aAAa,iBAAiB;AACtD,gBAAM,IAAI,MAAM,QAAQ,MAAM,mBAAmB,KAAK,QAAQ,GAAG;AAAA,QACnE;AAEA,YAAI,KAAK,SAAS,KAAK,UAAU,iBAAiB;AAChD,gBAAM,IAAI,MAAM,QAAQ,MAAM,0BAA0B,KAAK,KAAK,GAAG;AAAA,QACvE;AAEA,eAAO,KAAK,OAAO,QAAQ;AAAA,UACzB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,aAAa,QAAgB,WAA4C;AAC7E,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,WAAW,uBAAuB,SAAS;AAAA,UAC3C,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,gBAAgB,OAAgD;AACpE,cAAM,kBAAkBA,eAAc,KAAK;AAC3C,YAAI,CAAC,iBAAiB;AACpB,iBAAO;AAAA,QACT;AAEA,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,eAAO,MACJ,OAAO,CAAC,SAAS,KAAK,UAAU,mBAAmB,KAAK,WAAW,WAAW,EAC9E,KAAK,CAAC,MAAM,UAAU,MAAM,UAAU,cAAc,KAAK,SAAS,CAAC,EAAE,CAAC;AAAA,MAC3E;AAAA,MAEA,MAAM,OAAO,QAAgB,UAAuC;AAClE,cAAM,qBAAqBA,eAAc,QAAQ;AACjD,YAAI,CAAC,oBAAoB;AACvB,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC9C;AAEA,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,YAAI,KAAK,WAAW,aAAa;AAC/B,gBAAM,IAAI,MAAM,QAAQ,MAAM,wBAAwB;AAAA,QACxD;AAEA,YAAI,KAAK,SAAS,KAAK,UAAU,oBAAoB;AACnD,gBAAM,IAAI,MAAM,QAAQ,MAAM,0BAA0B,KAAK,KAAK,GAAG;AAAA,QACvE;AAEA,eAAO,KAAK,OAAO,QAAQ;AAAA,UACzB,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,aAAa,OAAsC;AACvD,cAAM,kBAAkBA,eAAc,KAAK;AAC3C,YAAI,CAAC,iBAAiB;AACpB,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,cAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,UAAU,mBAAmB,KAAK,WAAW,WAAW;AACrG,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AAEnC,cAAM,QAAQ;AAAA,UACZ,SAAS,IAAI,CAAC,SACZ,KAAK,KAAK;AAAA,YACR,GAAG;AAAA,YACH,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,WAAW;AAAA,UACb,CAAC,CAAC;AAAA,QACN;AAEA,eAAO,QAAQ,IAAI,SAAS,IAAI,CAAC,SAAS,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;AAAA,MAC/D;AAAA,MAEA,MAAM,aAAa,QAAgB,UAAuC;AACxE,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,UAAUA,eAAc,QAAQ;AAAA,UAChC,QAAQ,KAAK,WAAW,YAAY,gBAAgB,KAAK;AAAA,UACzD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,eAAe,QAAqC;AACxD,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,eAAO,KAAK,KAAK;AAAA,UACf,GAAG;AAAA,UACH,UAAU;AAAA,UACV,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,OAA8B;AAClC,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,UAAU,MAAM,kBAAAI,QAAG,QAAQ,MAAM,UAAU,EAAE,eAAe,KAAK,CAAC;AACxE,cAAM,QAAQ,MAAM,QAAQ;AAAA,UAC1B,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,oBAAoB,KAAK,MAAM,IAAI,CAAC,EACxE,IAAI,OAAO,UAAU;AACpB,kBAAM,MAAM,MAAM,kBAAAA,QAAG,SAAS,mBAAAC,QAAK,KAAK,MAAM,UAAU,MAAM,IAAI,GAAG,MAAM;AAC3E,mBAAO,oBAAoB,KAAK,MAAM,GAAG,CAAe;AAAA,UAC1D,CAAC;AAAA,QACL;AACA,eAAO,MAAM,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,MAAM,EAAE;AAAA,MACvD;AAAA,MAEA,MAAM,cAAc,OAAuC;AACzD,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,cAAM,kBAAkBL,eAAc,KAAK;AAC3C,cAAM,YAAY,MAAM;AAAA,UACtB,CAAC,SACC,KAAK,WAAW,eAChB,KAAK,UAAU,WAAW,KAC1B,CAAC,KAAK,UACL,CAAC,mBAAmB,CAAC,KAAK,YAAY,KAAK,aAAa;AAAA,QAC7D;AAEA,YAAI,CAAC,iBAAiB;AACpB,iBAAO;AAAA,QACT;AAEA,eAAO,UAAU,KAAK,CAAC,MAAM,UAAU;AACrC,gBAAM,eAAe,KAAK,aAAa,kBAAkB,IAAI;AAC7D,gBAAM,gBAAgB,MAAM,aAAa,kBAAkB,IAAI;AAC/D,cAAI,iBAAiB,eAAe;AAClC,mBAAO,eAAe;AAAA,UACxB;AAEA,iBAAO,KAAK,KAAK,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,YAA6B;AACjC,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,YAAI,MAAM,WAAW,GAAG;AACtB,iBAAO;AAAA,QACT;AAEA,eAAO,MACJ,IAAI,CAAC,SAAS;AACb,gBAAM,SAAS,KAAK,WAAW,cAAc,QAAQ,KAAK,WAAW,gBAAgB,QAAQ;AAC7F,gBAAM,UAAU,KAAK,UAAU,SAAS,IAAI,cAAc,KAAK,UAAU,KAAK,GAAG,CAAC,KAAK;AACvF,gBAAM,SAAS,KAAK,OAAO,SAAS,IAAI,WAAW,KAAK,OAAO,KAAK,GAAG,CAAC,KAAK;AAC7E,gBAAM,YAAY,KAAK,aAAa,KAAK,UAAU,SAAS,IACxD,SAAS,KAAK,UAAU,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAAE,MAAM,IAAI,KAAK,UAAU,MAAM,KACrG;AACJ,gBAAM,WAAW,KAAK,WAAW,MAAM,KAAK,QAAQ,KAAK;AACzD,gBAAM,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK;AAC/C,gBAAM,WAAW,KAAK,WAAW,OAAO,KAAK,QAAQ,KAAK;AAC1D,iBAAO,GAAG,MAAM,KAAK,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ;AAAA,QAC5G,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,MAAc,8BACZ,QACA,cACA,WACe;AACf,cAAM,WAAW;AAAA,UACf,GAAG,aAAa,IAAI,CAAC,cAAc,CAAC,WAAW,MAAM,CAAU;AAAA,UAC/D,GAAG,UAAU,IAAI,CAAC,kBAAkB,CAAC,QAAQ,aAAa,CAAU;AAAA,QACtE;AAEA,YAAI,SAAS,WAAW,GAAG;AACzB;AAAA,QACF;AAEA,mBAAW,CAAC,WAAW,aAAa,KAAK,UAAU;AACjD,cAAI,cAAc,eAAe;AAC/B,kBAAM,IAAI,MAAM,QAAQ,MAAM,2BAA2B;AAAA,UAC3D;AAAA,QACF;AAEA,cAAM,QAAQ;AAAA,UACZ,cAAc,SAAS,QAAQ,CAAC,CAAC,WAAW,aAAa,MAAM,CAAC,WAAW,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;AAAA,QACvH;AAEA,cAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,CAAC;AAC1C,mBAAW,CAAC,WAAW,aAAa,KAAK,UAAU;AACjD,cAAI,WAAW,OAAO,eAAe,SAAS,GAAG;AAC/C,kBAAM,IAAI;AAAA,cACR,0CAA0C,SAAS,OAAO,aAAa;AAAA,YACzE;AAAA,UACF;AAEA,cAAI,CAAC,MAAM,IAAI,SAAS,GAAG;AACzB,kBAAM,IAAI,WAAW,oBAAI,IAAI,CAAC;AAAA,UAChC;AACA,gBAAM,IAAI,SAAS,GAAG,IAAI,aAAa;AAAA,QACzC;AAAA,MACF;AAAA,MAEA,MAAc,iBAAiB,QAAgB,WAAkC;AAC/E,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,YAAI,KAAK,UAAU,SAAS,SAAS,GAAG;AACtC;AAAA,QACF;AAEA,cAAM,KAAK,KAAK;AAAA,UACd,GAAG;AAAA,UACH,WAAW,cAAc,CAAC,GAAG,KAAK,WAAW,SAAS,CAAC;AAAA,UACvD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAc,aAAa,QAAgB,eAAsC;AAC/E,cAAM,OAAO,MAAM,KAAK,KAAK,MAAM;AACnC,YAAI,KAAK,OAAO,SAAS,aAAa,GAAG;AACvC;AAAA,QACF;AAEA,cAAM,KAAK,KAAK;AAAA,UACd,GAAG;AAAA,UACH,QAAQ,cAAc,CAAC,GAAG,KAAK,QAAQ,aAAa,CAAC;AAAA,UACrD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAc,gBAAgB,aAAoC;AAChE,cAAM,QAAQ,MAAM,KAAK,KAAK;AAC9B,cAAM,QAAQ;AAAA,UACZ,MACG,OAAO,CAAC,SAAS,KAAK,UAAU,SAAS,WAAW,CAAC,EACrD,IAAI,CAAC,SACJ,KAAK,KAAK;AAAA,YACR,GAAG;AAAA,YACH,WAAW,KAAK,UAAU,OAAO,CAAC,OAAO,OAAO,WAAW;AAAA,YAC3D,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC,CAAC;AAAA,QACR;AAAA,MACF;AAAA,MAEQ,YAAY,QAAwB;AAC1C,cAAM,QAAQ,qBAAqB,KAAK,OAAO;AAC/C,eAAO,mBAAAK,QAAK,KAAK,MAAM,UAAU,QAAQ,MAAM,OAAO;AAAA,MACxD;AAAA,MAEA,MAAc,SAAS,UAAmC;AACxD,cAAM,UAAU,MAAM,kBAAAD,QAAG,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAClE,cAAM,MAAM,QACT,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,EAChC,IAAI,CAAC,UAAU,MAAM,KAAK,MAAM,qBAAqB,IAAI,CAAC,CAAC,EAC3D,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC,EACjD,IAAI,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,CAAC,EACzC,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAC3C,eAAO,IAAI,SAAS,IAAI,KAAK,IAAI,GAAG,GAAG,IAAI;AAAA,MAC7C;AAAA,IACF;AAAA;AAAA;;;ACzRA,SAAS,gBAAgB,QAA4C;AACnE,QAAM,UAAU,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,QAAQ,IAAI,CAAC,WAAW,gBAAgB,MAAM,CAAC,IAAI,CAAC;AAC3G,SAAO;AAAA,IACL,UAAUE,eAAc,OAAO,QAAQ,KAAK;AAAA,IAC5C,SAAS,QAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAAA,EAC5E;AACF;AAEA,SAAS,gBAAgB,QAA4C;AACnE,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,MAAMC,eAAc,OAAO,IAAI;AAAA,IAC/B,MAAMD,eAAc,OAAO,IAAI,KAAK;AAAA,IACpC,QAAQ,sBAAsB,OAAO,MAAM;AAAA,IAC3C,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,IACzF,KAAK,OAAO,OAAO,QAAQ,YAAY,OAAO,SAAS,OAAO,GAAG,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,IAC9F,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,IACzF,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,EAC3F;AACF;AAEA,SAAS,sBAAsB,OAAiC;AAC9D,SAAO,UAAU,aAAa,UAAU,UAAU,UAAU,aAAa,QAAQ;AACnF;AAEA,SAASC,eAAc,OAAwB;AAC7C,SAAOD,eAAc,KAAK,EAAE,QAAQ,QAAQ,GAAG;AACjD;AAEA,SAASA,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAzJA,IAAAE,mBASa;AATb,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAD,oBAAe;AAEf;AAOO,IAAM,YAAN,MAAgB;AAAA,MACrB,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,aAAwC;AAC5C,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,YAAI;AACF,gBAAM,MAAM,MAAM,kBAAAE,QAAG,SAAS,MAAM,gBAAgB,MAAM;AAC1D,iBAAO,gBAAgB,KAAK,MAAM,GAAG,CAAqB;AAAA,QAC5D,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,kBAAM,UAAU,gBAAgB;AAAA,cAC9B,UAAU;AAAA,cACV,SAAS,CAAC;AAAA,YACZ,CAAC;AACD,kBAAM,KAAK,WAAW,OAAO;AAC7B,mBAAO;AAAA,UACT;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,QAAqD;AACpE,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,aAAa,gBAAgB,MAAM;AACzC,cAAM,kBAAAA,QAAG,UAAU,MAAM,gBAAgB,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC3F,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,cAA2C;AAC/C,gBAAQ,MAAM,KAAK,WAAW,GAAG;AAAA,MACnC;AAAA,MAEA,MAAM,WAAW,MAAqD;AACpE,cAAM,iBAAiBH,eAAc,IAAI;AACzC,gBAAQ,MAAM,KAAK,WAAW,GAAG,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,cAAc;AAAA,MAC1F;AAAA,MAEA,MAAM,aACJ,MACA,MACA,QACA,UAGI,CAAC,GACsB;AAC3B,cAAM,SAAS,MAAM,KAAK,WAAW;AACrC,cAAM,iBAAiBA,eAAc,IAAI;AACzC,cAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,cAAM,WAAW,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,cAAc;AAC/E,cAAM,aAAa,gBAAgB;AAAA,UACjC,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,WAAW,QAAQ,aAAa,UAAU;AAAA,UAC1C,KAAK,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM,UAAU;AAAA,UAC/D,WAAW,UAAU,aAAa;AAAA,UAClC,WAAW;AAAA,QACb,CAAC;AAED,cAAM,cAAc,WAChB,OAAO,QAAQ,IAAI,CAAC,WAAY,OAAO,SAAS,iBAAiB,aAAa,MAAO,IACrF,CAAC,GAAG,OAAO,SAAS,UAAU;AAElC,cAAM,KAAK,WAAW;AAAA,UACpB,GAAG;AAAA,UACH,SAAS;AAAA,QACX,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,mBAAmB,MAAc,QAA0B,KAAyC;AACxG,cAAM,SAAS,MAAM,KAAK,WAAW,IAAI;AACzC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,QAC7C;AAEA,YAAI,OAAO,WAAW,cAAc,WAAW,YAAY;AACzD,iBAAO;AAAA,QACT;AAEA,eAAO,KAAK,aAAa,OAAO,MAAM,OAAO,MAAM,QAAQ;AAAA,UACzD,WAAW,OAAO;AAAA,UAClB,KAAK,OAAO,QAAQ,WAAW,MAAM,OAAO;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,iBAAiB,MAAc,WAA8C;AACjF,cAAM,SAAS,MAAM,KAAK,WAAW,IAAI;AACzC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,QAC7C;AAEA,eAAO,KAAK,aAAa,OAAO,MAAM,OAAO,MAAM,OAAO,QAAQ;AAAA,UAChE;AAAA,UACA,KAAK,OAAO;AAAA,QACd,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,mBAAoC;AACxC,cAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAI,QAAQ,WAAW,GAAG;AACxB,iBAAO;AAAA,QACT;AAEA,cAAM,SAAS,MAAM,KAAK,WAAW;AACrC,eAAO;AAAA,UACL,SAAS,OAAO,QAAQ;AAAA,UACxB,GAAG,QAAQ,IAAI,CAAC,WAAW,KAAK,OAAO,IAAI,KAAK,OAAO,IAAI,MAAM,OAAO,MAAM,EAAE;AAAA,QAClF,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA;AAAA;;;AC5GA,eAAsB,mBAAmB,SAA+C;AACtF,QAAM,YAAY,IAAI,UAAU,OAAO;AACvC,QAAM,YAAY,IAAI,UAAU,OAAO;AACvC,QAAM,UAAU,MAAM,UAAU,YAAY;AAC5C,QAAM,eAAmC,CAAC;AAC1C,QAAM,gBAA8B,CAAC;AAErC,aAAW,UAAU,SAAS;AAC5B,QAAI,OAAO,WAAW,cAAc,OAAO,OAAO,QAAQ,UAAU;AAClE;AAAA,IACF;AAEA,QAAI,eAAe,OAAO,GAAG,GAAG;AAC9B;AAAA,IACF;AAEA,iBAAa,KAAK,MAAM,UAAU,mBAAmB,OAAO,MAAM,UAAU,CAAC;AAAA,EAC/E;AAEA,aAAW,UAAU,cAAc;AACjC,kBAAc,KAAK,GAAI,MAAM,UAAU,aAAa,OAAO,IAAI,CAAE;AAAA,EACnE;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,wBAAAI,QAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAhDA;AAAA;AAAA;AAAA;AAAA,0BAAoB;AAIpB,IAAAC;AACA,IAAAA;AAAA;AAAA;;;ACIA,eAAsB,wBAAwB,SAAqD;AACjG,QAAM,QAAQ,IAAI,mBAAmB,OAAO;AAC5C,QAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,QAAM,YAAmC,CAAC;AAE1C,aAAW,OAAO,MAAM;AACtB,QAAI,IAAI,WAAW,aAAa,OAAO,IAAI,QAAQ,UAAU;AAC3D;AAAA,IACF;AAEA,QAAIC,gBAAe,IAAI,GAAG,GAAG;AAC3B;AAAA,IACF;AAEA,cAAU;AAAA,MACR,MAAM,MAAM,SAAS,IAAI,IAAI;AAAA,QAC3B,QAAQ;AAAA,QACR,UAAU,IAAI;AAAA,QACd,QAAQ,IAAI,UAAU;AAAA,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,EACF;AACF;AAEA,SAASA,gBAAe,KAAsB;AAC5C,MAAI;AACF,yBAAAC,QAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA5CA,IAAAC;AAAA,IAAAC,kBAAA;AAAA;AAAA;AAAA,IAAAD,uBAAoB;AAGpB;AAAA;AAAA;;;AC+ZA,SAAS,eAAe,OAAiD;AACvE,SAAO;AAAA,IACL,OAAO,MAAM,QAAQ,MAAM,KAAK,IAC5B,MAAM,MAAM,IAAI,CAAC,SAAS,kBAAkB,IAAI,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC,IAC5G,CAAC;AAAA,EACP;AACF;AAEA,SAAS,kBAAkB,QAAwC;AACjE,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,MAAME,eAAc,OAAO,IAAI;AAAA,IAC/B,MAAM,mBAAAC,QAAK,QAAQ,OAAO,OAAO,QAAQ,EAAE,CAAC;AAAA,IAC5C,QAAQ,OAAO,OAAO,UAAU,EAAE,EAAE,KAAK,KAAK,MAAMD,eAAc,OAAO,IAAI,KAAK,MAAM;AAAA,IACxF,QAAQE,iBAAgB,OAAO,MAAM;AAAA,IACrC,QAAQ,OAAO,OAAO,WAAW,YAAY,OAAO,SAAS,OAAO,MAAM,IAAI,KAAK,MAAM,OAAO,MAAM,IAAI;AAAA,IAC1G,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,IACzF,WAAW,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,OAAO,YAAY;AAAA,EAC3F;AACF;AAEA,SAASA,iBAAgB,OAA+B;AACtD,UAAQ,OAAO;AAAA,IACb,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASF,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EACtB,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAChB;AAEA,SAASG,cAAa,QAAgC;AACpD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,OAAwB;AACzC,SAAO,OAAQ,MAAiE,OAC7E,MAA+B,UAC/B,MAAgC,WACjC,KAAK;AACT;AAEA,eAAeC,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,kBAAAC,QAAG,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAneA,IAAAC,mBACAC,oBAEAC,eAOa;AAVb,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAH,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,IAAAC,gBAAsB;AAEtB;AACA,IAAAC;AAIO,IAAM,gBAAN,MAAoB;AAAA,MACzB,YAA6B,SAAiB;AAAjB;AAAA,MAAkB;AAAA,MAE/C,MAAM,OAAO,MAAc,QAA0C;AACnE,cAAM,KAAK,cAAc;AACzB,cAAM,KAAK,UAAU;AAErB,cAAM,iBAAiBT,eAAc,IAAI;AACzC,YAAI,CAAC,gBAAgB;AACnB,gBAAM,IAAI,MAAM,4BAA4B;AAAA,QAC9C;AAEA,cAAM,WAAW,MAAM,KAAK,KAAK,cAAc;AAC/C,YAAI,YAAY,SAAS,WAAW,WAAW;AAC7C,cAAI,OAAO,WAAW,UAAU;AAC9B,kBAAM,KAAK,SAAS,SAAS,MAAM,MAAM;AAAA,UAC3C;AACA,iBAAQ,MAAM,KAAK,KAAK,cAAc,KAAM;AAAA,QAC9C;AAEA,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,SAAyB,kBAAkB;AAAA,UAC/C,MAAM;AAAA,UACN,MAAM,mBAAAC,QAAK,KAAK,MAAM,cAAc,cAAc;AAAA,UAClD,QAAQ,UAAU,UAAU,MAAM,cAAc;AAAA,UAChD,QAAQ;AAAA,UACR;AAAA,UACA,WAAW,UAAU,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,UACzD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAED,cAAM,KAAK,KAAK;AAAA,UACd,OAAO;AAAA,UACP,IAAI,KAAK,IAAI;AAAA,UACb,MAAM,OAAO,WAAW,WAAW,EAAE,IAAI,OAAO,IAAI;AAAA,UACpD,UAAU;AAAA,YACR,MAAM,OAAO;AAAA,YACb,QAAQ,OAAO;AAAA,YACf,MAAM,OAAO;AAAA,YACb,QAAQ,OAAO;AAAA,UACjB;AAAA,QACF,CAAC;AAED,YAAI;AACF,gBAAM,eAAe,MAAM,KAAK,aAAa,OAAO,MAAM;AAC1D,gBAAM,KAAK;AAAA,YACT,eACI,CAAC,YAAY,OAAO,OAAO,MAAM,OAAO,MAAM,IAC9C,CAAC,YAAY,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAM,MAAM;AAAA,UAClE;AACA,gBAAM,KAAK,aAAa,MAAM;AAC9B,cAAI,OAAO,WAAW,UAAU;AAC9B,kBAAM,KAAK,SAAS,OAAO,MAAM,MAAM;AAAA,UACzC;AACA,gBAAM,OAAO,MAAM,KAAK,IAAI,OAAO,IAAI;AACvC,gBAAM,KAAK,KAAK;AAAA,YACd,OAAO;AAAA,YACP,IAAI,KAAK,IAAI;AAAA,YACb,MAAM,OAAO,WAAW,WAAW,EAAE,IAAI,QAAQ,UAAU,OAAO,KAAK,IAAI;AAAA,YAC3E,UAAU;AAAA,cACR,MAAM,KAAK;AAAA,cACX,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK;AAAA,cACX,QAAQ,KAAK;AAAA,YACf;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,KAAK,KAAK;AAAA,YACd,OAAO;AAAA,YACP,IAAI,KAAK,IAAI;AAAA,YACb,MAAM,OAAO,WAAW,WAAW,EAAE,IAAI,OAAO,IAAI;AAAA,YACpD,UAAU;AAAA,cACR,MAAM,OAAO;AAAA,cACb,QAAQ,OAAO;AAAA,cACf,MAAM,OAAO;AAAA,cACb,QAAQ,OAAO;AAAA,YACjB;AAAA,YACA,OAAO,UAAU,KAAK;AAAA,UACxB,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,cAAc,QAAgB,eAAiD;AACnF,cAAM,YAAY,IAAI,UAAU,KAAK,OAAO;AAC5C,cAAM,OAAO,MAAM,UAAU,KAAK,MAAM;AACxC,YAAI,KAAK,UAAU;AACjB,gBAAM,QAAQ,MAAM,KAAK,KAAK,KAAK,QAAQ;AAC3C,cAAI,SAAS,MAAM,WAAW,WAAW;AACvC,mBAAO;AAAA,UACT;AAEA,gBAAM,UAAU,eAAe,MAAM;AAAA,QACvC;AAEA,cAAM,WAAWD,eAAc,iBAAiB,KAAK,WAAW,QAAQ,MAAM,EAAE;AAChF,cAAM,OAAO,MAAM,KAAK,qBAAqB,YAAY,QAAQ,MAAM,EAAE;AACzE,eAAO,KAAK,OAAO,MAAM,MAAM;AAAA,MACjC;AAAA,MAEA,MAAM,IAAI,MAAuC;AAC/C,cAAM,WAAW,MAAM,KAAK,KAAK,IAAI;AACrC,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,qBAAqB,IAAI,EAAE;AAAA,QAC7C;AACA,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,KAAK,MAAmD;AAC5D,cAAM,iBAAiBA,eAAc,IAAI;AACzC,YAAI,CAAC,gBAAgB;AACnB,iBAAO;AAAA,QACT;AACA,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,eAAO,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc;AAAA,MAChE;AAAA,MAEA,MAAM,OAAkC;AACtC,cAAM,KAAK,UAAU;AACrB,gBAAQ,MAAM,KAAK,UAAU,GAAG,MAC7B,MAAM,EACN,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAAA,MAC9D;AAAA,MAEA,MAAM,WAAW,KAAkD;AACjE,cAAM,cAAc,mBAAAC,QAAK,QAAQ,GAAG;AACpC,cAAM,YAAY,MAAM,KAAK,KAAK;AAClC,eAAO,UAAU,KAAK,CAAC,aAAa;AAClC,cAAI,SAAS,WAAW,WAAW;AACjC,mBAAO;AAAA,UACT;AAEA,gBAAM,WAAW,mBAAAA,QAAK,SAAS,SAAS,MAAM,WAAW;AACzD,iBAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,mBAAAA,QAAK,WAAW,QAAQ;AAAA,QACpF,CAAC;AAAA,MACH;AAAA,MAEA,MAAM,KAAK,MAAuC;AAChD,cAAM,WAAW,MAAM,KAAK,IAAI,IAAI;AACpC,cAAM,OAAO,MAAM,KAAK,aAAa;AAAA,UACnC,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AACD,cAAM,KAAK,KAAK;AAAA,UACd,OAAO;AAAA,UACP,IAAI,KAAK,IAAI;AAAA,UACb,MAAM,OAAO,KAAK,WAAW,WAAW,EAAE,IAAI,KAAK,QAAQ,UAAU,KAAK,KAAK,IAAI;AAAA,UACnF,UAAU;AAAA,YACR,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,UACf;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAAA,MAEA,MAAM,OACJ,MACA,UAGI,CAAC,GACoB;AACzB,cAAM,KAAK,cAAc;AACzB,cAAM,WAAW,MAAM,KAAK,IAAI,IAAI;AACpC,cAAM,KAAK,KAAK;AAAA,UACd,OAAO;AAAA,UACP,IAAI,KAAK,IAAI;AAAA,UACb,MAAM,OAAO,SAAS,WAAW,WAAW,EAAE,IAAI,SAAS,QAAQ,UAAU,SAAS,KAAK,IAAI;AAAA,UAC/F,UAAU;AAAA,YACR,MAAM,SAAS;AAAA,YACf,QAAQ,SAAS;AAAA,YACjB,MAAM,SAAS;AAAA,YACf,QAAQ,SAAS;AAAA,UACnB;AAAA,QACF,CAAC;AAED,YAAI;AACF,gBAAM,OAAO,CAAC,YAAY,QAAQ;AAClC,cAAI,QAAQ,OAAO;AACjB,iBAAK,KAAK,SAAS;AAAA,UACrB;AACA,eAAK,KAAK,SAAS,IAAI;AACvB,gBAAM,KAAK,OAAO,IAAI;AACtB,gBAAM,KAAK,OAAO,CAAC,YAAY,OAAO,CAAC,EAAE,MAAM,MAAM,IAAI;AAEzD,cAAI,OAAO,SAAS,WAAW,UAAU;AACvC,kBAAM,YAAY,IAAI,UAAU,KAAK,OAAO;AAC5C,gBAAI,QAAQ,cAAc;AACxB,oBAAM,UAAU,OAAO,SAAS,QAAQ,EAAE,QAAQ,YAAY,CAAC;AAAA,YACjE;AACA,kBAAM,UAAU,eAAe,SAAS,MAAM;AAAA,UAChD;AAEA,gBAAM,OAAO,MAAM,KAAK,aAAa;AAAA,YACnC,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AACD,gBAAM,KAAK,KAAK;AAAA,YACd,OAAO;AAAA,YACP,IAAI,KAAK,IAAI;AAAA,YACb,MACE,OAAO,SAAS,WAAW,WACvB;AAAA,cACE,IAAI,SAAS;AAAA,cACb,QAAQ,QAAQ,eAAe,cAAc;AAAA,YAC/C,IACA;AAAA,YACN,UAAU;AAAA,cACR,MAAM,KAAK;AAAA,cACX,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK;AAAA,cACX,QAAQ,KAAK;AAAA,YACf;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,gBAAM,KAAK,KAAK;AAAA,YACd,OAAO;AAAA,YACP,IAAI,KAAK,IAAI;AAAA,YACb,MAAM,OAAO,SAAS,WAAW,WAAW,EAAE,IAAI,SAAS,QAAQ,UAAU,SAAS,KAAK,IAAI;AAAA,YAC/F,UAAU;AAAA,cACR,MAAM,SAAS;AAAA,cACf,QAAQ,SAAS;AAAA,cACjB,MAAM,SAAS;AAAA,cACf,QAAQ,SAAS;AAAA,YACnB;AAAA,YACA,OAAO,UAAU,KAAK;AAAA,UACxB,CAAC;AACD,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,YAA6B;AACjC,cAAM,YAAY,MAAM,KAAK,KAAK;AAClC,YAAI,UAAU,WAAW,GAAG;AAC1B,iBAAO;AAAA,QACT;AAEA,eAAO,UACJ,IAAI,CAAC,aAAa;AACjB,gBAAM,SAASE,cAAa,SAAS,MAAM;AAC3C,gBAAM,OAAO,OAAO,SAAS,WAAW,WAAW,SAAS,SAAS,MAAM,KAAK;AAChF,iBAAO,GAAG,MAAM,IAAI,SAAS,IAAI,GAAG,IAAI,WAAW,SAAS,MAAM;AAAA,QACpE,CAAC,EACA,KAAK,IAAI;AAAA,MACd;AAAA,MAEA,MAAM,WAAW,QAAQ,IAAoC;AAC3D,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,YAAI;AACF,gBAAM,MAAM,MAAM,kBAAAE,QAAG,SAAS,MAAM,oBAAoB,MAAM;AAC9D,iBAAO,IACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAwB,EACrD,MAAM,CAAC,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AAAA,QAC1C,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,mBAAO,CAAC;AAAA,UACV;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAM,YAA2B;AAC/B,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,cAAM,YAA8B,CAAC;AAErC,mBAAW,UAAU,MAAM,OAAO;AAChC,gBAAM,SAAS,MAAMD,YAAW,OAAO,IAAI;AAC3C,gBAAM,aACJ,OAAO,WAAW,YACd,YACA,SACE,OAAO,SACP;AACR,oBAAU,KAAK;AAAA,YACb,GAAG;AAAA,YACH,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,cAAM,YAAY,IAAI,UAAU,KAAK,OAAO;AAC5C,cAAM,QAAQ,MAAM,UAAU,KAAK;AACnC,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,UAAU;AAClB;AAAA,UACF;AAEA,gBAAM,QAAQ,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,YAAY,KAAK,WAAW,SAAS;AAC/F,cAAI,CAAC,OAAO;AACV,kBAAM,UAAU,eAAe,KAAK,EAAE;AAAA,UACxC;AAAA,QACF;AAEA,cAAM,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AAAA,MAC3C;AAAA,MAEA,MAAM,eAAe,QAAiC;AACpD,cAAM,OAAO,MAAM,IAAI,UAAU,KAAK,OAAO,EAAE,KAAK,MAAM;AAC1D,YAAI,CAAC,KAAK,UAAU;AAClB,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,WAAW,MAAM,KAAK,KAAK,KAAK,QAAQ;AAC9C,YAAI,CAAC,YAAY,SAAS,WAAW,WAAW;AAC9C,iBAAO,KAAK;AAAA,QACd;AAEA,eAAO,SAAS;AAAA,MAClB;AAAA,MAEA,MAAc,SAAS,cAAsB,QAA+B;AAC1E,cAAM,WAAW,MAAM,KAAK,IAAI,YAAY;AAC5C,cAAM,IAAI,UAAU,KAAK,OAAO,EAAE,aAAa,QAAQ,SAAS,IAAI;AACpE,cAAM,KAAK,aAAa;AAAA,UACtB,GAAG;AAAA,UACH;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAAA,MACH;AAAA,MAEA,MAAc,qBAAqB,UAAmC;AACpE,cAAM,iBAAiBJ,eAAc,QAAQ,KAAK;AAClD,cAAM,WAAW,IAAI,KAAK,MAAM,KAAK,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC;AAChF,YAAI,CAAC,SAAS,IAAI,cAAc,GAAG;AACjC,iBAAO;AAAA,QACT;AAEA,iBAAS,SAAS,GAAG,SAAS,KAAQ,UAAU,GAAG;AACjD,gBAAM,YAAY,GAAG,cAAc,IAAI,MAAM;AAC7C,cAAI,CAAC,SAAS,IAAI,SAAS,GAAG;AAC5B,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,cAAM,IAAI,MAAM,2CAA2C,QAAQ,IAAI;AAAA,MACzE;AAAA,MAEA,MAAc,YAA0C;AACtD,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,YAAI;AACF,gBAAM,MAAM,MAAM,kBAAAK,QAAG,SAAS,MAAM,mBAAmB,MAAM;AAC7D,iBAAO,eAAe,KAAK,MAAM,GAAG,CAAwB;AAAA,QAC9D,SAAS,OAAO;AACd,cAAK,MAAgC,SAAS,UAAU;AACtD,kBAAM,QAAQ,eAAe,EAAE,OAAO,CAAC,EAAE,CAAC;AAC1C,kBAAM,KAAK,UAAU,KAAK;AAC1B,mBAAO;AAAA,UACT;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,MAEA,MAAc,UAAU,OAA2C;AACjE,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,aAAa,eAAe,KAAK;AACvC,cAAM,kBAAAA,QAAG,UAAU,MAAM,mBAAmB,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,MAChG;AAAA,MAEA,MAAc,aAAa,QAAiD;AAC1E,cAAM,QAAQ,MAAM,KAAK,UAAU;AACnC,cAAM,aAAa,kBAAkB,MAAM;AAC3C,cAAM,YAAY,MAAM,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,IAAI,IACtE,MAAM,MAAM,IAAI,CAAC,SAAU,KAAK,SAAS,WAAW,OAAO,aAAa,IAAK,IAC7E,CAAC,GAAG,MAAM,OAAO,UAAU;AAC/B,cAAM,KAAK,UAAU,EAAE,OAAO,UAAU,CAAC;AACzC,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,KAAK,OAA2C;AAC5D,cAAM,QAAQ,MAAM,8BAA8B,KAAK,OAAO;AAC9D,cAAM,kBAAAA,QAAG,WAAW,MAAM,oBAAoB,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,GAAM,MAAM;AAAA,MACpF;AAAA,MAEA,MAAc,gBAA+B;AAC3C,YAAI;AACF,gBAAM,KAAK,OAAO,CAAC,aAAa,iBAAiB,CAAC;AAAA,QACpD,QAAQ;AACN,gBAAM,IAAI,MAAM,6CAA6C;AAAA,QAC/D;AAAA,MACF;AAAA,MAEA,MAAc,aAAa,QAAkC;AAC3D,YAAI;AACF,gBAAM,KAAK,OAAO,CAAC,YAAY,YAAY,WAAW,cAAc,MAAM,EAAE,CAAC;AAC7E,iBAAO;AAAA,QACT,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAc,OAAO,MAA+B;AAClD,kBAAM,qBAAM,OAAO,CAAC,MAAM,KAAK,SAAS,GAAG,IAAI,GAAG;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,KAAK;AAAA,UACL,aAAa;AAAA,QACf,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;AChZO,SAAS,gBAAgB,qBAAyC,WAA4B;AACnG,SAAO,OAAO,wBAAwB,YAAY,OAAO,SAAS,mBAAmB,KAAK,sBAAsB,IAC5G,YAAY,KAAK,YAAY,KAAK,MAAM,mBAAmB,MAAM,IACjE;AACN;AAEA,eAAsB,4BACpB,SACA,SACA,UACA,SACwB;AACxB,MAAI,SAAS,SAAS,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,IAAI,WAAW,qBAAqB,OAAO,EAAE,OAAO;AAChE,QAAM,QAAQ,MAAM,IAAI,UAAU,SAAS,IAAI;AAC/C,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,WACJ,SAAS,SAAS,SACd;AAAA,SAAyE,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC,aACvG;AAAA,SAAmG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAEvI,SAAO,QAAQ,aAAa,eAAe,SAAS;AAAA,IAClD;AAAA,MACE;AAAA,MACA,uBAAuB,QAAQ;AAAA,IACjC;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,uBACpB,SACA,UACA,KAC6B;AAC7B,QAAM,mBAAmB,OAAO,EAAE,MAAM,MAAM,IAAI;AAClD,QAAM,wBAAwB,OAAO,EAAE,MAAM,MAAM,IAAI;AACvD,QAAM,CAAC,aAAa,aAAa,iBAAiB,mBAAmB,iBAAiB,yBAAyB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnI,IAAI,UAAU,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,WAAW;AAAA,IAC1D,IAAI,UAAU,OAAO,EAAE,iBAAiB,EAAE,MAAM,MAAM,eAAe;AAAA,IACrE,IAAI,cAAc,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,eAAe;AAAA,IAClE,IAAI,mBAAmB,OAAO,EAAE,UAAU;AAAA,MACxC;AAAA,MACA,aAAa,SAAS;AAAA,IACxB,CAAC,EAAE,MAAM,MAAM,qBAAqB;AAAA,IACpC,IAAI,qBAAqB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,uBAAuB;AAAA,IACjF,IAAI,wBAAwB,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,uDAAuD;AAAA,EACtH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AA/EA;AAAA;AAAA;AAAA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA,IAAAK;AACA,IAAAA;AACA;AACA,IAAAC;AACA,IAAAD;AAAA;AAAA;;;ACdA;AAAA;AAAA;AAAA;AAUA;AAAA;AAAA;;;ACUA,eAAsB,sBACpB,SACA,OACA,cACwB;AACxB,QAAM,WAAW,MAAM,aAAa,eAAe,SAAS;AAAA,IAC1D,cAAc,QAAQ,KAAK;AAAA,EAC7B,CAAC;AAED,SAAO,aAAa;AAAA,IAClB,qBAAqB;AAAA,MACnB;AAAA,QACE,GAAG;AAAA,QACH,mBAAmB,uBAAuB,SAAS,iBAAiB;AAAA,MACtE;AAAA,MACA;AAAA,IACF,GAAG,KAAK;AAAA,EACV;AACF;AAEA,eAAsB,mBACpB,SACA,cACA,WACwB;AACxB,SAAO,aAAa,KAAK,iBAAiB,oBAAoB,SAAS,cAAc,SAAS,EAAE,CAAC,CAAC;AACpG;AAEA,eAAsB,oBACpB,SACA,cACA,qBACA,OACwB;AACxB,SAAO,aAAa,KAAK,oBAAoB,uBAAuB,SAAS,qBAAqB,KAAK,CAAC,CAAC;AAC3G;AAEA,eAAsB,2BACpB,OACwB;AACxB,SAAO,MAAM,aAAa;AAAA,IACxB,wBAAwB,MAAM,SAAS;AAAA,MACrC,WAAW,MAAM;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,cAAc,MAAM;AAAA,IACtB,CAAC;AAAA,EACH;AACF;AAnEA;AAAA;AAAA;AAAA;AAMA;AACA;AACA;AAAA;AAAA;;;ACaA,eAAsB,wBACpB,QACwB;AACxB,MAAI,CAAC,4BAA4B,OAAO,SAAS,GAAG;AAClD,WAAO,kBAAkB,OAAO,YAAY,OAAO,WAAW,OAAO,QAAQ;AAAA,EAC/E;AAEA,QAAM,yBAAyB,MAAM,sBAAsB,MAAM;AACjE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,KAAK,UAAU,6BAA6B,OAAO,UAAU,OAAO,WAAW,sBAAsB,GAAG,MAAM,CAAC;AAAA,IAC/G,OAAO;AAAA,IACP;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,WAA4B;AACtE,SACE,UAAU,SAAS,oCACnB,OAAO,WAAW,WAAW,MAAM,IAAI;AAE3C;AAEA,eAAe,sBACb,QAC0C;AAC1C,QAAM,aAAa,qBAAqB,OAAO,eAAe,YAAY;AAC1E,QAAM,aAAa,mBAAAE,QAAK,KAAK,WAAW,gBAAgB,OAAO,SAAS;AACxE,QAAM,YAAY,uBAAuB,OAAO,SAAS;AACzD,QAAM,OAAO,QAAQ,OAAO,QAAQ;AACpC,QAAM,OAAO,oBAAAC,QAAO,WAAW,QAAQ,EAAE,OAAO,OAAO,SAAS,EAAE,OAAO,KAAK;AAC9E,QAAM,WAAW,GAAG,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM,GAAG,EAAE,CAAC,IAAI,SAAS;AACxE,QAAM,sBAAsB,mBAAAD,QAAK,KAAK,YAAY,QAAQ;AAC1D,QAAM,cAAc,mBAAAA,QAAK,SAAS,OAAO,eAAe,cAAc,mBAAmB,KAAK;AAE9F,QAAM,kBAAAE,QAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAC9C,QAAM,kBAAAA,QAAG,UAAU,qBAAqB,OAAO,WAAW,MAAM;AAEhE,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,YAAY,OAAO,WAAW,OAAO,WAAW,MAAM;AAAA,IACtD,YAAY,OAAO,UAAU;AAAA,IAC7B,SAAS,wBAAwB,OAAO,WAAW,6BAA6B;AAAA,IAChF,QAAQ;AAAA,EACV;AACF;AAEA,SAAS,6BACP,UACA,WACA,wBACyB;AACzB,QAAM,UAAmC;AAAA,IACvC,cAAc;AAAA,IACd,MAAM;AAAA,IACN,aAAa,uBAAuB;AAAA,IACpC,YAAY,uBAAuB;AAAA,IACnC,YAAY,uBAAuB;AAAA,IACnC,SAAS,yBAAyB,UAAU,SAAS;AAAA,IACrD,SAAS,uBAAuB;AAAA,IAChC,QAAQ,uBAAuB;AAAA,EACjC;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,sBAAgB,SAAS,QAAQ,IAAI;AACrC,sBAAgB,SAAS,QAAQ,MAAM;AACvC,sBAAgB,SAAS,QAAQ,eAAe;AAChD,sBAAgB,SAAS,QAAQ,QAAQ;AACzC,sBAAgB,SAAS,QAAQ,OAAO;AACxC,qBAAe,SAAS,QAAQ,SAAS;AACzC,qBAAe,SAAS,QAAQ,SAAS;AACzC,qBAAe,SAAS,QAAQ,QAAQ;AACxC,sBAAgB,SAAS,QAAQ,UAAU;AAC3C,sBAAgB,SAAS,QAAQ,OAAO;AACxC,sBAAgB,SAAS,QAAQ,OAAO;AACxC,sBAAgB,SAAS,QAAQ,WAAW;AAC5C,sBAAgB,SAAS,QAAQ,QAAQ;AACzC,sBAAgB,SAAS,QAAQ,MAAM;AACvC,sBAAgB,SAAS,QAAQ,QAAQ;AACzC,sBAAgB,SAAS,QAAQ,UAAU;AAAA,IAC7C;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,UAAkB,WAA2B;AAC7E,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,YAAY;AAAA,QAChB,eAAe,MAAM,OAAO,EAAE;AAAA,QAC9B,eAAe,QAAQ,OAAO,IAAI;AAAA,QAClC,eAAe,iBAAiB,OAAO,aAAa;AAAA,QACpD,eAAe,UAAU,OAAO,MAAM;AAAA,QACtC,eAAe,SAAS,OAAO,KAAK;AAAA,QACpC,mBAAmB,WAAW,OAAO,OAAO;AAAA,QAC5C,mBAAmB,WAAW,OAAO,OAAO;AAAA,QAC5C,mBAAmB,UAAU,OAAO,MAAM;AAAA,QAC1C,eAAe,YAAY,OAAO,QAAQ;AAAA,QAC1C,eAAe,SAAS,OAAO,KAAK;AAAA,QACpC,eAAe,SAAS,OAAO,KAAK;AAAA,QACpC,eAAe,aAAa,OAAO,SAAS;AAAA,QAC5C,eAAe,UAAU,OAAO,MAAM;AAAA,QACtC,eAAe,QAAQ,OAAO,IAAI;AAAA,QAClC,eAAe,UAAU,OAAO,MAAM;AAAA,QACtC,eAAe,YAAY,OAAO,QAAQ;AAAA,MAC5C,EAAE,OAAO,CAAC,aAAiC,QAAQ,QAAQ,CAAC;AAE5D,UAAI,UAAU,SAAS,GAAG;AACxB,eAAO,UAAU,KAAK,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,mBAAmB,UAAU,WAAW,GAAG;AACpD;AAEA,SAAS,uBAAuB,WAA2B;AACzD,MAAI;AACF,SAAK,MAAM,SAAS;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QAAQ,OAAuB;AACtC,SAAO,MACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,KAAK;AACrB;AAEA,SAAS,gBACP,QACA,QACA,KACM;AACN,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,GAAG,IAAI;AAAA,EAChB;AACF;AAEA,SAAS,eACP,QACA,QACA,KACM;AACN,QAAM,QAAQ,OAAO,GAAG;AACxB,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB;AAAA,EACF;AAEA,SAAO,GAAG,GAAG,OAAO,IAAI,MAAM;AAChC;AAEA,SAAS,eAAe,KAAa,OAAoC;AACvE,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAa,OAAoC;AAC3E,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,GAAG,IAAI,MAAM,MAAM;AAC/B;AA3MA,IAAAC,qBACAC,mBACAC,oBAOM,kCACA,kCACA;AAXN;AAAA;AAAA;AAAA,IAAAF,sBAAmB;AACnB,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AACA;AACA;AAGA,IAAM,mCAAmC;AACzC,IAAM,mCAAmC;AACzC,IAAM,gCAAgC;AAAA;AAAA;;;ACS/B,SAAS,iCACd,aACA,SAC0B;AAC1B,MAAI,CAAC,6BAA6B,aAAa,OAAO,GAAG;AACvD,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,IAAI;AAAA,KAC3B,QAAQ,6BAA6B,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,YAAY,CAAC,EAAE,OAAO,OAAO;AAAA,EACnG;AACA,QAAM,wBACJ,YAAY,KAAK,CAAC,SAAS,KAAK,SAAS,SAAS,YAAY,KAC9D,CAAC,GAAG,iBAAiB,EAAE,KAAK,CAAC,SAAS,oBAAoB,IAAI,IAAI,CAAC;AAErE,SAAO,YACJ,IAAI,CAAC,YAAY,WAAW;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,MAAM,oBAAoB,WAAW,SAAS,MAAM,qBAAqB;AAAA,EAC3E,EAAE,EACD,KAAK,CAAC,MAAM,UAAU;AACrB,QAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,aAAO,KAAK,OAAO,MAAM;AAAA,IAC3B;AAEA,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B,CAAC,EACA,IAAI,CAAC,UAAU,MAAM,UAAU;AACpC;AAEA,SAAS,6BACP,aACA,SACS;AACT,SAAO,yBAAyB,WAAW,KAAK,iBAAiB,OAAO;AAC1E;AAEA,SAAS,yBAAyB,aAAgD;AAChF,SAAO,YAAY,KAAK,CAAC,SAAS,4BAA4B,KAAK,SAAS,IAAI,CAAC;AACnF;AAEA,SAAS,iBAAiB,SAAuC;AAC/D,QAAM,eAAe,CAAC,QAAQ,OAAO,QAAQ,WAAW,QAAQ,WAAW,EACxE,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC,EACvF,KAAK,IAAI,EACT,KAAK;AAER,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,SAAO,oBAAoB,KAAK,CAAC,YAAY,QAAQ,KAAK,YAAY,CAAC;AACzE;AAEA,SAAS,oBAAoB,MAAc,uBAAwC;AACjF,MAAI,yBAAyB,SAAS,cAAc;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,4BAA4B,IAAI,GAAG;AACrC,WAAO,KAAK,8BAA8B,IAAI;AAAA,EAChD;AAEA,MAAI,iBAAiB,IAAI,IAAI,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,qBAAqB,IAAI,IAAI,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,8BAA8B,MAAsB;AAC3D,MAAI,KAAK,SAAS,mBAAmB,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,mBAAmB,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,0BAA0B,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,gBAAgB,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,eAAe,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,MAAuB;AAC1D,SAAO,4BAA4B,KAAK,IAAI;AAC9C;AAzHA,IASM,qBAOA,qBACA,kBACA;AAlBN;AAAA;AAAA;AASA,IAAM,sBAAsB;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,gBAAgB,oBAAoB,CAAC;AAC1E,IAAM,mBAAmB,oBAAI,IAAI,CAAC,cAAc,aAAa,cAAc,CAAC;AAC5E,IAAM,uBAAuB,oBAAI,IAAI,CAAC,aAAa,gBAAgB,CAAC;AAAA;AAAA;;;AClBpE,IAAa;AAAb,IAAAC,eAAA;AAAA;AAAA;AAAO,IAAM,qBAAN,cAAiC,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,MAET,YAAY,SAAiB,SAA8D;AACzF,cAAM,OAAO;AACb,aAAK,OAAO;AACZ,aAAK,OAAO,QAAQ;AACpB,aAAK,UAAU,QAAQ;AAAA,MACzB;AAAA,IACF;AAAA;AAAA;;;ACUA,eAAsB,iBACpB,SACA,OAM6B;AAC7B,QAAM,UAA6B;AAAA,IACjC,WAAW,QAAQ;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,SAAS,MAAM;AAAA,IACf,SAAS,MAAM;AAAA,IACf,YAAY,MAAM,WAAW,IAAI,CAAC,cAAc,kBAAkB,SAAS,CAAC;AAAA,EAC9E;AAEA,MAAI;AACF,WAAO;AAAA,MACL,QAAQ,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IAClD;AAAA,EACF,SAAS,OAAO;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAChG;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,WAA0D;AACnF,SAAO;AAAA,IACL,MAAM,UAAU;AAAA,IAChB,MAAM,UAAU;AAAA,IAChB,QAAQ,UAAU;AAAA,IAClB,SAAS,UAAU;AAAA,IACnB,YAAY,UAAU,cAAc,WAAW,UAAU,UAAU;AAAA,IACnE,WAAW,UAAU,aAAa,WAAW,UAAU,SAAS;AAAA,EAClE;AACF;AAEA,SAAS,WAAW,OAA+C;AACjE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK,OAAO,MAAM;AAClC;AAnEA;AAAA;AAAA;AAAA;AAAA;;;ACSO,SAAS,SACd,UACA,MACM;AACN,WAAS,IAAI,KAAK,WAAW,SAAS,MAAM,IAAI;AAClD;AAEO,SAAS,UAAU,SAA0C;AAClE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,2BAA4B,MAAgB,OAAO,EAAE;AAAA,EACvE;AACF;AAEO,SAASC,YAAW,OAAgB,OAAuB;AAChE,MAAI,OAAO,UAAU,YAAY,MAAM,WAAW,GAAG;AACnD,UAAM,IAAI,MAAM,kBAAkB,KAAK,+BAA+B;AAAA,EACxE;AAEA,SAAO;AACT;AAEO,SAAS,YAAY,OAAgB,UAA4B;AACtE,SAAO,OAAO,UAAU,YAAY,QAAQ;AAC9C;AAEO,SAAS,oBAAoB,OAAgB,OAAwB;AAC1E,MAAI,OAAO,UAAU,WAAW;AAC9B,UAAM,IAAI,MAAM,kBAAkB,KAAK,sBAAsB;AAAA,EAC/D;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAoC;AACrE,SAAO,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI;AACnF;AAEO,SAAS,YAAY,OAAgB,KAAa,KAAa,UAA0B;AAC9F,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEO,SAAS,SAAS,QAAgB,UAAuD;AAC9F,SAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,QAAgB,OAAuB;AACtE,QAAM,QAAkB,CAAC;AAEzB,aAAW,YAAQ,uBAAU,QAAQ,KAAK,GAAG;AAC3C,UAAM,SAAS,KAAK,QAAQ,MAAM,KAAK,UAAU,MAAM;AACvD,eAAW,QAAQ,KAAK,MAAM,MAAM,OAAO,GAAG;AAC5C,UAAI,KAAK,WAAW,KAAK,WAAW,KAAK;AACvC;AAAA,MACF;AAEA,YAAM,KAAK,GAAG,MAAM,IAAI,IAAI,EAAE;AAC9B,UAAI,MAAM,UAAU,KAAK;AACvB,eAAO,GAAG,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,cACpB,YACA,WACA,YACA,UAEI,CAAC,GAOH;AACF,QAAM,UAMD,CAAC;AACN,QAAM,QAAQ,CAAC,UAAU;AAEzB,SAAO,MAAM,SAAS,KAAK,QAAQ,SAAS,YAAY;AACtD,UAAM,cAAc,MAAM,MAAM;AAChC,QAAI,CAAC,aAAa;AAChB;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,kBAAAC,QAAG,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AACrE,YAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAEjE,eAAW,SAAS,SAAS;AAC3B,UAAI,QAAQ,UAAU,YAAY;AAChC;AAAA,MACF;AAEA,YAAM,YAAY,mBAAAC,QAAK,KAAK,aAAa,MAAM,IAAI;AACnD,UAAI,QAAQ,eAAe,WAAW,MAAM,YAAY,CAAC,GAAG;AAC1D;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,kBAAAD,QAAG,KAAK,SAAS;AACpC,UAAI,MAAM,YAAY,GAAG;AACvB,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY,KAAK,MAAM,YAAY;AAAA,QACrC,CAAC;AACD,YAAI,WAAW;AACb,gBAAM,KAAK,SAAS;AAAA,QACtB;AAAA,MACF,OAAO;AACL,gBAAQ,KAAK;AAAA,UACX,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM,KAAK;AAAA,UACX,WAAW,mBAAAC,QAAK,QAAQ,SAAS,EAAE,YAAY;AAAA,UAC/C,YAAY,KAAK,MAAM,YAAY;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,gBAAgB,UAAkB,UAA0C;AAChG,MAAI;AACF,UAAM,SAAS,MAAM,kBAAAD,QAAG,SAAS,QAAQ;AACzC,QAAI,OAAO,SAAS,CAAC,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,WAAO,aAAa,OAAO,SAAS,MAAM,GAAG,QAAQ;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,mBAAmB,SAAiB,eAAgC;AAClF,MAAI;AACF,WAAO,IAAI,OAAO,SAAS,gBAAgB,MAAM,IAAI;AAAA,EACvD,QAAQ;AACN,WAAO,IAAI,OAAO,YAAY,OAAO,GAAG,gBAAgB,MAAM,IAAI;AAAA,EACpE;AACF;AAEO,SAAS,iBAAiB,OAAe,QAAwB;AACtE,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,SAAO,UAAU,MAAM,QAAQ;AAC7B,UAAM,QAAQ,MAAM,QAAQ,QAAQ,MAAM;AAC1C,QAAI,UAAU,IAAI;AAChB;AAAA,IACF;AAEA,aAAS;AACT,aAAS,QAAQ,OAAO;AAAA,EAC1B;AAEA,SAAO;AACT;AAEO,SAAS,kBAAkB,UAA6C;AAC7E,MAAI,CAAC,YAAY,aAAa,aAAa;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,QAAQ,aAAa,EAAE;AACzC;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AA/MA,IAAAE,mBACAC,oBAEA;AAHA,IAAAC,eAAA;AAAA;AAAA;AAAA,IAAAF,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,kBAA0B;AAE1B;AAAA;AAAA;;;AC6HA,SAAS,yBAAyB,WAAgC;AAChE,QAAM,QAAQ,UAAU,QAAQ,SAAS,IAAI,EAAE,MAAM,IAAI;AACzD,QAAM,UAAuB,CAAC;AAC9B,MAAI,QAAQ;AAEZ,SAAO,QAAQ,MAAM,QAAQ;AAC3B,WAAO,QAAQ,MAAM,UAAU,CAAC,MAAM,KAAK,GAAG,WAAW,MAAM,GAAG;AAChE,eAAS;AAAA,IACX;AAEA,QAAI,SAAS,MAAM,QAAQ;AACzB;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,KAAK;AAChD,aAAS;AAET,QAAI,CAAC,MAAM,KAAK,GAAG,WAAW,MAAM,GAAG;AACrC,YAAM,IAAI,MAAM,uCAAuC;AAAA,IACzD;AAEA,UAAM,cAAc,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,KAAK;AAChD,aAAS;AAET,UAAM,QAA4B,CAAC;AAEnC,WAAO,QAAQ,MAAM,UAAU,CAAC,MAAM,KAAK,GAAG,WAAW,MAAM,GAAG;AAChE,YAAM,SAAS,MAAM,KAAK;AAC1B,UAAI,CAAC,QAAQ;AACX,iBAAS;AACT;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,WAAW,KAAK,GAAG;AAC7B,iBAAS;AACT;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,MAAM,6CAA6C;AACxE,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,MAAM,wBAAwB,MAAM,EAAE;AAAA,MAClD;AAEA,YAAM,WAAW,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AACpD,YAAM,WAAW,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AACpD,eAAS;AAET,YAAM,YAAsB,CAAC;AAC7B,aAAO,QAAQ,MAAM,QAAQ;AAC3B,cAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,MAAM,GAAG;AACrD;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,mBAAS;AACT;AAAA,QACF;AAEA,cAAM,SAAS,KAAK,CAAC;AACrB,YAAI,WAAW,OAAO,WAAW,OAAO,WAAW,OAAO,WAAW,MAAM;AACzE,gBAAM,IAAI,MAAM,gBAAgB,QAAQ,CAAC,2BAA2B,IAAI,EAAE;AAAA,QAC5E;AAEA,kBAAU,KAAK,IAAI;AACnB,iBAAS;AAAA,MACX;AAEA,YAAM,KAAK;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,QAAgB,OAAkC;AAC3E,QAAM,SAAS,OAAO,WAAW,QAAQ;AACzC,QAAM,mBAAmB,SAAS,OAAO,MAAM,CAAC,IAAI;AACpD,QAAM,aAAa,iBAAiB,SAAS,MAAM,IAAI,SAAS;AAChE,QAAM,cAAc,iBAAiB,SAAS,IAAI,iBAAiB,MAAM,OAAO,IAAI,CAAC;AACrF,MAAI,SAAS;AAEb,aAAW,QAAQ,MAAM,OAAO;AAC9B,QAAI,SAAS,KAAK,IAAI,GAAG,KAAK,WAAW,IAAI,MAAM;AACnD,aAAS,gBAAgB,aAAa,QAAQ,IAAI;AAElD,eAAW,WAAW,KAAK,OAAO;AAChC,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,WAAW,QAAQ,MAAM,CAAC;AAEhC,UAAI,WAAW,MAAM;AACnB;AAAA,MACF;AAEA,UAAI,WAAW,KAAK;AAClB,aAAK,YAAY,MAAM,KAAK,QAAQ,UAAU;AAC5C,iBAAO;AAAA,QACT;AAEA,kBAAU;AACV;AAAA,MACF;AAEA,UAAI,WAAW,KAAK;AAClB,aAAK,YAAY,MAAM,KAAK,QAAQ,UAAU;AAC5C,iBAAO;AAAA,QACT;AAEA,oBAAY,OAAO,QAAQ,CAAC;AAC5B,kBAAU;AACV;AAAA,MACF;AAEA,UAAI,WAAW,KAAK;AAClB,oBAAY,OAAO,QAAQ,GAAG,QAAQ;AACtC,kBAAU;AACV,kBAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,KAAK,UAAU;AAC1C,SAAO,SAAS,SAAS,MAAM,KAAK;AACtC;AAEA,SAAS,gBACP,aACA,QACA,MACQ;AACR,QAAM,cAAc,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,CAAC;AAC1F,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,YAAY,MAAM,CAAC;AACpC,OAAK,YAAY,MAAM,KAAK,QAAQ,UAAU;AAC5C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,eAAe,aAAa,QAAQ,QAAQ;AAC3D,SAAO,WAAW,KAAK,SAAS;AAClC;AAEA,SAAS,eAAe,OAAiB,OAAe,UAA0B;AAChF,QAAM,eAAe;AAErB,WACM,QAAQ,KAAK,IAAI,GAAG,QAAQ,YAAY,GAC5C,SAAS,KAAK,IAAI,MAAM,SAAS,GAAG,QAAQ,YAAY,GACxD,SAAS,GACT;AACA,SAAK,MAAM,KAAK,KAAK,QAAQ,UAAU;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AA1SA,IAAAE,mBAiBa;AAjBb;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf;AACA;AACA,IAAAC;AAaO,IAAM,iBAAiC;AAAA,MAC5C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,OAAO;AAAA,YAClB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,YAAYC,YAAW,KAAK,OAAO,OAAO;AAChD,cAAM,gBAAgB,yBAAyB,SAAS;AAExD,YAAI,cAAc,WAAW,GAAG;AAC9B,gBAAM,IAAI,MAAM,gCAAgC;AAAA,QAClD;AAEA,cAAM,aAMD,CAAC;AAEN,mBAAW,SAAS,eAAe;AACjC,gBAAM,UAAU,kBAAkB,MAAM,WAAW;AACnD,gBAAM,UAAU,kBAAkB,MAAM,WAAW;AAEnD,cAAI,WAAW,WAAW,YAAY,SAAS;AAC7C,kBAAM,IAAI,MAAM,yCAAyC,OAAO,OAAO,OAAO,EAAE;AAAA,UAClF;AAEA,gBAAM,aAAa,WAAW;AAC9B,cAAI,CAAC,YAAY;AACf,kBAAM,IAAI,MAAM,+BAA+B;AAAA,UACjD;AAEA,gBAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,gBAAM,SAAS,MAAM,WAAW,QAAQ;AACxC,gBAAM,SAAS,SAAS,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM,IAAI;AAC9D,gBAAM,SAAS,YAAY,OAAO,KAAK;AACvC,gBAAM,QAAQ,kBAAkB,QAAQ,KAAK;AAE7C,cAAI,UAAU,OAAO;AACnB,kBAAM,IAAI,MAAM,6BAA6B,UAAU,EAAE;AAAA,UAC3D;AAEA,qBAAW,KAAK;AAAA,YACd,MAAM;AAAA,YACN,MAAM,YAAY,OAAO,WAAW,SAAS,WAAW;AAAA,YACxD;AAAA,YACA,SAAS,YAAY,OAAO,SAAY;AAAA,YACxC,SAAS,iBAAiB,QAAQ,YAAY,OAAO,KAAK,KAAK;AAAA,UACjE,CAAC;AAAA,QACH;AAEA,mBAAW,aAAa,YAAY;AAClC,cAAI,UAAU,SAAS,UAAU;AAC/B,kBAAM,kBAAAA,QAAG,GAAG,UAAU,MAAM,EAAE,OAAO,KAAK,CAAC;AAC3C;AAAA,UACF;AAEA,gBAAM,sBAAsB,UAAU,IAAI;AAC1C,gBAAM,kBAAAA,QAAG,UAAU,UAAU,MAAM,UAAU,WAAW,IAAI,MAAM;AAAA,QACpE;AACA,cAAM,eAAe,MAAM,iBAAiB,SAAS;AAAA,UACnD,UAAU;AAAA,UACV,SAAS,eAAe,WAAW,MAAM;AAAA,UACzC,SAAS,aAAa,WAAW,GAAK;AAAA,UACtC,YAAY,WAAW,IAAI,CAAC,eAAe;AAAA,YACzC,MAAM,UAAU;AAAA,YAChB,MAAM,UAAU;AAAA,YAChB,QAAQ;AAAA,YACR,SAAS,UAAU;AAAA,YACnB,YAAY,UAAU,SAAS,WAAW,SAAY,UAAU;AAAA,YAChE,WAAW,UAAU,SAAS,WAAW,SAAY,UAAU,WAAW;AAAA,UAC5E,EAAE;AAAA,QACJ,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,SAAS,WAAW,IAAI,CAAC,eAAe;AAAA,gBACtC,MAAM,UAAU;AAAA,gBAChB,MAAM,UAAU;AAAA,cAClB,EAAE;AAAA,cACF,UAAU,aAAa,QAAQ;AAAA,cAC/B,sBAAsB,aAAa;AAAA,cACnC,SAAS,aAAa,WAAW,GAAK;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,WAAW,IAAI,CAAC,cAAc,UAAU,IAAI;AAAA,YAC1D,UAAU,aAAa,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChIA,IAMa;AANb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA;AACA,IAAAC;AAGO,IAAM,sBAAsC;AAAA,MACjD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,wBAAwB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AACnF,cAAM,QAAQ,IAAI,mBAAmB,QAAQ,eAAe,YAAY;AACxE,cAAM,QAAQ,OAAO,KAAK,WAAW,WAAWC,YAAW,KAAK,QAAQ,QAAQ,IAAI;AAEpF,YAAI,OAAO;AACT,gBAAM,MAAM,MAAM,MAAM,KAAK,KAAK;AAClC,gBAAM,iBAAiB,gBAAgB,IAAI,OAAO;AAClD,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,IAAI;AAAA,gBACJ;AAAA,gBACA,SAAS,MAAM,MAAM,UAAU;AAAA,kBAC7B,KAAK,QAAQ;AAAA,kBACb,aAAa,QAAQ,SAAS;AAAA,gBAChC,CAAC;AAAA,cACH;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,YACA,eAAe,kBAAkB,IAAI,WAAW,YAC5C;AAAA,cACE,cAAc;AAAA,gBACZ,WAAW;AAAA,gBACX,SAAS,IAAI;AAAA,gBACb,UAAU,OAAO,IAAI,aAAa,WAAW,IAAI,WAAW;AAAA,gBAC5D,MAAM,eAAe;AAAA,gBACrB,QAAQ,IAAI,aAAa,KAAK,IAAI,WAAW;AAAA,cAC/C;AAAA,YACF,IACA;AAAA,UACN;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,MAAM,KAAK;AAC9B,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,MAAM,MAAM,MAAM,aAAa;AAAA,gBAC7B,KAAK,QAAQ;AAAA,gBACb,aAAa,QAAQ,SAAS;AAAA,cAChC,CAAC;AAAA,cACD,SAAS,MAAM,MAAM,UAAU;AAAA,gBAC7B,KAAK,QAAQ;AAAA,gBACb,aAAa,QAAQ,SAAS;AAAA,cAChC,CAAC;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvEO,SAAS,uBAAuB,SAAgD;AACrF,QAAM,WAAW,mBAAAC,QAAK,QAAQ,QAAQ,KAAK,CAAC,KAAK,EAAE;AACnD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,wDAAwD;AAAA,EAC1E;AAEA,QAAM,YAAQ;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,KAAK,QAAQ;AAAA,MACb,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AAEA,SAAO,MAAM;AACf;AAvCA,IAAAC,oBACA;AADA;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AACjB,gCAAsB;AAAA;AAAA;;;ACDtB,IAMa;AANb;AAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AAGO,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,UAAUC,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,QAAQ;AACnE,cAAM,cAAc,kBAAkB,UAAU,QAAQ,KAAK,QAAQ,MAAM;AAC3E,cAAM,YAAY,YAAY,KAAK,YAAY,KAAO,KAAS,IAAO;AACtE,cAAM,iBAAiB,YAAY,QAAQ,OAAO,uBAAuB,KAAO,KAAS,GAAM;AAC/F,cAAM,QAAQ,IAAI,mBAAmB,QAAQ,eAAe,YAAY;AACxE,cAAM,MAAM,MAAM,MAAM,OAAO;AAAA,UAC7B;AAAA,UACA,KAAK;AAAA,UACL,aAAa,QAAQ,SAAS;AAAA,UAC9B;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,MAAM,uBAAuB;AAAA,UACjC,SAAS,QAAQ,eAAe;AAAA,UAChC,OAAO,IAAI;AAAA,QACb,CAAC;AACD,cAAM,UAAU,MAAM,MAAM,OAAO,IAAI,IAAI,GAAG;AAE9C,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,KAAK;AAAA,cACL,SAAS,MAAM,MAAM,UAAU;AAAA,gBAC7B,KAAK;AAAA,gBACL,aAAa,QAAQ,SAAS;AAAA,cAChC,CAAC;AAAA,YACH;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrEA,IAKa;AALb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,YAAY,IAAI,UAAU,QAAQ,eAAe,YAAY;AACnE,cAAM,UAAU,MAAM,UAAU,YAAY;AAC5C,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,QAAQ,MAAM,IAAI;AAAA,UACtB,QAAQ,SAAS;AAAA,UACjBC,YAAW,KAAK,SAAS,SAAS;AAAA,UAClC,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,QACrC;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,gBAAgB,KAAK;AAAA,YAChC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC/CA,IAMa;AANb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,mBAAmB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AAC9E,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AAEA,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,OAAO,MAAM,MAAM,MAAM,QAAQ,QAAQ,SAAS,IAAI;AAC5D,YAAI;AACJ,YAAI;AACJ,YAAI;AACF,qBAAW,MAAM,IAAI,cAAc,QAAQ,eAAe,YAAY,EAAE,cAAc,KAAK,IAAI,KAAK,OAAO;AAAA,QAC7G,SAAS,OAAO;AACd,0BAAgB,OAAQ,MAAgC,WAAW,KAAK;AAAA,QAC1E;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzDA,IAIa;AAJb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGO,IAAM,yBAAyC;AAAA,MACpD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,sBAAsB;AAAA,gBACpB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,yBAAyB;AAAA,gBACvB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,wBAAwB,QAAQ,eAAe,YAAY;AAC7E,cAAM,UAAU,MAAM,MAAM,KAAK;AACjC,cAAM,cACJ,OAAO,KAAK,yBAAyB,aACrC,OAAO,KAAK,4BAA4B;AAE1C,YAAI,eAAe,QAAQ,SAAS,SAAS,QAAQ;AACnD,gBAAM,IAAI,MAAM,+CAA+C;AAAA,QACjE;AAEA,cAAM,SAAS,cACX,MAAM,MAAM,OAAO;AAAA,UACjB,oBAAoB,YAAY,KAAK,sBAAsB,QAAQ,kBAAkB;AAAA,UACrF,uBAAuB,YAAY,KAAK,yBAAyB,QAAQ,qBAAqB;AAAA,QAChG,CAAC,IACD;AAEJ,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACxDO,SAAS,wBAAwB,MAA2B;AACjE,QAAM,SAAsB,CAAC;AAC7B,QAAM,UAAU;AAEhB,aAAW,SAAS,KAAK,SAAS,OAAO,GAAG;AAC1C,UAAM,OAAO,MAAM,CAAC,KAAK,IAAI,YAAY;AACzC,UAAM,YAAY,MAAM,CAAC,KAAK;AAE9B,QAAI,WAAW,KAAK,GAAG,GAAG;AACxB,YAAM,eAAe,OAAO,SAAS,IAAI,MAAM,CAAC,GAAG,EAAE;AACrD,YAAM,OAAO,UAAU,SAAS;AAChC,UAAI,MAAM;AACR,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK;AACf,YAAM,OAAO,UAAU,SAAS;AAChC,UAAI,MAAM;AACR,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,OAAO;AACjB,YAAM,OAAO,mBAAmB,SAAS,EAAE,QAAQ,OAAO,EAAE;AAC5D,iBAAW,QAAQ,KAAK,MAAM,IAAI,GAAG;AACnC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AACA;AAAA,IACF;AAEA,QAAI,QAAQ,QAAQ,QAAQ,MAAM;AAChC,YAAM,QAAQ,CAAC,GAAG,UAAU,SAAS,+BAA+B,CAAC;AACrE,YAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,cAAM,OAAO,UAAU,KAAK,CAAC,KAAK,EAAE;AACpC,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAEA,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,QAAQ,OAAO,GAAG,QAAQ,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI;AAAA,QAC1D,CAAC;AAAA,MACH,CAAC;AACD;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS;AACnB,YAAM,OAAO,CAAC,GAAG,UAAU,SAAS,+BAA+B,CAAC,EACjE;AAAA,QAAI,CAAC,QACJ,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS,6CAA6C,CAAC,EACvE,IAAI,CAAC,SAAS,UAAU,KAAK,CAAC,KAAK,EAAE,CAAC,EACtC,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAAA,MACrC,EACC,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;AAEjC,UAAI,KAAK,SAAS,GAAG;AACnB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM,mBAAmB,IAAI;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,2BAA2B,QAA6B;AACtE,QAAM,QAAkB,CAAC;AACzB,MAAI,cAAc;AAElB,QAAM,iBAAiB,MAAY;AACjC,QAAI,aAAa;AACf,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AACb,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,SAAS;AAC1B,qBAAe;AACf,UAAI,MAAM,KAAK,WAAW,GAAG;AAC3B;AAAA,MACF;AAEA,YAAM,OAAO,mBAAmB,MAAM,IAAI;AAC1C,YAAM,SAAS,KAAK,CAAC,KAAK,CAAC;AAC3B,YAAM,KAAK,KAAK,OAAO,KAAK,KAAK,CAAC,IAAI;AACtC,YAAM,KAAK,KAAK,OAAO,IAAI,MAAM,KAAK,EAAE,KAAK,KAAK,CAAC,IAAI;AAEvD,iBAAW,OAAO,KAAK,MAAM,CAAC,GAAG;AAC/B,cAAM,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,IAAI;AAAA,MACrC;AAEA,YAAM,KAAK,EAAE;AACb;AAAA,IACF;AAEA,QAAI,MAAM,MAAM;AACd,UAAI,CAAC,aAAa;AAChB,cAAM,KAAK,KAAK;AAChB,sBAAc;AAAA,MAChB;AACA,YAAM,KAAK,MAAM,IAAI;AACrB;AAAA,IACF;AAEA,mBAAe;AAEf,QAAI,MAAM,cAAc;AACtB,YAAM,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,EAAE;AACtF,YAAM,KAAK,EAAE;AACb;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,IAAI;AACrB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,iBAAe;AACf,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAC/B;AAEO,SAAS,sBAAsB,QAA2C;AAC/E,QAAM,WAAiC,CAAC;AAExC,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,OAAO,SAAS,eAAe,CAAC,MAAM,cAAc;AACtD;AAAA,IACF;AAEA,UAAM,mBAAmB,wBAAwB,QAAQ,OAAO,MAAM,YAAY;AAClF,UAAM,UAAU,OACb,MAAM,QAAQ,GAAG,gBAAgB,EACjC,OAAO,CAAC,SAA4D,KAAK,SAAS,WAAW,EAC7F,IAAI,CAAC,SAAS,KAAK,KAAK,KAAK,CAAC,EAC9B,OAAO,OAAO,EACd,KAAK,GAAG,EACR,QAAQ,QAAQ,GAAG,EACnB,MAAM,GAAG,GAAG;AAEf,aAAS,KAAK;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO,MAAM;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,QACA,SACqF;AACrF,QAAM,mBAAmB,iBAAiB,OAAO;AAEjD,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,OAAO,SAAS,eAAe,CAAC,MAAM,cAAc;AACtD;AAAA,IACF;AAEA,QAAI,iBAAiB,MAAM,IAAI,MAAM,kBAAkB;AACrD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,cAAc;AAAA,MACd,WAAW,QAAQ;AAAA,MACnB,UAAU,wBAAwB,QAAQ,OAAO,MAAM,YAAY;AAAA,MACnE,OAAO,MAAM;AAAA,IACf;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAuB;AACtD,SAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,EAAE,kBAAkB;AAC7D;AAEA,SAAS,wBAAwB,QAAqB,YAAoB,OAAuB;AAC/F,WAAS,QAAQ,aAAa,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AAClE,UAAM,QAAQ,OAAO,KAAK;AAC1B,QAAI,OAAO,SAAS,eAAe,MAAM,gBAAgB,MAAM,gBAAgB,OAAO;AACpF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,OAAO;AAChB;AAEA,SAAS,mBAAmB,MAA8B;AACxD,QAAM,cAAc,KAAK,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC;AAC1E,SAAO,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,GAAG,MAAM,KAAK,EAAE,QAAQ,cAAc,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC;AAClG;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO;AAAA,IACL,eAAe,KAAK,EACjB,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,WAAW,IAAI,EACvB,QAAQ,YAAY,GAAG;AAAA,EAC5B,EACG,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAAS,eAAe,OAAuB;AAC7C,SAAO,MAAM,QAAQ,sDAAsD,CAAC,QAAQ,QAAQ,MAAM,UAAU;AAC1G,UAAM,OAAO,UAAU,KAAK,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK,KAAK,OAAO,IAAI;AACxE,WAAO,IAAI,IAAI,KAAK,mBAAmB,OAAO,IAAI,CAAC,CAAC;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO;AAAA,IACL,MACG,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,WAAW,IAAI,EACvB,QAAQ,YAAY,GAAG;AAAA,EAC5B;AACF;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,YAAY,GAAG,EACvB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,GAAI,EACxB,QAAQ,WAAW,GAAG;AAC3B;AA3PA;AAAA;AAAA;AAAA;AAAA;;;ACQO,SAAS,yBAAyB,SAA2B;AAClE,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,SAAS,QAAQ,SAAS,mBAAmB,GAAG;AACzD,UAAM,OAAO,MAAM,CAAC,KAAK,IAAI,KAAK;AAClC,QAAI,KAAK;AACP,gBAAU,IAAI,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,SAAS;AACtB;AAEO,SAAS,uBACd,SACA,WACsB;AACtB,QAAM,WAAW,oBAAI,IAAY;AACjC,QAAM,cAAc,oBAAI,IAAY;AAEpC,QAAM,WAAW,QAAQ,QAAQ,qBAAqB,CAAC,aAAa,WAAmB;AACrF,UAAM,MAAM,OAAO,KAAK;AACxB,UAAM,QAAQ,qBAAqB,WAAW,GAAG;AAEjD,QAAI,UAAU,QAAW;AACvB,kBAAY,IAAI,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,aAAS,IAAI,GAAG;AAChB,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,SAAS;AAAA,IACT,UAAU,CAAC,GAAG,QAAQ;AAAA,IACtB,aAAa,CAAC,GAAG,WAAW;AAAA,EAC9B;AACF;AAEA,SAAS,qBAAqB,WAAoC,KAAiC;AACjG,QAAM,SAAS,gBAAgB,UAAU,GAAG,CAAC;AAC7C,MAAI,WAAW,QAAW;AACxB,WAAO;AAAA,EACT;AAEA,QAAMC,SAAO,IAAI,MAAM,GAAG,EAAE,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC,EAAE,OAAO,OAAO;AAC3E,MAAIA,OAAK,WAAW,GAAG;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,UAAmB;AACvB,aAAW,WAAWA,QAAM;AAC1B,QAAI,CAAC,WAAW,OAAO,YAAY,YAAY,MAAM,QAAQ,OAAO,KAAK,EAAE,WAAW,UAAU;AAC9F,aAAO;AAAA,IACT;AAEA,cAAW,QAAoC,OAAO;AAAA,EACxD;AAEA,SAAO,gBAAgB,OAAO;AAChC;AAEA,SAAS,gBAAgB,OAAoC;AAC3D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AAC3D,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAjFA,IAMM;AANN;AAAA;AAAA;AAMA,IAAM,sBAAsB;AAAA;AAAA;;;ACE5B,eAAsB,iBAAiB,UAAyC;AAC9E,QAAM,OAAO,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAEnC,QAAM,CAAC,YAAY,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjD,eAAAC,QAAQ,cAAc,EAAE,MAAM,SAAS,CAAC;AAAA,IACxC,eAAAA,QAAQ,eAAe,EAAE,MAAM,SAAS,CAAC;AAAA,EAC3C,CAAC;AAED,QAAM,OAAO,WAAW,SAAS;AACjC,QAAM,UAAU,WAAW,SAAS;AACpC,QAAM,SAAS,wBAAwB,IAAI;AAC3C,QAAM,UAAU,eAAe,IAAI;AACnC,QAAM,WAAW,kBAAkB,CAAC,GAAG,WAAW,UAAU,GAAG,WAAW,QAAQ,CAAC;AACnF,QAAM,kBAAkB,2BAA2B,MAAM;AAEzD,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,sBAAsB,MAAM;AAAA,IACtC,cAAc,yBAAyB,OAAO;AAAA,IAC9C;AAAA,IACA,OAAO,WAAW,SAAS,OAAO;AAAA,IAClC,YAAY;AAAA,MACV,YAAY,QAAQ;AAAA,MACpB,YAAY,gBAAgB,OAAO;AAAA,MACnC,UAAU,QAAQ;AAAA,MAClB,QAAQ,SAAS,MAAM,OAAO;AAAA,MAC9B,OAAO,SAAS,MAAM,GAAG;AAAA,MACzB,QAAQ,SAAS,MAAM,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,kBAAkB,UAAqE;AAC9F,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,aAA4B,CAAC;AAEnC,aAAW,WAAW,UAAU;AAC9B,UAAM,QAAQ,QAAQ,QAAQ,QAAQ,KAAK,KAAK;AAChD,UAAM,QAAQ,QAAQ,WAAW,IAAI,KAAK;AAC1C,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,MAAM,GAAG,IAAI,IAAI,IAAI;AAC3B,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AAEA,SAAK,IAAI,GAAG;AACZ,eAAW,KAAK;AAAA,MACd;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,MAAiC;AACvD,QAAM,UAA6B,CAAC;AACpC,QAAM,UAAU;AAEhB,aAAW,SAAS,KAAK,SAAS,OAAO,GAAG;AAC1C,UAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE;AACjD,UAAM,OAAOC,WAAU,MAAM,CAAC,KAAK,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,QAAQ,CAAC,OAAO,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG;AAC9D;AAAA,IACF;AAEA,YAAQ,KAAK;AAAA,MACX;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,SAA4B,SAAqC;AACnF,QAAM,eAAe,QAAQ,KAAK,CAAC,SAAS,KAAK,UAAU,CAAC,GAAG,QAAQ,QAAQ,CAAC,GAAG;AACnF,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,SAAO,QACJ,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,GAC7B,MAAM,GAAG,GAAG;AAClB;AAEA,SAAS,gBAAgB,SAAyB;AAChD,SAAO,QACJ,MAAM,eAAe,EACrB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EAAE;AACrB;AAEA,SAAS,SAAS,MAAc,KAAqB;AACnD,QAAM,UAAU,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,OAAO,IAAI,CAAC;AACzD,SAAO,SAAS,UAAU;AAC5B;AAEA,SAASA,WAAU,OAAuB;AACxC,SAAOC;AAAA,IACL,MACG,QAAQ,gBAAgB,IAAI,EAC5B,QAAQ,WAAW,IAAI,EACvB,QAAQ,YAAY,GAAG;AAAA,EAC5B,EACG,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAASA,oBAAmB,OAAuB;AACjD,SAAO,MACJ,QAAQ,YAAY,GAAG,EACvB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG,EACrB,QAAQ,UAAU,GAAG,EACrB,QAAQ,YAAY,GAAI,EACxB,QAAQ,WAAW,GAAG;AAC3B;AAtIA,IAAAC,mBAEA;AAFA;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf,qBAAoB;AAEpB;AACA;AAAA;AAAA;;;ACUA,eAAsB,gBAAgB,SAA4C;AAChF,QAAM,SAAS,gBAAgB,QAAQ,SAAS,QAAQ,MAAM;AAC9D,QAAM,WAAW,OAAO,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC;AAC7D,QAAM,WAAW,IAAI,qBAAS;AAAA,IAC5B,SAAS,QAAQ,WAAW;AAAA,IAC5B,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ;AAAA,IACrB,UAAU;AAAA,MACR;AAAA,QACE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO,mBAAO,SAAS,QAAQ;AACjC;AAEO,SAAS,wBAAwB,SAAiB,QAAkC;AACzF,QAAM,SAAS,gBAAgB,SAAS,MAAM;AAC9C,QAAM,QAAkB,CAAC;AAEzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,CAAC,CAAC;AACtD,YAAM,KAAK,EAAE;AACb;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,IAAI;AACrB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAC/B;AAEO,SAAS,gBAAgB,SAAiB,QAAuC;AACtF,SAAO,WAAW,aAAa,oBAAoB,OAAO,IAAI,qBAAqB,OAAO;AAC5F;AAEA,SAAS,qBAAqB,SAA8B;AAC1D,SAAO,QACJ,MAAM,eAAe,EACrB,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAC3B,OAAO,OAAO,EACd,IAAI,CAAC,WAAW;AAAA,IACf,MAAM;AAAA,IACN,MAAM,MAAM,QAAQ,UAAU,IAAI;AAAA,EACpC,EAAE;AACN;AAEA,SAAS,oBAAoB,SAA8B;AACzD,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,QAAM,SAAsB,CAAC;AAC7B,MAAI,iBAA2B,CAAC;AAEhC,QAAM,iBAAiB,MAAY;AACjC,UAAM,OAAO,eAAe,KAAK,GAAG,EAAE,KAAK;AAC3C,QAAI,MAAM;AACR,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AACA,qBAAiB,CAAC;AAAA,EACpB;AAEA,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,UAAM,UAAU,KAAK,KAAK;AAE1B,QAAI,CAAC,SAAS;AACZ,qBAAe;AACf;AAAA,IACF;AAEA,QAAI,OAAO,KAAK,OAAO,GAAG;AACxB,qBAAe;AACf,YAAM,YAAsB,CAAC;AAC7B,eAAS;AAET,aAAO,QAAQ,MAAM,UAAU,CAAC,OAAO,MAAM,MAAM,KAAK,KAAK,IAAI,KAAK,CAAC,GAAG;AACxE,kBAAU,KAAK,MAAM,KAAK,KAAK,EAAE;AACjC,iBAAS;AAAA,MACX;AAEA,UAAI,UAAU,WAAW,GAAG;AAC1B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,YAAY,WAAW;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,MACF;AAEA;AAAA,IACF;AAEA,UAAM,eAAe,QAAQ,MAAM,mBAAmB;AACtD,QAAI,cAAc;AAChB,qBAAe;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM,aAAa,CAAC,GAAG,KAAK,KAAK;AAAA,QACjC,cAAc,aAAa,CAAC,GAAG,UAAU;AAAA,MAC3C,CAAC;AACD;AAAA,IACF;AAEA,QAAI,oBAAoB,OAAO,GAAG;AAChC,YAAM,aAAa,CAAC,OAAO;AAC3B,UAAI,SAAS,QAAQ;AAErB,aAAO,SAAS,MAAM,UAAU,qBAAqB,MAAM,MAAM,KAAK,IAAI,KAAK,CAAC,GAAG;AACjF,mBAAW,MAAM,MAAM,MAAM,KAAK,IAAI,KAAK,CAAC;AAC5C,kBAAU;AAAA,MACZ;AAEA,YAAM,OAAO,mBAAmB,UAAU;AAC1C,UAAI,KAAK,SAAS,GAAG;AACnB,uBAAe;AACf,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,QACF,CAAC;AACD,gBAAQ,SAAS;AACjB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,MAAM,qBAAqB;AACpD,QAAI,aAAa;AACf,qBAAe;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM,GAAG,KAAK,OAAO,KAAK,OAAO,YAAY,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,GAAG,KAAK,KAAK,EAAE;AAAA,MACtG,CAAC;AACD;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,uBAAuB;AACvD,QAAI,cAAc;AAChB,qBAAe;AACf,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MACE,GAAG,KAAK,OAAO,KAAK,OAAO,aAAa,CAAC,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,GAC3D,aAAa,CAAC,CAAC,KAAK,aAAa,CAAC,GAAG,KAAK,KAAK,EAAE;AAAA,MACxD,CAAC;AACD;AAAA,IACF;AAEA,mBAAe,KAAK,OAAO;AAAA,EAC7B;AAEA,iBAAe;AACf,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAuB;AAClD,SAAO,KAAK,SAAS,GAAG,KAAK,CAAC,YAAY,KAAK,IAAI,KAAK,CAAC,YAAY,KAAK,IAAI;AAChF;AAEA,SAAS,mBAAmB,OAA6B;AACvD,QAAM,OAAO,MACV,IAAI,YAAY,EAChB,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;AAEjC,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,iBACJ,KAAK,SAAS,KAAK,KAAK,CAAC,GAAG,MAAM,CAAC,SAAS,cAAc,KAAK,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI;AACrF,QAAM,WAAW,mBAAmB,KAAK,OAAO,KAAK,OAAO,CAAC,GAAG,UAAU,UAAU,cAAc;AAElG,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,cAAc,SAAS,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,KAAK,IAAI,MAAM,GAAG,CAAC;AAC9E,SAAO,SAAS,IAAI,CAAC,QAAQ,OAAO,KAAK,WAAW,CAAC;AACvD;AAEA,SAAS,aAAa,MAAwB;AAC5C,QAAM,UAAU,KAAK,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAChE,SAAO,QAAQ,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AACrD;AAEA,SAAS,OAAO,KAAe,aAA+B;AAC5D,MAAI,IAAI,UAAU,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,GAAG,KAAK,GAAG,MAAM,KAAK,EAAE,QAAQ,cAAc,IAAI,OAAO,GAAG,MAAM,EAAE,CAAC;AAC/E;AAEA,SAAS,gBAAgB,OAAqC;AAC5D,MAAI,MAAM,SAAS,SAAS;AAC1B,WAAO,IAAI,kBAAM;AAAA,MACf,MAAM,MAAM,KAAK;AAAA,QAAI,CAAC,QACpB,IAAI,qBAAS;AAAA,UACX,UAAU,IAAI;AAAA,YAAI,CAAC,SACjB,IAAI,sBAAU;AAAA,cACZ,UAAU;AAAA,gBACR,IAAI,sBAAU;AAAA,kBACZ,UAAU,qBAAqB,IAAI;AAAA,gBACrC,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,IAAI,sBAAU;AAAA,IACnB,SAAS,MAAM,eAAe,gBAAgB,MAAM,YAAY,IAAI;AAAA,IACpE,UAAU,MAAM,OACZ,CAAC,IAAI,oBAAQ,EAAE,MAAM,MAAM,QAAQ,KAAK,MAAM,WAAW,CAAC,CAAC,IAC3D,qBAAqB,MAAM,IAAI;AAAA,EACrC,CAAC;AACH;AAEA,SAAS,qBAAqB,MAAgC;AAC5D,QAAM,WAA6B,CAAC;AACpC,QAAM,UAAU;AAChB,MAAI,YAAY;AAEhB,aAAW,SAAS,KAAK,SAAS,OAAO,GAAG;AAC1C,UAAM,UAAU,MAAM,CAAC,KAAK;AAC5B,UAAM,QAAQ,MAAM,SAAS;AAC7B,kBAAc,UAAU,KAAK,MAAM,WAAW,KAAK,CAAC;AAEpD,QAAI,MAAM,CAAC,KAAK,MAAM,CAAC,GAAG;AACxB,eAAS;AAAA,QACP,IAAI,8BAAkB;AAAA,UACpB,MAAM,MAAM,CAAC;AAAA,UACb,UAAU;AAAA,YACR,IAAI,oBAAQ;AAAA,cACV,MAAM,MAAM,CAAC;AAAA,cACb,OAAO;AAAA,YACT,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,CAAC,GAAG;AACnB,eAAS;AAAA,QACP,IAAI,oBAAQ;AAAA,UACV,MAAM,MAAM,CAAC;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,CAAC,GAAG;AACnB,eAAS;AAAA,QACP,IAAI,oBAAQ;AAAA,UACV,MAAM,MAAM,CAAC;AAAA,UACb,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,CAAC,GAAG;AACnB,eAAS;AAAA,QACP,IAAI,oBAAQ;AAAA,UACV,MAAM,MAAM,CAAC;AAAA,UACb,SAAS;AAAA,QACX,CAAC;AAAA,MACH;AAAA,IACF;AAEA,gBAAY,QAAQ,QAAQ;AAAA,EAC9B;AAEA,gBAAc,UAAU,KAAK,MAAM,SAAS,CAAC;AAE7C,MAAI,SAAS,WAAW,GAAG;AACzB,aAAS;AAAA,MACP,IAAI,oBAAQ;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,UAA4B,MAAoB;AACrE,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,WAAS;AAAA,IACP,IAAI,oBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,OAAe;AACtC,UAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,GAAG;AAAA,IACvC,KAAK;AACH,aAAO,yBAAa;AAAA,IACtB,KAAK;AACH,aAAO,yBAAa;AAAA,IACtB,KAAK;AACH,aAAO,yBAAa;AAAA,IACtB,KAAK;AACH,aAAO,yBAAa;AAAA,IACtB,KAAK;AACH,aAAO,yBAAa;AAAA,IACtB;AACE,aAAO,yBAAa;AAAA,EACxB;AACF;AA7UA;AAAA;AAAA;AAAA;AAAA,kBAWO;AAAA;AAAA;;;ACXP;AAAA;AAAA;AAAA;AACA;AACA;AAOA;AAAA;AAAA;;;ACPO,SAAS,qBAAqB,OAAgB,WAA6B,YAA8B;AAC9G,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,gBAAgB,UAAU,YAAY;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,4DAA4D;AAC9E;AAEO,SAAS,iBAAiB,YAAoB,eAA+B;AAClF,QAAM,YAAY,WAAW,MAAM,UAAU,IAAI,CAAC;AAClD,SAAO,YAAY,WAAW,MAAM,GAAG,CAAC,UAAU,MAAM,IAAI,gBAAgB,GAAG,UAAU,GAAG,aAAa;AAC3G;AAEO,SAAS,sBAAsB,OAAyC;AAC7E,MAAI,UAAU,QAAW;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,UAAM,IAAI,MAAM,kDAAkD;AAAA,EACpE;AAEA,SAAO;AACT;AAEO,SAAS,iBAAiB,OAAgB,UAA0B;AACzE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,UAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAEA,SAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,CAAC;AACnD;AAzCA;AAAA;AAAA;AAAA;AAAA;;;ACYA,eAAsB,uBAAuB,SAAiB,KAA2C;AACvG,QAAM,QAA6B,iBAChC,IAAI,CAAC,YAAY,kBAAkB,SAAS;AAAA,IAC3C,SAAS;AAAA,IACT,QAAQ;AAAA,EACV,CAAC,CAAC,EACD,OAAO,CAAC,SAAoC,QAAQ,IAAI,CAAC;AAE5D,QAAM,iBAAiB,YAAY;AAAA,IACjC,mBAAAC,QAAK,KAAK,SAAS,YAAY,gBAAgB;AAAA,IAC/C,mBAAAA,QAAK,KAAK,KAAK,YAAY,gBAAgB;AAAA,EAC7C,CAAC;AAED,aAAW,YAAY,gBAAgB;AACrC,UAAM,UAAU,MAAM,gBAAgB,QAAQ;AAC9C,QAAI,YAAY,MAAM;AACpB;AAAA,IACF;AAEA,UAAM,UAAU,mBAAAA,QAAK,QAAQ,QAAQ;AACrC,eAAW,QAAQ,QAAQ,MAAM,OAAO,GAAG;AACzC,YAAM,OAAO,kBAAkB,MAAM;AAAA,QACnC;AAAA,QACA,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,MAAM;AACR,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cACd,YACA,OACAC,eAAc,OACL;AACT,MAAI,UAAU;AAEd,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,gBAAgB,KAAK,SAAS,UAAU;AAC7D,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,YAAYA,eAAc,oBAAoB,YAAY,IAAI;AACpE,QAAI,CAAC,KAAK,QAAQ,KAAK,SAAS,GAAG;AACjC;AAAA,IACF;AAEA,cAAU,CAAC,KAAK;AAAA,EAClB;AAEA,SAAO;AACT;AAEO,SAAS,iCAAyC;AACvD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAe,gBAAgB,UAA0C;AACvE,MAAI;AACF,WAAO,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,SAAS,OAAO;AACd,UAAM,QAAQ;AACd,QAAI,MAAM,SAAS,UAAU;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,kBACP,YACA,SAI0B;AAC1B,QAAM,UAAU,WAAW,KAAK;AAChC,MAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,GAAG;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,WAAW,GAAG;AACtC,MAAI,UAAU,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAClD,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,YAAU,QAAQ,QAAQ,OAAO,GAAG,EAAE,QAAQ,UAAU,EAAE;AAC1D,QAAM,gBAAgB,QAAQ,SAAS,GAAG;AAC1C,QAAM,WAAW,QAAQ,WAAW,GAAG;AAEvC,MAAI,eAAe;AACjB,cAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACtC;AAEA,MAAI,UAAU;AACZ,cAAU,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EACtC;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;AAC1B,cAAU,MAAM,OAAO;AAAA,EACzB,WAAW,CAAC,YAAY,CAAC,QAAQ,WAAW,KAAK,GAAG;AAClD,cAAU,MAAM,OAAO;AAAA,EACzB;AAEA,MAAI,eAAe;AACjB,cAAU,QAAQ,SAAS,KAAK,IAAI,UAAU,GAAG,OAAO;AAAA,EAC1D;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA;AAAA,IACA,SAAS,IAAI,OAAO,IAAI,YAAY,OAAO,CAAC,GAAG;AAAA,EACjD;AACF;AAEA,SAAS,gBAAgB,SAAiB,YAAmC;AAC3E,QAAM,eAAe,mBAAAF,QAAK,SAAS,mBAAAA,QAAK,QAAQ,OAAO,GAAG,mBAAAA,QAAK,QAAQ,UAAU,CAAC;AAClF,MAAI,CAAC,gBAAgB,iBAAiB,KAAK;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,WAAW,IAAI,KAAK,mBAAAA,QAAK,WAAW,YAAY,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,QAAQ,OAAO,GAAG;AACxC;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,SAAS,GAAG,IAAI,QAAQ,GAAG,KAAK;AAC/C;AAEA,SAAS,YAAY,SAAyB;AAC5C,MAAI,SAAS;AAEb,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,UAAM,OAAO,QAAQ,QAAQ,CAAC,KAAK;AAEnC,QAAI,SAAS,KAAK;AAChB,UAAI,SAAS,KAAK;AAChB,cAAM,kBAAkB,QAAQ,QAAQ,CAAC,KAAK;AAC9C,YAAI,oBAAoB,KAAK;AAC3B,oBAAU;AACV,mBAAS;AAAA,QACX,OAAO;AACL,oBAAU;AACV,mBAAS;AAAA,QACX;AACA;AAAA,MACF;AAEA,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,QAAI,SAAS,KAAK;AAChB,gBAAU;AACV;AAAA,IACF;AAEA,cAAUG,aAAY,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,SAASA,aAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAEA,SAAS,YAAY,OAA2B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,mBAAAH,QAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAC/D;AAlNA,IAAAI,mBACAC,oBAIM;AALN;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAIjB,IAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACHA,eAAsB,oBACpB,KACA,eACA,gBACA,QAAQ,GACW;AACnB,QAAM,aAAa,cAAc,QAAQ,OAAO,GAAG;AACnD,QAAM,WAAW,mBAAAC,QAAK,SAAS,UAAU,EAAE,KAAK;AAChD,QAAM,SAAS,SAAS,SAAS,IAAI,WAAW,WAAW,KAAK;AAEhE,MAAI,CAAC,QAAQ;AACX,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,uBAAuB,MAAM;AAC9C,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,WAAW,UAAU;AAC9B,UAAM,UAAU,UAAM,iBAAAC,SAAG,SAAS;AAAA,MAChC;AAAA,MACA,KAAK;AAAA,MACL,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,oBAAoB;AAAA,MACpB,gBAAgB;AAAA,MAChB,QAAQ,CAAC,cAAc,sBAAsB,cAAc,gBAAgB;AAAA,IAC7E,CAAC;AAED,eAAW,SAAS,SAAS;AAC3B,YAAM,eAAe,mBAAAD,QAAK,QAAQ,KAAK,KAAK;AAC5C,YAAME,eAAc,MAAM,SAAS,GAAG;AACtC,UAAI,cAAc,cAAc,eAAe,aAAaA,YAAW,GAAG;AACxE;AAAA,MACF;AAEA,cAAQ,IAAI,MAAM,QAAQ,OAAO,IAAI,EAAE,QAAQ,UAAU,EAAE,CAAC;AAC5D,UAAI,QAAQ,QAAQ,OAAO;AACzB,eAAO,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;AACpC;AAEA,SAAS,uBAAuB,QAA0B;AACxD,QAAM,QAAQ,OAAO,QAAQ,cAAc,EAAE;AAE7C,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,OAAO,KAAK;AAAA,EACd;AACF;AA3DA,IAAAC,oBAEA;AAFA;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAEjB,uBAAe;AAGf;AAAA;AAAA;;;ACkOA,SAAS,eAAe,OAAgC;AACtD,MACE,UAAU,sBACV,UAAU,qBACV,UAAU,qBACV,UAAU,uBACV,UAAU,eACV;AACA,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,QAAiC;AACxD,SAAO,WAAW,qBAAqB,WAAW;AACpD;AAEA,SAAS,gBACP,gBACA,aACA,SAMa;AACb,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,CAAC,GAAG,gBAAgB,GAAG,WAAW;AAAA,IAC3C,KAAK,eAAe;AAClB,YAAM,UAAU,sBAAsB,QAAQ,SAAS,WAAW;AAClE,YAAM,OAAO,oBAAoB,aAAa,OAAO;AACrD,aAAO,CAAC,GAAG,gBAAgB,mBAAmB,SAAS,QAAQ,YAAY,GAAG,GAAG,IAAI;AAAA,IACvF;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,UAAU,eAAe,QAAQ,SAAS,QAAQ,MAAM;AAC9D,YAAM,QAAQ,iBAAiB,gBAAgB,OAAO;AACtD,YAAM,OAAO,oBAAoB,aAAa,OAAO;AAErD,UAAI,CAAC,OAAO;AACV,YAAI,CAAC,QAAQ,iBAAiB;AAC5B,gBAAM,IAAI,mBAAmB,sBAAsB,OAAO,IAAI;AAAA,YAC5D,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,cACA,mBAAmB,oBAAoB,cAAc;AAAA,YACvD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO,CAAC,GAAG,gBAAgB,mBAAmB,SAAS,QAAQ,YAAY,GAAG,GAAG,IAAI;AAAA,MACvF;AAEA,aAAO;AAAA,QACL,GAAG,eAAe,MAAM,GAAG,MAAM,eAAe,CAAC;AAAA,QACjD,GAAG;AAAA,QACH,GAAG,eAAe,MAAM,MAAM,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,IACA,KAAK,qBAAqB;AACxB,YAAM,UAAU,eAAe,QAAQ,SAAS,QAAQ,MAAM;AAC9D,YAAM,QAAQ,iBAAiB,gBAAgB,OAAO;AACtD,YAAM,OAAO,oBAAoB,aAAa,OAAO;AAErD,UAAI,CAAC,OAAO;AACV,YAAI,CAAC,QAAQ,iBAAiB;AAC5B,gBAAM,IAAI,mBAAmB,sBAAsB,OAAO,IAAI;AAAA,YAC5D,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,cACA,mBAAmB,oBAAoB,cAAc;AAAA,YACvD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,eAAO,CAAC,GAAG,gBAAgB,mBAAmB,SAAS,QAAQ,YAAY,GAAG,GAAG,IAAI;AAAA,MACvF;AAEA,aAAO;AAAA,QACL,GAAG,eAAe,MAAM,GAAG,MAAM,QAAQ;AAAA,QACzC,GAAG;AAAA,QACH,GAAG,eAAe,MAAM,MAAM,QAAQ;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,OAA2B,QAAgC;AACjF,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,uDAAuD,MAAM,IAAI;AAAA,EACnF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,SAA6B,aAAkC;AAC5F,MAAI,SAAS;AACX,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,YAAY;AAAA,IAC/B,CAAC,UACC,MAAM,SAAS,eAAe,QAAQ,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK,EAAE,SAAS;AAAA,EAC5F;AAEA,MAAI,cAAc;AAChB,WAAO,aAAa;AAAA,EACtB;AAEA,QAAM,IAAI,MAAM,4GAA4G;AAC9H;AAEA,SAAS,oBAAoB,QAAqB,SAA8B;AAC9E,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,OAAO,GAAG,IAAI,IAAI;AACzB,MACE,OAAO,SAAS,eAChB,MAAM,gBACN,iBAAiB,MAAM,IAAI,MAAM,iBAAiB,OAAO,GACzD;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,MAAc,cAAiC;AACzE,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,QAA+B;AAC1D,SAAO,OACJ;AAAA,IACC,CAAC,UACC,MAAM,SAAS,eAAe,QAAQ,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK,EAAE,SAAS;AAAA,EAC5F,EACC,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,MAAM,GAAG,EAAE;AAChB;AA9XA,IAAAC,mBACAC,oBAiCa;AAlCb;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AAWA;AACA;AACA;AAMA,IAAAC;AACA;AACA,IAAAC;AAUO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aACE;AAAA,gBACF,MAAM,CAAC,oBAAoB,mBAAmB,mBAAmB,qBAAqB,aAAa;AAAA,cACrG;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,MAAM,CAAC,cAAc,UAAU;AAAA,cACjC;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,sBAAsB;AAAA,cACxB;AAAA,cACA,mBAAmB;AAAA,gBACjB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,oBAAoB;AAAA,gBAClB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,UAAU,SAAS;AAAA,YACtC,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,SAAS,eAAe,KAAK,MAAM;AACzC,cAAM,UAAUA,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,SAAS,qBAAqB,KAAK,MAAM;AAC/C,cAAM,UAAU,OAAO,KAAK,YAAY,WAAW,KAAK,QAAQ,KAAK,IAAI;AACzE,cAAM,eAAe,iBAAiB,KAAK,eAAe,CAAC;AAC3D,cAAM,gBAAgB,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC3E,cAAM,sBAAsB,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7F,cAAM,YAAY,sBAAsB,KAAK,SAAS;AACtD,cAAM,kBAAkB,YAAY,KAAK,mBAAmB,KAAK;AACjE,cAAM,oBAAoB,YAAY,KAAK,oBAAoB,IAAI;AACnE,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,YAAY,mBAAAC,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAErD,YAAI,cAAc,UAAU,cAAc,SAAS;AACjD,gBAAM,IAAI,mBAAmB,kBAAkB,SAAS,yDAAyD;AAAA,YAC/G,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf,eAAe,iBAAiB,UAAU,OAAO;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,cAAc,SAAS;AACzB,gBAAM,IAAI,mBAAmB,yCAAyC,aAAa,SAAS,IAAI;AAAA,YAC9F,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf,eAAe,SAAS,SAAS,GAAG,IAAI,GAAG,QAAQ,SAAS,GAAG,QAAQ;AAAA,YACzE;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,cAAM,eAAe,UAAU,MAAM,kBAAAC,QAAG,SAAS,QAAQ,IAAI;AAE7D,YAAI,CAAC,WAAW,gBAAgB,MAAM,KAAK,CAAC,iBAAiB;AAC3D,gBAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK,YAAY,QAAQ,cAAc;AAC7F,gBAAM,IAAI,mBAAmB,mBAAmB,UAAU,IAAI;AAAA,YAC5D,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,kBAAkB,uBAAuB,SAAS,SAAS;AACjE,cAAM,gBAAgB,gBAAgB,uBAAuB,eAAe,SAAS,IAAI;AACzF,cAAM,sBAAsB,sBACxB,uBAAuB,qBAAqB,SAAS,IACrD;AAEJ,cAAM,mBAAmB,UAAU,MAAM,iBAAiB,QAAQ,IAAI;AACtE,cAAM,yBAAyB,mBAAmB,wBAAwB,iBAAiB,IAAI,IAAI,CAAC;AACpG,cAAM,iBACJ,uBAAuB,SAAS,IAC5B,yBACA,gBAAgB,kBAAkB,WAAW,IAAI,YAAY;AACnE,cAAM,cAAc,gBAAgB,gBAAgB,SAAS,MAAM;AACnE,cAAM,cAAc,gBAAgB,gBAAgB,aAAa;AAAA,UAC/D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,cAAM,gBAAgB,2BAA2B,WAAW;AAC5D,cAAM,aAAa,kBAAkB,mBAAmB,kBAAkB,WAAW;AACrF,cAAM,UAAU,iBAAiB,YAAY,aAAa;AAC1D,cAAM,SAAS,MAAM,gBAAgB;AAAA,UACnC,OAAO,eAAe,WAAW,kBAAkB;AAAA,UACnD,aAAa,qBAAqB;AAAA,UAClC,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAED,YAAI,mBAAmB;AACrB,gBAAM,sBAAsB,QAAQ;AAAA,QACtC;AAEA,cAAM,kBAAAA,QAAG,UAAU,UAAU,MAAM;AACnC,cAAM,eAAe,MAAM,iBAAiB,SAAS;AAAA,UACnD,UAAU;AAAA,UACV,SAAS,aAAa,QAAQ,KAAK,MAAM;AAAA,UACzC,SAAS,aAAa,WAAW,eAAe,GAAK;AAAA,UACrD,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,WAAW;AAAA,cAC3B,QAAQ;AAAA,cACR,SAAS,aAAa,WAAW,eAAe,GAAK;AAAA,cACrD,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,kBAAkB,gBAAgB;AAAA,cAClC,kBAAkB;AAAA,gBAChB,GAAG,oBAAI,IAAI;AAAA,kBACT,GAAG,gBAAgB;AAAA,kBACnB,GAAI,eAAe,eAAe,CAAC;AAAA,kBACnC,GAAI,qBAAqB,eAAe,CAAC;AAAA,gBAC3C,CAAC;AAAA,cACH;AAAA,cACA,OAAO,OAAO;AAAA,cACd,UAAU,aAAa,QAAQ;AAAA,cAC/B,sBAAsB,aAAa;AAAA,cACnC,SAAS,aAAa,WAAW,eAAe,GAAK;AAAA,YACvD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,CAAC,QAAQ;AAAA,YACvB,UAAU,aAAa,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrOA,IAAAC,mBAOa;AAPb;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf;AACA;AACA,IAAAC;AAGO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,cAAc,YAAY;AAAA,YAC7C,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,YAAYA,YAAW,KAAK,YAAY,YAAY;AAC1D,cAAM,YAAYA,YAAW,KAAK,YAAY,YAAY;AAC1D,cAAM,aAAa,YAAY,KAAK,aAAa,KAAK;AACtD,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,SAAS,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM;AACjD,cAAM,cAAc,iBAAiB,QAAQ,SAAS;AAEtD,YAAI,gBAAgB,GAAG;AACrB,gBAAM,IAAI,MAAM,2BAA2B,QAAQ,EAAE;AAAA,QACvD;AAEA,cAAM,QAAQ,aACV,OAAO,MAAM,SAAS,EAAE,KAAK,SAAS,IACtC,OAAO,QAAQ,WAAW,SAAS;AACvC,cAAM,UAAU,iBAAiB,QAAQ,KAAK;AAE9C,cAAM,kBAAAA,QAAG,UAAU,UAAU,OAAO,MAAM;AAC1C,cAAM,eAAe,MAAM,iBAAiB,SAAS;AAAA,UACnD,UAAU;AAAA,UACV,SAAS,aAAa,QAAQ;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,QAAQ;AAAA,cACR;AAAA,cACA,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN,kBAAkB;AAAA,cAClB,oBAAoB,aAAa,cAAc;AAAA,cAC/C,UAAU,aAAa,QAAQ;AAAA,cAC/B,sBAAsB,aAAa;AAAA,cACnC,SAAS,aAAa,SAAS,GAAK;AAAA,YACtC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,CAAC,QAAQ;AAAA,YACvB,UAAU,aAAa,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7FA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,WAA2B;AAAA,MACtC,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,UAAU,SAAS;AAC/B,YAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,gBAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,gBAAM,MAAM,mBAAmB,QAAQ,SAAS,MAAM,MAAM;AAC5D,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,IAAI;AAAA,gBACJ,MAAM;AAAA,gBACN,OAAO,QAAQ,SAAS;AAAA,gBACxB,SAAS,GAAG,QAAQ,SAAS,IAAI;AAAA,cACnC;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,MAAM;AAAA,cACN,OAAO,QAAQ,SAAS;AAAA,cACxB,SAAS;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChDA,IAAAC,mBAOa;AAPb;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf;AACA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,YAAY,YAAY,KAAK,WAAW,KAAK;AACnD,cAAM,aAAa,YAAY,KAAK,aAAa,GAAG,KAAO,GAAG;AAC9D,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,QAAQ,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAEpC,YAAI,MAAM,OAAO,GAAG;AAClB,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM,MAAM;AAAA,gBACZ,YAAY,MAAM,MAAM,YAAY;AAAA,cACtC;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU,MAAM,cAAc,UAAU,WAAW,YAAY;AAAA,UACnE,cAAc,CAAC,WAAWC,iBACxB,cAAc,YAAY,cAAc,WAAW,QAAQ,eAAe,aAAaA,YAAW;AAAA,QACtG,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,OAAO,QAAQ;AAAA,cACf;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3EA,IAKa;AALb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,UAAU,SAAS;AAC/B,cAAM,mBAAmB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AAC9E,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,UAAU,MAAM,MAAM,YAAY;AACxC,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,iBAAiB;AAAA,YACxC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChCO,SAAS,4BAA4B,OAA4B;AACtE,SAAO,KAAK,UAAU,wBAAwB,KAAK,GAAG,MAAM,CAAC;AAC/D;AAEO,SAAS,wBAAwB,OAAwC;AAC9E,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,kBAAkB,KAAK;AAAA,IAC9B,MAAM,MAAM;AAAA,EACd;AACF;AAEO,SAAS,oBAAoB,QAAuD;AACzF,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,aAAa,4BAA4B,MAAM;AACrD,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,OAAO,MAAM,0BAA0B;AAC3D,QAAI,cAAc,CAAC,GAAG;AACpB,aAAO,YAAY,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAkC;AAC3D,QAAM;AAAA,IACJ,cAAc;AAAA,IACd,MAAM;AAAA,IACN,GAAG;AAAA,EACL,IAAI;AAEJ,SAAO;AACT;AAEA,SAAS,4BAA4B,QAAoC;AACvE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM;AAChC,WAAO,OAAO,QAAQ,OAAO,SAAS,WAAW,OAAO,MAAM,OAAO;AAAA,EACvE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA/CA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAIa;AAJb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,OAAOC,YAAW,KAAK,MAAM,MAAM,EAAE,KAAK;AAChD,cAAM,QAAQ,QAAQ,eAAe,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAE7E,YAAI,CAAC,OAAO;AACV,gBAAM,YAAY,QAAQ,eAAe,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI;AACvE,gBAAM,IAAI;AAAA,YACR,UAAU,SAAS,IACf,kBAAkB,IAAI,wBAAwB,UAAU,KAAK,IAAI,CAAC,KAClE,kBAAkB,IAAI;AAAA,UAC5B;AAAA,QACF;AAEA,eAAO,SAAS,4BAA4B,KAAK,CAAC;AAAA,MACpD;AAAA,IACF;AAAA;AAAA;;;ACrBO,SAAS,6BAA6B,UAAqD;AAChG,SAAO,oBAAoB,QAAQ;AACrC;AApBA,IAEa,uBACA,oBACA,kBAEA,uBACA,yBACA,uBACA,uBAEP;AAXN;AAAA;AAAA;AAEO,IAAM,wBAAwB,MAAM,OAAO;AAC3C,IAAM,qBAAqB;AAC3B,IAAM,mBAAmB;AAEzB,IAAM,wBAAwB,CAAC,MAAM;AACrC,IAAM,0BAA0B,CAAC,QAAQ,QAAQ,SAAS,QAAQ,SAAS,QAAQ,MAAM;AACzF,IAAM,wBAAwB,CAAC,QAAQ,OAAO;AAC9C,IAAM,wBAAwB,CAAC,QAAQ,OAAO;AAErD,IAAM,sBAAyE;AAAA,MAC7E,KAAK;AAAA,MACL,OAAO;AAAA,MACP,KAAK;AAAA,MACL,KAAK;AAAA,IACP;AAAA;AAAA;;;AChBA,IAAAC,oBAUa;AAVb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAEjB;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AAGO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,YAAY,mBAAAC,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAErD,YAAI,cAAc,UAAU,cAAc,SAAS;AACjD,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,QAAQ,iBAAiB,SAAS;AAAA,gBAClC,QAAQ;AAAA,gBACR,eAAe,iBAAiB,UAAU,OAAO;AAAA,cACnD;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc,SAAS;AACzB,gBAAM,IAAI,mBAAmB,qCAAqC,aAAa,SAAS,IAAI;AAAA,YAC1F,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf,qBAAqB,CAAC,OAAO;AAAA,YAC/B;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI;AACF,gBAAM,WAAW,MAAM,iBAAiB,QAAQ;AAChD,gBAAM,WAAW,QAAQ,OAAO;AAEhC,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,QAAQ;AAAA,gBACR,MAAM,SAAS;AAAA,gBACf,OAAO,SAAS;AAAA,gBAChB,YAAY,SAAS;AAAA,gBACrB,SAAS,SAAS,QAAQ,MAAM,GAAG,EAAE;AAAA,gBACrC,UAAU,SAAS,SAAS,MAAM,GAAG,EAAE;AAAA,gBACvC,cAAc,SAAS;AAAA,gBACvB,UAAU,SAAS,SAAS,MAAM,GAAG,EAAE;AAAA,gBACvC,SAAS,aAAa,SAAS,SAAS,QAAQ;AAAA,gBAChD,kBAAkB,SAAS,QAAQ,SAAS;AAAA,gBAC5C,iBAAiB,aAAa,SAAS,iBAAiB,KAAK,IAAI,KAAO,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC;AAAA,gBACjG,0BACE,SAAS,gBAAgB,SAAS,KAAK,IAAI,KAAO,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,gBAC5E,aAAa,aAAa,SAAS,MAAM,KAAK,IAAI,KAAO,KAAK,MAAM,WAAW,CAAC,CAAC,CAAC;AAAA,gBAClF,sBAAsB,SAAS,KAAK,SAAS,KAAK,IAAI,KAAO,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,cACvF;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,QAAQ;AACd,cAAI,MAAM,SAAS,UAAU;AAC3B,kBAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK,YAAY,QAAQ,cAAc;AAC7F,kBAAM,IAAI,mBAAmB,mBAAmB,UAAU,IAAI;AAAA,cAC5D,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,eAAe;AAAA,gBACf;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAEA,gBAAM,IAAI;AAAA,YACR,8BAA8B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACpF;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzGA,eAAsB,iCAAiC,aAAuD;AAC5G,QAAM,SAAS,MAAM,kBAAAC,QAAG,SAAS,WAAW;AAC5C,QAAM,MAAM,IAAI,eAAAC,QAAO,MAAM;AAC7B,QAAM,UAAU,IAAI,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,WAAW;AACrE,QAAM,YAAY,QAAQ,KAAK,CAAC,UAAU,mBAAmB,MAAM,SAAS,EAAE,SAAS,UAAU,CAAC,KAC7F,QAAQ,KAAK,CAAC,UAAU,mBAAmB,MAAM,SAAS,MAAM,SAAS,KACzE,QAAQ,KAAK,CAAC,UAAU,MAAM,UAAU,YAAY,EAAE,SAAS,KAAK,CAAC;AAE1E,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,kBAAkB,WAAW,sCAAsC;AAAA,EACrF;AAEA,SAAO;AAAA,IACL,WAAW,UAAU;AAAA,IACrB,UAAU,UAAU,QAAQ,EAAE,SAAS,MAAM;AAAA,EAC/C;AACF;AAEA,eAAsB,qBAAqB,SAIzB;AAChB,QAAM,kBAAAD,QAAG,MAAM,QAAQ,YAAY,EAAE,WAAW,KAAK,CAAC;AACtD,QAAM,kBAAAA,QAAG,UAAU,QAAQ,aAAa,QAAQ,aAAa;AAE7D,QAAM,MAAM,IAAI,eAAAC,QAAO,QAAQ,aAAa;AAC5C,MAAI,aAAa,QAAQ,YAAY,IAAI;AAC3C;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO,MAAM,QAAQ,OAAO,GAAG,EAAE,YAAY;AAC/C;AAzCA,IAAAC,mBAEA;AAFA;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf,qBAAmB;AAAA;AAAA;;;ACwInB,SAAS,qBAAqB,OAAmC;AAC/D,QAAM,SAAS,SAAS,KAAK;AAC7B,QAAM,WAAW,SAAS,OAAO,gBAAgB;AAEjD,SAAO;AAAA,IACL,UAAUC,YAAW,QAAQ,CAAC,aAAa,UAAU,CAAC,KAAK;AAAA,IAC3D,OAAOA,YAAW,QAAQ,CAAC,OAAO,CAAC,KAAK;AAAA,IACxC,QAAQA,YAAW,QAAQ,CAAC,WAAW,QAAQ,CAAC;AAAA,IAChD,YAAYA,YAAW,QAAQ,CAAC,gBAAgB,YAAY,CAAC;AAAA,IAC7D,iBAAiBA,YAAW,QAAQ,CAAC,eAAe,aAAa,UAAU,OAAO,CAAC;AAAA,IACnF,gBAAgB,WAAW,UAAU,CAAC,mBAAmB,gBAAgB,CAAC;AAAA,IAC1E,YAAY,WAAW,UAAU,CAAC,eAAe,YAAY,CAAC;AAAA,EAChE;AACF;AAEA,SAAS,SAAS,OAAyC;AACzD,SAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IAC5D,QACD,CAAC;AACP;AAEA,SAASA,YAAW,QAAiC,MAAoC;AACvF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,aAAO,MAAM,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAiC,MAA0B;AAClF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO,MAAM,OAAO,CAAC,SAAyB,OAAO,SAAS,YAAY,KAAK,SAAS,CAAC;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,UAAU,QAAiC,MAA2B;AAC7E,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,WAAW,QAAiC,MAAoC;AACvF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAuB;AAChD,SAAO,MAAM,SAAS,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AACpD;AA7MA,IAAAC,mBAYa;AAZb;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAYR,IAAM,eAAN,MAAmB;AAAA,MACxB,YACmB,QACA,YAAuB,OACvBC,SAAmB,CAAC,OAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC,GAC5F;AAHiB;AACA;AACA,qBAAAA;AAAA,MAChB;AAAA,MAEH,MAAM,kBAAkB,OAAiE;AACvF,cAAM,WAAW,MAAM,KAAK,UAAU,oBAAoB;AAAA,UACxD,QAAQ;AAAA,UACR,SAAS,KAAK,iBAAiB;AAAA,UAC/B,MAAM,KAAK,UAAU;AAAA,YACnB,UAAU,MAAM,YAAY,KAAK,OAAO;AAAA,YACxC,eAAe,MAAM,gBAAgB,KAAK,OAAO;AAAA,YACjD,cAAc,MAAM,eAAe,KAAK,OAAO;AAAA,YAC/C,gBAAgB,MAAM,iBAAiB,KAAK,OAAO;AAAA,YACnD,OAAO;AAAA,cACL;AAAA,gBACE,MAAM,MAAM;AAAA,gBACZ,QAAQ,MAAM;AAAA,cAChB;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,cAAM,OAAO,SAAS,SAAS,IAAI;AACnC,cAAM,UAAUF,YAAW,MAAM,CAAC,YAAY,SAAS,CAAC;AACxD,cAAM,WAAW,gBAAgB,MAAM,CAAC,aAAa,UAAU,CAAC;AAChE,YAAI,CAAC,WAAW,SAAS,WAAW,GAAG;AACrC,gBAAM,IAAI,MAAM,qEAAqE;AAAA,QACvF;AAEA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,WAAW,WAAmB,UAAiC;AACnE,cAAM,SAAS,MAAM,kBAAAG,QAAG,SAAS,QAAQ;AACzC,cAAM,WAAW,MAAM,KAAK,UAAU,WAAW;AAAA,UAC/C,QAAQ;AAAA,UACR,MAAM;AAAA,QACR,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,oCAAoC,SAAS,MAAM,GAAG;AAAA,QACxE;AAAA,MACF;AAAA,MAEA,MAAM,mBAAmB,SAGM;AAC7B,cAAM,YAAY,KAAK,IAAI;AAE3B,mBAAS;AACP,gBAAM,SAAS,MAAM,KAAK,eAAe,QAAQ,SAAS,QAAQ,QAAQ;AAC1E,gBAAM,QAAQ,OAAO,MAAM,YAAY;AACvC,cAAI,UAAU,QAAQ;AACpB,mBAAO;AAAA,UACT;AAEA,cAAI,UAAU,UAAU;AACtB,kBAAM,IAAI,MAAM,OAAO,UAAU,gBAAgB,QAAQ,OAAO,UAAU;AAAA,UAC5E;AAEA,cAAI,KAAK,IAAI,IAAI,aAAa,KAAK,OAAO,WAAW;AACnD,kBAAM,IAAI,MAAM,gBAAgB,QAAQ,OAAO,oBAAoB,KAAK,OAAO,SAAS,KAAK;AAAA,UAC/F;AAEA,gBAAM,KAAK,MAAM,KAAK,OAAO,cAAc;AAAA,QAC7C;AAAA,MACF;AAAA,MAEA,MAAM,eAAe,KAA8B;AACjD,cAAM,WAAW,MAAM,KAAK,UAAU,GAAG;AACzC,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,sCAAsC,SAAS,MAAM,GAAG;AAAA,QAC1E;AAEA,eAAO,OAAO,KAAK,MAAM,SAAS,YAAY,CAAC;AAAA,MACjD;AAAA,MAEA,MAAc,eAAe,SAAiB,UAA8C;AAC1F,cAAM,WAAW,MAAM,KAAK,UAAU,0BAA0B,mBAAmB,OAAO,CAAC,IAAI;AAAA,UAC7F,QAAQ;AAAA,UACR,SAAS,KAAK,iBAAiB;AAAA,QACjC,CAAC;AACD,cAAM,OAAO,SAAS,SAAS,IAAI;AACnC,cAAM,UAAU,UAAU,MAAM,CAAC,kBAAkB,eAAe,CAAC;AACnE,cAAM,QAAQ,QACX,IAAI,CAAC,SAAS,qBAAqB,IAAI,CAAC,EACxC,KAAK,CAAC,SAAS,KAAK,aAAa,QAAQ;AAE5C,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI,MAAM,gBAAgB,OAAO,2BAA2B,QAAQ,IAAI;AAAA,QAChF;AAEA,eAAO;AAAA,MACT;AAAA,MAEQ,mBAA2C;AACjD,eAAO;AAAA,UACL,gBAAgB;AAAA,UAChB,eAAe,UAAU,KAAK,OAAO,KAAK;AAAA,QAC5C;AAAA,MACF;AAAA,MAEA,MAAc,UAAU,cAAsB,MAAqD;AACjG,cAAM,WAAW,MAAM,KAAK,UAAU,GAAG,kBAAkB,KAAK,OAAO,OAAO,CAAC,GAAG,YAAY,IAAI,IAAI;AACtG,cAAM,UAAW,MAAM,SAAS,KAAK;AACrC,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,IAAI,MAAM,qCAAqC,SAAS,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE;AAAA,QACpG;AAEA,cAAM,SAAS,SAAS,OAAO;AAC/B,cAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,YAAI,SAAS,GAAG;AACd,gBAAM,IAAI,MAAM,0BAA0BH,YAAW,QAAQ,CAAC,OAAO,SAAS,CAAC,KAAK,QAAQ,IAAI,EAAE,EAAE;AAAA,QACtG;AAEA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AClHA,eAAsB,qBACpB,UACA,WAC+B;AAC/B,MAAI;AACF,QAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,aAAO;AAAA,QACL,OAAO,MAAM,iBAAiB,QAAQ;AAAA,QACtC,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,wBAAwB,SAAS,SAAkB,GAAG;AACxD,aAAO;AAAA,QACL,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,cAAc,SAAS;AACzB,aAAO;AAAA,QACL,OAAO,MAAM,uBAAuB,UAAU,OAAO;AAAA,QACrD,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,cAAc,SAAS;AACzB,aAAO;AAAA,QACL,OAAO,MAAM,uBAAuB,UAAU,QAAQ;AAAA,QACtD,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,aAAO;AAAA,QACL,OAAO,MAAM,qBAAqB,UAAU,WAAW,uCAAuC;AAAA,QAC9F,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,aAAO;AAAA,QACL,OAAO,MAAM;AAAA,UACX;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,iBAAiB,UAA+C;AAC7E,QAAM,WAAW,MAAM,kBAAAI,QAAG,SAAS,QAAQ,GAAG,SAAS,QAAQ;AAC/D,QAAM,SAAS,CAAC,GAAG,QAAQ,SAAS,oBAAoB,CAAC,EACtD,IAAI,CAAC,UAAU,OAAO,SAAS,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,EAClD,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,KAAK,QAAQ,CAAC;AAExD,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,KAAK,IAAI,GAAG,MAAM;AAAA,EAC3B;AAEA,QAAM,cAAc,QAAQ,MAAM,oBAAoB;AACtD,MAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,SAAO,YAAY;AACrB;AAEA,eAAe,uBACb,UACA,cAC6B;AAC7B,QAAM,MAAM,IAAI,gBAAAC,QAAO,MAAM,kBAAAD,QAAG,SAAS,QAAQ,CAAC;AAClD,QAAM,QAAQ,IAAI,SAAS,kBAAkB;AAC7C,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,MAAM,QAAQ,EAAE,SAAS,MAAM;AAC3C,QAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,IAAI,YAAY,YAAY,YAAY,KAAK,GAAG,CAAC;AACpF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,yBAAyB,OAAO,SAAS,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;AACrE;AAEA,eAAe,qBACb,UACA,YACA,YAC6B;AAC7B,QAAM,YAAgB,SAAK,MAAM,kBAAAA,QAAG,SAAS,QAAQ,GAAG,EAAE,MAAM,SAAS,CAAC;AAC1E,QAAM,QACJ,eAAe,YACP,SAAK,WAAW,sBAAsB,KAAS,SAAK,WAAW,sBAA2B,IAC1F,SAAK,WAAW,8BAA8B,KAAS,SAAK,WAAW,8BAAmC;AAEpH,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,wBAAwB,OAAO,KAAK,MAAM,OAAO,GAAG,UAAU;AACvE;AAEA,SAAS,wBAAwB,QAAgB,YAAwC;AACvF,MAAI,OAAO,SAAS,MAAM,OAAO,aAAa,CAAC,MAAM,OAAQ;AAC3D,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,aAAa,EAAE;AACvC,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,OAAO,aAAa,EAAE;AACxC,MAAI,YAAY,IAAI,OAAO,QAAQ;AACjC,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,OAAO,aAAa,YAAY,CAAC;AACvD,WAAS,QAAQ,GAAG,QAAQ,eAAe,SAAS,GAAG;AACrD,UAAM,cAAc,YAAY,IAAI,QAAQ;AAC5C,QAAI,cAAc,IAAI,OAAO,QAAQ;AACnC;AAAA,IACF;AAEA,UAAM,oBAAoB,OAAO,aAAa,WAAW;AACzD,UAAM,cAAc,OAAO,aAAa,cAAc,CAAC;AACvD,QAAI,sBAAsB,YAAY;AACpC;AAAA,IACF;AAEA,UAAM,sBAAsB,YAAY;AACxC,QAAI,sBAAsB,IAAI,OAAO,QAAQ;AAC3C,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,OAAO,aAAa,mBAAmB;AACzD,QAAI,cAAc,OAAO;AACvB,aAAO,yBAAyB,OAAO,YAAY,sBAAsB,CAAC,CAAC;AAAA,IAC7E;AAEA,QAAI,cAAc,QAAQ;AACxB,aAAO,yBAAyB,OAAO,aAAa,sBAAsB,CAAC,CAAC;AAAA,IAC9E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,OAAmC;AACnE,MAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,KAAK;AACzB;AAhMA,IAAAE,mBAEAC,iBACA,KASM,OACA,QACA,yCACA;AAfN;AAAA;AAAA;AAAA,IAAAD,oBAAe;AAEf,IAAAC,kBAAmB;AACnB,UAAqB;AAErB;AAOA,IAAM,QAAQ;AACd,IAAM,SAAS;AACf,IAAM,0CAA0C;AAChD,IAAM,oDAAoD;AAAA;AAAA;;;ACsB1D,eAAsB,yBACpB,SACA,SACA,SACoC;AACpC,QAAM,OAAO,UAAU,OAAO;AAC9B,QAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,QAAM,eAAe,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC9E,QAAM,YAAY,mBAAAC,QAAK,QAAQ,YAAY,EAAE,YAAY;AAEzD,MAAI,CAAC,QAAQ,oBAAoB,SAAS,SAAS,GAAG;AACpD,UAAM,IAAI;AAAA,MACR,GAAG,QAAQ,QAAQ,oBAAoB,QAAQ,oBAAoB,KAAK,IAAI,CAAC,gBAAgB,aAAa,SAAS;AAAA,MACnH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,eAAe;AAAA,UACf,qBAAqB,QAAQ;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,kBAAAC,QAAG,KAAK,YAAY;AAAA,EACnC,SAAS,OAAO;AACd,UAAM,QAAQ;AACd,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK,YAAY,QAAQ,cAAc;AAC7F,YAAM,IAAI,mBAAmB,mBAAmB,UAAU,IAAI;AAAA,QAC5D,MAAM;AAAA,QACN,SAAS;AAAA,UACP,eAAe;AAAA,UACf;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM;AAAA,EACR;AAEA,MAAI,KAAK,OAAO,uBAAuB;AACrC,UAAM,IAAI;AAAA,MACR,GAAG,QAAQ,QAAQ,uCAAuC,gBAAgB,KAAK,IAAI,CAAC,cAAc,kBAAkB;AAAA,MACpH;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,eAAe;AAAA,UACf,cAAc,KAAK;AAAA,UACnB,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,qBAAqB,cAAc,SAAS;AACzE,MAAI,eAAe,SAAS,eAAe,QAAQ,kBAAkB;AACnE,UAAM,IAAI;AAAA,MACR,GAAG,QAAQ,QAAQ,uCAAuC,eAAe,KAAK,iBAAiB,gBAAgB;AAAA,MAC/G;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,eAAe;AAAA,UACf,cAAc,eAAe;AAAA,UAC7B,UAAU;AAAA,UACV,QAAQ,eAAe;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,KAAK;AAAA,IACX,WAAW,eAAe;AAAA,IAC1B,iBAAiB,eAAe;AAAA,IAChC,KAAK,YAAY,KAAK,KAAK,IAAI;AAAA,IAC/B,UAAU,OAAO,KAAK,aAAa,YAAY,KAAK,SAAS,KAAK,EAAE,SAAS,IAAI,KAAK,SAAS,KAAK,IAAI;AAAA,IACxG,cACE,OAAO,KAAK,kBAAkB,YAAY,KAAK,cAAc,KAAK,EAAE,SAAS,IACzE,KAAK,cAAc,KAAK,IACxB;AAAA,EACR;AACF;AAEA,eAAsB,0BACpB,SACA,SACA,SACA;AACA,MAAI,CAAC,QAAQ,OAAO,OAAO,OAAO;AAChC,UAAM,IAAI,mBAAmB,8CAA8C;AAAA,MACzE,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,IAAI,aAAa;AAAA,IAC9B,GAAG,QAAQ,OAAO;AAAA,IAClB,UAAU,QAAQ,YAAY,QAAQ,OAAO,OAAO;AAAA,IACpD,cAAc,QAAQ,gBAAgB,QAAQ,OAAO,OAAO;AAAA,EAC9D,CAAC;AAED,MAAI;AACF,UAAM,QAAQ,MAAM,OAAO,kBAAkB;AAAA,MAC3C,UAAU,mBAAAD,QAAK,SAAS,QAAQ,YAAY;AAAA,MAC5C,OAAO,QAAQ;AAAA,MACf,UAAU,QAAQ;AAAA,MAClB,cAAc,QAAQ;AAAA,IACxB,CAAC;AACD,UAAM,YAAY,MAAM,SAAS,CAAC;AAClC,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,mBAAmB,2CAA2C,QAAQ,UAAU,KAAK;AAAA,QAC7F,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAEA,UAAM,OAAO,WAAW,WAAW,QAAQ,YAAY;AACvD,UAAM,SAAS,MAAM,OAAO,mBAAmB;AAAA,MAC7C,SAAS,MAAM;AAAA,MACf,UAAU,mBAAAA,QAAK,SAAS,QAAQ,YAAY;AAAA,IAC9C,CAAC;AACD,UAAM,aAAa,OAAO,cAAc,QAAQ;AAChD,QAAI,cAAc,aAAa,kBAAkB;AAC/C,YAAM,IAAI;AAAA,QACR,GAAG,QAAQ,QAAQ,uCAAuC,UAAU,iBAAiB,gBAAgB;AAAA,QACrG;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,eAAe,QAAQ;AAAA,YACvB,cAAc;AAAA,YACd,UAAU;AAAA,YACV,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,mBAAAA,QAAK,KAAK,QAAQ,eAAe,cAAc,YAAY,UAAU,MAAM,OAAO;AACtG,UAAM,cAAc,mBAAAA,QAAK,KAAK,aAAa,YAAY;AACvD,UAAM,eAAe,mBAAAA,QAAK,KAAK,aAAa,SAAS;AACrD,UAAM,WAAW,MAAM,+BAA+B,QAAQ,QAAQ;AAAA,MACpE,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,KAAK;AAAA,QACH;AAAA,UACE,MAAM,QAAQ;AAAA,UACd,UAAU;AAAA,UACV,QAAQ,cAAc,QAAQ,QAAQ,QAAQ,SAAS;AAAA,UACvD,iBAAiB,QAAQ;AAAA,UACzB,UAAU;AAAA,UACV,MAAM,QAAQ;AAAA,UACd,WAAW;AAAA,UACX,iBAAiB,eAAe,OAAO,aAAa,kBAAkB,QAAQ;AAAA,UAC9E,SAAS,MAAM;AAAA,UACf,OAAO,OAAO;AAAA,UACd,YAAY,OAAO;AAAA,UACnB,gBAAgB,OAAO;AAAA,UACvB;AAAA,UACA,aAAa,OAAO,aAAa,cAAc;AAAA,UAC/C;AAAA,UACA,iBAAiB,aAAa,UAAU,KAAK,IAAI,KAAO,KAAK,MAAM,QAAQ,OAAO,eAAe,CAAC,CAAC,CAAC;AAAA,UACpG,0BACE,SAAS,SAAS,KAAK,IAAI,KAAO,KAAK,MAAM,QAAQ,OAAO,eAAe,CAAC,CAAC;AAAA,QACjF;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,oBAAoB;AACvC,YAAM;AAAA,IACR;AAEA,UAAM,IAAI;AAAA,MACR,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,MAChF;AAAA,QACE,MAAM;AAAA,QACN,SAAS;AAAA,UACP,eAAe,QAAQ;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,+BACb,QACA,QACA,SAMiB;AACjB,MAAI,OAAO,YAAY;AACrB,UAAM,gBAAgB,MAAM,OAAO,eAAe,OAAO,UAAU;AACnE,UAAM,sBAAsB,QAAQ,WAAW;AAC/C,UAAM,qBAAqB;AAAA,MACzB;AAAA,MACA,aAAa,QAAQ;AAAA,MACrB,YAAY,mBAAAA,QAAK,KAAK,QAAQ,aAAa,SAAS;AAAA,IACtD,CAAC;AACD,UAAM,YAAY,MAAM,iCAAiC,QAAQ,WAAW;AAC5E,UAAM,kBAAAC,QAAG,UAAU,QAAQ,cAAc,UAAU,UAAU,MAAM;AACnE,WAAO,UAAU;AAAA,EACnB;AAEA,MAAI,OAAO,iBAAiB;AAC1B,UAAM,YAAY,MAAM,OAAO,eAAe,OAAO,eAAe,GAAG,SAAS,MAAM;AACtF,UAAM,sBAAsB,QAAQ,YAAY;AAChD,UAAM,kBAAAA,QAAG,UAAU,QAAQ,cAAc,UAAU,MAAM;AACzD,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR,8DAA8D,QAAQ,UAAU;AAAA,IAChF;AAAA,MACE,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,QAAM,YAAY,SAAS,OAAO;AAClC,SAAO,OAAO,UAAU,SAAS,IAAI,OAAO,SAAS,IAAI,UAAU,QAAQ,CAAC;AAC9E;AAEA,SAAS,cACP,QACA,WACQ;AACR,SAAO,OAAO,WAAW,aAAa,OAAO,SAAS,IAAI;AAC5D;AAtRA,IAAAC,mBACAC;AADA;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AACA;AAMA;AACA;AACA;AACA,IAAAC;AACA;AACA,IAAAC;AAAA;AAAA;;;ACmEA,SAAS,gBACP,OACA,WAC4C;AAC5C,MAAI,cAAc,WAAW,EAAE,iBAAiB,uBAAuB,CAAC,oBAAoB,IAAI,MAAM,IAAI,GAAG;AAC3G,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,EAChB;AACF;AAEA,eAAe,0BACb,SACA,SACA,UAIA;AACA,QAAM,eAAe,MAAM,aAAa,QAAQ,SAAS,OAAO;AAChE,QAAM,SAAS,KAAK,MAAM,aAAa,MAAM;AAE7C,SAAO;AAAA,IACL,KAAK;AAAA,MACH;AAAA,QACE,GAAG;AAAA,QACH,QAAQ,OAAO,WAAW,mBAAAC,QAAK,QAAQ,OAAO,OAAO,QAAQ,EAAE,CAAC,EAAE,QAAQ,OAAO,EAAE,KAAK;AAAA,QACxF,UAAU;AAAA,QACV,UAAU;AAAA,UACR,MAAM;AAAA,UACN,SAAS,SAAS;AAAA,UAClB,QAAQ,SAAS;AAAA,QACnB;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa;AAAA,EACf;AACF;AA5HA,IAAAC,oBASM,sBACA,qBAOO;AAjBb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAEjB;AACA,IAAAC;AAEA,IAAAC;AACA;AACA;AAEA,IAAM,uBAAuB,6BAA6B,KAAK;AAC/D,IAAM,sBAAsB,oBAAI,IAAI;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAEM,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,UAAU,MAAM,yBAAyB,SAAS,SAAS;AAAA,UAC/D,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqB;AAAA,UACrB,QAAQ,CAAC,cAAc,UAAU,QAAQ,OAAO,EAAE;AAAA,QACpD,CAAC;AAED,YAAI,QAAQ,cAAc,WAAW,CAAC,QAAQ,OAAO,OAAO,OAAO;AACjE,iBAAO,0BAA0B,SAAS,SAAS;AAAA,YACjD,SAAS;AAAA,YACT,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAEA,YAAI;AACF,iBAAO,MAAM,0BAA0B,SAAS,SAAS;AAAA,YACvD,UAAU;AAAA,YACV,UAAU;AAAA,YACV,qBAAqB;AAAA,YACrB,QAAQ,CAAC,cAAc,UAAU,QAAQ,OAAO,EAAE;AAAA,UACpD,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,WAAW,gBAAgB,OAAO,QAAQ,SAAS;AACzD,cAAI,CAAC,UAAU;AACb,kBAAM;AAAA,UACR;AAEA,iBAAO,0BAA0B,SAAS,SAAS,QAAQ;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChFA,IAIMC,uBAEO;AANb;AAAA;AAAA;AAAA;AACA;AAGA,IAAMA,wBAAuB,6BAA6B,OAAO;AAE1D,IAAM,sBAAsC;AAAA,MACjD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,UAAU,MAAM,yBAAyB,SAAS,SAAS;AAAA,UAC/D,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,0BAA0B,SAAS,SAAS;AAAA,UACjD,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACnDA,IAIMC,uBAEO;AANb;AAAA;AAAA;AAAA;AACA;AAGA,IAAMA,wBAAuB,6BAA6B,KAAK;AAExD,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,UAAU,MAAM,yBAAyB,SAAS,SAAS;AAAA,UAC/D,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AACD,eAAO,0BAA0B,SAAS,SAAS;AAAA,UACjD,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACnDA,IAIMC,uBAEO;AANb;AAAA;AAAA;AAAA;AACA;AAGA,IAAMA,wBAAuB,6BAA6B,KAAK;AAExD,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,UAAU,MAAM,yBAAyB,SAAS,SAAS;AAAA,UAC/D,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ,CAAC,cAAc,UAAU,QAAQ,OAAO,EAAE;AAAA,QACpD,CAAC;AACD,eAAO,0BAA0B,SAAS,SAAS;AAAA,UACjD,UAAU;AAAA,UACV,UAAU;AAAA,UACV,qBAAqBA;AAAA,UACrB,QAAQ,CAAC,cAAc,UAAU,QAAQ,OAAO,EAAE;AAAA,QACpD,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACnDA,IAMa;AANb;AAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AAGO,IAAM,mBAAmC;AAAA,MAC9C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,qBAAqB,QAAQ,eAAe,YAAY;AAC1E,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,cAAc,IAAI,wBAAwB,QAAQ,eAAe,YAAY;AAEnF,YAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,gBAAM,OAAOC,YAAW,KAAK,MAAM,MAAM;AACzC,gBAAMC,WAAU,MAAM,MAAM,OAAO;AAAA,YACjC,MAAM;AAAA,YACN,MAAM,QAAQ,SAAS;AAAA,YACvB,IAAI;AAAA,YACJ,SAAS,oBAAoB,QAAQ,SAAS,IAAI;AAAA,YAClD,SAAS;AAAA,UACX,CAAC;AACD,gBAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM,oBAAoB;AAAA,YACtE,cAAcA,SAAQ;AAAA,YACtB,WAAWA,SAAQ;AAAA,YACnB,SAASA,SAAQ;AAAA,UACnB,CAAC;AACD,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,IAAI;AAAA,gBACJ,SAAAA;AAAA,gBACA,SAAS,gBAAgBA,SAAQ,EAAE;AAAA,cACrC;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,SAAS,QAAQ;AACpC,gBAAM,IAAI,MAAM,oEAAoE;AAAA,QACtF;AAEA,cAAM,YAAYD,YAAW,KAAK,YAAY,YAAY;AAC1D,YAAI,OAAO,KAAK,YAAY,WAAW;AACrC,gBAAMC,WAAU,MAAM,MAAM,KAAK,SAAS;AAC1C,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,IAAI;AAAA,gBACJ,SAAAA;AAAA,gBACA,SAASA,WAAU,GAAGA,SAAQ,EAAE,KAAKA,SAAQ,MAAM,KAAK;AAAA,cAC1D;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,YAAY,KAAK;AACtC,YAAI,CAAC,OAAO,oBAAoB;AAC9B,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,UAAU,oBAAoB,KAAK,SAAS,SAAS;AAC3D,cAAM,WAAW,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AACrE,cAAM,UAAU,MAAM,MAAM,YAAY,SAAS;AACjD,YAAI,QAAQ,SAAS,iBAAiB;AACpC,gBAAM,IAAI,MAAM,oBAAoB,SAAS,QAAQ,QAAQ,IAAI,yBAAyB;AAAA,QAC5F;AACA,YAAI,QAAQ,OAAO,QAAQ,SAAS,MAAM;AACxC,gBAAM,IAAI,MAAM,gBAAgB,SAAS,aAAa,QAAQ,EAAE,WAAW,QAAQ,SAAS,IAAI,IAAI;AAAA,QACtG;AAEA,cAAM,UAAU,MAAM,MAAM,QAAQ,WAAW;AAAA,UAC7C;AAAA,UACA;AAAA,UACA,aAAa,QAAQ,SAAS;AAAA,QAChC,CAAC;AACD,cAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM,UAAU,qBAAqB;AAAA,UACjF,cAAc,QAAQ;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,QAAQ,QAAQ,MAAM,QAAQ,QAAQ,IAAI;AAAA,YACrD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACzEA,eAAsB,gBAAgB,UAAkB,UAA0C;AAChG,QAAM,OAAO,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AACnC,QAAM,YAAY,mBAAAC,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAErD,MAAI,uBAAuB,IAAI,SAAS,GAAG;AACzC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,gCAAgC,SAAS;AAAA,MACjD,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,kCAAkC,SAAS;AAAA,MACnD,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,iCAAiC,SAAS;AAAA,MAClD,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,wBAAwB,SAAS,SAAkB,GAAG;AACxD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,mCAAmC,SAAS;AAAA,MACpD,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,sBAAsB,SAAS,SAAkB,GAAG;AACtD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,iCAAiC,SAAS;AAAA,MAClD,QAAQ;AAAA,MACR,eAAe;AAAA,MACf,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,MAAI,wBAAwB,IAAI,SAAS,GAAG;AAC1C,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ,uCAAuC,aAAa,SAAS;AAAA,MACrE,QAAQ;AAAA,MACR,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,kBAAAD,QAAG,SAAS,QAAQ;AACzC,MAAI,OAAO,SAAS,CAAC,GAAG;AACtB,WAAO;AAAA,MACL,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM,KAAK;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,SAAS,GAAG,KAAK,IAAI,OAAO,QAAQ,QAAQ,CAAC;AAClE,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,MAAM,SAAS,MAAM;AAAA,IAC9B,MAAM,KAAK;AAAA,IACX;AAAA,EACF;AACF;AAhJA,IAAAE,mBACAC,oBASa,wBAQP;AAlBN;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AAOO,IAAM,yBAAyB,oBAAI,IAAI;AAAA,MAC5C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,IAAM,0BAA0B,oBAAI,IAAI;AAAA,MACtC;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,CAAC;AAAA;AAAA;;;ACxBM,SAAS,yBAAyB,UAAkB,cAA+B;AACxF,QAAM,iBAAiB,mBAAAC,QAAK,QAAQ,QAAQ;AAC5C,QAAM,eAAe,mBAAAA,QAAK,QAAQ,qBAAqB,YAAY,EAAE,cAAc;AAEnF,SACE,mBAAmB,gBACnB,eAAe,WAAW,GAAG,YAAY,GAAG,mBAAAA,QAAK,GAAG,EAAE;AAE1D;AAEO,SAAS,mCACd,UACA,WACyB;AACzB,QAAM,aAAa,UAAU,WAAW;AACxC,QAAM,UAAU,qBAAqB,UAAU;AAC/C,QAAM,UAAU,wBAAwB,YAAY,0BAA0B;AAC9E,QAAM,UAAU,qBAAqB,SAAS,OAAO;AAErD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM,UAAU;AAAA,IAChB,WAAW,UAAU;AAAA,IACrB,cAAc;AAAA,IACd,MACE;AAAA,IACF;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,SAAS,QAAQ,MAAM,OAAO,EAAE;AAAA,IAChC;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,SAAiB,SAAyB;AACtE,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA,YAAY,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,0BAA0B,MAAM,KAAK,IAAI,GAAG,CAAC;AACtD;AAEA,SAAS,qBAAqB,YAA4B;AACxD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,UAAU;AACpC,QAAI,UAAU,OAAO,WAAW,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG;AAClE,YAAM,YAAY;AAAA,QAChBC,gBAAe,MAAM,OAAO,EAAE;AAAA,QAC9BA,gBAAe,QAAQ,OAAO,IAAI;AAAA,QAClCA,gBAAe,iBAAiB,OAAO,aAAa;AAAA,QACpDA,gBAAe,UAAU,OAAO,MAAM;AAAA,QACtCA,gBAAe,SAAS,OAAO,KAAK;AAAA,QACpCC,oBAAmB,WAAW,OAAO,OAAO;AAAA,QAC5CA,oBAAmB,WAAW,OAAO,OAAO;AAAA,QAC5CA,oBAAmB,UAAU,OAAO,MAAM;AAAA,QAC1CD,gBAAe,YAAY,OAAO,QAAQ;AAAA,QAC1CA,gBAAe,SAAS,OAAO,KAAK;AAAA,QACpCA,gBAAe,SAAS,OAAO,KAAK;AAAA,QACpCA,gBAAe,aAAa,OAAO,SAAS;AAAA,QAC5CA,gBAAe,UAAU,OAAO,MAAM;AAAA,QACtCA,gBAAe,QAAQ,OAAO,IAAI;AAAA,QAClCA,gBAAe,UAAU,OAAO,MAAM;AAAA,QACtCA,gBAAe,YAAY,OAAO,QAAQ;AAAA,MAC5C,EAAE,OAAO,CAAC,aAAiC,QAAQ,QAAQ,CAAC;AAE5D,UAAI,UAAU,SAAS,GAAG;AACxB,eAAO,UAAU,KAAK,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO,mBAAmB,QAAW,YAAY,GAAG;AACtD;AAEA,SAASA,gBAAe,KAAa,OAAoC;AACvE,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW;AACxF,WAAO,GAAG,GAAG,IAAI,OAAO,KAAK,CAAC;AAAA,EAChC;AAEA,SAAO;AACT;AAEA,SAASC,oBAAmB,KAAa,OAAoC;AAC3E,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,GAAG,IAAI,MAAM,MAAM;AAC/B;AAzGA,IAAAC,oBAOM;AAPN;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAEjB;AACA;AACA;AAGA,IAAM,6BAA6B;AAAA;AAAA;;;ACPnC,IAUa;AAVb;AAAA;AAAA;AAEA;AACA,IAAAC;AACA;AACA;AACA;AACA,IAAAC;AAGO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,YAAY,mBAAmB,KAAK,UAAU;AACpD,cAAM,UAAU,mBAAmB,KAAK,QAAQ;AAChD,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,YAAI;AAEJ,YAAI;AACF,sBAAY,MAAM,gBAAgB,UAAU,QAAQ,OAAO,YAAY;AAAA,QACzE,SAAS,OAAO;AACd,gBAAM,QAAQ;AACd,cAAI,MAAM,SAAS,UAAU;AAC3B,kBAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK,YAAY,QAAQ,cAAc;AAC7F,kBAAM,IAAI,mBAAmB,mBAAmB,UAAU,IAAI;AAAA,cAC5D,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,eAAe;AAAA,gBACf;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAEA,gBAAM;AAAA,QACR;AAEA,YAAI,CAAC,UAAU,UAAU;AACvB,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,MAAM;AAAA,gBACN,UAAU;AAAA,gBACV,QAAQ,UAAU;AAAA,gBAClB,MAAM,UAAU;AAAA,gBAChB,WAAW,UAAU;AAAA,gBACrB,QAAQ,UAAU,UAAU;AAAA,gBAC5B,eAAe,UAAU;AAAA,gBACzB,eAAe,UAAU;AAAA,cAC3B;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,aAAa,CAAC,WAAW,yBAAyB,UAAU,QAAQ,eAAe,YAAY,GAAG;AACrG,iBAAO;AAAA,YACL,KAAK,UAAU,mCAAmC,UAAU,SAAS,GAAG,MAAM,CAAC;AAAA,UACjF;AAAA,QACF;AAEA,cAAM,SAAS,UAAU,WAAW,IAAI,MAAM,OAAO;AACrD,cAAM,aAAa,YAAY,KAAK,IAAI,YAAY,GAAG,CAAC,IAAI;AAC5D,cAAM,WAAW,UAAU,KAAK,IAAI,SAAS,MAAM,MAAM,IAAI,MAAM;AACnE,cAAM,WAAW,MAAM,MAAM,YAAY,QAAQ,EAAE,KAAK,IAAI;AAC5D,cAAM,YAAY;AAAA,UAChB,aAAa,UAAU,QAAQ,OAAO,YAAY;AAAA,UAClD,aAAa;AAAA,QACf;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN,UAAU;AAAA,cACV,MAAM,UAAU;AAAA,cAChB,WAAW,UAAU;AAAA,cACrB,WAAW,aAAa;AAAA,cACxB,SAAS,aAAa,KAAK,IAAI,GAAG,SAAS,MAAM,OAAO,EAAE,MAAM;AAAA,cAChE,SAAS;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACjHA,IAIa;AAJb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,UAAU,SAAS;AAC/B,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,WAAW,MAAM,IAAI,UAAU,QAAQ,SAAS,IAAI;AAC1D,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,OAAO,QAAQ,SAAS;AAAA,cACxB;AAAA,cACA,SACE,SAAS,SAAS,IACd,SACG,MAAM,GAAG,CAAC,EACV,IAAI,CAAC,YAAY,GAAG,QAAQ,IAAI,SAAS,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE,EAC3E,KAAK,IAAI,IACZ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACyGA,SAAS,aAAa,YAAsB,gBAAkC;AAC5E,MAAI,CAAC,gBAAgB;AACnB,WAAO,WAAW,MAAM,GAAG,sBAAsB;AAAA,EACnD;AAEA,QAAM,SAAS,WAAW,KAAK,CAAC,cAAc,cAAc,cAAc;AAC1E,MAAI,QAAQ;AACV,WAAO,CAAC,MAAM;AAAA,EAChB;AAEA,QAAM,UAAU,OAAO,SAAS,gBAAgB,EAAE;AAClD,MAAI,OAAO,SAAS,OAAO,KAAK,WAAW,KAAK,WAAW,WAAW,QAAQ;AAC5E,UAAM,gBAAgB,WAAW,UAAU,CAAC;AAC5C,QAAI,eAAe;AACjB,aAAO,CAAC,aAAa;AAAA,IACvB;AAAA,EACF;AAEA,QAAM,IAAI,mBAAmB,oBAAoB,cAAc,IAAI;AAAA,IACjE,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,IACnB;AAAA,EACF,CAAC;AACH;AAEA,SAAS,kBACP,WACA,WACA,SACA,YACyB;AACzB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AAEA,QAAM,OAAY,WAAM,cAAc,WAAW;AAAA,IAC/C,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,EACV,CAAC;AAED,QAAM,WAAW,KAAK;AACtB,QAAM,cAAc,KAAK,OAAO,CAAC,KAAK,QAAQ,KAAK,IAAI,KAAK,MAAM,QAAQ,GAAG,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC;AACnG,QAAM,UAAU,KAAK,MAAM,GAAG,OAAO,EAAE,IAAI,CAAC,KAAK,WAAW;AAAA,IAC1D,KAAK,QAAQ;AAAA,IACb,OAAO,aAAa,KAAK,UAAU;AAAA,EACrC,EAAE;AAEF,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,eAAe,KAAK,IAAI,GAAG,WAAW,QAAQ,MAAM;AAAA,IACpD,kBAAkB,KAAK,IAAI,GAAG,cAAc,UAAU;AAAA,IACtD;AAAA,EACF;AACF;AAEA,SAAS,aAAa,KAAgB,YAA8B;AAClE,SAAO,IAAI,MAAM,GAAG,UAAU,EAAE,IAAI,CAAC,SAAS,WAAW,IAAI,CAAC;AAChE;AAEA,SAAS,WAAW,OAAwB;AAC1C,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,MAAM;AACzB,WAAO,MAAM,YAAY;AAAA,EAC3B;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,MAAM,SAAS,MAAM,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ;AAAA,EAC5D;AAEA,SAAO,OAAO,KAAK;AACrB;AApOA,IAAAC,mBACAC,oBAEA,MASM,wBAEO;AAdb;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,WAAsB;AAEtB;AACA,IAAAC;AACA;AACA;AACA,IAAAC;AAGA,IAAM,yBAAyB;AAExB,IAAM,sBAAsC;AAAA,MACjD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,iBACJ,OAAO,KAAK,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,IACxD,OAAO,KAAK,MAAM,KAAK,KAAK,CAAC,IAC7B,OAAO,KAAK,UAAU,WACpB,KAAK,MAAM,KAAK,IAChB;AACR,cAAM,UAAU,YAAY,KAAK,UAAU,GAAG,KAAK,QAAQ,OAAO,yBAAyB;AAC3F,cAAM,aAAa,YAAY,KAAK,aAAa,GAAG,KAAK,QAAQ,OAAO,4BAA4B;AACpG,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAE1E,YAAI;AACJ,YAAI;AACF,iBAAO,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAAA,QAC/B,SAAS,OAAO;AACd,gBAAM,QAAQ;AACd,cAAI,MAAM,SAAS,UAAU;AAC3B,kBAAM,cAAc,MAAM,oBAAoB,QAAQ,KAAK,YAAY,QAAQ,cAAc;AAC7F,kBAAM,IAAI,mBAAmB,mBAAmB,UAAU,IAAI;AAAA,cAC5D,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,eAAe;AAAA,gBACf;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAEA,gBAAM;AAAA,QACR;AAEA,cAAM,YAAY,mBAAAC,QAAK,QAAQ,QAAQ,EAAE,YAAY;AACrD,YAAI,CAAC,uBAAuB,IAAI,SAAS,GAAG;AAC1C,gBAAM,IAAI,mBAAmB,mCAAmC,aAAa,SAAS,IAAI;AAAA,YACxF,MAAM;AAAA,YACN,SAAS;AAAA,cACP,qBAAqB,CAAC,GAAG,sBAAsB,EAAE,KAAK;AAAA,YACxD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI;AACJ,YAAI;AACF,qBAAgB,cAAS,UAAU;AAAA,YACjC,WAAW;AAAA,YACX,OAAO;AAAA,YACP,KAAK;AAAA,UACP,CAAC;AAAA,QACH,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,gCAAgC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,YACtF;AAAA,cACE,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,cAAM,aAAa,SAAS,cAAc,CAAC;AAC3C,YAAI,WAAW,WAAW,GAAG;AAC3B,iBAAO;AAAA,YACL,KAAK;AAAA,cACL;AAAA,gBACE,MAAM;AAAA,gBACN;AAAA,gBACA,MAAM,KAAK;AAAA,gBACX,YAAY;AAAA,gBACZ,QAAQ,CAAC;AAAA,cACX;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,qBAAqB,aAAa,YAAY,cAAc;AAClE,cAAM,WAAW,mBAAmB;AAAA,UAAI,CAAC,cACvC,kBAAkB,SAAS,OAAO,SAAS,GAAG,WAAW,SAAS,UAAU;AAAA,QAC9E;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,MAAM,KAAK;AAAA,cACX,YAAY,WAAW;AAAA,cACvB,iBAAiB;AAAA,cACjB,iBAAiB,mBAAmB;AAAA,cACpC,qBAAqB,KAAK,IAAI,GAAG,WAAW,SAAS,mBAAmB,MAAM;AAAA,cAC9E,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9IA,IAOa;AAPb;AAAA;AAAA;AAAA,IAAAC;AACA;AACA;AACA;AACA,IAAAC;AAGO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,KAAK;AAAA,gBACH,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,UAAUC,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,WAAW,OAAO,KAAK,QAAQ,WAAW,KAAK,MAAM,QAAQ;AACnE,cAAM,YAAY,YAAY,KAAK,YAAY,KAAO,KAAS,IAAO;AACtE,cAAM,cAAc,kBAAkB,UAAU,QAAQ,KAAK,QAAQ,MAAM;AAC3E,cAAM,iBAAiB,gBAAgB,OAAO;AAC9C,cAAM,iBAAiB;AAAA,UACrB,QAAQ,OAAO;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,aAAa,YAAY,QAAQ,OAAO,mBAAmB,GAAG,GAAG,CAAC;AACxE,cAAM,iBAAiB,YAAY,QAAQ,OAAO,uBAAuB,KAAK,KAAQ,IAAK;AAE3F,YAAI,eAAe,kBAAkB;AACnC,gBAAM,IAAI;AAAA,YACR;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,SAAS;AAAA,gBACP,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,SAAS,MAAM,qBAAqB;AAAA,UACxC;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB;AAAA,UACA;AAAA,UACA,UAAU,eAAe;AAAA,QAC3B,CAAC;AACD,cAAM,SAAS,OAAO,UAClB,YACA,OAAO,WACL,cACA,OAAO,aAAa,IAClB,cACA;AAER,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE;AAAA,cACA,KAAK;AAAA,cACL,UAAU,OAAO;AAAA,cACjB;AAAA,cACA,UAAU,OAAO;AAAA,cACjB,YAAY,OAAO;AAAA,cACnB,SAAS,OAAO;AAAA,cAChB,UAAU,OAAO;AAAA,cACjB,aAAa,eAAe;AAAA,cAC5B,QAAQ,OAAO;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,eAAe,iBACX;AAAA,YACE,cAAc;AAAA,cACZ,WAAW;AAAA,cACX;AAAA,cACA,UAAU,OAAO;AAAA,cACjB,MAAM,eAAe;AAAA,cACrB,QAAQ,OAAO,aAAa,KAAK,CAAC,OAAO,WAAW,CAAC,OAAO;AAAA,YAC9D;AAAA,UACF,IACA;AAAA,QACN;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC9GA,IAAAC,mBAEAC,mBAOa;AATb;AAAA;AAAA;AAAA,IAAAD,oBAAe;AAEf,IAAAC,oBAAe;AAEf;AACA;AACA,IAAAC;AAGO,IAAM,kBAAkC;AAAA,MAC7C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,gBAAgB;AAAA,gBACd,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,SAAS;AAAA,YAC5B,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,UAAUA,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;AACzD,cAAM,gBAAgB,YAAY,KAAK,gBAAgB,KAAK;AAC5D,cAAM,aAAa,YAAY,KAAK,aAAa,GAAG,KAAO,QAAQ,OAAO,gBAAgB;AAC1F,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,QAAQ,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAEpC,cAAM,QAAQ,mBAAmB,SAAS,aAAa;AACvD,cAAM,YAAY,MAAM,YAAY,KAE9B,UAAM,kBAAAC,SAAG,MAAM;AAAA,UACb,KAAK;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,QAAQ,CAAC,cAAc,sBAAsB,cAAc,gBAAgB;AAAA,QAC7E,CAAC,GAEA,OAAO,CAAC,aAAa,CAAC,cAAc,UAAU,QAAQ,eAAe,WAAW,CAAC,EACjF,MAAM,GAAG,GAAK,IACjB,CAAC,QAAQ;AAEb,cAAM,UAA+D,CAAC;AAEtE,mBAAW,YAAY,WAAW;AAChC,cAAI,QAAQ,UAAU,YAAY;AAChC;AAAA,UACF;AAEA,gBAAM,UAAU,MAAM,gBAAgB,UAAU,QAAQ,OAAO,YAAY;AAC3E,cAAI,CAAC,SAAS;AACZ;AAAA,UACF;AAEA,gBAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,mBAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,gBAAI,QAAQ,UAAU,YAAY;AAChC;AAAA,YACF;AAEA,kBAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,kBAAM,YAAY;AAClB,gBAAI,MAAM,KAAK,IAAI,GAAG;AACpB,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,MAAM,QAAQ;AAAA,gBACd,MAAM,KAAK,MAAM,GAAG,GAAG;AAAA,cACzB,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,UAAU,UAAU;AAAA,cACpB;AAAA,cACA;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChHA,IAIa;AAJb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGO,IAAM,kBAAkC;AAAA,MAC7C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,IAAI;AAAA,gBACF,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,MAAM,CAAC,WAAW,WAAW;AAAA,gBAC7B,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM,SAAS;AAAA,YAC1B,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,UAAU,MAAM,IAAI;AAAA,UACxB,QAAQ,SAAS;AAAA,UACjBC,YAAW,KAAK,IAAI,IAAI;AAAA,UACxBA,YAAW,KAAK,SAAS,SAAS;AAAA,UAClC,KAAK,aAAa,cAAc,cAAc;AAAA,QAChD;AACA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,QAAQ,QAAQ,IAAI,OAAO,KAAK,EAAE;AAAA,YAC7C;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrDA,IAOa;AAPb;AAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,sBAAsC;AAAA,MACjD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,UAAU;AAAA,YACrB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAI,QAAQ,SAAS,SAAS,QAAQ;AACpC,gBAAM,IAAI,MAAM,2CAA2C;AAAA,QAC7D;AAEA,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,SAAS,MAAM,IAAI,wBAAwB,QAAQ,eAAe,YAAY,EAAE,KAAK;AAC3F,YAAI,CAAC,OAAO,uBAAuB;AACjC,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAWC,YAAW,KAAK,UAAU,UAAU;AACrD,cAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAC/D,cAAM,YAAY,IAAI,UAAU,QAAQ,eAAe,YAAY;AACnE,cAAM,SAAS,MAAM,UAAU,WAAW,QAAQ;AAClD,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AAAA,QACjD;AAEA,cAAM,QAAQ,IAAI,qBAAqB,QAAQ,eAAe,YAAY;AAC1E,cAAM,UAAU,MAAM,MAAM,OAAO;AAAA,UACjC,MAAM;AAAA,UACN,MAAM,QAAQ,SAAS;AAAA,UACvB,IAAI,OAAO;AAAA,UACX,SAAS,yBAAyB,OAAO,IAAI;AAAA,UAC7C,SAAS;AAAA,QACX,CAAC;AACD,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,OAAO,MAAM,QAAQ,oBAAoB;AAAA,UAC7E,cAAc,QAAQ;AAAA,UACtB,WAAW,QAAQ;AAAA,UACnB,SAAS,QAAQ;AAAA,QACnB,CAAC;AACD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,oBAAoB,QAAQ,EAAE,YAAY,OAAO,IAAI;AAAA,YAChE;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC5EA,IAMa;AANb;AAAA;AAAA;AAAA;AACA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,uBAAuC;AAAA,MAClD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,YAAY;AAAA,YACvB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,YAAYC,YAAW,KAAK,YAAY,YAAY;AAC1D,cAAM,eAAe,IAAI,qBAAqB,QAAQ,eAAe,YAAY;AAEjF,YAAI,QAAQ,SAAS,SAAS,QAAQ;AACpC,gBAAMC,WAAU,MAAM,aAAa,KAAK,SAAS;AACjD,iBAAO;AAAA,YACL,KAAK;AAAA,cACH;AAAA,gBACE,IAAI;AAAA,gBACJ,SAAAA;AAAA,gBACA,SAASA,WAAU,GAAGA,SAAQ,EAAE,KAAKA,SAAQ,MAAM,KAAK;AAAA,cAC1D;AAAA,cACA;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,gBAAM,IAAI,MAAM,4CAA4C;AAAA,QAC9D;AAEA,cAAM,UAAU,oBAAoB,KAAK,SAAS,SAAS;AAC3D,cAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;AAC/D,cAAM,UAAU,MAAM,aAAa,YAAY,SAAS;AACxD,YAAI,QAAQ,SAAS,YAAY;AAC/B,gBAAM,IAAI,MAAM,oBAAoB,SAAS,QAAQ,QAAQ,IAAI,oBAAoB;AAAA,QACvF;AACA,YAAI,QAAQ,OAAO,QAAQ,SAAS,MAAM;AACxC,gBAAM,IAAI,MAAM,oBAAoB,SAAS,aAAa,QAAQ,EAAE,WAAW,QAAQ,SAAS,IAAI,IAAI;AAAA,QAC1G;AAEA,cAAM,UAAU,MAAM,aAAa,QAAQ,WAAW;AAAA,UACpD;AAAA,UACA,UAAU;AAAA,UACV,aAAa,QAAQ,SAAS;AAAA,QAChC,CAAC;AACD,cAAM,MAAM,IAAI,WAAW,QAAQ,eAAe,YAAY;AAC9D,cAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,QAAQ,MAAM,QAAQ,qBAAqB;AAAA,UAC/E,cAAc,QAAQ;AAAA,UACtB;AAAA,UACA;AAAA,UACA,UAAU;AAAA,QACZ,CAAC;AACD,YAAI,SAAS;AACX,gBAAM,IAAI,UAAU,QAAQ,eAAe,YAAY,EAAE,mBAAmB,QAAQ,SAAS,MAAM,UAAU;AAAA,QAC/G;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,YAAY,UAAU,aAAa,UAAU;AAAA,YACxD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACnFO,SAAS,qBAAqB,SAA8C;AACjF,QAAM,WAAW,mBAAAC,QAAK,QAAQ,QAAQ,KAAK,CAAC,KAAK,EAAE;AACnD,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,sDAAsD;AAAA,EACxE;AAEA,QAAM,YAAQ;AAAA,IACZ,QAAQ;AAAA,IACR;AAAA,MACE;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,QAAQ,OAAO;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,MACE,KAAK,QAAQ;AAAA,MACb,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK,uBAAuB,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,QAAM,MAAM;AACZ,MAAI,CAAC,MAAM,KAAK;AACd,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAEA,SAAO,MAAM;AACf;AAEO,SAAS,uBAAuB,SAAyD;AAC9F,QAAM,MAAyB;AAAA,IAC7B,GAAG,QAAQ;AAAA,IACX,iBAAiB,QAAQ,OAAO;AAAA,IAChC,kBAAkB,QAAQ,OAAO;AAAA,IACjC,eAAe,QAAQ,OAAO;AAAA,IAC9B,cAAc,QAAQ,OAAO;AAAA,EAC/B;AAEA,QAAM,aAAa,QAAQ,OAAO,IAAI;AACtC,MAAI,QAAQ,OAAO,IAAI,WAAW,WAAW,WAAW,CAAC,WAAW,UAAU;AAC5E,QAAI,uCAAuC,mBAAAA,QAAK;AAAA,MAC9C,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AACA,WAAO,IAAI;AAAA,EACb;AAEA,SAAO;AACT;AA7EA,IAAAC,oBACAC;AADA,IAAAC,cAAA;AAAA;AAAA;AAAA,IAAAF,qBAAiB;AACjB,IAAAC,6BAAsB;AAAA;AAAA;;;ACDtB,IAOa;AAPb;AAAA;AAAA;AAAA,IAAAE;AACA;AACA,IAAAC;AACA,IAAAA;AACA,IAAAC;AAGO,IAAM,oBAAoC;AAAA,MAC/C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,QAAQ,QAAQ;AAAA,YACnC,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAI,QAAQ,SAAS,SAAS,QAAQ;AACpC,gBAAM,IAAI,MAAM,mCAAmC;AAAA,QACrD;AAEA,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,OAAOC,YAAW,KAAK,MAAM,MAAM;AACzC,cAAM,OAAOA,YAAW,KAAK,MAAM,MAAM;AACzC,cAAM,SAASA,YAAW,KAAK,QAAQ,QAAQ;AAC/C,cAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,cAAM,mBAAmB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AAC9E,cAAM,YAAY,IAAI,UAAU,QAAQ,eAAe,YAAY;AACnE,cAAM,YAAY,IAAI,UAAU,QAAQ,eAAe,YAAY;AACnE,cAAM,WAAW,MAAM,UAAU,WAAW,IAAI;AAChD,YAAI,YAAY,SAAS,WAAW,WAAW;AAC7C,gBAAM,IAAI,MAAM,aAAa,IAAI,uBAAuB;AAAA,QAC1D;AAEA,YAAI;AACJ,YAAI;AACJ,YAAI,QAAQ;AACV,8BAAoB,MAAM,UAAU,KAAK,MAAM,GAAG;AAClD,gBAAM,UAAU,OAAO,QAAQ,IAAI;AACnC,2BAAiB;AAAA,QACnB;AAEA,YAAI;AACJ,YAAI;AACF,gBAAM,qBAAqB;AAAA,YACzB,SAAS,QAAQ,eAAe;AAAA,YAChC,QAAQ,QAAQ;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAAA,QACH,SAAS,OAAO;AACd,cAAI,QAAQ;AACV,kBAAM,UAAU,OAAO,QAAQ;AAAA,cAC7B,UAAU,oBAAoB;AAAA,YAChC,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,UACrB;AACA,gBAAM;AAAA,QACR;AAEA,cAAM,SAAS,MAAM,UAAU,aAAa,MAAM,MAAM,WAAW;AAAA,UACjE;AAAA,UACA,WAAW,UAAU;AAAA,QACvB,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA;AAAA,cACA,SAAS,YAAY,IAAI,MAAM,IAAI,SAAS,GAAG,GAAG,iBAAiB,SAAS,cAAc,KAAK,EAAE;AAAA,YACnG;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACrCO,SAAS,oBAAoC;AAClD,SAAO,OAAO,KAAK,iBAAiB;AACtC;AAEO,SAAS,mBAAmB,WAAoC;AACrE,QAAM,aAAa,UAAU,KAAK,EAAE,YAAY;AAChD,QAAM,UAAU,kBAAkB,UAAU;AAC5C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,0BAA0B,SAAS,EAAE;AAAA,EACvD;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,SAA0B,YAAkC;AAC9F,MAAI,QAAQ,SAAS,WAAW,eAAe,SAAS;AACtD,UAAM,IAAI,MAAM,QAAQ,QAAQ,IAAI,iCAAiC;AAAA,EACvE;AAEA,SAAO,QAAQ;AACjB;AAEO,SAAS,wBACd,aACA,QACA,SACQ;AACR,SAAO;AAAA,IACL,mBAAmB,WAAW;AAAA,IAC9B,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,KAAK;AAAA,IACZ;AAAA,EACF,EAAE,KAAK,MAAM;AACf;AAEO,SAAS,2BAAmC;AACjD,SAAO,kBAAkB,EACtB,IAAI,CAAC,SAAS,KAAK,IAAI,KAAK,kBAAkB,IAAI,EAAE,WAAW,EAAE,EACjE,KAAK,IAAI;AACd;AAvGA,IAYM,0BAaA,qBAWO;AApCb;AAAA;AAAA;AAYA,IAAM,2BAA2B;AAAA,MAC/B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,IAAM,sBAAsB;AAAA,MAC1B,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEO,IAAM,oBAA2D;AAAA,MACtE,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,WAAW;AAAA,QACX,oBACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,WAAW;AAAA,QACX,oBACE;AAAA,MACJ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,MAAM;AAAA,QACN,WAAW;AAAA,QACX,oBACE;AAAA,MACJ;AAAA,IACF;AAAA;AAAA;;;ACSA,SAAS,cAAc,IAAoB;AACzC,QAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAK,CAAC;AAClD,MAAI,UAAU,IAAI;AAChB,WAAO,GAAG,OAAO;AAAA,EACnB;AAEA,QAAM,UAAU,KAAK,MAAM,UAAU,EAAE;AACvC,QAAM,YAAY,UAAU;AAC5B,SAAO,GAAG,OAAO,IAAI,SAAS;AAChC;AAEA,SAASC,UAAS,OAAe,UAA0B;AACzD,SAAO,MAAM,UAAU,WAAW,QAAQ,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACvE;AAnFA,IAEM,cAEO;AAJb;AAAA;AAAA;AAEA,IAAM,eAAe;AAEd,IAAM,2BAAN,MAA+B;AAAA,MAMpC,YACmB,WACA,aACA,WACjB;AAHiB;AACA;AACA;AAAA,MAChB;AAAA,MATc,YAAY,KAAK,IAAI;AAAA,MAC9B,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAmC;AAAA,MAQ3C,QAAc;AACZ,aAAK,YAAY;AACjB,aAAK,KAAK,SAAS;AACnB,aAAK,YAAY,YAAY,MAAM;AACjC,eAAK,KAAK,wBAAwB,KAAK,SAAS,EAAE;AAAA,QACpD,GAAG,YAAY;AACf,aAAK,UAAU,QAAQ;AAAA,MACzB;AAAA,MAEA,SAAe;AACb,aAAK,cAAc;AACnB,aAAK,KAAK,MAAM;AAAA,MAClB;AAAA,MAEA,KAAK,OAAsB;AACzB,aAAK,cAAc;AACnB,cAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,aAAK,KAAK,WAAW,OAAO,EAAE;AAAA,MAChC;AAAA,MAEA,kBAAkC;AAChC,eAAO;AAAA,UACL,UAAU,CAAC,SAAS;AAClB,iBAAK,YAAYA,UAAS,MAAM,EAAE;AAClC,iBAAK,KAAK,UAAU,KAAK,SAAS,EAAE;AAAA,UACtC;AAAA,UACA,YAAY,CAAC,SAAS;AACpB,iBAAK,aAAa;AAClB,iBAAK,YAAY,QAAQ,IAAI;AAC7B,iBAAK,KAAK,QAAQ,IAAI,EAAE;AAAA,UAC1B;AAAA,UACA,aAAa,CAAC,SAAS;AACrB,iBAAK,YAAY,cAAc,IAAI;AACnC,iBAAK,KAAK,cAAc,IAAI,EAAE;AAAA,UAChC;AAAA,QACF;AAAA,MACF;AAAA,MAEQ,KAAK,OAAqB;AAChC,aAAK,WAAW;AAAA,UACd,aAAa,KAAK,SAAS,KAAK,KAAK,WAAW,QAAQ,KAAK,SAAS,WAAW,cAAc,KAAK,IAAI,IAAI,KAAK,SAAS,CAAC,KAAK,KAAK;AAAA,QACvI;AAAA,MACF;AAAA,MAEQ,gBAAsB;AAC5B,YAAI,CAAC,KAAK,WAAW;AACnB;AAAA,QACF;AAEA,sBAAc,KAAK,SAAS;AAC5B,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAAA;AAAA;;;ACpEA;AAAA;AAAA;AAAA;AAuBA,eAAsB,gBACpB,SACgC;AAChC,QAAM,UAAU,mBAAmB,QAAQ,SAAS;AACpD,QAAM,OAAO,oBAAoB,SAAS,QAAQ,OAAO,IAAI;AAC7D,QAAM,iBAAgC;AAAA,IACpC,GAAG,QAAQ;AAAA,IACX;AAAA,EACF;AACA,QAAM,eAAe,IAAI,mBAAmB;AAC5C,QAAM,UAAU,MAAM,aAAa,OAAO,QAAQ,GAAG;AACrD,QAAM,eAAe,QAAQ,mBAAmB,MAAM;AAAA,IACpD,WAAW,QAAQ;AAAA,IACnB,cAAc,CAAC,MAAM;AAAA,EACvB,CAAC;AACD,QAAM,WAAW,IAAI,yBAAyB,QAAQ,MAAM,QAAQ,aAAa,QAAQ,SAAS;AAClG,WAAS,MAAM;AAEf,MAAI;AACF,UAAM,SAAS,MAAM,aAAa;AAAA,MAChC,OAAO,wBAAwB,QAAQ,aAAa,QAAQ,QAAQ,OAAO;AAAA,MAC3E,KAAK,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,SAAS,gBAAgB;AAAA,MACpC,UAAU;AAAA,QACR,MAAM;AAAA,QACN,MAAM,kBAAkB,QAAQ,MAAM,QAAQ,WAAW;AAAA,QACzD,MAAM,QAAQ;AAAA,MAChB;AAAA,IACF,CAAC;AAED,aAAS,OAAO;AAEhB,WAAO;AAAA,MACL,SAAS,wBAAwB,OAAO,QAAQ,QAAQ;AAAA,MACxD,UAAU,sBAAsB,QAAQ,QAAQ,IAAI;AAAA,IACtD;AAAA,EACF,SAAS,OAAO;AACd,aAAS,KAAK,KAAK;AACnB,UAAM;AAAA,EACR;AACF;AAEA,SAAS,sBACP,QACA,WACmC;AACnC,QAAM,WAAkC,CAAC;AAEzC,MAAI,OAAO,aAAa,SAAS,GAAG;AAClC,aAAS,eAAe,OAAO;AAAA,EACjC;AAEA,MAAI,OAAO,uBAAuB;AAChC,aAAS,eAAe;AAAA,MACtB,WAAW;AAAA,MACX,SAAS,YAAY,SAAS;AAAA,MAC9B,UAAU;AAAA,MACV,MAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACvD;AAEA,SAAS,wBAAwB,UAAmC;AAClE,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,SAAS,SAAS,aAAa;AACjC;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,SAAS,KAAK;AACtC,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,QAAQ,kBAAkB,KAAK;AACjD,QAAI,WAAW;AACb,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,WAAmB,aAA6B;AACzE,QAAM,OAAO,YACV,KAAK,EACL,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAEd,SAAO,GAAG,SAAS,IAAI,QAAQ,MAAM;AACvC;AAzHA;AAAA;AAAA;AAAA;AACA;AAIA;AACA;AAAA;AAAA;;;ACNA,IAIM,gBAEO;AANb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGA,IAAM,iBAAiB,kBAAkB;AAElC,IAAM,WAA2B;AAAA,MACtC,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE,uJACA,yBAAyB;AAAA,UAC3B,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,eAAe,UAAU,YAAY;AAAA,YAChD,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,gBAAM,IAAI,MAAM,8CAA8C;AAAA,QAChE;AAEA,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,cAAcC,YAAW,KAAK,aAAa,aAAa;AAC9D,cAAM,SAASA,YAAW,KAAK,QAAQ,QAAQ;AAC/C,cAAM,YAAYA,YAAW,KAAK,YAAY,YAAY;AAC1D,cAAM,EAAE,iBAAAC,iBAAgB,IAAI,MAAM;AAClC,cAAM,SAAS,MAAMA,iBAAgB;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA,KAAK,QAAQ;AAAA,UACb,QAAQ,QAAQ;AAAA,UAChB,oBAAoB,QAAQ;AAAA,UAC5B,WAAW,QAAQ;AAAA,QACrB,CAAC;AACD,cAAM,UAAmC;AAAA,UACvC,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA,SAAS,OAAO;AAAA,QAClB;AAEA,YAAI,OAAO,UAAU,cAAc,QAAQ;AACzC,kBAAQ,eAAe,OAAO,SAAS;AAAA,QACzC;AAEA,YAAI,OAAO,UAAU,cAAc,WAAW;AAC5C,kBAAQ,eAAe,OAAO,SAAS;AAAA,QACzC;AAEA,eAAO,SAAS,KAAK,UAAU,SAAS,MAAM,CAAC,GAAG,OAAO,QAAQ;AAAA,MACnE;AAAA,IACF;AAAA;AAAA;;;ACCA,eAAe,kBAAkB,WAAsB,SAAmD;AACxG,MAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,UAAM,QAAQ,MAAM,UAAU,gBAAgB,QAAQ,SAAS,IAAI;AACnE,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,IAAI,cAAc,QAAQ,eAAe,YAAY,EAAE,WAAW,QAAQ,GAAG;AACpG,MAAI,CAAC,YAAY,OAAO,SAAS,WAAW,UAAU;AACpD,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,MAAM,UAAU,KAAK,SAAS,MAAM;AAAA,EAC7C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA/FA,IAMa;AANb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aACE;AAAA,UACF,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,IAAI;AAAA,sBACF,MAAM;AAAA,sBACN,aAAa;AAAA,oBACf;AAAA,oBACA,MAAM;AAAA,sBACJ,MAAM;AAAA,sBACN,aAAa;AAAA,oBACf;AAAA,oBACA,QAAQ;AAAA,sBACN,MAAM;AAAA,sBACN,MAAM,CAAC,WAAW,eAAe,WAAW;AAAA,sBAC5C,aAAa;AAAA,oBACf;AAAA,kBACF;AAAA,kBACA,UAAU,CAAC,MAAM,QAAQ,QAAQ;AAAA,kBACjC,sBAAsB;AAAA,gBACxB;AAAA,cACF;AAAA,YACF;AAAA,YACA,UAAU,CAAC,OAAO;AAAA,YAClB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,mBAAmB,KAAK,KAAK;AAC3C,cAAM,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,WAAW,WAAW,EAAE;AACtE,cAAM,aAAa,MAAM,KAAK,CAAC,SAAS,KAAK,WAAW,aAAa,GAAG,MAAM;AAC9E,cAAM,YAAY,IAAI,UAAU,QAAQ,eAAe,YAAY;AACnE,cAAM,aAAa,MAAM,kBAAkB,WAAW,OAAO;AAC7D,cAAM,aAAa,aAAa,MAAM,UAAU,aAAa,WAAW,IAAI,KAAK,IAAI;AAErF,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,OAAO,MAAM;AAAA,cACb;AAAA,cACA;AAAA,cACA,QAAQ,YAAY;AAAA,cACpB,SAAS,gBAAgB,KAAK;AAAA,YAChC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvEA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,iBAAiC;AAAA,MAC5C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,OAAO,MAAM,MAAM,OAAOC,YAAW,KAAK,SAAS,SAAS,GAAG,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,IAAI;AAAA,UACjI,UAAU,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW;AAAA,QAChE,CAAC;AACD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACjDA,IAKa;AALb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,cAA8B;AAAA,MACzC,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,mBAAmB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AAC9E,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AAEA,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,OAAO,MAAM,MAAM,KAAK,MAAM;AACpC,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,YACF;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7CA,IAKa;AALb;AAAA;AAAA;AAAA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,eAA+B;AAAA,MAC1C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,UAAU,SAAS;AAC/B,cAAM,mBAAmB,QAAQ,eAAe,YAAY,EAAE,MAAM,MAAM,IAAI;AAC9E,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACkEA,SAAS,eAAe,OAAwD;AAC9E,MAAI,UAAU,aAAa,UAAU,iBAAiB,UAAU,aAAa;AAC3E,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,MAAM,wBAAwB,KAAK,EAAE;AACjD;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,SAAO,MACJ,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC,EACrE,IAAI,CAAC,UAAU,KAAK,MAAM,KAAe,CAAC,EAC1C,OAAO,CAAC,UAAU,QAAQ,CAAC;AAChC;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAzHA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,iBAAiC;AAAA,MAC5C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,MAAM,CAAC,WAAW,eAAe,WAAW;AAAA,gBAC5C,aAAa;AAAA,cACf;AAAA,cACA,gBAAgB;AAAA,gBACd,MAAM;AAAA,gBACN,OAAO,EAAE,MAAM,SAAS;AAAA,gBACxB,aAAa;AAAA,cACf;AAAA,cACA,YAAY;AAAA,gBACV,MAAM;AAAA,gBACN,OAAO,EAAE,MAAM,SAAS;AAAA,gBACxB,aAAa;AAAA,cACf;AAAA,cACA,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,UAAU;AAAA,gBACR,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,SAAS;AAAA,YACpB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,oDAAoD;AAAA,QACtE;AAEA,cAAM,QAAQ,IAAI,UAAU,QAAQ,eAAe,YAAY;AAC/D,cAAM,UAAU,MAAM,MAAM,KAAK,MAAM;AACvC,cAAM,aAAa,OAAO,KAAK,WAAW,WAAW,eAAe,KAAK,MAAM,IAAI;AACnF,cAAM,YAAY,OAAO,KAAK,UAAU,WAAW,sBAAsB,KAAK,KAAK,IAAI;AACvF,cAAM,eAAe,OAAO,KAAK,aAAa,WAAW,sBAAsB,KAAK,QAAQ,IAAI;AAChG,cAAM,gBAAgB,gBAAgB,KAAK,cAAc;AACzD,cAAM,aAAa,gBAAgB,KAAK,UAAU;AAElD,YAAI,QAAQ,SAAS,SAAS,YAAY;AACxC,cAAI,cAAc,QAAW;AAC3B,kBAAM,IAAI,MAAM,sEAAsE;AAAA,UACxF;AACA,cAAI,iBAAiB,QAAW;AAC9B,kBAAM,IAAI,MAAM,wCAAwC;AAAA,UAC1D;AACA,cAAI,iBAAiB,cAAc,SAAS,GAAG;AAC7C,kBAAM,IAAI,MAAM,4CAA4C;AAAA,UAC9D;AACA,cAAI,cAAc,WAAW,SAAS,GAAG;AACvC,kBAAM,IAAI,MAAM,4CAA4C;AAAA,UAC9D;AACA,cAAI,cAAc,QAAQ,UAAU,QAAQ,SAAS,MAAM;AACzD,kBAAM,IAAI,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,SAAS,QAAQ,SAAS,QAAQ,SAAS,IAAI,GAAG;AAAA,UAC1G;AAAA,QACF;AAEA,cAAM,OAAO,MAAM,MAAM,OAAO,QAAQ;AAAA,UACtC,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,WAAW;AAAA,UACX,OAAO;AAAA,UACP,UAAU;AAAA,QACZ,CAAC;AACD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AClGA,IAIa;AAJb;AAAA;AAAA;AAAA;AACA,IAAAC;AAGO,IAAM,qBAAqC;AAAA,MAChD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,WAAW,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,EAAE,SAAS,IAClF,KAAK,UAAU,KAAK,IACpB;AACJ,cAAM,eAAe,WACjB,MAAM,QAAQ,YAAY,KAAK,QAAQ,IACvC,MAAM,QAAQ,YAAY,mBAAmB;AAEjD,YAAI,CAAC,cAAc;AACjB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,UAAU,aAAa,aAAa,WAAW,aAAa,SAAS,GAAK;AAChF,cAAM,SAAS,MAAM,QAAQ,YAAY,KAAK,aAAa,EAAE;AAE7D,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,gBAAgB,OAAO,OAAO;AAAA,cAC9B,eAAe,OAAO;AAAA,cACtB,SAAS,OAAO,OAAO;AAAA,cACvB;AAAA,cACA,SAAS;AAAA,YACX;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,OAAO;AAAA,UACvB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvDA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,qBAAqC;AAAA,MAChD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,OAAOC,YAAW,KAAK,MAAM,MAAM;AACzC,cAAM,SAAS,mBAAmB,KAAK,OAAO;AAC9C,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,WAAW,MAAM,MAAM,OAAO,MAAM,MAAM;AAChD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7CA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,qBAAqC;AAAA,MAChD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,QAAQ,YAAY,KAAK,OAAO,GAAG,KAAK,EAAE;AAChD,cAAM,SAAS,MAAM,MAAM,WAAW,KAAK;AAC3C,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SACE,OAAO,SAAS,IACZ,OACG,IAAI,CAAC,UAAU;AACd,sBAAM,WAAW,MAAM,UAAU,OAAO,IAAI,MAAM,SAAS,IAAI,KAAK;AACpE,sBAAM,OAAO,OAAO,MAAM,MAAM,OAAO,WAAW,SAAS,MAAM,KAAK,EAAE,KAAK;AAC7E,uBAAO,GAAG,MAAM,KAAK,GAAG,QAAQ,GAAG,IAAI;AAAA,cACzC,CAAC,EACA,KAAK,IAAI,IACZ;AAAA,YACR;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChDA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,kBAAkC;AAAA,MAC7C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,WAAW,MAAM,MAAM,IAAIC,YAAW,KAAK,MAAM,MAAM,CAAC;AAC9D,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvCA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,mBAAmC;AAAA,MAC9C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,WAAW,MAAM,MAAM,KAAKC,YAAW,KAAK,MAAM,MAAM,CAAC;AAC/D,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACvCA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,mBAAmC;AAAA,MAC9C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,YACb,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,UAAU,SAAS;AAC/B,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,YAAY,MAAM,MAAM,KAAK;AACnC,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChCA,IAIa;AAJb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAGO,IAAM,qBAAqC;AAAA,MAChD,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,eAAe;AAAA,gBACb,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,MAAM;AAAA,YACjB,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,QAAQ,IAAI,cAAc,QAAQ,eAAe,YAAY;AACnE,cAAM,WAAW,MAAM,MAAM,OAAOC,YAAW,KAAK,MAAM,MAAM,GAAG;AAAA,UACjE,OAAO,YAAY,KAAK,OAAO,KAAK;AAAA,UACpC,cAAc,YAAY,KAAK,eAAe,KAAK;AAAA,QACrD,CAAC;AACD,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ;AAAA,cACA,SAAS,MAAM,MAAM,UAAU;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACiHA,eAAe,wBAAwB,UAAmC;AACxE,MAAI;AACF,UAAM,WAAW,MAAM,iBAAiB,QAAQ;AAChD,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AA1KA,IAAAC,mBACAC,oBAea;AAhBb;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AAMA;AACA;AACA;AACA,IAAAC;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,MAAM,CAAC,cAAc,UAAU;AAAA,cACjC;AAAA,cACA,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,aAAa;AAAA,gBACX,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,WAAW;AAAA,gBACT,MAAM;AAAA,gBACN,aAAa;AAAA,gBACb,sBAAsB;AAAA,cACxB;AAAA,cACA,oBAAoB;AAAA,gBAClB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,SAAS;AAAA,YAC5B,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,UAAUA,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,SAAS,qBAAqB,KAAK,MAAM;AAC/C,cAAM,YAAY,sBAAsB,KAAK,SAAS;AACtD,cAAM,gBAAgB,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,KAAK,IAAI;AAC3E,cAAM,sBAAsB,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;AAC7F,cAAM,oBAAoB,YAAY,KAAK,oBAAoB,IAAI;AACnE,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,YAAY,mBAAAC,QAAK,QAAQ,QAAQ,EAAE,YAAY;AAErD,YAAI,cAAc,UAAU,cAAc,SAAS;AACjD,gBAAM,IAAI,mBAAmB,kBAAkB,SAAS,yDAAyD;AAAA,YAC/G,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf,eAAe,iBAAiB,UAAU,OAAO;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,cAAc,SAAS;AACzB,gBAAM,IAAI,mBAAmB,0CAA0C,aAAa,SAAS,IAAI;AAAA,YAC/F,MAAM;AAAA,YACN,SAAS;AAAA,cACP,eAAe;AAAA,cACf,eAAe,SAAS,SAAS,GAAG,IAAI,GAAG,QAAQ,SAAS,GAAG,QAAQ;AAAA,YACzE;AAAA,UACF,CAAC;AAAA,QACH;AAEA,cAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,cAAM,eAAe,UAAU,MAAM,kBAAAC,QAAG,SAAS,QAAQ,IAAI;AAC7D,cAAM,aAAa,UAAU,MAAM,wBAAwB,QAAQ,IAAI;AACvE,cAAM,kBAAkB,uBAAuB,SAAS,SAAS;AACjE,cAAM,gBAAgB,gBAAgB,uBAAuB,eAAe,SAAS,IAAI;AACzF,cAAM,sBAAsB,sBACxB,uBAAuB,qBAAqB,SAAS,IACrD;AACJ,cAAM,YAAY,wBAAwB,gBAAgB,SAAS,MAAM;AACzE,cAAM,UAAU,iBAAiB,YAAY,SAAS;AACtD,cAAM,SAAS,MAAM,gBAAgB;AAAA,UACnC,OAAO,eAAe;AAAA,UACtB,aAAa,qBAAqB;AAAA,UAClC,SAAS;AAAA,UACT;AAAA,UACA,SAAS,gBAAgB;AAAA,QAC3B,CAAC;AAED,YAAI,mBAAmB;AACrB,gBAAM,sBAAsB,QAAQ;AAAA,QACtC;AAEA,cAAM,kBAAAA,QAAG,UAAU,UAAU,MAAM;AACnC,cAAM,eAAe,MAAM,iBAAiB,SAAS;AAAA,UACnD,UAAU;AAAA,UACV,SAAS,cAAc,QAAQ;AAAA,UAC/B,SAAS,aAAa,WAAW,WAAW,GAAK;AAAA,UACjD,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,WAAW;AAAA,cAC3B,QAAQ;AAAA,cACR,SAAS,aAAa,WAAW,WAAW,GAAK;AAAA,cACjD,YAAY;AAAA,cACZ,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA;AAAA,cACA,OAAO,OAAO;AAAA,cACd,OAAO,eAAe;AAAA,cACtB,kBAAkB,gBAAgB;AAAA,cAClC,kBAAkB;AAAA,gBAChB,GAAG,oBAAI,IAAI;AAAA,kBACT,GAAG,gBAAgB;AAAA,kBACnB,GAAI,eAAe,eAAe,CAAC;AAAA,kBACnC,GAAI,qBAAqB,eAAe,CAAC;AAAA,gBAC3C,CAAC;AAAA,cACH;AAAA,cACA,UAAU,aAAa,QAAQ;AAAA,cAC/B,sBAAsB,aAAa;AAAA,cACnC,SAAS,aAAa,WAAW,WAAW,GAAK;AAAA,YACnD;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,CAAC,QAAQ;AAAA,YACvB,UAAU,aAAa,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACjKA,IAAAC,mBAOa;AAPb;AAAA;AAAA;AAAA,IAAAA,oBAAe;AAEf;AACA;AACA,IAAAC;AAGO,IAAM,gBAAgC;AAAA,MAC3C,YAAY;AAAA,QACV,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,YAAY;AAAA,YACV,MAAM;AAAA,YACN,YAAY;AAAA,cACV,MAAM;AAAA,gBACJ,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,SAAS;AAAA,gBACP,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,cACA,oBAAoB;AAAA,gBAClB,MAAM;AAAA,gBACN,aAAa;AAAA,cACf;AAAA,YACF;AAAA,YACA,UAAU,CAAC,QAAQ,SAAS;AAAA,YAC5B,sBAAsB;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,cAAM,OAAO,UAAU,OAAO;AAC9B,cAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,cAAM,UAAUA,YAAW,KAAK,SAAS,SAAS;AAClD,cAAM,oBAAoB,YAAY,KAAK,oBAAoB,IAAI;AACnE,cAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,cAAM,UAAU,MAAM,WAAW,QAAQ;AACzC,cAAM,SAAS,UAAU,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM,IAAI;AAC/D,cAAM,UAAU,iBAAiB,QAAQ,OAAO;AAEhD,YAAI,mBAAmB;AACrB,gBAAM,sBAAsB,QAAQ;AAAA,QACtC;AAEA,cAAM,kBAAAA,QAAG,UAAU,UAAU,SAAS,MAAM;AAC5C,cAAM,eAAe,MAAM,iBAAiB,SAAS;AAAA,UACnD,UAAU;AAAA,UACV,SAAS,cAAc,QAAQ;AAAA,UAC/B;AAAA,UACA,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM,UAAU,WAAW;AAAA,cAC3B,QAAQ;AAAA,cACR;AAAA,cACA,YAAY,UAAU,SAAS;AAAA,cAC/B,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,MAAM;AAAA,cACN;AAAA,cACA,OAAO,OAAO,WAAW,SAAS,MAAM;AAAA,cACxC,UAAU,aAAa,QAAQ;AAAA,cAC/B,sBAAsB,aAAa;AAAA,cACnC,SAAS,aAAa,SAAS,GAAK;AAAA,YACtC;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,YACE,cAAc,CAAC,QAAQ;AAAA,YACvB,UAAU,aAAa,QAAQ;AAAA,UACjC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChFO,SAAS,+BAA+B,OAAoD;AACjG,SAAO,CAAC,GAAG,KAAK,EACb,IAAI,CAAC,MAAM,WAAW;AAAA,IACrB;AAAA,IACA;AAAA,IACA,MAAM,gBAAgB,KAAK,WAAW,SAAS,IAAI;AAAA,EACrD,EAAE,EACD,KAAK,CAAC,MAAM,UAAU;AACrB,QAAI,KAAK,SAAS,MAAM,MAAM;AAC5B,aAAO,KAAK,OAAO,MAAM;AAAA,IAC3B;AAEA,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC5B,CAAC,EACA,IAAI,CAAC,UAAU,MAAM,IAAI;AAC9B;AAEA,SAAS,gBAAgB,MAAsB;AAC7C,MAAI,4BAA4B,KAAK,IAAI,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,KAAK,IAAI,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,IAAI,IAAI,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAnCA,IAEM;AAFN;AAAA;AAAA;AAEA,IAAM,mBAAmB,oBAAI,IAAI,CAAC,aAAa,gBAAgB,CAAC;AAAA;AAAA;;;AC8FzD,SAAS,mBAAmB,MAAiB,UAA+B,CAAC,GAAiB;AACnG,QAAM,QAAQ,oBAAI,IAA4B;AAE9C,aAAW,QAAQ,YAAY,MAAM,OAAO,GAAG;AAC7C,aAAS,OAAO,IAAI;AAAA,EACtB;AAEA,SAAO;AAAA,IACL,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,SAAS,KAAK,UAAU;AAAA,IAC9D,MAAM,QAAQ,MAAM,SAAS,SAAS;AACpC,YAAM,OAAO,MAAM,IAAI,IAAI;AAC3B,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,MACzC;AAEA,aAAO,KAAK,QAAQ,SAAS,OAAO;AAAA,IACtC;AAAA,IACA,MAAM,QAAQ;AACZ;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,MAAiB,SAAgD;AACpF,QAAM,iBAAiB,SAAS,UAAU,cAAc;AACxD,QAAM,YAAY,QAAQ,YAAY,IAAI,IAAI,QAAQ,SAAS,IAAI;AACnE,QAAM,eAAe,IAAI,IAAI,QAAQ,gBAAgB,CAAC,CAAC;AAEvD,SAAO;AAAA,IACL,CAAC,GAAG,gBAAgB,GAAI,QAAQ,gBAAgB,CAAC,CAAE,EAAE,OAAO,CAAC,SAAS;AACpE,YAAM,OAAO,KAAK,WAAW,SAAS;AACtC,UAAI,aAAa,CAAC,UAAU,IAAI,IAAI,GAAG;AACrC,eAAO;AAAA,MACT;AAEA,aAAO,CAAC,aAAa,IAAI,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;AAtIA,IA+CM,iBAkBA;AAjEN;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAAC;AAGA;AACA;AACA;AAEA,IAAM,kBAA6C;AAAA,MACjD;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;AAEA,IAAM,cAAyC;AAAA,MAC7C,GAAG;AAAA,MACH;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,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACxFO,SAAS,0BAA0B,SAA0C;AAClF,QAAM,eAAe,QAAQ,eACzB,mBAAAC,QAAK,QAAQ,QAAQ,YAAY,IACjC,QAAQ,MACN,mBAAAA,QAAK,QAAQ,QAAQ,GAAG,IACxB;AAEN,SAAO,eAAe,mBAAAA,QAAK,KAAK,cAAc,oBAAoB,IAAI;AACxE;AAEO,SAAS,6BACd,cACA,KACA,UACA,UACQ;AACR,MAAI,UAAU;AACZ,WAAO,eAAe,oBAAoB,cAAc,GAAG,IAAI;AAAA,EACjE;AAEA,MAAI,cAAc;AAChB,WAAO,oBAAoB,cAAc,GAAG;AAAA,EAC9C;AAEA,SAAO,WAAW,mBAAAA,QAAK,KAAK,UAAU,SAAS,IAAI;AACrD;AAEO,SAAS,8BACd,cACA,KACA,UACA,UACQ;AACR,MAAI,cAAc;AAChB,WAAO,oBAAoB,cAAc,GAAG;AAAA,EAC9C;AAEA,MAAI,CAAC,YAAY,CAAC,UAAU;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,mBAAAA,QAAK,KAAK,UAAU,oBAAoB;AACjD;AAEO,SAAS,wBAAwB,cAAsB,KAAyB,cAA8B;AACnH,MAAI,cAAc;AAChB,WAAO,oBAAoB,cAAc,GAAG;AAAA,EAC9C;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAAe,KAAiC;AAClF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,mBAAAA,QAAK,WAAW,KAAK,IAAI,mBAAAA,QAAK,UAAU,KAAK,IAAI,mBAAAA,QAAK,QAAQ,OAAO,QAAQ,IAAI,GAAG,KAAK;AAClG;AAEO,SAAS,oBAAoB,OAAmD;AACrF,SAAO,OAAO,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,MAAM,SAAS,SAAS;AACxE;AApEA,IAAAC,oBAIM;AAJN;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAIjB,IAAM,uBAAuB,mBAAAD,QAAK,KAAK,YAAY,gBAAgB;AAAA;AAAA;;;ACU5D,SAAS,gCAAqD;AACnE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,QAAQ,aAAa,UAAU,YAAY;AAAA,IACpD,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,aAAa;AAAA,IACb,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,MAAM,CAAC;AAAA,IACP,WAAW,CAAC;AAAA,IACZ,KAAK,CAAC;AAAA,IACN,KAAK;AAAA,IACL,WAAW;AAAA,EACb;AACF;AAEO,SAAS,6BACd,OACA,UAAmC,CAAC,GACf;AACrB,QAAM,WAAW,8BAA8B;AAC/C,QAAM,WAAW,QAAQ,OAAO,QAAQ;AACxC,QAAM,WAAW,QAAQ,OAAO,QAAQ;AACxC,QAAM,WAAW,0BAA0B,OAAO;AAClD,QAAM,cAAc;AAAA,IAClB,OAAO,OAAO,eAAe,EAAE,EAAE,KAAK;AAAA,IACtC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,QAAM,eAAe;AAAA,IACnB,OAAO,OAAO,gBAAgB,EAAE,EAAE,KAAK;AAAA,IACvC,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,OAAO,OAAO,cAAc,EAAE,EAAE,KAAK;AAAA,IACrC,QAAQ;AAAA,IACR,mBAAAE,QAAK,KAAK,UAAU,aAAa;AAAA,EACnC;AACA,QAAM,YAAY;AAAA,IAChB,OAAO,OAAO,aAAa,EAAE,EAAE,KAAK;AAAA,IACpC,QAAQ;AAAA,IACR,mBAAAA,QAAK,KAAK,UAAU,QAAQ;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,SAAS,QAAQ,OAAO,OAAO;AAAA,IAC/B,SAAS,OAAO,OAAO,WAAW,SAAS,OAAO,EAAE,KAAK,KAAK,SAAS;AAAA,IACvE,aAAa,OAAO,OAAO,eAAe,OAAO,WAAW,SAAS,WAAW,EAAE,KAAK,KAAK,SAAS;AAAA,IACrG,SAAS,qBAAqB,OAAO,OAAO;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,oBAAoB,OAAO,UAAU;AAAA,IACjD,aAAa,OAAO,gBAAgB;AAAA,IACpC,MAAM,qBAAqB,OAAO,IAAI;AAAA,IACtC,WAAW,mBAAmB,OAAO,WAAW,QAAQ;AAAA,IACxD,KAAK,mBAAmB,OAAO,GAAG;AAAA,IAClC,KAAK,oBAAoB,OAAO,OAAO,OAAO,EAAE,EAAE,KAAK,GAAG,QAAQ,GAAG;AAAA,IACrE,WAAWC,aAAY,OAAO,WAAW,KAAO,KAAK,KAAK,KAAO,SAAS,SAAS;AAAA,EACrF;AACF;AAEO,SAAS,yBAAyB,YAAyD;AAChG,MAAI,CAAC,WAAW,SAAS;AACvB,WAAO;AAAA,EACT;AACA,QAAM,OAAO,CAAC,WAAW,WAAW;AACpC,MAAI,WAAW,SAAS;AACtB,SAAK,KAAK,aAAa,WAAW,OAAO;AAAA,EAC3C;AACA,MAAI,WAAW,UAAU;AACvB,SAAK,KAAK,YAAY;AAAA,EACxB;AACA,MAAI,WAAW,UAAU;AACvB,SAAK,KAAK,YAAY;AAAA,EACxB,WAAW,WAAW,aAAa;AACjC,SAAK,KAAK,mBAAmB,WAAW,WAAW;AAAA,EACrD;AACA,MAAI,WAAW,cAAc;AAC3B,SAAK,KAAK,mBAAmB,WAAW,YAAY;AAAA,EACtD;AACA,MAAI,WAAW,YAAY;AACzB,SAAK,KAAK,YAAY,WAAW,UAAU;AAAA,EAC7C;AACA,MAAI,WAAW,WAAW;AACxB,SAAK,KAAK,gBAAgB,WAAW,SAAS;AAAA,EAChD;AACA,MAAI,WAAW,YAAY;AACzB,SAAK,KAAK,iBAAiB,WAAW,UAAU;AAAA,EAClD;AACA,MAAI,WAAW,aAAa;AAC1B,SAAK,KAAK,gBAAgB;AAAA,EAC5B;AACA,MAAI,WAAW,KAAK,SAAS,GAAG;AAC9B,SAAK,KAAK,UAAU,WAAW,KAAK,KAAK,GAAG,CAAC;AAAA,EAC/C;AACA,OAAK,KAAK,GAAG,WAAW,SAAS;AACjC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,SAAS,WAAW;AAAA,IACpB;AAAA,IACA,KAAK,WAAW;AAAA,IAChB,KAAK,WAAW;AAAA,IAChB,KAAK;AAAA,IACL,SAAS,CAAC;AAAA,IACV,SAAS,CAAC;AAAA,IACV,WAAW,WAAW;AAAA,IACtB,OAAO;AAAA,IACP,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,CAAC;AAAA,IACZ;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAuC;AACnE,UAAQ,OAAO,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG;AAAA,IAChD,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,mBAAmB,OAAgB,UAA6B;AACvE,QAAM,eAAe,oBAAI,IAAI;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,SAAO,qBAAqB,KAAK,EAAE,OAAO,CAAC,QAAQ;AACjD,QAAI,CAAC,YAAY,QAAQ,cAAc;AACrC,aAAO;AAAA,IACT;AAEA,WAAO,CAAC,aAAa,IAAI,GAAG;AAAA,EAC9B,CAAC;AACH;AAEA,SAAS,qBAAqB,OAA0B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC9E;AAEA,SAAS,mBAAmB,OAAwC;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAgC,EAC5D,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,GAAG,OAAO,OAAO,EAAE,EAAE,KAAK,CAAC,CAAU,EACnE,OAAO,CAAC,CAAC,KAAK,GAAG,MAAM,IAAI,SAAS,KAAK,IAAI,SAAS,CAAC;AAE1D,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAASA,aAAY,OAAgB,KAAa,KAAa,UAA0B;AACvF,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAhNA,IAAAC,oBAUM,4BACA,+BACA;AAZN;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AACjB;AASA,IAAM,6BAA6B;AACnC,IAAM,gCAAgC;AACtC,IAAM,iCAAiC;AAAA;AAAA;;;ACChC,SAAS,sBAAiC;AAC/C,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS,CAAC;AAAA,IACV,YAAY,8BAA8B;AAAA,EAC5C;AACF;AAEO,SAAS,mBACd,QACA,UAAmC,CAAC,GACzB;AACX,QAAM,UAAU,MAAM,QAAQ,QAAQ,OAAO,IACzC,OAAQ,QACL,IAAI,CAAC,WAAW,mBAAmB,MAAM,CAAC,EAC1C,OAAO,CAAC,WAAsC,WAAW,IAAI,IAChE,CAAC;AACL,QAAM,aAAa,6BAA6B,QAAQ,YAAY,OAAO;AAC3E,QAAM,mBAAmB,yBAAyB,UAAU;AAE5D,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,WAAW,WAAW,OAAO;AAAA,IACtD,SAAS,oBAAoB,mBAAmB,CAAC,GAAG,SAAS,gBAAgB,IAAI,OAAO;AAAA,IACxF;AAAA,EACF;AACF;AAEO,SAAS,4BAA4B,QAAkD;AAC5F,SAAO,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,IACrC,GAAG;AAAA,IACH,IAAI,OAAO;AAAA,EACb,EAAE;AACJ;AAEA,SAAS,mBAAmB,QAAsE;AAChG,QAAM,OAAO,OAAO,QAAQ,QAAQ,EAAE,EAAE,KAAK;AAC7C,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,QAAQ,YAAY;AAAA,IAC7B,WAAW,mBAAmB,QAAQ,SAAS;AAAA,IAC/C,SAAS,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,IAC5C,MAAMC,sBAAqB,QAAQ,IAAI;AAAA,IACvC,KAAKC,oBAAmB,QAAQ,GAAG;AAAA,IACnC,KAAK,OAAO,QAAQ,OAAO,EAAE,EAAE,KAAK;AAAA,IACpC,KAAK,OAAO,QAAQ,OAAO,EAAE,EAAE,KAAK;AAAA,IACpC,SAASD,sBAAqB,QAAQ,OAAO;AAAA,IAC7C,SAASA,sBAAqB,QAAQ,OAAO;AAAA,IAC7C,WAAWE,aAAY,QAAQ,WAAW,KAAO,KAAK,KAAK,KAAO,6BAA6B;AAAA,IAC/F,OAAO,QAAQ,QAAQ,KAAK;AAAA,IAC5B,MAAM,cAAc,QAAQ,IAAI;AAAA,EAClC;AACF;AAEA,SAAS,mBAAmB,OAA6C;AACvE,WAAS,SAAS,IAAI,KAAK,EAAE,YAAY,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,cAAc,OAAsE;AAC3F,QAAM,OAAO,kBAAkB,OAAO,IAAI;AAC1C,SAAO;AAAA,IACL;AAAA,IACA,UAAU,OAAO,OAAO,YAAY,EAAE,EAAE,KAAK;AAAA,IAC7C,SAASD,oBAAmB,OAAO,OAAO;AAAA,EAC5C;AACF;AAEA,SAAS,kBAAkB,OAAwD;AACjF,WAAS,SAAS,IAAI,KAAK,EAAE,YAAY,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAASD,sBAAqB,OAA0B;AACtD,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC;AAC9E;AAEA,SAASC,oBAAmB,OAAwC;AAClE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,OAAO,QAAQ,KAAgC,EAC5D,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,GAAG,OAAO,OAAO,EAAE,EAAE,KAAK,CAAC,CAAU,EACnE,OAAO,CAAC,CAAC,KAAK,GAAG,MAAM,IAAI,SAAS,KAAK,IAAI,SAAS,CAAC;AAE1D,SAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAS,oBAAoB,SAA+C;AAC1E,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,UAA6B,CAAC;AAEpC,aAAW,UAAU,SAAS;AAC5B,UAAM,MAAM,OAAO,KAAK,YAAY;AACpC,QAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,IACF;AAEA,SAAK,IAAI,GAAG;AACZ,YAAQ,KAAK,MAAM;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,SAASC,aAAY,OAAgB,KAAa,KAAa,UAA0B;AACvF,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAlJA,IAWM;AAXN,IAAAC,eAAA;AAAA;AAAA;AAAA;AAWA,IAAM,gCAAgC;AAAA;AAAA;;;ACLtC,eAAsB,kCACpB,QACe;AACf,MAAI,OAAO,SAAS,cAAc;AAChC;AAAA,EACF;AAEA,QAAM,aAAa,cAAc,OAAO,MAAM,UAAU;AACxD,QAAM,YAAY,cAAc,OAAO,MAAM,cAAc;AAC3D,QAAM,cAAc,cAAc,OAAO,MAAM,iBAAiB;AAChE,QAAM,eAAe,cAAc,OAAO,MAAM,iBAAiB;AAEjE,MAAI,WAAW;AACb,UAAM,kBAAAC,QAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AAEA,MAAI,aAAa;AACf,UAAM,kBAAAA,QAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AAEA,MAAI,cAAc;AAChB,UAAM,kBAAAA,QAAG,MAAM,mBAAAC,QAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAChE;AAEA,MAAI,YAAY;AACd,UAAM,kBAAAD,QAAG,MAAM,mBAAAC,QAAK,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC5D,UAAM,0BAA0B,OAAO,MAAM,YAAY,WAAW,WAAW;AAAA,EACjF;AAEA,MAAI,WAAW;AACb,UAAM,2BAA2B,SAAS;AAAA,EAC5C;AACF;AAEA,eAAe,0BACb,MACA,YACA,WACA,aACe;AACf,MAAI,CAAC,8BAA8B,UAAU,GAAG;AAC9C;AAAA,EACF;AAEA,QAAM,kBAAkB;AAAA,IACtB,SAAS;AAAA,MACP,UAAU,QAAQ,MAAM,YAAY,KAAK;AAAA,MACzC,aAAa,QAAQ,MAAM,YAAY,IAAI,SAAY,eAAe;AAAA,MACtE,eAAe;AAAA,QACb,UAAU,QAAQ,MAAM,YAAY;AAAA,QACpC,SAAS,sBAAsB,cAAc,MAAM,WAAW,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,IACA,WAAW,aAAa;AAAA,IACxB,aAAa,QAAQ,MAAM,gBAAgB,KAAK;AAAA,EAClD;AAEA,QAAM,kBAAAD,QAAG,UAAU,YAAY,GAAG,KAAK,UAAU,iBAAiB,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACxF;AAEA,eAAe,2BAA2B,WAAkC;AAC1E,QAAM,WAAW,uBAAuB,SAAS;AACjD,MAAI,CAAC,UAAU;AACb;AAAA,EACF;AAEA,QAAM,eAAe,mBAAAC,QAAK,QAAQ,mBAAAA,QAAK,QAAQ,QAAQ,CAAC;AACxD,QAAM,gBAAgB,mBAAAA,QAAK,KAAK,cAAc,iBAAiB;AAC/D,QAAM,kBAAkB,mBAAAA,QAAK,KAAK,UAAU,uBAAuB;AAEnE,MAAI,MAAMC,YAAW,aAAa,GAAG;AACnC,UAAM,kBAAAF,QAAG,MAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,oBAAoB,mBAAAC,QAAK,KAAK,iBAAiB,iBAAiB;AACtE,QAAI,CAAE,MAAMC,YAAW,iBAAiB,GAAI;AAC1C,YAAM,kBAAAF,QAAG,OAAO,eAAe,iBAAiB;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,YAAY,YAAY;AAClD,MAAI,YAAY,WAAW,GAAG;AAC5B;AAAA,EACF;AAEA,aAAW,SAAS,aAAa;AAC/B,QAAI,CAAC,MAAM,OAAO,KAAK,CAAC,wCAAwC,KAAK,MAAM,IAAI,GAAG;AAChF;AAAA,IACF;AAEA,UAAM,kBAAAA,QAAG,MAAM,iBAAiB,EAAE,WAAW,KAAK,CAAC;AACnD,UAAM,aAAa,mBAAAC,QAAK,KAAK,cAAc,MAAM,IAAI;AACrD,UAAM,aAAa,mBAAAA,QAAK,KAAK,iBAAiB,MAAM,IAAI;AAExD,QAAI,MAAMC,YAAW,UAAU,GAAG;AAChC;AAAA,IACF;AAEA,UAAM,kBAAAF,QAAG,OAAO,YAAY,UAAU;AAAA,EACxC;AACF;AAEA,SAAS,uBAAuB,WAA2B;AACzD,QAAM,aAAa,mBAAAC,QAAK,UAAU,SAAS;AAC3C,QAAM,SAAS,mBAAAA,QAAK,UAAU,mBAAAA,QAAK,KAAK,YAAY,gBAAgB,CAAC;AACrE,QAAM,cAAc,WAAW,YAAY,EAAE,QAAQ,OAAO,YAAY,CAAC;AAEzE,MAAI,cAAc,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,MAAM,GAAG,cAAc,OAAO,MAAM;AACxD;AAEA,SAAS,8BAA8B,YAA6B;AAClE,SAAO,WAAW,YAAY,EAAE;AAAA,IAC9B,mBAAAA,QAAK,UAAU,mBAAAA,QAAK,KAAK,YAAY,kBAAkB,aAAa,CAAC,EAAE,YAAY;AAAA,EACrF;AACF;AAEA,SAAS,sBAAsB,aAAyC;AACtE,UAAQ,YAAY,KAAK,EAAE,YAAY,GAAG;AAAA,IACxC,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,QAAQ,MAAgB,UAA2B;AAC1D,SAAO,KAAK,SAAS,QAAQ;AAC/B;AAEA,SAAS,cAAc,MAAgB,UAA0B;AAC/D,QAAM,QAAQ,KAAK,QAAQ,QAAQ;AACnC,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK,QAAQ,CAAC,KAAK,EAAE;AACrC;AAEA,eAAeC,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,kBAAAF,QAAG,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,YAAY,YAAuC;AAChE,MAAI;AACF,WAAO,MAAM,kBAAAA,QAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAC7D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAnKA,IAAAG,mBACAC;AADA;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAAA;AAAA;;;ACiBjB,eAAsB,0CACpB,QACA,eAAqD,0BAA0B,GAChE;AACf,MAAI,OAAO,SAAS,gBAAgB,mCAAmC,GAAG;AACxE;AAAA,EACF;AAEA,QAAM,SAAS,+BAA+B,gBAAgB,OAAO,IAAI,CAAC;AAC1E,QAAM,kBAAkB,MAAM,aAAa,mBAAmB,MAAM;AACpE,MAAI,MAAM,qCAAqC,eAAe,GAAG;AAC/D;AAAA,EACF;AAEA,QAAM,WAAW,gBAAgB,IAAI,MAAM;AAC3C,MAAI,UAAU;AACZ,UAAM;AACN;AAAA,EACF;AAEA,QAAM,kBAAkB,YAAY;AAClC,UAAM,kBAAkB,MAAM,aAAa,mBAAmB,MAAM;AACpE,QAAI,MAAM,qCAAqC,eAAe,GAAG;AAC/D;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,MAAM;AAAA,EACnC,GAAG,EAAE,QAAQ,MAAM;AACjB,oBAAgB,OAAO,MAAM;AAAA,EAC/B,CAAC;AAED,kBAAgB,IAAI,QAAQ,cAAc;AAC1C,QAAM;AACR;AAEO,SAAS,+BAA+B,SAAyD;AACtG,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,+BAA+B,QAAwB;AACrE,QAAM,QAAQ,OAAO,MAAM,iCAAiC;AAC5D,SAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAC/B;AAEA,eAAsB,qCAAqC,UAAoC;AAC7F,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,YAAY;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,kBAAAC,QAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,4BAAkE;AACzE,SAAO;AAAA,IACL,oBAAoB;AAAA,IACpB,SAAS;AAAA,EACX;AACF;AAEA,eAAe,8BAA8B,QAAkD;AAC7F,QAAM,UAAU,yBAAyB;AACzC,QAAM,SAAS,UAAM,qBAAM,QAAQ,UAAU,CAAC,SAAS,WAAW,aAAa,MAAM,GAAG;AAAA,IACtF,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AAED,OAAK,OAAO,YAAY,OAAO,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,+BAA+B,OAAO,MAAM;AACrD;AAEA,eAAe,yBAAyB,QAAgD;AACtF,QAAM,UAAU,yBAAyB;AACzC,YAAM,qBAAM,QAAQ,UAAU,CAAC,SAAS,WAAW,MAAM,GAAG;AAAA,IAC1D,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,2BAAmC;AAC1C,QAAM,kBAAkB,aAAa,QAAQ,yBAAyB;AACtE,SAAO,mBAAAC,QAAK,KAAK,mBAAAA,QAAK,QAAQ,eAAe,GAAG,QAAQ;AAC1D;AAEA,SAAS,gBAAgB,MAAuC;AAC9D,QAAM,QAAQ,KAAK,QAAQ,WAAW;AACtC,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,UAAQ,OAAO,KAAK,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG;AAAA,IAC1D,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,qCAA8C;AACrD,QAAM,QAAQ,OAAO,QAAQ,IAAI,2CAA2C,EAAE,EAAE,KAAK,EAAE,YAAY;AACnG,SAAO,UAAU,OAAO,UAAU,UAAU,UAAU;AACxD;AApJA,IAAAC,mBACAC,oBACA,oBAEAC,eAWM,cACA;AAhBN;AAAA;AAAA;AAAA,IAAAF,oBAAe;AACf,IAAAC,qBAAiB;AACjB,yBAA8B;AAE9B,IAAAC,gBAAsB;AAWtB,IAAM,mBAAe,kCAAc,UAAU;AAC7C,IAAM,kBAAkB,oBAAI,IAA4C;AAAA;AAAA;;;ACXxE,eAAsB,6BACpB,QACA,UACA,OACkC;AAClC,MAAI,OAAO,SAAS,cAAc;AAChC,WAAO;AAAA,EACT;AAEA,QAAM,YAAYC,eAAc,OAAO,MAAM,cAAc;AAC3D,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,MAAM,aAAa,YAAY,MAAM,SAAS,KAAK,EAAE,SAAS,GAAG;AAC1E,UAAM,WAAW,4BAA4B,WAAW,MAAM,QAAQ;AACtE,UAAM,kBAAAC,QAAG,MAAM,mBAAAC,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,aAAa,2BAA2B;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,WAAmB,UAA0B;AAChF,MAAI,mBAAAA,QAAK,WAAW,QAAQ,GAAG;AAC7B,WAAO,mBAAAA,QAAK,UAAU,QAAQ;AAAA,EAChC;AAEA,QAAM,sBAAsB,mBAAAA,QAAK,QAAQ,SAAS;AAClD,QAAM,WAAW,mBAAAA,QAAK,QAAQ,qBAAqB,QAAQ;AAC3D,MAAI,aAAa,uBAAuB,SAAS,WAAW,GAAG,mBAAmB,GAAG,mBAAAA,QAAK,GAAG,EAAE,GAAG;AAChG,WAAO;AAAA,EACT;AAEA,SAAO,mBAAAA,QAAK,KAAK,qBAAqB,mBAAAA,QAAK,SAAS,QAAQ,CAAC;AAC/D;AAEA,SAASF,eAAc,MAAgB,UAA0B;AAC/D,QAAM,QAAQ,KAAK,QAAQ,QAAQ;AACnC,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK,QAAQ,CAAC,KAAK,EAAE;AACrC;AAxDA,IAAAG,mBACAC;AADA;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAAA;AAAA;;;ACyJjB,eAAe,aACb,QACA,WACiB;AACjB,QAAM,QAAgB,CAAC;AACvB,MAAI;AAEJ,KAAG;AACD,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B,SAAS,EAAE,OAAO,IAAI;AAAA,MACtB;AAAA,QACE,SAAS;AAAA,MACX;AAAA,IACF;AACA,UAAM,KAAK,GAAG,OAAO,KAAK;AAC1B,aAAS,OAAO;AAAA,EAClB,SAAS;AAET,SAAO;AACT;AAEA,SAAS,eAAe,QAA6D;AACnF,QAAM,MAAM;AAAA,IACV,GAAG,OAAO;AAAA,EACZ;AAEA,MAAI,OAAO,KAAK,SAAS,WAAW,OAAO,KAAK,UAAU;AACxD,UAAM,aAAa,QAAQ,IAAI,OAAO,KAAK,QAAQ;AACnD,QAAI,YAAY;AACd,UAAI,OAAO,KAAK,QAAQ,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,cAA4C;AACzE,QAAM,QAAQ,cAAc,KAAK;AACjC,SAAO,QAAQ,CAAC,KAAK,IAAI,CAAC;AAC5B;AAEA,SAAS,iBAAiB,QAAyD;AACjF,MAAI,gBAAgB,QAAQ;AAC1B,WAAO,KAAK,UAAU,OAAO,YAAY,MAAM,CAAC;AAAA,EAClD;AAEA,QAAM,eAAe,OAAO,QAAQ,IAAI,CAAC,SAAS;AAChD,YAAQ,KAAK,MAAM;AAAA,MACjB,KAAK;AACH,eAAO,KAAK,KAAK,KAAK;AAAA,MACxB,KAAK;AACH,eAAO,UAAU,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM;AAAA,MACrD,KAAK;AACH,eAAO,UAAU,KAAK,QAAQ,KAAK,KAAK,KAAK,MAAM;AAAA,MACrD,KAAK;AACH,eAAO,UAAU,KAAK,WAClB,KAAK,SAAS,OACd,aAAa,KAAK,SAAS,GAAG,UAAU,KAAK,SAAS,YAAY,0BAA0B;AAAA,MAClG,KAAK;AACH,eAAO,kBAAkB,KAAK,GAAG;AAAA,MACnC;AACE,eAAO,KAAK,UAAU,IAAI;AAAA,IAC9B;AAAA,EACF,CAAC,EAAE,OAAO,OAAO;AAEjB,MAAI,OAAO,qBAAqB,OAAO,KAAK,OAAO,iBAAiB,EAAE,SAAS,GAAG;AAChF,iBAAa,KAAK,KAAK,UAAU,OAAO,mBAAmB,MAAM,CAAC,CAAC;AAAA,EACrE;AAEA,QAAM,SAAS,aAAa,KAAK,MAAM,EAAE,KAAK;AAC9C,SAAO,UAAU,KAAK,UAAU,QAAQ,MAAM,CAAC;AACjD;AAEA,eAAe,4BAA4B,QAAoD;AAC7F,QAAM,0CAA0C,MAAM;AAEtD,QAAM,cAAcC,eAAc,OAAO,MAAM,iBAAiB;AAChE,MAAI,aAAa;AACf,UAAM,kBAAAC,QAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AAEA,QAAM,eAAeD,eAAc,OAAO,MAAM,iBAAiB;AACjE,MAAI,cAAc;AAChB,UAAM,kBAAAC,QAAG,MAAM,mBAAAC,QAAK,QAAQ,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAChE;AAEA,QAAM,YAAYF,eAAc,OAAO,MAAM,cAAc;AAC3D,MAAI,WAAW;AACb,UAAM,kBAAAC,QAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC/C;AAEA,QAAM,kCAAkC,MAAM;AAChD;AAEA,SAASD,eAAc,MAAgB,UAA0B;AAC/D,QAAM,QAAQ,KAAK,QAAQ,QAAQ;AACnC,MAAI,QAAQ,GAAG;AACb,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,KAAK,QAAQ,CAAC,KAAK,EAAE;AACrC;AA/PA,IAAAG,mBACAC,oBAEAC,gBACA,cAeM,sBAEO;AArBb;AAAA;AAAA;AAAA,IAAAF,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,IAAAC,iBAAuB;AACvB,mBAAqC;AAGrC;AACA;AACA;AAUA,IAAM,uBAAuB;AAEtB,IAAM,iBAAN,MAA0C;AAAA,MAgB/C,YAAqB,QAAqC;AAArC;AACnB,aAAK,YAAY,IAAI,kCAAqB;AAAA,UACxC,SAAS,OAAO;AAAA,UAChB,MAAM,OAAO;AAAA,UACb,KAAK,OAAO,OAAO;AAAA,UACnB,KAAK,eAAe,MAAM;AAAA,UAC1B,QAAQ;AAAA,QACV,CAAC;AACD,aAAK,UAAU,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAC3C,qBAAW,QAAQ,OAAO,KAAK,EAAE,MAAM,OAAO,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,GAAG;AAC5F,iBAAK,YAAY,KAAK,IAAI;AAAA,UAC5B;AAEA,cAAI,KAAK,YAAY,SAAS,sBAAsB;AAClD,iBAAK,YAAY,OAAO,GAAG,KAAK,YAAY,SAAS,oBAAoB;AAAA,UAC3E;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MAhCiB,SAAS,IAAI;AAAA,QAC5B;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,cAAc,CAAC;AAAA,QACjB;AAAA,MACF;AAAA,MAEiB;AAAA,MACA,cAAwB,CAAC;AAAA,MAClC,YAAY;AAAA,MACZ,iBAAuC;AAAA,MAqB/C,MAAM,WAA0C;AAC9C,cAAM,KAAK,gBAAgB;AAC3B,cAAM,QAAQ,MAAM,aAAa,KAAK,QAAQ,KAAK,OAAO,SAAS;AAEnE,eAAO;AAAA,UACL,QAAQ,KAAK;AAAA,UACb,QAAQ;AAAA,UACR,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC;AAAA,UAC/C,cAAc,sBAAsB,KAAK,OAAO,gBAAgB,CAAC;AAAA,UACjE,aAAa,CAAC,GAAG,KAAK,WAAW;AAAA,UACjC,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,MAEA,MAAM,QAAuB;AAC3B,aAAK,iBAAiB;AAEtB,YAAI;AACF,gBAAM,KAAK,OAAO,MAAM;AAAA,QAC1B,QAAQ;AACN,gBAAM,KAAK,UAAU,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,QACpD,UAAE;AACA,eAAK,YAAY;AAAA,QACnB;AAAA,MACF;AAAA,MAEQ,UAAU,MAA+B;AAC/C,eAAO;AAAA,UACL,YAAY,KAAK,OAAO;AAAA,UACxB,MAAM,KAAK;AAAA,UACX,aAAa,KAAK,eAAe;AAAA,UACjC,aAAa,KAAK,eAAe;AAAA,YAC/B,MAAM;AAAA,YACN,YAAY,CAAC;AAAA,UACf;AAAA,UACA,UAAU,KAAK,aAAa,iBAAiB;AAAA,UAC7C,QAAQ,OAAO,OAAO,YAAY,KAAK,WAAW,KAAK,MAAM,OAAO,OAAO;AAAA,QAC7E;AAAA,MACF;AAAA,MAEA,MAAc,WACZ,UACA,OACA,SAC4B;AAC5B,cAAM,KAAK,gBAAgB;AAC3B,cAAM,kBAAkB,MAAM,6BAA6B,KAAK,QAAQ,UAAU,KAAK;AAEvF,cAAM,SAAS,MAAM,KAAK,OAAO;AAAA,UAC/B;AAAA,YACE,MAAM;AAAA,YACN,WAAW;AAAA,UACb;AAAA,UACA;AAAA,UACA;AAAA,YACE,QAAQ,QAAQ;AAAA,YAChB,SAAS,KAAK,OAAO;AAAA,YACrB,wBAAwB;AAAA,YACxB,iBAAiB,KAAK,OAAO;AAAA,UAC/B;AAAA,QACF;AAEA,eAAO;AAAA,UACL,IAAI,OAAO,YAAY;AAAA,UACvB,QAAQ,iBAAiB,MAAM;AAAA,QACjC;AAAA,MACF;AAAA,MAEA,MAAc,kBAAiC;AAC7C,YAAI,KAAK,WAAW;AAClB;AAAA,QACF;AAEA,YAAI,KAAK,gBAAgB;AACvB,gBAAM,KAAK;AACX;AAAA,QACF;AAEA,aAAK,kBAAkB,YAAY;AACjC,gBAAM,4BAA4B,KAAK,MAAM;AAC7C,gBAAM,KAAK,OAAO,QAAQ,KAAK,WAAW;AAAA,YACxC,SAAS,KAAK,OAAO;AAAA,UACvB,CAAC;AACD,eAAK,YAAY;AAAA,QACnB,GAAG;AAEH,YAAI;AACF,gBAAM,KAAK;AAAA,QACb,SAAS,OAAO;AACd,eAAK,YAAY;AACjB,gBAAM,KAAK,UAAU,MAAM,EAAE,MAAM,MAAM,MAAS;AAClD,gBAAM;AAAA,QACR,UAAE;AACA,eAAK,iBAAiB;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AChIO,SAAS,gBAAgB,QAAgD;AAC9E,MAAI,OAAO,cAAc,SAAS;AAChC,WAAO,IAAI,eAAe,MAAM;AAAA,EAClC;AAEA,SAAO,IAAI,qBAAqB,MAAM;AACxC;AA9BA,IAGa;AAHb,IAAAC,eAAA;AAAA;AAAA;AAAA;AAGO,IAAM,uBAAN,MAAgD;AAAA,MACrD,YAAqB,QAAqC;AAArC;AAAA,MAAsC;AAAA,MAE3D,MAAM,WAA0C;AAC9C,eAAO;AAAA,UACL,QAAQ,KAAK;AAAA,UACb,QAAQ;AAAA,UACR,OAAO,CAAC;AAAA,UACR,cAAc,CAAC;AAAA,UACf,aAAa;AAAA,YACX,eAAe,KAAK,OAAO,IAAI;AAAA,UACjC;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,MAEA,MAAM,QAAuB;AAC3B;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACZA,eAAsB,sBACpB,QACA,gBAAkC,iBACA;AAClC,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,OAAO,CAAC;AAAA,QACR,cAAc,CAAC;AAAA,QACf,aAAa,CAAC,eAAe,OAAO,IAAI,0BAA0B;AAAA,QAClE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,cAAc,MAAM;AACnC,MAAI;AACF,WAAO;AAAA,MACL;AAAA,MACA,UAAU,MAAM,OAAO,SAAS;AAAA,IAClC;AAAA,EACF,SAAS,OAAO;AACd,UAAM,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAC1C,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,QACR;AAAA,QACA,QAAQ;AAAA,QACR,OAAO,CAAC;AAAA,QACR,cAAc,CAAC;AAAA,QACf,aAAa,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACpE,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AACF;AA4BA,eAAsB,gBAAgB,SAA8C;AAClF,aAAW,UAAU,SAAS;AAC5B,QAAI;AACF,YAAM,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,IAC5C,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AACF;AApFA;AAAA;AAAA;AAAA,IAAAC;AAAA;AAAA;;;ACAA,IAKa;AALb;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AACA;AAGO,IAAM,mBAAN,MAAuB;AAAA,MAI5B,YACmB,QACA,gBAAkC,iBACnD;AAFiB;AACA;AAAA,MAChB;AAAA,MANK,YAAoC,CAAC;AAAA,MAC5B,gBAAgB,oBAAI,IAAuB;AAAA,MAO5D,MAAM,UAA2C;AAC/C,YAAI,CAAC,KAAK,OAAO,SAAS;AACxB,gBAAM,KAAK,MAAM;AACjB,eAAK,YAAY,CAAC;AAClB,iBAAO,KAAK;AAAA,QACd;AAEA,cAAM,UAAU,4BAA4B,KAAK,MAAM;AACvD,cAAM,KAAK,MAAM;AAEjB,cAAM,gBAAwC,CAAC;AAC/C,mBAAW,UAAU,SAAS;AAC5B,gBAAM,aAAa,MAAM,sBAAsB,QAAQ,KAAK,aAAa;AACzE,wBAAc,KAAK,WAAW,QAAQ;AACtC,cAAI,WAAW,UAAU,WAAW,SAAS,WAAW,SAAS;AAC/D,iBAAK,cAAc,IAAI,OAAO,IAAI,WAAW,MAAM;AAAA,UACrD;AAAA,QACF;AAEA,aAAK,YAAY;AACjB,eAAO,KAAK,aAAa;AAAA,MAC3B;AAAA,MAEA,eAAuC;AACrC,eAAO,KAAK,UAAU,IAAI,CAAC,cAAc;AAAA,UACvC,GAAG;AAAA,UACH,OAAO,CAAC,GAAG,SAAS,KAAK;AAAA,UACzB,cAAc,CAAC,GAAG,SAAS,YAAY;AAAA,UACvC,aAAa,CAAC,GAAG,SAAS,WAAW;AAAA,QACvC,EAAE;AAAA,MACJ;AAAA,MAEA,qBAA0C;AACxC,eAAO,KAAK,UAAU,QAAQ,CAAC,aAAa,SAAS,KAAK;AAAA,MAC5D;AAAA,MAEA,MAAM,QAAuB;AAC3B,cAAM,gBAAgB,CAAC,GAAG,KAAK,cAAc,OAAO,CAAC,CAAC;AACtD,aAAK,cAAc,MAAM;AAAA,MAC3B;AAAA,IACF;AAAA;AAAA;;;AChDO,SAAS,wBAAwB,OAAuD;AAC7F,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,kBAAkB,KAAK,YAAY,KAAK,IAAI;AAAA,QAClD,aAAa,qBAAqB,IAAI;AAAA,QACtC,YAAY,gBAAgB,KAAK,WAAW;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAM,OAAO,UAAU,OAAO;AAC9B,YAAM,SAAS,MAAM,KAAK,OAAO,MAAM;AAAA,QACrC,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,aAAO;AAAA,QACL,IAAI,OAAO;AAAA,QACX,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF,EAAE;AACJ;AAEO,SAAS,kBAAkB,YAAoB,UAA0B;AAC9E,QAAM,aAAa,OAAO,UAAU,IAAI,QAAQ,GAC7C,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,OAAO,GAAG,EAClB,QAAQ,iBAAiB,KAAK;AAEjC,MAAI,WAAW,UAAU,mBAAmB;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,WAAW,MAAM,GAAG,EAAE,CAAC,IAAI,WAAW,MAAM,GAAG,CAAC;AAC5D;AAEA,SAAS,qBAAqB,MAAiC;AAC7D,QAAM,cAAc,KAAK,YAAY,KAAK;AAC1C,QAAM,SAAS,eAAe,KAAK,UAAU;AAC7C,MAAI,KAAK,eAAe,gBAAgB,KAAK,KAAK,WAAW,UAAU,GAAG;AACxE,UAAM,cAAc;AACpB,WAAO,CAAC,aAAa,aAAa,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,EACpE;AAEA,SAAO,cAAc,GAAG,WAAW,IAAI,MAAM,KAAK;AACpD;AAEA,SAAS,gBAAgB,OAAyD;AAChF,QAAM,SAAS,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,IACrE,gBAAgB,KAAK,IACrB,CAAC;AAEL,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,OAAO;AAAA,EAChB;AAEA,MAAI,CAAC,OAAO,cAAc,OAAO,OAAO,eAAe,YAAY,MAAM,QAAQ,OAAO,UAAU,GAAG;AACnG,WAAO,aAAa,CAAC;AAAA,EACvB;AAEA,SAAO;AACT;AApEA,IAIM;AAJN;AAAA;AAAA;AAAA,IAAAC;AAIA,IAAM,oBAAoB;AAAA;AAAA;;;ACC1B,eAAsB,0BACpB,QACA,UAAU,IAAI,iBAAiB,MAAM,GACV;AAC3B,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,QAAQ;AACtB,SAAO,wBAAwB,QAAQ,mBAAmB,CAAC;AAC7D;AAfA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACWA,eAAsB,0BACpB,QACA,UAA+B,CAAC,GAChC,eAAgD,CAAC,GAC1B;AACvB,QAAM,UAAU,aAAa,WAAW,IAAI,iBAAiB,OAAO,GAAG;AACvE,QAAM,kBACJ,aAAa,oBACZ,CAAC,cAAoC,0BAA0B,WAAW,OAAO;AACpF,QAAM,WAAW,MAAM,gBAAgB,OAAO,GAAG;AACjD,QAAM,WAAW,mBAAmB,OAAO,MAAM;AAAA,IAC/C,GAAG;AAAA,IACH,cAAc,CAAC,GAAI,QAAQ,gBAAgB,CAAC,GAAI,GAAG,QAAQ;AAAA,EAC7D,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,QAAQ;AACZ,YAAM,SAAS,QAAQ;AACvB,YAAM,aAAa,QAAQ;AAC3B,UAAI,CAAC,aAAa,SAAS,aAAa,SAAS;AAC/C,cAAM,QAAQ,MAAM;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AArCA;AAAA;AAAA;AAAA;AACA;AAEA;AAAA;AAAA;;;ACHA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACMA,eAAsB,4BACpB,cACA,UACA,SACA,gBACA,aAC8B;AAC9B,MAAI;AACF,WAAO,MAAM,aAAa,QAAQ,SAAS,SAAS,MAAM,SAAS,SAAS,WAAW;AAAA,MACrF,QAAQ,QAAQ;AAAA,MAChB,KAAK,QAAQ;AAAA,MACb,WAAW,QAAQ,QAAQ;AAAA,MAC3B,UAAU,QAAQ,YAAY;AAAA,QAC5B,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,QAAI,aAAa,KAAK,GAAG;AACvB,YAAM;AAAA,IACR;AAEA,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,UAAmC;AAAA,MACvC,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM,sBAAsB,SAAS,SAAS,MAAM,OAAO;AAAA,MAC3D,WACE;AAAA,IACJ;AAEA,QAAI,iBAAiB,oBAAoB;AACvC,cAAQ,OAAO,MAAM;AACrB,UAAI,MAAM,SAAS;AACjB,gBAAQ,UAAU,MAAM;AAAA,MAC1B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,QAAQ,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,IACzC;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,UAAkB,SAAyB;AACxE,QAAM,QAAQ,QAAQ,YAAY;AAElC,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,cAAc,KAAK,MAAM,SAAS,gBAAgB,GAAG;AAClG,WAAO,oBAAoB,QAAQ;AAAA,EACrC;AAEA,MAAI,MAAM,SAAS,oBAAoB,KAAK,MAAM,SAAS,sBAAsB,GAAG;AAClF,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,aAAa,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,YAAY,GAAG;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,KAAK,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,GAAG;AACnN,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,KAAK,MAAM,SAAS,cAAc,KAAK,MAAM,SAAS,MAAM,GAAG;AACjH,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,aAAa,KAAK,MAAM,SAAS,YAAY,KAAK,MAAM,SAAS,MAAM,GAAG;AAC3F,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,kBAAkB,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,cAAc,GAAG;AAClC,WAAO,OAAO,QAAQ;AAAA,EACxB;AAEA,MAAI,MAAM,SAAS,wBAAwB,GAAG;AAC5C,WAAO,qBAAqB,QAAQ;AAAA,EACtC;AAEA,MAAI,MAAM,SAAS,uBAAuB,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,QAAQ;AACxB;AA7GA;AAAA;AAAA;AACA,IAAAC;AACA;AAGA;AAAA;AAAA;;;ACEO,SAAS,oBAAoB,OAAkD;AACpF,QAAM,qBAAqB,IAAI,IAAI,MAAM,mBAAmB,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AAC7F,QAAM,mBAAmB,MAAM,oBAAoB,oBAAI,IAAY;AACnE,QAAM,eAAeC,eAAc,CAAC,MAAM,OAAO,MAAM,WAAW,MAAM,WAAW,CAAC;AACpF,QAAM,WAAWA,eAAc,CAAC,MAAM,WAAW,MAAM,WAAW,CAAC;AAEnE,QAAM,UAAU,MAAM,OAAO,IAAI,CAAC,UAAU;AAC1C,UAAM,YAAkE,CAAC;AACzE,UAAM,YAAgC,CAAC;AACvC,UAAM,QAAQ,aAAa,SAAS,MAAM,KAAK,YAAY,CAAC;AAC5D,UAAM,SAAS,iBAAiB,IAAI,MAAM,IAAI;AAE9C,QAAI,MAAM,WAAW,SAAS,KAAK,CAAC,MAAM,WAAW,SAAS,MAAM,SAAS,IAAI,GAAG;AAClF,gBAAU,KAAK,YAAY;AAAA,IAC7B;AAEA,QACE,MAAM,MAAM,SAAS,MACpB,CAAC,MAAM,SAAS,QAAQ,CAAC,MAAM,MAAM,SAAS,MAAM,SAAS,KAAK,YAAY,CAAC,IAChF;AACA,gBAAU,KAAK,MAAM;AAAA,IACvB;AAEA,QAAI,CAAC,YAAY,oBAAoB,MAAM,MAAM,QAAQ,GAAG;AAC1D,gBAAU,KAAK,gBAAgB;AAAA,IACjC;AAEA,QAAI,YAAY,oBAAoB,MAAM,MAAM,YAAY,GAAG;AAC7D,gBAAU,KAAK,oBAAoB;AAAA,IACrC;AAEA,UAAM,cAAc,WAAW,UAAU,MAAM,SAAS;AACxD,QAAI,MAAM,UAAU,SAAS,GAAG;AAC9B,UAAI,aAAa;AACf,kBAAU,KAAK,WAAW;AAAA,MAC5B,OAAO;AACL,kBAAU,KAAK,WAAW;AAAA,MAC5B;AAAA,IACF;AAEA,UAAM,eAAe,WAAW,cAAc,MAAM,MAAM;AAC1D,QAAI,MAAM,OAAO,SAAS,GAAG;AAC3B,UAAI,cAAc;AAChB,kBAAU,KAAK,OAAO;AAAA,MACxB,OAAO;AACL,kBAAU,KAAK,OAAO;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,iBAAiB,gBAAgB,cAAc,KAAK;AAC1D,QAAI,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS,SAAS,GAAG;AAC5E,UAAI,gBAAgB;AAClB,kBAAU,KAAK,SAAS;AAAA,MAC1B,WAAW,CAAC,OAAO;AACjB,kBAAU,KAAK,SAAS;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,OAAO;AACT,gBAAU,KAAK,MAAM;AAAA,IACvB,WAAW,UAAU,WAAW,GAAG;AACjC,gBAAU,KAAK,SAAS;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL;AAAA,MACA,YAAY,UAAU,WAAW,KAAK,MAAM,aAAa;AAAA,MACzD;AAAA,MACA;AAAA,MACA,WAAW,WAAW,SAAS;AAAA,MAC/B,WAAW,WAAW,SAAS;AAAA,IACjC;AAAA,EACF,CAAC;AAED,QAAM,cAAc,QACjB,OAAO,CAAC,UAAU,MAAM,SAAS,MAAM,UAAU,WAAW,CAAC,EAC7D,IAAI,CAAC,UAAU,MAAM,KAAK;AAC7B,QAAM,mBAAmB,QAAQ,OAAO,CAAC,UAAU,MAAM,UAAU,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK;AAC/F,QAAM,kBAAkB,iBAAiB,OAAO,CAAC,UAAU,MAAM,aAAa,WAAW;AACzF,QAAM,iBAAiB,iBAAiB,OAAO,CAAC,UAAU,MAAM,aAAa,UAAU;AACvF,QAAM,eAAe,QAAQ,OAAO,CAAC,UAAU,MAAM,MAAM,EAAE,IAAI,CAAC,UAAU,MAAM,KAAK;AACvF,QAAM,wBAAwB,eAAe,OAAO,CAAC,UAAU,CAAC,iBAAiB,IAAI,MAAM,IAAI,CAAC;AAEhG,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAASA,eAAc,QAA2C;AAChE,SAAO,OACJ,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC,EACvF,KAAK,IAAI,EACT,YAAY;AACjB;AAEA,SAAS,YAAY,oBAAiC,eAAkC;AACtF,SAAO,cAAc,MAAM,CAAC,SAAS,mBAAmB,IAAI,IAAI,CAAC;AACnE;AAEA,SAAS,YAAY,oBAAiC,OAA0B;AAC9E,SAAO,MAAM,KAAK,CAAC,SAAS,mBAAmB,IAAI,IAAI,CAAC;AAC1D;AAEA,SAAS,WAAW,MAAc,QAA2B;AAC3D,SAAO,OAAO,KAAK,CAAC,UAAU,SAAS,KAAK,SAAS,KAAK,CAAC;AAC7D;AAEA,SAAS,gBAAgB,MAAc,OAA6B;AAClE,MAAI,WAAW,MAAM,MAAM,SAAS,QAAQ,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,SAAS,SAAS,KAAK,CAAC,YAAY;AAC/C,QAAI;AACF,aAAO,IAAI,OAAO,SAAS,GAAG,EAAE,KAAK,IAAI;AAAA,IAC3C,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AACH;AAEA,SAAS,WAAc,QAAkB;AACvC,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAxIA;AAAA;AAAA;AAAA;AAAA;;;ACMO,SAAS,uBAAuB,SAQjB;AACpB,QAAM,mBAAmB,oBAAoB,QAAQ,QAAQ,QAAQ;AACrE,QAAM,YAAY,oBAAoB;AAAA,IACpC,QAAQ,QAAQ;AAAA,IAChB,OAAO,QAAQ,SAAS,mBAAmB,QAAQ,QAAQ,QAAQ;AAAA,IACnE,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ,aAAa,QAAQ,QAAQ,WAAW;AAAA,IAC3D,aAAa,QAAQ;AAAA,IACrB,oBAAoB,QAAQ;AAAA,IAC5B;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEO,SAAS,uBACd,UACA,cAC4B;AAC5B,MAAI,aAAa,gBAAgB,aAAa,sBAAsB,WAAW,GAAG;AAChF,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,aAAa,sBAAsB,IAAI,CAAC,UAAU,MAAM,IAAI;AACjF,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,KAAK;AAAA,MACX;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,wBAAwB,aAAa,KAAK,IAAI,CAAC;AAAA,QACrD,eAAe;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,UAAwC;AAC1E,QAAM,SAAS,oBAAI,IAAY;AAE/B,aAAW,WAAW,UAAU;AAC9B,QAAI,SAAS,SAAS,UAAU,QAAQ,SAAS,cAAc;AAC7D;AAAA,IACF;AAEA,UAAM,aAAa,oBAAoB,QAAQ,OAAO;AACtD,QAAI,YAAY;AACd,aAAO,IAAI,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mCAAmC,cAAyC;AAC1F,SAAO,aAAa,sBAAsB,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI;AAChF;AAEA,SAAS,mBAAmB,UAAmC;AAC7D,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,SAAS,SAAS,UAAU,CAAC,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,GAAG;AACtF;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,EACjB;AAEA,SAAO;AACT;AA1FA,IAAAC,cAAA;AAAA;AAAA;AAAA;AAEA;AACA;AAAA;AAAA;;;ACiBA,eAAsB,oBACpB,QAWA;AACA,MAAI,OAAO,kBAAkB,sBAAsB,SAAS,GAAG;AAC7D,UAAM,oBAAoB,mCAAmC,OAAO,iBAAiB;AACrF,UAAM,UAAU,MAAM,OAAO,QAAQ,aAAa,eAAe,OAAO,SAAS;AAAA,MAC/E,cAAc,aAAa,OAAO,SAAS,WAAW,IAAI;AAAA,QACxD,kBAAkB,OAAO,SAAS;AAAA,MACpC,CAAC;AAAA,MACD;AAAA,QACE;AAAA,QACA;AAAA,UACE,iCAAiC,iBAAiB;AAAA,QAEpD;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,QAAQ,WAAW,WAAW,wDAAwD;AAC7F,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA,4BAA4B,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,iCAAiC;AAAA,IACtC,SAAS,OAAO;AAAA,IAChB,UAAU,OAAO;AAAA,IACjB,UAAU,OAAO;AAAA,IACjB,cAAc,OAAO;AAAA,IACrB,2BAA2B,OAAO;AAAA,IAClC,4BAA4B,OAAO;AAAA,IACnC,mBAAmB,OAAO,QAAQ;AAAA,IAClC,4BAA4B,OAAO;AAAA,IACnC,SAAS,OAAO;AAAA,EAClB,CAAC;AACH;AAlEA;AAAA;AAAA;AAAA;AACA;AACA;AACA,IAAAC;AAAA;AAAA;;;ACCO,SAAS,+BACd,cACA,YACA,WACA,eACA,4BACc;AACd,QAAM,oBAAoB,CAAC,GAAG,aAAa,aAAa;AACxD,QAAM,sBAAsB,YAAY,KAAK,6BAA6B,KAAK,QAAQ,UAAU;AAEjG,MAAI,qBAAqB;AACvB,UAAM,QAAQ,YAAY,MAAM,SAAS;AACzC,UAAM,SAAS,YAAY,MAAM,SAAS,KAAK,WAAW,KAAK,MAAM,MAAM;AAC3E,sBAAkB;AAAA,MAChB;AAAA,QACE;AAAA,QACA,2CAA2C,SAAS,IAAI,aAAa;AAAA,QACrE,uBAAuB,KAAK,GAAG,MAAM;AAAA,QACrC,2CAA2C,0BAA0B;AAAA,QACrE;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,uBACd,WACA,WACA,eACA,oBACM;AACN,MAAI,aAAa,GAAG;AAClB;AAAA,EACF;AAEA,MAAI,YAAY,uBAAuB,GAAG;AACxC,eAAW;AAAA,MACT,WAAW,SAAS;AAAA,IACtB;AACA;AAAA,EACF;AAEA,MAAI,YAAY,kBAAkB,GAAG;AACnC,eAAW;AAAA,MACT,WAAW,SAAS;AAAA,IACtB;AAAA,EACF;AACF;AAxDA;AAAA;AAAA;AAAA;AAAA;;;ACUA,eAAsB,oBAAoB,UAAyC;AACjF,QAAM,UAAU,MAAM,kBAAkB,QAAQ;AAChD,QAAM,eAAe,MAAM,cAAc,OAAO;AAEhD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,kBAAkB,UAAmC;AAClE,MAAI,aAAa,mBAAAC,QAAK,QAAQ,QAAQ;AACtC,QAAM,SAAS,mBAAAA,QAAK,MAAM,UAAU,EAAE;AAEtC,SAAO,MAAM;AACX,QAAI;AACF,YAAM,kBAAAC,QAAG,OAAO,mBAAAD,QAAK,KAAK,YAAY,MAAM,CAAC;AAC7C,aAAO;AAAA,IACT,QAAQ;AACN,UAAI,eAAe,QAAQ;AACzB,eAAO,mBAAAA,QAAK,QAAQ,QAAQ;AAAA,MAC9B;AAEA,mBAAa,mBAAAA,QAAK,QAAQ,UAAU;AAAA,IACtC;AAAA,EACF;AACF;AAEA,eAAe,cAAc,eAAwC;AACnE,MAAI;AACF,UAAM,SAAS,UAAM;AAAA,MACnB;AAAA,MACA,CAAC,MAAM,eAAe,aAAa,0BAA0B,kBAAkB;AAAA,MAC/E;AAAA,QACE,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,aAAa;AAAA,MACf;AAAA,IACF;AAEA,UAAM,eAAe,OAAO,OAAO,KAAK;AACxC,QAAI,CAAC,cAAc;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,sBAAsB,mBAAAA,QAAK,QAAQ,YAAY;AACrD,QAAI,mBAAAA,QAAK,SAAS,mBAAmB,EAAE,YAAY,MAAM,QAAQ;AAC/D,aAAO,mBAAAA,QAAK,QAAQ,mBAAmB;AAAA,IACzC;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAhEA,IAAAE,mBACAC,oBAEAC;AAHA;AAAA;AAAA;AAAA,IAAAF,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,IAAAC,gBAAsB;AAAA;AAAA;;;ACHtB,IAAa,sBACA,kBACA;AAFb,IAAAC,cAAA;AAAA;AAAA;AAAO,IAAM,uBAAuB;AAC7B,IAAM,mBAAmB,CAAC,UAAU,aAAa,UAAU;AAC3D,IAAM,oBAAoB,CAAC,QAAQ,YAAY,UAAU;AAAA;AAAA;;;ACyBzD,SAAS,iBACd,MACA,SAIa;AACb,QAAM,aAAa,KAAK,QAAQ,WAAW,EAAE;AAC7C,QAAM,QAAQ,WAAW,MAAM,mBAAmB;AAClD,QAAM,cAAc,QAAQ,CAAC,KAAK;AAClC,QAAM,QAAQ,QAAQ,CAAC,KAAK,YAAY,KAAK;AAC7C,QAAM,WAAW,uBAAuB,WAAW;AACnD,QAAM,iBAAiB,YAAY,KAAK,EAAE,SAAS;AACnD,QAAM,OAAO,cAAc,UAAU,QAAQ,cAAc,gBAAgB,QAAQ,OAAO;AAC1F,QAAM,cAAc,qBAAqB,UAAU,MAAM,QAAQ,YAAY;AAC7E,QAAM,gBAAgB,kBAAkB,UAAU,QAAQ,YAAY;AACtE,QAAM,WAAW,aAAa,UAAU,QAAQ,YAAY;AAC5D,QAAM,aAAa,eAAe,UAAU,QAAQ,YAAY;AAChE,QAAM,QAAQ,mBAAmB,SAAS,KAAK;AAC/C,QAAM,YAAY,mBAAmB,SAAS,UAAU;AACxD,QAAM,SAAS,mBAAmB,SAAS,MAAM;AACjD,QAAM,WAAW,aAAa,UAAU,QAAQ,YAAY;AAC5D,QAAM,QAAQ,oBAAoB,QAAQ;AAC1C,QAAM,UAAU,YAAY,SAAS,OAAO;AAE5C,0BAAwB,OAAO,QAAQ,YAAY;AAEnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,mBAAAC,QAAK,SAAS,QAAQ,SAAS,QAAQ,YAAY,KAAK;AAAA,IAC9D,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,aAA6C;AAC3E,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,YAAY,MAAM,OAAO,GAAG;AAC7C,UAAM,iBAAiB,KAAK,QAAQ,GAAG;AACvC,QAAI,kBAAkB,GAAG;AACvB;AAAA,IACF;AAEA,UAAM,MAAM,KAAK,MAAM,GAAG,cAAc,EAAE,KAAK,EAAE,YAAY;AAC7D,UAAM,QAAQ,KAAK,MAAM,iBAAiB,CAAC,EAAE,KAAK;AAClD,QAAI,CAAC,KAAK;AACR;AAAA,IACF;AAEA,WAAO,GAAG,IAAI,MAAM,QAAQ,gBAAgB,EAAE;AAAA,EAChD;AAEA,SAAO;AACT;AAEA,SAAS,cACP,UACA,cACA,gBACA,SACQ;AACR,QAAM,OAAO,SAAS,MAAM,KAAK;AACjC,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB;AAClB,UAAM,IAAI,iBAAiB,4CAA4C,YAAY;AAAA,EACrF;AAEA,QAAM,cAAc,mBAAAA,QAAK,SAAS,SAAS,mBAAAA,QAAK,QAAQ,YAAY,CAAC;AACrE,QAAM,WAAW,eAAe,gBAAgB,MAAM,mBAAAA,QAAK,SAAS,WAAW,IAAI,mBAAAA,QAAK,SAAS,OAAO;AACxG,MAAI,UAAU;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,iBAAiB,iCAAiC,YAAY;AAC1E;AAEA,SAAS,qBACP,UACA,MACA,cACQ;AACR,QAAM,cAAc,SAAS,aAAa,KAAK,KAAK,iBAAiB,IAAI;AACzE,MAAI,aAAa;AACf,WAAO;AAAA,EACT;AAEA,QAAM,IAAI,iBAAiB,mDAAmD,YAAY;AAC5F;AAEA,SAAS,kBAAkB,UAAkC,cAAmD;AAC9G,QAAM,MAAM,SAAS,gBAAgB,KAAK;AAC1C,MAAI,CAAC,OAAO,QAAQ,sBAAsB;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,IAAI;AAAA,IACR,qCAAqC,GAAG,gBAAgB,oBAAoB;AAAA,IAC5E;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAkC,cAAqC;AAC3F,QAAM,MAAM,SAAS,WAAW,KAAK,EAAE,YAAY;AACnD,MAAI,KAAK;AACP,QAAK,iBAAuC,SAAS,GAAG,GAAG;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,IAAI,iBAAiB,4BAA4B,GAAG,MAAM,YAAY;AAAA,EAC9E;AAEA,MAAI,aAAa,SAAS,QAAQ,GAAG;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,uBAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,IACT,SAAS;AAAA,EACX,EAAE,KAAK,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC;AAEtE,SAAO,uBAAuB,cAAc;AAC9C;AAEA,SAAS,YAAY,KAAiC;AACpD,QAAM,aAAa,KAAK,KAAK;AAC7B,SAAO,cAAc,WAAW,SAAS,IAAI,aAAa;AAC5D;AAEA,SAAS,eAAe,UAAkC,cAAwC;AAChG,QAAM,SAAS,mBAAmB,SAAS,eAAe,SAAS,cAAc;AACjF,QAAM,UAAU,OAAO;AAAA,IACrB,CAAC,UAAU,CAAE,kBAAwC,SAAS,KAAK;AAAA,EACrE;AACA,MAAI,SAAS;AACX,UAAM,IAAI,iBAAiB,oCAAoC,OAAO,MAAM,YAAY;AAAA,EAC1F;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,UAAkC,cAAuC;AAC7F,QAAM,WAAW;AAAA,IACf,SAAS,oBAAoB,SAAS,YAAY,SAAS;AAAA,EAC7D;AACA,QAAM,WAAW,eAAe,SAAS,gBAAgB;AAEzD,aAAW,WAAW,UAAU;AAC9B,QAAI;AACF,UAAI,OAAO,SAAS,GAAG;AAAA,IACzB,QAAQ;AACN,YAAM,IAAI,iBAAiB,mCAAmC,OAAO,MAAM,YAAY;AAAA,IACzF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,UAAwD;AACnF,SAAO;AAAA,IACL,UAAU,mBAAmB,SAAS,cAAc;AAAA,IACpD,UAAU,mBAAmB,SAAS,cAAc;AAAA,IACpD,cAAc,mBAAmB,SAAS,kBAAkB;AAAA,EAC9D;AACF;AAEA,SAAS,wBAAwB,OAA6B,cAA4B;AACxF,QAAM,WAAW;AAAA,IACf,EAAE,MAAM,kBAAkB,OAAO,kBAAkB,QAAQ,UAAU,MAAM,UAAU,MAAM,QAAQ,EAAE;AAAA,IACrG,EAAE,MAAM,kBAAkB,OAAO,sBAAsB,QAAQ,UAAU,MAAM,UAAU,MAAM,YAAY,EAAE;AAAA,IAC7G,EAAE,MAAM,kBAAkB,OAAO,sBAAsB,QAAQ,UAAU,MAAM,UAAU,MAAM,YAAY,EAAE;AAAA,EAC/G;AAEA,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,OAAO,WAAW,GAAG;AAC/B;AAAA,IACF;AAEA,UAAM,IAAI;AAAA,MACR,yBAAyB,QAAQ,IAAI,QAAQ,QAAQ,KAAK,oBAAoB,QAAQ,OAAO,KAAK,IAAI,CAAC;AAAA,MACvG;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAAmC;AACzD,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,SAAS,GAAG,GAAG;AACpD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO,OACJ,OAAO,CAAC,SAAyB,OAAO,SAAS,QAAQ,EACzD,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,MACnB;AAAA,IACF,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO,QACJ,MAAM,MAAM,EACZ,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AACnB;AAEA,SAAS,mBAAmB,KAAmC;AAC7D,SAAOC,YAAW,eAAe,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;AACzE;AAEA,SAAS,aAAa,KAAkC;AACtD,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,IAAI,KAAK,EAAE,YAAY;AAC1C,SAAO,eAAe,UAAU,eAAe,OAAO,eAAe;AACvE;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,mBAAmB,KACtB,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,CAAC,KAAK,WAAW,GAAG,CAAC;AAE1D,SAAO,kBAAkB,MAAM,GAAG,GAAG,KAAK;AAC5C;AAEA,SAAS,UAAU,MAAgB,OAA2B;AAC5D,QAAM,WAAW,IAAI,IAAI,KAAK;AAC9B,SAAO,KAAK,OAAO,CAAC,UAAU,SAAS,IAAI,KAAK,CAAC;AACnD;AAEA,SAASA,YAAW,QAA4B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;AAC5B;AAlSA,IAAAC,oBAeM,qBAEO;AAjBb;AAAA;AAAA;AAAA,IAAAA,qBAAiB;AAEjB,IAAAC;AAaA,IAAM,sBAAsB;AAErB,IAAM,mBAAN,cAA+B,MAAM;AAAA,MAC1C,YACE,SACS,UACT;AACA,cAAM,GAAG,OAAO,KAAK,QAAQ,GAAG;AAFvB;AAGT,aAAK,OAAO;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AChBA,eAAsB,eACpB,SACA,KACA,aACwB;AACxB,QAAM,iBAAiBC,aAAY;AAAA,IACjC,mBAAAC,QAAK,KAAK,SAAS,SAAS;AAAA,IAC5B,mBAAAA,QAAK,KAAK,SAAS,QAAQ;AAAA,IAC3B,mBAAAA,QAAK,KAAK,KAAK,SAAS;AAAA,IACxB,mBAAAA,QAAK,KAAK,KAAK,QAAQ;AAAA,EACzB,CAAC;AACD,QAAM,uBAAuBD,aAAY;AAAA,IACvC,mBAAAC,QAAK,KAAK,SAAS,UAAU;AAAA,IAC7B,mBAAAA,QAAK,KAAK,KAAK,UAAU;AAAA,EAC3B,CAAC;AACD,QAAM,aAA4B,CAAC;AACnC,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,YAAY,oBAAI,IAAoB;AAE1C,aAAW,aAAa,sBAAsB;AAC5C,UAAM,aAAa,WAAW,SAAS,aAAa,WAAW,WAAW,UAAU;AAAA,EACtF;AAEA,aAAW,aAAa,gBAAgB;AACtC,QAAI,CAAE,MAAM,YAAY,SAAS,GAAI;AACnC;AAAA,IACF;AAEA,UAAM,aAAa,UAAM,kBAAAC,SAAG,eAAe;AAAA,MACzC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,QAAQ,CAAC,sBAAsB,cAAc,YAAY;AAAA,IAC3D,CAAC;AAED,eAAW,aAAa,WAAW,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,GAAG;AACnF,YAAM,aAAa,WAAW,SAAS,aAAa,WAAW,WAAW,UAAU;AAAA,IACtF;AAAA,EACF;AAEA,SAAO,WAAW,KAAK,CAAC,MAAM,UAAU,KAAK,KAAK,cAAc,MAAM,IAAI,CAAC;AAC7E;AAMA,eAAe,aACb,WACA,SACA,aACA,WACA,WACA,YACe;AACf,QAAM,iBAAiB,mBAAAD,QAAK,UAAU,SAAS;AAC/C,MAAI,UAAU,IAAI,cAAc,GAAG;AACjC;AAAA,EACF;AAEA,YAAU,IAAI,cAAc;AAC5B,MAAI,CAAE,MAAM,cAAc,SAAS,KAAM,cAAc,WAAW,WAAW,GAAG;AAC9E;AAAA,EACF;AAEA,QAAM,SAAS,iBAAiB,MAAM,kBAAAE,QAAG,SAAS,WAAW,MAAM,GAAG;AAAA,IACpE,cAAc;AAAA,IACd;AAAA,EACF,CAAC;AACD,QAAM,eAAe,UAAU,IAAI,OAAO,IAAI;AAC9C,MAAI,gBAAgB,iBAAiB,OAAO,cAAc;AACxD,UAAM,IAAI;AAAA,MACR,yBAAyB,OAAO,IAAI,cAAc,YAAY,QAAQ,OAAO,YAAY;AAAA,IAC3F;AAAA,EACF;AAEA,YAAU,IAAI,OAAO,MAAM,OAAO,YAAY;AAC9C,aAAW,KAAK,MAAM;AACxB;AAEA,eAAe,cAAc,UAAoC;AAC/D,MAAI;AACF,UAAM,OAAO,MAAM,kBAAAA,QAAG,KAAK,QAAQ;AACnC,WAAO,KAAK,OAAO;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,YAAY,YAAsC;AAC/D,MAAI;AACF,UAAM,OAAO,MAAM,kBAAAA,QAAG,KAAK,UAAU;AACrC,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASH,aAAY,OAA2B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,mBAAAC,QAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAC/D;AA/GA,IAAAG,mBACAC,oBAEAC;AAHA,IAAAC,kBAAA;AAAA;AAAA;AAAA,IAAAH,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,IAAAC,oBAAe;AAGf;AACA;AAAA;AAAA;;;ACPA;AAAA;AAAA;AAAA,IAAAE;AACA;AAAA;AAAA;;;ACWA,eAAsB,mBAAmB,KAAsC;AAC7E,QAAM,QAAQ,MAAM,oBAAoB,GAAG;AAC3C,QAAM,eAAe,MAAM,oBAAoB,MAAM,SAAS,GAAG;AACjE,QAAM,EAAE,SAAS,UAAU,IAAI,uBAAuB,YAAY;AAClE,QAAM,cAAc,MAAM,uBAAuB,MAAM,SAAS,GAAG;AACnE,QAAM,SAAS,MAAM,eAAe,MAAM,SAAS,KAAK,WAAW;AAEnE,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB,SAAiB,KAA+C;AACjG,QAAM,cAAc,4BAA4B,SAAS,GAAG;AAC5D,QAAM,UAAmC,CAAC;AAE1C,aAAW,aAAa,aAAa;AACnC,UAAM,eAAe,mBAAAC,QAAK,KAAK,WAAW,oBAAoB;AAC9D,UAAM,aAAa,mBAAAA,QAAK,KAAK,WAAW,WAAW;AAEnD,QAAI,MAAMC,eAAc,YAAY,GAAG;AACrC,cAAQ,KAAK,MAAM,oBAAoB,SAAS,cAAc,oBAAoB,CAAC;AACnF;AAAA,IACF;AAEA,QAAI,MAAMA,eAAc,UAAU,GAAG;AACnC,cAAQ,KAAK,MAAM,oBAAoB,SAAS,YAAY,WAAW,CAAC;AAAA,IAC1E;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,4BAA4B,SAAiB,KAAuB;AAC3E,QAAM,eAAe,mBAAAD,QAAK,QAAQ,OAAO;AACzC,QAAM,cAAc,mBAAAA,QAAK,QAAQ,GAAG;AACpC,QAAM,eAAe,mBAAAA,QAAK,SAAS,cAAc,WAAW;AAE5D,MAAI,CAAC,gBAAgB,iBAAiB,KAAK;AACzC,WAAO,CAAC,YAAY;AAAA,EACtB;AAEA,QAAM,QAAQ,aAAa,MAAM,mBAAAA,QAAK,GAAG,EAAE,OAAO,OAAO;AACzD,QAAM,cAAc,CAAC,YAAY;AAEjC,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,gBAAY,KAAK,mBAAAA,QAAK,KAAK,cAAc,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;AAAA,EACxE;AAEA,SAAO;AACT;AAEA,eAAeC,eAAc,UAAoC;AAC/D,MAAI;AACF,UAAM,OAAO,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AACnC,WAAO,KAAK,OAAO;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,oBACb,SACA,cACA,UACgC;AAChC,SAAO;AAAA,IACL,MAAM;AAAA,IACN,cAAc,mBAAAF,QAAK,SAAS,SAAS,YAAY,KAAK;AAAA,IACtD;AAAA,IACA,SAAS,MAAM,kBAAAE,QAAG,SAAS,cAAc,MAAM;AAAA,EACjD;AACF;AAEA,SAAS,uBAAuB,OAAyE;AACvG,QAAM,WAAW,uBAAuB;AACxC,MAAI,aAAa;AACjB,MAAI,YAAY;AAChB,QAAM,QAAkB,CAAC;AAEzB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,QAAQ,KAAK,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,KAAK,QAAQ;AAAA;AAAA,QAAa,KAAK,YAAY;AAAA;AAAA;AAChE,UAAM,QAAQ,GAAG,OAAO,GAAG,KAAK,OAAO,GAAG,QAAQ;AAClD,UAAM,YAAY,MAAM,SAAS,IAAI,SAAS;AAC9C,UAAM,aAAa,OAAO,WAAW,YAAY,OAAO,MAAM;AAE9D,QAAI,aAAa,cAAc,UAAU;AACvC,YAAM,KAAK,GAAG,SAAS,GAAG,KAAK,EAAE;AACjC,oBAAc;AACd;AAAA,IACF;AAEA,gBAAY;AACZ,UAAM,iBAAiB,KAAK,IAAI,GAAG,WAAW,aAAa,OAAO,WAAW,WAAW,MAAM,CAAC;AAC/F,UAAM,SAAS;AACf,UAAM,cAAc,OAAO,WAAW,QAAQ,MAAM;AACpD,UAAM,eAAe,KAAK,IAAI,GAAG,iBAAiB,WAAW;AAC7D,UAAM,SAAS,aAAa,OAAO,YAAY;AAC/C,UAAM,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,EAAE;AAC3C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,MAAM,KAAK,EAAE;AAAA,IACtB;AAAA,EACF;AACF;AAEA,SAAS,yBAAiC;AACxC,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,OAAO,SAAS,KAAK,EAAE,IAAI,OAAO;AACvD,SAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAC1D;AAEA,SAAS,aAAa,OAAe,OAAuB;AAC1D,QAAM,SAAS,OAAO,KAAK,OAAO,MAAM;AACxC,MAAI,OAAO,UAAU,OAAO;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,OAAO,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,CAAC,EAAE,SAAS,MAAM;AAC/D;AAhJA,IAAAC,mBACAC,oBASM;AAVN;AAAA;AAAA;AAAA,IAAAD,oBAAe;AACf,IAAAC,qBAAiB;AAIjB;AACA;AAEA;AAEA,IAAM,gCAAgC,KAAK;AAAA;AAAA;;;ACIpC,SAAS,0BACd,UACA,SACA,SACA,cAC4B;AAC5B,MAAI,CAAC,yBAAyB,YAAY,KAAK,CAAC,uBAAuB,IAAI,QAAQ,GAAG;AACpF,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,yBAAyB,QAAQ,QAAQ;AAC9D,MAAI,CAAC,aAAa,oBAAoB;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,gBAAgB,aAAa,eAAe,yBAAyB,OAAO,IAAI;AAChG,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,OAAK,aAAa,eAAe,aAAa,qBAAqB,yBAAyB,OAAO,GAAG;AACpG,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,cAA0C;AAC1E,SAAO,CAAC,GAAG,aAAa,gBAAgB,EAAE,KAAK,CAAC,SAAS,wBAAwB,IAAI,IAAI,CAAC;AAC5F;AAEA,SAAS,yBAAyB,UAGhC;AACA,QAAM,SAAS,4BAA4B,QAAQ;AACnD,QAAM,mBAAmB,UAAU,IAAI,SAAS,MAAM,MAAM,IAAI;AAChE,MAAI,qBAAqB;AACzB,MAAI,cAAc;AAElB,aAAW,WAAW,kBAAkB;AACtC,QAAI,QAAQ,SAAS,UAAU,OAAO,QAAQ,SAAS,UAAU;AAC/D;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,KAAK,WAAW,yBAAyB,GAAG;AACvD;AAAA,IACF;AAEA,yBAAqB;AACrB,QAAI,QAAQ,SAAS,mCAAmC;AACtD,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,4BAA4B,UAAmC;AACtE,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AAC5D,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,QAAI,QAAQ,SAAS,UAAU,CAAC,QAAQ,WAAW,kBAAkB,QAAQ,OAAO,GAAG;AACrF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,SAA0B;AAC1D,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACtE,WAAO,mBAAmB,KAAK,CAAC,YAAY,QAAQ,KAAK,OAAO,CAAC;AAAA,EACnE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,2BACP,MACA,OACA,MACA,eACqB;AACrB,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,KAAK;AAAA,MACX;AAAA,QACE,IAAI;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAxIA,IAIM,yBACA,wBACA;AANN;AAAA;AAAA;AAAA;AAIA,IAAM,0BAA0B,oBAAI,IAAI,CAAC,gBAAgB,oBAAoB,CAAC;AAC9E,IAAM,yBAAyB,oBAAI,IAAI,CAAC,cAAc,aAAa,gBAAgB,aAAa,gBAAgB,CAAC;AACjH,IAAM,qBAAqB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA;AAAA;;;ACsBA,eAAsB,aAAa,SAAiD;AAClF,MAAI,CAAC,QAAQ,OAAO,QAAQ;AAC1B,UAAM,IAAI,MAAM,yEAAyE;AAAA,EAC3F;AACA,QAAM,iBAAiB,MAAM,mBAAmB,QAAQ,GAAG;AAC3D,QAAM,WAAW,QAAQ,YAAY,EAAE,MAAM,QAAiB,MAAM,OAAO;AAC3E,MAAI,UAAU,MAAM,sBAAsB,QAAQ,SAAS,QAAQ,OAAO,QAAQ,YAAY;AAC9F,QAAM,SAAS,IAAI,cAAAC,QAAO,EAAE,QAAQ,QAAQ,OAAO,QAAQ,SAAS,QAAQ,OAAO,QAAQ,CAAC;AAC5F,QAAM,mBAAmB,CAAC,QAAQ;AAClC,QAAM,eAAe,QAAQ,gBAAiB,MAAM,0BAA0B,QAAQ,MAAM;AAC5F,QAAM,qBAAqB,aAAa,YAAY,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI;AACpF,QAAM,cAAc,IAAI,YAAY,QAAQ,OAAO,MAAM,UAAU;AACnE,QAAM,YAAY,IAAI,cAAc;AACpC,QAAM,gBAAgB,KAAK,IAAI,GAAG,QAAQ,OAAO,iBAAiB;AAClE,QAAM,qBAAqB,gBAAgB,KAAK,IAAI,GAAG,QAAQ,OAAO,sBAAsB;AAC5F,QAAM,4BAA4B,QAAQ,UAAU,SAAS,SAAS,mBAAmB,QAAQ,QAAQ,SAAS,IAAI;AACtH,MAAI,uBAAuB;AAC3B,MAAI,eAAe,oBAAI,IAAY;AACnC,MAAI,6BAA6B;AACjC,MAAI,EAAE,qBAAqB,kBAAkB,qBAAqB,IAAI,yBAAyB,OAAO;AACtG,MAAI,6BAA6B;AACjC,MAAI,6BAA6B;AACjC,MAAI,uBAAuB;AAC3B,MAAI;AACF,aAAS,YAAY,KAAK,aAAa,GAAG;AACxC,qBAAe,QAAQ,aAAa,uBAAuB;AAC3D,UAAI,gBAAgB,QAAQ,qBAAqB,SAAS,GAAG;AAC3D,kBAAU,MAAM,mBAAmB,SAAS,QAAQ,cAAc,SAAS;AAC3E,gBAAQ,WAAW,WAAW,kBAAkB,SAAS,0DAA0D;AACnH,eAAO;AAAA,UACL;AAAA,UACA,cAAc,CAAC,GAAG,YAAY;AAAA,UAC9B,uBAAuB;AAAA,UACvB,oBAAoB;AAAA,UACpB,SAAS;AAAA,UACT,aAAa,cAAc,SAAS;AAAA,UACpC,QAAQ;AAAA,QACV;AAAA,MACF;AACA,gBAAU,MAAM,4BAA4B,SAAS,SAAS,UAAU,eAAe,YAAY;AACnG,qBAAe,QAAQ,aAAa,uBAAuB;AAC3D,YAAM,eAAe,MAAM,uBAAuB,eAAe,cAAc,UAAU,QAAQ,GAAG;AACpG,YAAM,oBAAoB,uBAAuB;AAAA,QAC/C,QAAQ,eAAe;AAAA,QACvB;AAAA,QACA,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,WAAW,QAAQ,WAAW;AAAA,QAC9B,aAAa,aAAa;AAAA,QAC1B;AAAA,MACF,CAAC;AACD,UAAI,eAAe,wBAAwB,QAAQ,KAAK,QAAQ,QAAQ,gBAAgB,QAAQ,WAAW,QAAQ,WAAW,QAAQ,mBAAmB,cAAc,mBAAmB,QAAQ,UAAU;AAC5M,qBAAe,+BAA+B,cAAc,QAAQ,YAAY,WAAW,eAAe,0BAA0B;AACpI,YAAM,eAAe,iBAAiB,QAAQ,OAAO,OAAO,0BAA0B;AACtF,YAAM,gBAAgB,2BAA2B,QAAQ,QAAQ,cAAc,0BAA0B;AACzG,YAAM,iBAAiB,oBAAoB,cAAc,QAAQ,UAAU,aAAa;AACxF,YAAM,6BAA6B,iCAAiC,aAAa,aAAa,EAAE,OAAO,QAAQ,OAAO,WAAW,QAAQ,WAAW,WAAW,aAAa,aAAa,aAAa,2BAA2B,kBAAkB,sBAAsB,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,CAAC;AACrS,YAAM,sBAAsB,iCAAiC,4BAA4B,EAAE,SAAS,cAAc,4BAA4B,mBAAmB,QAAQ,kBAAkB,CAAC;AAC5L,gBAAU,eAAe,aAAa,uBAAuB,OAAO,IAAI;AACxE,UAAI,eAAe,cAAc,CAAC,sBAAsB;AACtD,gBAAQ,WAAW,WAAW,wCAAwC,eAAe,cAAc,kCAAkC;AACrI,+BAAuB;AAAA,MACzB;AACA,6BAAuB,QAAQ,WAAW,WAAW,eAAe,kBAAkB;AACtF,UAAI;AACJ,YAAM,sBAA4C,CAAC;AACnD,cAAQ,WAAW,mBAAmB;AACtC,UAAI;AACF,mBAAW,MAAM,uBAAuB,QAAQ,eAAe,UAAU,cAAc,qBAAqB,QAAQ,WAAW,QAAQ,aAAa,CAAC,WAAW,oBAAoB,KAAK,MAAM,CAAC;AAChM,kBAAU,yBAAyB,SAAS,mBAAmB;AAC/D,qCAA6B;AAAA,MAC/B,SAAS,OAAO;AACd,kBAAU,yBAAyB,SAAS,mBAAmB;AAC/D,YAAI,CAAC,uBAAuB,KAAK,GAAG;AAClC,gBAAM;AAAA,QACR;AACA,sCAA8B;AAC9B,kBAAU,MAAM,oBAAoB,SAAS,QAAQ,cAAc,4BAA4B,KAAK;AACpG,cAAM,UAAU,uBAAuB,0BAA0B;AACjE,gBAAQ,WAAW;AAAA,UACjB;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,QAAQ,OAAO;AAAA,YACf;AAAA,YACA;AAAA,UACF;AAAA,QACF;AACA,cAAMC,OAAM,SAAS,QAAQ,WAAW;AACxC;AAAA,MACF,UAAE;AACA,gBAAQ,WAAW,kBAAkB;AAAA,MACvC;AACA,6BAAuB,UAAU,OAAO;AACxC,qBAAe,QAAQ,aAAa,uBAAuB;AAC3D,UAAI,SAAS,UAAU,WAAW,GAAG;AACnC,cAAM,YAAY,MAAM,oBAAoB;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,YAAI,UAAU,SAAS,YAAY;AACjC,oBAAU,UAAU;AACpB,uCAA6B,UAAU;AACvC;AAAA,QACF;AACA,iCAAyB,UAAU,OAAO;AAC1C,eAAO,UAAU;AAAA,MACnB;AACA,gBAAU,MAAM,QAAQ,aAAa,eAAe,SAAS;AAAA,QAC3D,cAAc,aAAa,SAAS,SAAS;AAAA,UAC3C,kBAAkB,SAAS;AAAA,UAC3B,WAAW,SAAS;AAAA,QACtB,CAAC;AAAA,MACH,CAAC;AACD,YAAM,oBAAqC,CAAC;AAC5C,YAAM,oBAAoB,oBAAI,IAAY;AAC1C,UAAI,gBAAgB;AACpB,iBAAW,YAAY,SAAS,WAAW;AACzC,uBAAe,QAAQ,aAAa,uBAAuB;AAC3D,gBAAQ,WAAW,aAAa,SAAS,SAAS,MAAM,SAAS,SAAS,SAAS;AACnF,wBAAgB,iBAAiB,SAAS,SAAS,SAAS;AAC5D,qCAA6B,4BAA4B,4BAA4B,SAAS,SAAS,IAAI;AAC3G,cAAM,UAAU,oBAAoB,SAAS,SAAS,SAAS;AAC/D,YAAI,YAAY,SAAS,SAAS,SAAS,eAAe,SAAS,SAAS,SAAS,mBAAmB;AACtG,gBAAM,iBAAiB,gBAAgB,OAAO;AAC9C,cAAI,CAAC,eAAe,cAAc,CAAC,eAAe,gBAAgB;AAChE,sBAAU,MAAM,QAAQ,aAAa,KAAK;AAAA,cACxC,GAAG;AAAA,cACH,mBAAmB,yBAAyB,QAAQ,iBAAiB;AAAA,YACvE,CAAC;AACD,aAAC,EAAE,qBAAqB,kBAAkB,qBAAqB,IAAI,yBAAyB,OAAO;AACnG,yCAA6B;AAAA,UAC/B;AAAA,QACF;AACA,cAAM,gBAAgB,UAAU,iBAAiB,QAAQ;AACzD,cAAM,oBAAoB,gBACtB,OACA,qBAAqB,SAAS,SAAS,MAAM,SAAS,SAAS,WAAW,SAAS,QAAQ;AAC/F,cAAM,qBAAqB,iBAAiB,oBACxC,OACA,uBAAuB,SAAS,SAAS,MAAM,iBAAiB;AACpE,cAAM,wBAAwB,iBAAiB,qBAAqB,qBAChE,OACA,0BAA0B,SAAS,SAAS,MAAM,SAAS,SAAS,WAAW,SAAS,iBAAiB;AAC7G,cAAM,gBAAgB,KAAK,IAAI;AAC/B,cAAM,SAAS,iBAAiB,qBAAqB,sBAAsB,yBAA0B,MAAM,4BAA4B,cAAc,UAAU,SAAS,gBAAgB,WAAW;AACnM,uBAAe,QAAQ,aAAa,uBAAuB;AAC3D,cAAM,WAAW,cAAc,SAAS,OAAO,WAAW;AAC1D,YAAI,UAAU,cAAc,QAAQ;AAClC,yBAAe,oBAAI,IAAI,CAAC,GAAG,cAAc,GAAG,SAAS,YAAY,CAAC;AAClE,mBAAS,aAAa,QAAQ,CAAC,gBAAgB,kBAAkB,IAAI,WAAW,CAAC;AACjF,oBAAU,MAAM;AAChB,oBAAU,MAAM,QAAQ,aAAa,KAAK;AAAA,YACxC,GAAG;AAAA,YACH,mBAAmB,yBAAyB,QAAQ,mBAAmB;AAAA,cACrE,cAAc,SAAS;AAAA,YACzB,CAAC;AAAA,UACH,CAAC;AACD,WAAC,EAAE,qBAAqB,kBAAkB,qBAAqB,IAAI,yBAAyB,OAAO;AACnG,uCAA6B;AAAA,QAC/B;AACA,cAAM,sBAAsB,UAAU,cAAc,YAChD,SAAS,eACT,kCAAkC;AAAA,UAChC,UAAU,SAAS,SAAS;AAAA,UAC5B,SAAS,SAAS,SAAS;AAAA,UAC3B,cAAc,QAAQ,mBAAmB,gBAAgB,CAAC,GAAG,YAAY;AAAA,UACzE,UAAU,OAAO;AAAA,QACnB,CAAC;AACL,YAAI,qBAAqB;AACvB,oBAAU,MAAM,QAAQ,aAAa,KAAK;AAAA,YACxC,GAAG;AAAA,YACH,mBAAmB,0BAA0B,QAAQ,mBAAmB,mBAAmB;AAAA,UAC7F,CAAC;AACD,WAAC,EAAE,qBAAqB,kBAAkB,qBAAqB,IAAI,yBAAyB,OAAO;AAAA,QACrG;AACA,YAAI,OAAO,IAAI;AACb,kBAAQ,WAAW,eAAe,SAAS,SAAS,MAAM,OAAO,MAAM;AAAA,QACzE,OAAO;AACL,kBAAQ,WAAW,cAAc,SAAS,SAAS,MAAM,OAAO,MAAM;AAAA,QACxE;AACA,cAAM,oBAAoB,MAAM,wBAAwB;AAAA,UACtD,YAAY,SAAS;AAAA,UACrB,UAAU,SAAS,SAAS;AAAA,UAC5B,WAAW,OAAO;AAAA,UAClB,WAAW,QAAQ;AAAA,UACnB;AAAA,QACF,CAAC;AACD,0BAAkB,KAAK,iBAAiB;AACxC,kBAAU,MAAM,QAAQ,aAAa,eAAe,yBAAyB,SAAS,EAAE,UAAU,SAAS,SAAS,MAAM,YAAY,KAAK,IAAI,IAAI,eAAe,IAAI,OAAO,IAAI,wBAAwB,kBAAkB,uBAAuB,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAAA,MAC3Q;AACA,gBAAU,MAAM,2BAA2B,EAAE,SAAS,cAAc,QAAQ,cAAc,WAAW,SAAS,UAAU,IAAI,CAAC,aAAa,SAAS,SAAS,IAAI,GAAG,cAAc,mBAAmB,cAAc,CAAC,GAAG,iBAAiB,EAAE,CAAC;AAC1O,6BAAuB,gBAAgB,IAAI,uBAAuB;AAClE,UAAI,yBAAyB,sBAAsB,SAAS,SAAS,GAAG;AACtE,kBAAU,MAAM,QAAQ,aAAa,eAAe,SAAS;AAAA,UAC3D;AAAA,YACE;AAAA,YACA;AAAA,cACE;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA,UAAI,wBAAwB,CAAC,qBAAqB;AAChD,kBAAU,MAAM,QAAQ,aAAa,KAAK;AAAA,UACxC,GAAG;AAAA,UACH,mBAAmB,yBAAyB,QAAQ,iBAAiB;AAAA,QACvE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,mBAAmB,MAAM,QAAQ,aAAa,KAAK,OAAO,EAAE,MAAM,MAAM,OAAO;AACrF,UAAM,IAAI,eAAe,gBAAgB,KAAK,GAAG,kBAAkB,EAAE,OAAO,MAAM,CAAC;AAAA,EACrF,UAAE;AACA,QAAI,kBAAkB;AACpB,YAAM,aAAa,QAAQ,EAAE,MAAM,MAAM,MAAS;AAAA,IACpD;AAAA,EACF;AACF;AApQA;AAAA;AAAA;AAAA;AAAA,oBAAmB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA,IAAAC;AACA;AACA,IAAAC;AACA;AACA;AAEA;AACA;AAAA;AAAA;;;AC/BA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,uBAAoD;AACpD,IAAAC,gBAAsB;AACtB,IAAAC,iBAAmB;;;ACJnB;AACA;AACA;AACA;AAOA,eAAsB,oBAAoB,SAAiD;AACzF,QAAM,QAAQ,IAAI,mBAAmB,QAAQ,OAAO;AACpD,QAAM,MAAM,IAAI,WAAW,QAAQ,OAAO;AAC1C,QAAM,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK;AAE1C,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB;AAAA,MACxC,SAAS,IAAI;AAAA,MACb,KAAK,IAAI;AAAA,MACT,WAAW,IAAI;AAAA,MACf,gBAAgB,IAAI,kBAAkB,IAAI;AAAA,MAC1C,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,OAAO,WAAW,OAAO,WACpC,cACA,OAAO,aAAa,IAClB,cACA;AAEN,UAAM,YAAY,MAAM,MAAM,SAAS,IAAI,IAAI;AAAA,MAC7C;AAAA,MACA,UAAU,OAAO,OAAO,aAAa,WAAW,OAAO,WAAW;AAAA,MAClE,QAAQ,aAAa,OAAO,UAAU,IAAI,IAAM;AAAA,IAClD,CAAC;AACD,UAAM,iBAAiB,KAAK,SAAS;AAAA,EACvC,SAAS,OAAO;AACd,UAAM,YAAY,MAAM,MAAM,SAAS,IAAI,IAAI;AAAA,MAC7C,QAAQC,iBAAgB,KAAK,IAAI,cAAc;AAAA,MAC/C,UAAUC,cAAa,KAAK;AAAA,MAC5B,QAAQ,aAAaC,mBAAkB,KAAK,GAAG,IAAM;AAAA,IACvD,CAAC;AACD,UAAM,iBAAiB,KAAK,SAAS;AAAA,EACvC;AACF;AAEA,eAAe,iBAAiB,KAAiB,KAAqE;AACpH,QAAM,aACJ,IAAI,WAAW,cACX,cACA,IAAI,WAAW,cACb,cACA;AACR,QAAM,UAAU,aAAa,IAAI,QAAQ,KAAK,KAAK,eAAe,GAAG;AACrE,QAAM,IAAI;AAAA,IACR,MAAM,IAAI,EAAE;AAAA,IACZ,IAAI;AAAA,IACJ,OAAO,IAAI,EAAE,KAAK,UAAU,KAAK,IAAI,OAAO;AAAA,EAAK,OAAO;AAAA,IACxD;AAAA,IACA;AAAA,MACE,OAAO,IAAI;AAAA,MACX,WAAW,IAAI;AAAA,MACf,UAAU,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAASF,iBAAgB,OAAyB;AAChD,SAAO,QAAS,MAAiC,QAAQ;AAC3D;AAEA,SAASC,cAAa,OAAoC;AACxD,QAAM,WAAY,MAAiC;AACnD,SAAO,OAAO,aAAa,YAAY,OAAO,SAAS,QAAQ,IAAI,KAAK,MAAM,QAAQ,IAAI;AAC5F;AAEA,SAASC,mBAAkB,OAAwB;AACjD,QAAM,MAAO,MAA4B;AACzC,MAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAC7C,WAAO;AAAA,EACT;AAEA,QAAM,UAAW,MAAgC;AACjD,SAAO,OAAO,YAAY,YAAY,QAAQ,SAAS,IAAI,UAAU;AACvE;;;AD9EA;AACA;AACAC;;;AETA,IAAAC,qBAAiB;;;ACAjB;AACA;;;ACDA;;;ACAA;;;ACAO,SAAS,2BAA2B,SAAiD;AAC1F,QAAM,aAAa,OAAO,WAAW,EAAE,EAAE,KAAK;AAC9C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,WAAW,MAAM,qBAAqB;AAC5D,MAAI,CAAC,gBAAgB,CAAC,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,cAAc,CAAC,EAAE,KAAK;AACrC,MAAI,CAAC,UAAU,eAAe,KAAK,MAAM,GAAG;AAC1C,WAAO;AAAA,EACT;AAEA,SAAO,YAAY,OAAO,QAAQ,MAAM,KAAK,CAAC;AAChD;;;ACjBA,IAAM,sBAAsB;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,wBAAwB,oBAAoB,mBAAmB;AACrE,IAAM,mBAAmB,oBAAoB,cAAc;AAC3D,IAAM,qBAAqB,oBAAoB,gBAAgB;AAC/D,IAAM,qBAAqB,oBAAoB,gBAAgB;AAEtE,SAAS,oBAAoB,OAAkC;AAC7D,SAAO,IAAI,OAAO,IAAI,MAAM,IAAI,YAAY,EAAE,KAAK,GAAG,CAAC,KAAK,GAAG;AACjE;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;;;ACjEA,IAAAC,sBAAmB;AAKnB,IAAM,sBAAsB;AAErB,SAAS,2BAA2B,MAAqC;AAC9E,QAAM,aAAaC,eAAc,IAAI,KAAK;AAC1C,SAAO;AAAA,IACL,KAAK,oBAAAC,QAAO,WAAW,MAAM,EAAE,OAAO,WAAW,YAAY,CAAC,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,IACzF,MAAM;AAAA,EACR;AACF;AAEO,SAAS,qBAAqB,MAAmD;AACtF,QAAM,OAAO,yBAAyB,KAAK,WAAW;AACtD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACF;AACF;AAEO,SAAS,yBAAyB,aAAkD;AACzF,QAAM,QAAQ,OAAO,eAAe,EAAE,EAAE,MAAM,uCAAuC;AACrF,MAAI,CAAC,QAAQ,CAAC,GAAG;AACf,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAM,CAAC,CAAC;AAClC,QAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,OAAO,OAAO,CAAC,OAAO,QAAQ,CAAC,OAAO,WAAW;AACpD,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,SAAS,YAAY,OAAO,SAAS,oBAAoB,OAAO,SAAS,cAAc;AAChG,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,KAAKD,eAAc,OAAO,GAAG;AAAA,MAC7B,MAAM,OAAO;AAAA,MACb,WAAWA,eAAc,OAAO,SAAS;AAAA,MACzC,mBAAmBE,uBAAsB,OAAO,iBAAiB;AAAA,MACjE,aAAaA,uBAAsB,OAAO,WAAW;AAAA,MACrD,OAAOA,uBAAsB,OAAO,KAAK;AAAA,IAC3C;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,0BAA0B,aAAqB,MAAoC;AACjG,QAAM,OAAO,0BAA0B,WAAW;AAClD,QAAM,UAAU,KAAK;AAAA,IACnB;AAAA,MACE,KAAKF,eAAc,KAAK,GAAG;AAAA,MAC3B,MAAM,KAAK;AAAA,MACX,WAAWA,eAAc,KAAK,SAAS;AAAA,MACvC,mBAAmBE,uBAAsB,KAAK,iBAAiB;AAAA,MAC/D,aAAaA,uBAAsB,KAAK,WAAW;AAAA,MACnD,OAAOA,uBAAsB,KAAK,KAAK;AAAA,IACzC;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,CAAC,MAAM,qBAAqB,OAAO,EACvC,OAAO,CAAC,SAAS,QAAQ,KAAK,KAAK,EAAE,SAAS,CAAC,EAC/C,KAAK,MAAM;AAChB;AAEO,SAAS,0BAA0B,aAA6B;AACrE,SAAO,OAAO,eAAe,EAAE,EAC5B,QAAQ,2CAA2C,EAAE,EACrD,KAAK;AACV;AAEA,SAASF,eAAc,OAAwB;AAC7C,SAAO,OAAO,SAAS,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACvD;AAEA,SAASE,uBAAsB,OAAoC;AACjE,QAAM,aAAaF,eAAc,KAAK;AACtC,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;;;AHjFO,SAAS,yBAAyB,OAIhB;AACvB,QAAM,YAAY,2BAA2B,qBAAqB,MAAM,OAAO,MAAM,OAAO,CAAC;AAC7F,QAAM,OAAO,UAAU;AACvB,QAAM,oBAAoB,2BAA2B,yBAAyB,IAAI,CAAC;AACnF,QAAM,qBAAqB,sBAAsB,KAAK,IAAI;AAC1D,QAAM,gBAAgB,iBAAiB,KAAK,IAAI;AAChD,QAAM,kBAAkB,QAAQ,iBAAiB,KAAK,mBAAmB,KAAK,IAAI;AAClF,QAAM,gBAAgB,sBAAsB,wBAAwB,KAAK,IAAI;AAC7E,QAAM,kBAAkB,iBAAiB,qBAAqB,KAAK,IAAI;AAEvE,MAAI,QAAQ;AACZ,MAAI,UAAU,KAAK,UAAU,IAAI;AAC/B,aAAS;AAAA,EACX;AACA,MAAI,mBAAmB,KAAK,IAAI,GAAG;AACjC,aAAS;AAAA,EACX;AACA,MAAI,oBAAoB;AACtB,aAAS;AAAA,EACX;AACA,MAAI,iBAAiB,mBAAmB,eAAe;AACrD,aAAS;AAAA,EACX;AACA,OAAK,MAAM,UAAU,eAAe,UAAU,KAAK,GAAG;AACpD,aAAS;AAAA,EACX;AACA,OAAK,MAAM,UAAU,uBAAuB,UAAU,KAAK,MAAM,MAAM,UAAU,WAAW,UAAU,KAAK,GAAG;AAC5G,aAAS;AAAA,EACX;AAEA,QAAM,aAAa,SAAS,IAAI,YAAY,SAAS,IAAI,aAAa;AAEtE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAAe,SAAgC;AAC3E,QAAM,kBAAkB,OAAO,SAAS,EAAE,EAAE,KAAK;AACjD,MAAI,mBAAmB,CAAC,kBAAkB,eAAe,KAAK,CAAC,wBAAwB,eAAe,GAAG;AACvG,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,aAAa,CAAC,kBAAkB,QAAQ,UAAU,SAAS,GAAG;AACnF,WAAO,QAAQ,UAAU;AAAA,EAC3B;AAEA,WAAS,QAAQ,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;AACpE,UAAM,UAAU,QAAQ,SAAS,KAAK;AACtC,QAAI,SAAS,SAAS,QAAQ;AAC5B;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK;AACnD,QAAI,WAAW,CAAC,kBAAkB,OAAO,GAAG;AAC1C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,mBAAmB;AAC5B;AAEA,SAAS,yBAAyB,MAAkC;AAClE,QAAM,gBAAgB,KAAK,MAAM,WAAW;AAC5C,MAAI,gBAAgB,CAAC,KAAK,mBAAmB,KAAK,IAAI,GAAG;AACvD,WAAO,cAAc,CAAC,EAAE,KAAK;AAAA,EAC/B;AAEA,QAAM,gBAAgB,KAAK,MAAM,sCAAsC;AACvE,MAAI,gBAAgB,CAAC,GAAG;AACtB,WAAO,cAAc,CAAC,EAAE,KAAK;AAAA,EAC/B;AAEA,SAAO;AACT;;;AIjGA;AACA;AACA;AACA;AACA;AACA;AACAG;AACAC;AACAD;AACA;AACAA;AAWA,eAAsB,2BAA2B,OAa9C;AACD,QAAM,OAAO;AAAA,IACX,iBAAiB,MAAM,MAAM,oBAAoB,OAAO,YACtD,gBAAuB;AAAA,MACrB,GAAG;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACH,sBAAsB,MAAM,MAAM,wBAAwB;AAAA,IAC1D,wBAAwB,MAAM,MAAM,0BAA0B;AAAA,EAChE;AACA,QAAM,YAAY,IAAI,UAAU,MAAM,OAAO;AAC7C,MAAI,UAAU,MAAM,MAAM,aAAa,KAAK;AAAA,IAC1C,GAAG,MAAM;AAAA,IACT,WAAW;AAAA,MACT,GAAI,MAAM,QAAQ,aAAa,qBAAqB;AAAA,MACpD,WAAW,MAAM,SAAS,UAAU;AAAA,MACpC,gBAAe,oBAAI,KAAK,GAAE,YAAY;AAAA,IACxC;AAAA,EACF,CAAC;AAED,UAAQ,MAAM,SAAS,QAAQ;AAAA,IAC7B,KAAK,qBAAqB;AACxB,YAAM,OAAO,MAAM,SAAS;AAC5B,UAAI,CAAC,MAAM;AACT,eAAO,EAAE,SAAS,UAAU,MAAM,SAAS;AAAA,MAC7C;AAEA,YAAM,aAAa,WAAW,KAAK,OAAO,EAAE;AAC5C,YAAM,SAAS,MAAM,KAAK,gBAAgB;AAAA,QACxC,aAAa,KAAK,OAAO;AAAA,QACzB,QAAQ,oBAAoB,MAAM,UAAU,KAAK,OAAO,IAAI,KAAK,OAAO,OAAO;AAAA,QAC/E,WAAW,MAAM,SAAS,gBAAgB;AAAA,QAC1C,KAAK,MAAM;AAAA,QACX,QAAQ,MAAM;AAAA,QACd,WAAW,MAAM;AAAA,MACnB,CAAC;AACD,YAAM,UAAU,OAAO,KAAK,OAAO,IAAI;AAAA,QACrC,QAAQ;AAAA,QACR,OAAO;AAAA,MACT,CAAC;AACD,gBAAU,MAAM;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,gCAAgC,KAAK,OAAO,EAAE;AAAA,mBAAsD,OAAO,OAAO;AAAA,MACpH;AACA;AAAA,IACF;AAAA,IAEA,KAAK,qBAAqB;AACxB,YAAM,OAAO,MAAM,SAAS;AAC5B,YAAM,WAAW,MAAM,SAAS;AAChC,UAAI,CAAC,QAAQ,CAAC,UAAU;AACtB,eAAO,EAAE,SAAS,UAAU,MAAM,SAAS;AAAA,MAC7C;AAEA,YAAM,UAAU,OAAO,KAAK,OAAO,IAAI,SAAS,IAAI;AACpD,YAAM,kBAAkB,WAAW,KAAK,OAAO,IAAI;AAAA,QACjD,aAAa,SAAS;AAAA,MACxB,CAAC;AACD,YAAM,YAAY,IAAI,UAAU,MAAM,OAAO;AAC7C,YAAM,WAAW,MAAM,UAAU,WAAW,SAAS,IAAI;AACzD,YAAM,SAAS,oBAAoB,MAAM,UAAU,KAAK,OAAO,IAAI,KAAK,OAAO,OAAO;AACtF,UAAI,CAAC,YAAY,SAAS,WAAW,cAAc,OAAO,SAAS,QAAQ,UAAU;AACnF,cAAM,MAAM,KAAK,qBAAqB;AAAA,UACpC,SAAS,MAAM;AAAA,UACf,QAAQ,MAAM;AAAA,UACd,MAAM,SAAS;AAAA,UACf,MAAM,SAAS;AAAA,UACf;AAAA,QACF,CAAC;AACD,cAAM,UAAU,aAAa,SAAS,MAAM,SAAS,MAAM,WAAW;AAAA,UACpE;AAAA,UACA,WAAW,UAAU;AAAA,QACvB,CAAC;AAAA,MACH;AAEA,YAAM,IAAI,WAAW,MAAM,OAAO,EAC/B,KAAK,QAAQ,SAAS,MAAM,QAAQ,SAAS,EAC7C,MAAM,MAAM,IAAI;AACnB,gBAAU,MAAM;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,+BAA+B,KAAK,OAAO,EAAE,iBAAiB,SAAS,IAAI;AAAA,MAC7E;AACA;AAAA,IACF;AAAA,IAEA,KAAK,qBAAqB;AACxB,YAAM,UAAU,2BAA2B,MAAM,SAAS,qBAAqB,MAAM,SAAS,iBAAiB;AAC/G,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE,SAAS,UAAU,MAAM,SAAS;AAAA,MAC7C;AAEA,YAAM,MAAM,MAAM,SAAS,OACvB,MAAM,IAAI,cAAc,MAAM,OAAO,EAAE,eAAe,MAAM,SAAS,KAAK,OAAO,EAAE,EAAE,MAAM,MAAM,MAAM,GAAG,IAC1G,MAAM;AACV,YAAM,QAAQ,IAAI,mBAAmB,MAAM,OAAO;AAClD,YAAM,MAAM,MAAM,MAAM,OAAO;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,WAAW;AAAA,QACX,gBAAgB,MAAM,OAAO;AAAA,MAC/B,CAAC;AACD,YAAM,MAAM,KAAK,uBAAuB;AAAA,QACtC,SAAS,MAAM;AAAA,QACf,OAAO,IAAI;AAAA,MACb,CAAC;AACD,YAAM,MAAM,OAAO,IAAI,IAAI,GAAG;AAC9B,UAAI,MAAM,SAAS,MAAM;AACvB,cAAM,aAAa,WAAW,MAAM,SAAS,KAAK,OAAO,EAAE;AAC3D,cAAM,kBAAkB,WAAW,MAAM,SAAS,KAAK,OAAO,IAAI;AAAA,UAChE,mBAAmB;AAAA,UACnB,OAAO,IAAI;AAAA,QACb,CAAC;AAAA,MACH;AACA,gBAAU,MAAM;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN,uCAAuC,IAAI,EAAE,SAAS,OAAO;AAAA,MAC/D;AACA;AAAA,IACF;AAAA,IAEA,KAAK,0BAA0B;AAC7B,gBAAU,MAAM;AAAA,QACd;AAAA,QACA,MAAM;AAAA,QACN;AAAA,MACF;AACA;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,SAAS;AACP,UAAI,MAAM,SAAS,SAAS,CAAC,MAAM,SAAS,KAAK,OAAO,SAAS,MAAM,SAAS,KAAK,OAAO,UAAU,SAAS;AAC7G,cAAM,aAAa,WAAW,MAAM,SAAS,KAAK,OAAO,EAAE;AAC3D,kBAAU,MAAM;AAAA,UACd;AAAA,UACA,MAAM;AAAA,UACN,2BAA2B,MAAM,SAAS,KAAK,OAAO,EAAE;AAAA,QAC1D;AAAA,MACF;AACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,MAAM;AAAA,EAClB;AACF;AAEA,eAAe,aAAa,WAAsB,QAA+B;AAC/E,QAAM,UAAU,MAAM,UAAU,KAAK,MAAM;AAC3C,MAAI,QAAQ,UAAU,QAAQ;AAC5B;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,OAAO;AAClB,UAAM,UAAU,MAAM,QAAQ,MAAM,EAAE,MAAM,MAAM,IAAI;AAAA,EACxD;AACF;AAEA,eAAe,kBACb,WACA,QACA,OAKe;AACf,QAAM,OAAO,MAAM,UAAU,KAAK,MAAM;AACxC,QAAM,OAAO,yBAAyB,KAAK,WAAW;AACtD,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,UAAU,KAAK;AAAA,IACnB,GAAG;AAAA,IACH,aAAa,0BAA0B,KAAK,aAAa;AAAA,MACvD,GAAG;AAAA,MACH,GAAG;AAAA,IACL,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,uBACb,SACA,cACA,MAC4C;AAC5C,QAAM,UAAU,uBAAuB,iBAAiB,IAAI,EAAE;AAC9D,QAAM,kBAAkB,QAAQ,SAC7B,MAAM,EAAE,EACR,KAAK,CAAC,YAAY,QAAQ,SAAS,UAAU,QAAQ,YAAY,OAAO;AAC3E,MAAI,iBAAiB;AACnB,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,eAAe,SAAS;AAAA,IAC1C,cAAc,QAAQ,OAAO;AAAA,EAC/B,CAAC;AACH;AAEA,SAAS,oBAAoB,UAAgC,QAAgB,SAAyB;AACpG,SAAO;AAAA,IACL,kBAAkB,MAAM,KAAK,OAAO;AAAA,IACpC,cAAc,SAAS,UAAU,IAAI;AAAA,IACrC;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,oBAAoB,UAAgC,QAAgB,SAAyB;AACpG,SAAO;AAAA,IACL,eAAe,MAAM;AAAA,IACrB,cAAc,SAAS,UAAU,IAAI;AAAA,IACrC,eAAe,OAAO;AAAA,IACtB;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AC/PAE;AACA;AACA;AACA;AACA;AACAC;AACAA;AACAA;AAIA,IAAM,kBAAkB;AAAA,EACtB,QAAQ;AAAA,EACR,gBAAgB;AAAA,EAChB,YAAY;AACd;AAEA,eAAsB,yBAAyB,OAIL;AACxC,QAAM,mBAAmB,MAAM,OAAO,EAAE,MAAM,MAAM,IAAI;AACxD,QAAM,wBAAwB,MAAM,OAAO,EAAE,MAAM,MAAM,IAAI;AAE7D,QAAM,YAAY,IAAI,UAAU,MAAM,OAAO;AAC7C,QAAM,kBAAkB,IAAI,mBAAmB,MAAM,OAAO;AAC5D,QAAM,CAAC,OAAO,WAAW,wBAAwB,WAAW,kBAAkB,MAAM,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxG,UAAU,KAAK;AAAA,IACf,IAAI,UAAU,MAAM,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACzD,gBAAgB,aAAa;AAAA,MAC3B,KAAK,MAAM;AAAA,MACX,aAAa;AAAA,IACf,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACjB,IAAI,cAAc,MAAM,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IACtD,IAAI,qBAAqB,MAAM,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC,CAAC;AAAA,IAC7D,IAAI,wBAAwB,MAAM,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO;AAAA,MAC7D,oBAAoB;AAAA,MACpB,uBAAuB;AAAA,MACvB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,EAAE;AAAA,EACJ,CAAC;AAED,QAAM,8BAA8B,WAAW,OAAO,sBAAsB;AAC5E,QAAM,iBAAiB,MAAM,UAAU,KAAK;AAC5C,QAAM,gBAAgB,eACnB,IAAI,CAAC,SAAS,qBAAqB,IAAI,CAAC,EACxC,OAAO,CAAC,SAA2C,QAAQ,QAAQ,KAAK,KAAK,QAAQ,MAAM,UAAU,GAAG,CAAC;AAC5G,QAAM,aAAa,cAChB,OAAO,CAAC,SAAS,YAAY,IAAI,CAAC,EAClC,KAAK,YAAY;AAEpB,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,KAAK,MAAM;AAAA,IACX,OAAO;AAAA,IACP,eAAe,cAAc,KAAK,YAAY;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,uBAAuB,uBAAuB,OAAO,CAAC,QAAQ,IAAI,WAAW,SAAS;AAAA,IACtF;AAAA,IACA,eAAe,UAAU,OAAO,CAAC,WAAW,OAAO,WAAW,MAAM;AAAA,IACpE,kBAAkB,UAAU,OAAO,CAAC,WAAW,OAAO,WAAW,SAAS;AAAA,IAC1E;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,8BACb,WACA,OACA,MACe;AACf,QAAM,WAAW,IAAI,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AACzD,aAAW,QAAQ,OAAO;AACxB,UAAM,eAAe,qBAAqB,IAAI;AAC9C,QAAI,CAAC,cAAc,KAAK,SAAS,KAAK,WAAW,aAAa;AAC5D;AAAA,IACF;AAEA,UAAM,MAAM,SAAS,IAAI,aAAa,KAAK,KAAK;AAChD,QAAI,CAAC,OAAO,IAAI,WAAW,eAAe,IAAI,aAAa,GAAG;AAC5D;AAAA,IACF;AAEA,UAAM,UAAU,OAAO,KAAK,IAAI;AAAA,MAC9B,QAAQ;AAAA,MACR,OAAO,KAAK,SAAS;AAAA,IACvB,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,EACrB;AACF;AAEA,SAAS,YAAY,MAAyC;AAC5D,MAAI,KAAK,OAAO,WAAW,aAAa;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,OAAO,UAAU,SAAS,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,KAAK,OAAO,SAAS,KAAK,OAAO,UAAU;AACrD;AAEA,SAAS,aAAa,MAAgC,OAAyC;AAC7F,QAAM,YAAY,gBAAgB,KAAK,KAAK,IAAI,KAAK;AACrD,QAAM,aAAa,gBAAgB,MAAM,KAAK,IAAI,KAAK;AACvD,MAAI,cAAc,YAAY;AAC5B,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,KAAK,OAAO,KAAK,MAAM,OAAO;AACvC;;;ACxGO,SAAS,wBAAwB,OAIf;AACvB,QAAM,aAAa,MAAM,KAAK,WAAW,SAAS,IAAI,MAAM,KAAK,aAAa,MAAM,SAAS;AAC7F,QAAM,aAAa,WAAW,KAAK,CAAC,SAAS,KAAK,KAAK,SAAS,QAAQ;AACxE,QAAM,qBAAqB,WAAW,KAAK,CAAC,SAAS,KAAK,KAAK,SAAS,gBAAgB;AACxF,QAAM,iBAAiB,WAAW,KAAK,CAAC,SAAS,KAAK,KAAK,SAAS,YAAY;AAEhF,MAAI,YAAY;AACd,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,SAAS,WAAW,OAAO,EAAE;AAAA,MACrC,MAAM;AAAA,MACN,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,mBAAmB,MAAM,SAAS,mBAAmB;AACtE,UAAM,eAAe,MAAM,SAAS,sBAAsB,KAAK,CAAC,QAAQ,IAAI,YAAY,MAAM,SAAS,iBAAiB;AACxH,QAAI,gBAAgB,CAAC,sBAAsB,CAAC,gBAAgB;AAC1D,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,kBAAkB,aAAa,EAAE;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,aAAa,kBAAkB;AACrC,QAAI,YAAY;AACd,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ,SAAS,WAAW,OAAO,EAAE;AAAA,QACrC,MAAM;AAAA,QACN,mBAAmB,MAAM,SAAS;AAAA,MACpC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,sBAAsB,yBAAyB,MAAM,UAAU,MAAM,UAAU,kBAAkB,GAAG;AACtG,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ,SAAS,mBAAmB,OAAO,EAAE;AAAA,MAC7C,MAAM;AAAA,MACN,UAAU,qBAAqB,MAAM,SAAS,eAAe,MAAM,SAAS,WAAW,kBAAkB;AAAA,IAC3G;AAAA,EACF;AAEA,MAAI,CAAC,sBAAsB,CAAC,kBAAkB,wBAAwB,MAAM,QAAQ,GAAG;AACrF,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,YAAY,sBAAsB,kBAAkB,WAAW,CAAC;AACtE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,YACJ,oBAAoB,UAAU,OAAO,EAAE,0BACvC;AAAA,IACJ,MAAM;AAAA,EACR;AACF;AAEA,SAAS,yBACP,UACA,UACA,MACS;AACT,MAAI,KAAK,OAAO,YAAY,KAAK,OAAO,aAAa,QAAQ;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,eAAe;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,SAAS,mBAAmB,SAAS,eAAe,cAAc,SAAS,cAAc,SAAS,KAAK,SAAS,UAAU,WAAW;AAC9I;AAEA,SAAS,qBACP,eACA,WACA,MACgC;AAChC,MAAI,KAAK,OAAO,UAAU;AACxB,UAAM,WAAW,UAAU,KAAK,CAAC,WAAW,OAAO,SAAS,KAAK,OAAO,QAAQ;AAChF,WAAO;AAAA,MACL,MAAM,KAAK,OAAO;AAAA,MAClB,MAAM,UAAU,QAAQ;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,UAAM,YAAY,cAAc,CAAC;AACjC,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,QACL,MAAM,UAAU,UAAU,SAAS,CAAC;AAAA,QACpC,MAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,UAAU;AAAA,MAChB,MAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,UAAU,UAAU,SAAS,CAAC;AAAA,IACpC,MAAM;AAAA,EACR;AACF;AAEA,SAAS,wBAAwB,UAAiD;AAChF,SAAO,SAAS,sBAAsB,SAAS,KAAK,SAAS,iBAAiB,SAAS;AACzF;;;AC9HAC;AASA,eAAsB,eAAe,OAKH;AAChC,QAAM,QAAQ,eAAe,MAAM,QAAQ;AAC3C,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,MACL,WAAW,MAAM,SAAS;AAAA,MAC1B,gBAAgB,CAAC;AAAA,MACjB,OAAO,MAAM;AAAA,MACb,YAAY,MAAM,cAAc,OAAO,CAAC,SAAS,KAAK,OAAO,WAAW,eAAe,KAAK,OAAO,UAAU,WAAW,CAAC;AAAA,IAC3H;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,UAAU,MAAM,OAAO;AACzC,QAAM,iBAAiB,IAAI,IAAI,MAAM,cAAc,IAAI,CAAC,SAAS,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC;AACxF,QAAM,iBAA2B,CAAC;AAElC,aAAW,QAAQ,OAAO;AACxB,QAAI,UAAU,eAAe,IAAI,KAAK,IAAI;AAC1C,QAAI,CAAC,SAAS;AACZ,YAAM,UAAU,MAAM,MAAM;AAAA,QAC1B,iBAAiB,KAAK,MAAM,MAAM,SAAS,UAAU,IAAI;AAAA,QACzD;AAAA,UACE,qBAAqB,KAAK,MAAM,MAAM,SAAS,UAAU,IAAI;AAAA,UAC7D;AAAA,YACE,KAAK,MAAM,SAAS,UAAU;AAAA,YAC9B,MAAM,KAAK;AAAA,YACX,WAAW,MAAM,SAAS,UAAU;AAAA,YACpC,mBAAmB,KAAK,SAAS,eAAe,MAAM,SAAS,oBAAoB;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AACA,qBAAe,KAAK,QAAQ,EAAE;AAC9B,YAAM,kBAAkB,qBAAqB,OAAO;AACpD,gBAAU,mBAAmB;AAC7B,UAAI,SAAS;AACX,uBAAe,IAAI,KAAK,MAAM,OAAO;AAAA,MACvC;AACA;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,gBAAgB,MAAM,SAAS,qBAAqB,QAAQ,KAAK,sBAAsB,MAAM,SAAS,mBAAmB;AACzI,YAAM,QAAQ,MAAM,MAAM,KAAK;AAAA,QAC7B,GAAG,QAAQ;AAAA,QACX,aAAa,0BAA0B,QAAQ,OAAO,aAAa;AAAA,UACjE,GAAG,QAAQ;AAAA,UACX,mBAAmB,MAAM,SAAS;AAAA,QACpC,CAAC;AAAA,MACH,CAAC;AACD,YAAM,YAAY,qBAAqB,KAAK;AAC5C,UAAI,WAAW;AACb,uBAAe,IAAI,KAAK,MAAM,SAAS;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,OAAO,eAAe,IAAI,KAAK,IAAI;AACzC,UAAM,UAAU,eAAe,IAAI,KAAK,SAAS;AACjD,QAAI,CAAC,QAAQ,CAAC,WAAW,KAAK,OAAO,UAAU,SAAS,QAAQ,OAAO,EAAE,GAAG;AAC1E;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,MAAM,OAAO,KAAK,OAAO,IAAI;AAAA,MACjD,cAAc,CAAC,QAAQ,OAAO,EAAE;AAAA,IAClC,CAAC;AACD,UAAM,YAAY,qBAAqB,OAAO;AAC9C,QAAI,WAAW;AACb,qBAAe,IAAI,KAAK,MAAM,SAAS;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,QAAQ,CAAC,GAAG,eAAe,OAAO,CAAC,EAAE,KAAKC,aAAY;AAC5D,SAAO;AAAA,IACL,WAAW,MAAM,SAAS;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,YAAY,MAAM,OAAO,CAAC,SAAS,KAAK,OAAO,WAAW,eAAe,KAAK,OAAO,UAAU,WAAW,CAAC;AAAA,EAC7G;AACF;AAEA,SAAS,eAAe,UAA4C;AAClE,MAAI,SAAS,eAAe,YAAY,CAAC,SAAS,mBAAmB,CAAC,SAAS,iBAAiB,CAAC,SAAS,eAAe;AACvH,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAoB,CAAC;AAC3B,MAAI,SAAS,sBAAsB,SAAS,eAAe;AACzD,UAAM,KAAK,EAAE,MAAM,SAAS,CAAC;AAAA,EAC/B;AAEA,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,WAAW,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,IAAI,WAAW;AAAA,EACvE,CAAC;AACD,QAAM,KAAK;AAAA,IACT,MAAM;AAAA,IACN,WAAW;AAAA,EACb,CAAC;AACD,SAAO;AACT;AAEA,SAAS,iBAAiB,MAA4B,WAA2B;AAC/E,QAAM,QACJ,SAAS,WACL,WACA,SAAS,mBACP,cACA;AACR,SAAO,GAAG,KAAK,KAAKC,UAAS,WAAW,GAAG,CAAC;AAC9C;AAEA,SAAS,qBAAqB,MAA4B,WAA2B;AACnF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,aAA+E,SAAS;AAAA,IACjG,KAAK;AACH,aAAO;AAAA,aAA6E,SAAS;AAAA,IAC/F;AACE,aAAO;AAAA,aAA+E,SAAS;AAAA,EACnG;AACF;AAEA,SAASD,cAAa,MAAgC,OAAyC;AAC7F,QAAM,QAAQ;AAAA,IACZ,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,YAAY;AAAA,EACd;AACA,QAAM,YAAY,MAAM,KAAK,KAAK,IAAI,KAAK;AAC3C,QAAM,aAAa,MAAM,MAAM,KAAK,IAAI,KAAK;AAC7C,MAAI,cAAc,YAAY;AAC5B,WAAO,YAAY;AAAA,EACrB;AAEA,SAAO,KAAK,OAAO,KAAK,MAAM,OAAO;AACvC;AAEA,SAASC,UAAS,OAAe,UAA0B;AACzD,SAAO,MAAM,UAAU,WAAW,QAAQ,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACvE;;;ARpJA,eAAsB,gBAAgB,SAA4D;AAChG,QAAM,iBAAiB,MAAM,mBAAmB,QAAQ,GAAG;AAC3D,QAAM,WAAW,yBAAyB;AAAA,IACxC,OAAO,QAAQ;AAAA,IACf,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,MAAI,WAAW,MAAM,yBAAyB;AAAA,IAC5C,SAAS,eAAe;AAAA,IACxB,KAAK,QAAQ;AAAA,IACb,WAAW,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,aAAa,MAAM,eAAe;AAAA,IACtC,SAAS,eAAe;AAAA,IACxB,KAAK,QAAQ;AAAA,IACb;AAAA,IACA,eAAe,SAAS;AAAA,EAC1B,CAAC;AACD,aAAW,MAAM,yBAAyB;AAAA,IACxC,SAAS,eAAe;AAAA,IACxB,KAAK,QAAQ;AAAA,IACb,WAAW,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,OAAO,SAAS;AAAA,IAChB,YAAY,SAAS;AAAA,EACvB;AACA,QAAM,WAAW,wBAAwB;AAAA,IACvC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,aAAa,MAAM,2BAA2B;AAAA,IAClD,SAAS,eAAe;AAAA,IACxB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB,cAAc,QAAQ;AAAA,IACtB;AAAA,IACA;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB,MAAM,QAAQ;AAAA,EAChB,CAAC;AAED,SAAO;AAAA,IACL,SAAS,WAAW;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ADrCA,eAAsB,oBAAoB,SAAqD;AAC7F,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,sBAAsB,2BAA2B,OAAO;AAC9D,MAAI,YAAY,QAAQ;AACxB,MAAI,UAAU,QAAQ;AAEtB,WAAS,aAAa,KAAK,cAAc,GAAG;AAC1C,SAAK,QAAQ,UAAU,QAAQ,YAAY,QAAQ;AACjD,YAAM,WAAW,MAAM,gBAAgB;AAAA,QACrC,OAAO;AAAA,QACP,KAAK,QAAQ;AAAA,QACb,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,WAAW,QAAQ;AAAA,MACrB,CAAC;AACD,gBAAU,SAAS;AAAA,IACrB;AAEA,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B,GAAG;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,CAAC;AACD,cAAU,OAAO;AAEjB,QAAI,CAAC,OAAO,WAAW,CAAC,qBAAqB;AAC3C,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,uBAAuB,QAAQ,UAAU,QAAQ,UAAU;AAChF,UAAM,WAAW,MAAM,QAAQ,UAAU;AAAA,MACvC,QAAQ;AAAA,QACN,GAAG;AAAA,QACH;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,gBAAY,2BAA2B,UAAU,KAAK,KAAK;AAAA,EAC7D;AACF;AAEA,SAAS,2BAA2B,SAAiD;AACnF,MAAI,QAAQ,UAAU,SAAS,YAAY;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,aACJ,OAAO,QAAQ,wBAAwB,WACnC,QAAQ,sBACR,QAAQ,OAAO;AAErB,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,UAAU;AAC9B;AAEA,SAAS,uBACP,UACA,YACQ;AACR,SAAO,iCAAiC,UAAU,UAAU;AAC9D;AAEA,SAAS,2BAA2B,OAA+C;AACjF,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,WAAW,SAAS,IAAI,aAAa;AAC9C;;;AUpGA,IAAAC,oBAAe;;;ACAf,qBAAe;AACf,IAAAC,qBAAiB;AAEjB,oBAAmB;AAEnB,IAAM,mBAAmB,oBAAI,IAAoB;AAE1C,SAAS,gBAAgB,KAAmB;AACjD,QAAM,kBAAkB,IAAI;AAAA,IAC1B,OAAO,QAAQ,QAAQ,GAAG,EACvB,OAAO,CAAC,CAAC,KAAK,KAAK,MAAM,iBAAiB,IAAI,GAAG,MAAM,KAAK,EAC5D,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AAAA,EACvB;AAEA,aAAW,CAAC,KAAK,KAAK,KAAK,kBAAkB;AAC3C,QAAI,gBAAgB,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,MAAM,OAAO;AAC1D;AAAA,IACF;AAEA,WAAO,QAAQ,IAAI,GAAG;AAAA,EACxB;AAEA,mBAAiB,MAAM;AACvB,QAAM,cAAc,mBAAAC,QAAK,QAAQ,WAAW,IAAI;AAChD,QAAM,iBAAiBC,aAAY;AAAA,IACjC,mBAAAD,QAAK,KAAK,aAAa,YAAY,MAAM;AAAA,IACzC,mBAAAA,QAAK,KAAK,KAAK,YAAY,MAAM;AAAA,EACnC,CAAC;AAED,aAAW,YAAY,gBAAgB;AACrC,QAAI,CAAC,eAAAE,QAAG,WAAW,QAAQ,GAAG;AAC5B;AAAA,IACF;AAEA,UAAM,SAAS,cAAAC,QAAO,MAAM,eAAAD,QAAG,aAAa,UAAU,MAAM,CAAC;AAC7D,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,UAAI,gBAAgB,IAAI,GAAG,GAAG;AAC5B;AAAA,MACF;AAEA,cAAQ,IAAI,GAAG,IAAI;AACnB,uBAAiB,IAAI,KAAK,KAAK;AAAA,IACjC;AAAA,EACF;AACF;AAEA,SAASD,aAAY,OAA2B;AAC9C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,mBAAAD,QAAK,UAAU,IAAI,CAAC,CAAC,CAAC;AAC/D;;;AD7CA;AACAI;;;AEJA,uBAAqB;AACrB,IAAAC,qBAAiB;AAIV,SAAS,cAAwB;AACtC,QAAM,eAAW,iBAAAC,SAAS,WAAW,EAAE,QAAQ,GAAG,CAAC;AAEnD,SAAO;AAAA,IACL,WAAW,SAAS;AAAA,IACpB,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,YAAY,mBAAAC,QAAK,KAAK,SAAS,QAAQ,aAAa;AAAA,IACpD,aAAa,mBAAAA,QAAK,KAAK,SAAS,MAAM,UAAU;AAAA,IAChD,YAAY,mBAAAA,QAAK,KAAK,SAAS,MAAM,SAAS;AAAA,EAChD;AACF;;;AChBA,IAAAC,qBAAiB;AAEjB;AAyBO,IAAM,0BAA0C;AAAA,EACrD,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,gBAAgB,CAAC;AAAA,EACjB,SAAS;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,EACd;AAAA,EACA,mBAAmB;AAAA,EACnB,kBAAkB;AACpB;AAEO,SAAS,wBAAwB,SAAkC,CAAC,GAAmB;AAC5F,SAAO;AAAA,IACL,OAAO,OAAO,OAAO,SAAS,wBAAwB,KAAK,EAAE,KAAK;AAAA,IAClE,YAAY,oBAAoB,OAAO,UAAU;AAAA,IACjD,UAAU,kBAAkB,OAAO,QAAQ;AAAA,IAC3C,gBAAgB,wBAAwB,OAAO,cAAc;AAAA,IAC7D,SAAS;AAAA,MACP,gBAAgBC;AAAA,QACd,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA,wBAAwB,QAAQ;AAAA,MAClC;AAAA,MACA,OAAOA,aAAY,OAAO,SAAS,OAAO,GAAG,KAAK,wBAAwB,QAAQ,KAAK;AAAA,MACvF,gBAAgBA;AAAA,QACd,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA,wBAAwB,QAAQ;AAAA,MAClC;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,YAAYA,aAAY,OAAO,UAAU,YAAY,GAAG,IAAI,wBAAwB,SAAS,UAAU;AAAA,MACvG,aAAaA;AAAA,QACX,OAAO,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,wBAAwB,SAAS;AAAA,MACnC;AAAA,MACA,YAAYA;AAAA,QACV,OAAO,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,wBAAwB,SAAS;AAAA,MACnC;AAAA,IACF;AAAA,IACA,mBAAmBA;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,IAC1B;AAAA,IACA,kBAAkBA;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,IAC1B;AAAA,EACF;AACF;AAEO,SAAS,6BACd,QACA,cACuB;AACvB,QAAM,aAAa,wBAAwB,MAAM;AACjD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,mBAAAC,QAAK,KAAK,qBAAqB,YAAY,EAAE,YAAY,UAAU;AAAA,EAC/E;AACF;AAEO,SAAS,4BAA4B,KAAmC;AAC7E,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,IACG,MAAM,GAAG,EACT,IAAI,CAAC,UAAU,OAAO,SAAS,MAAM,KAAK,GAAG,EAAE,CAAC,EAChD,OAAO,CAAC,UAAU,OAAO,SAAS,KAAK,CAAC;AAAA,EAC7C;AACF;AAEA,SAAS,oBAAoB,KAAiC;AAC5D,QAAM,QAAQ,OAAO,OAAO,wBAAwB,UAAU,EAAE,KAAK;AACrE,SAAO,MAAM,QAAQ,SAAS,EAAE,KAAK,wBAAwB;AAC/D;AAEA,SAAS,kBAAkB,KAAiC;AAC1D,QAAM,QAAQ,OAAO,OAAO,wBAAwB,QAAQ,EAAE,KAAK;AACnE,SAAO,MAAM,QAAQ,SAAS,EAAE;AAClC;AAEA,SAAS,wBAAwB,QAAiD;AAChF,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,OAAO,SAAS,KAAK,IAAI,KAAK,MAAM,KAAK,IAAI,OAAO;AACvE,QAAI,OAAO,SAAS,UAAU,KAAK,aAAa,GAAG;AACjD,aAAO,IAAI,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,MAAM;AACnB;AAEA,SAASD,aAAY,OAA2B,KAAa,KAAa,UAA0B;AAClG,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,MAAM,KAAK;AACnC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,UAAU,CAAC;AAChD;;;AC1JA,IAAAE,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,eAAsB,aAAgB,UAAkB,UAAyB;AAC/E,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,wBAAwB,UAAkB,OAA+B;AAC7F,QAAM,kBAAAA,QAAG,MAAM,mBAAAC,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,gBAAgB,GAAG,QAAQ,QAAQ,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAClE,QAAM,kBAAAD,QAAG,UAAU,eAAe,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC/E,QAAM,kBAAAA,QAAG,OAAO,eAAe,QAAQ;AACzC;;;ACFO,IAAM,4BAAN,MAAqE;AAAA,EAC1E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,OAAyC;AAC7C,UAAM,UAAU,MAAM,aAAsC,KAAK,UAAU,IAAI;AAC/E,QAAI,CAAC,WAAW,OAAO,QAAQ,UAAU,YAAY,CAAC,QAAQ,MAAM,KAAK,GAAG;AAC1E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,OAAO,QAAQ,MAAM,KAAK;AAAA,MAC1B,SAAS,OAAO,QAAQ,WAAW,EAAE,EAAE,KAAK;AAAA,MAC5C,YAAY,OAAO,QAAQ,cAAc,EAAE,EAAE,KAAK;AAAA,MAClD,OAAO,OAAO,QAAQ,UAAU,YAAY,QAAQ,MAAM,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI;AAAA,MAC1F,QAAQ,OAAO,QAAQ,WAAW,YAAY,QAAQ,OAAO,KAAK,IAAI,QAAQ,OAAO,KAAK,IAAI;AAAA,MAC9F,aAAa,OAAO,QAAQ,eAAe,EAAE,EAAE,KAAK;AAAA,MACpD,WAAW,OAAO,QAAQ,aAAa,EAAE,EAAE,KAAK;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAwC;AACjD,UAAM,wBAAwB,KAAK,UAAU;AAAA,MAC3C,OAAO,MAAM,MAAM,KAAK;AAAA,MACxB,SAAS,MAAM,QAAQ,KAAK;AAAA,MAC5B,YAAY,MAAM,WAAW,KAAK;AAAA,MAClC,GAAI,MAAM,QAAQ,EAAE,OAAO,MAAM,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,MACnD,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,KAAK,EAAE,IAAI,CAAC;AAAA,MACtD,aAAa,MAAM;AAAA,MACnB,WAAW,MAAM;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,wBAAwB,KAAK,UAAU,IAAI;AAAA,EACnD;AACF;;;ACrDA,IAAAE,qBAAiB;AAEjB;AAGA,IAAM,6BAA6B;AACnC,IAAM,iCAAiC;AAkChC,IAAM,wBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB,CAAC;AAAA,EACjB,SAAS;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,EAClB;AAAA,EACA,UAAU;AAAA,IACR,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,YAAY;AAAA,IACZ,kBAAkB;AAAA,EACpB;AAAA,EACA,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,UAAU;AACZ;AAEO,SAAS,sBAAsB,SAAgC,CAAC,GAAiB;AACtF,SAAO;AAAA,IACL,SAAS,aAAa,OAAO,SAAS,sBAAsB,OAAO;AAAA,IACnE,YAAY,aAAa,OAAO,YAAY,sBAAsB,UAAU;AAAA,IAC5E,gBAAgBC,yBAAwB,OAAO,cAAc;AAAA,IAC7D,SAAS;AAAA,MACP,WAAWC,aAAY,OAAO,SAAS,WAAW,KAAO,MAAS,sBAAsB,QAAQ,SAAS;AAAA,MACzG,gBAAgBA;AAAA,QACd,OAAO,SAAS;AAAA,QAChB;AAAA,QACA;AAAA,QACA,sBAAsB,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,YAAYA,aAAY,OAAO,UAAU,YAAY,GAAG,IAAI,sBAAsB,SAAS,UAAU;AAAA,MACrG,aAAaA;AAAA,QACX,OAAO,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,sBAAsB,SAAS;AAAA,MACjC;AAAA,MACA,YAAYA;AAAA,QACV,OAAO,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,sBAAsB,SAAS;AAAA,MACjC;AAAA,MACA,kBAAkBA;AAAA,QAChB,OAAO,UAAU;AAAA,QACjB;AAAA,QACA;AAAA,QACA,sBAAsB,SAAS;AAAA,MACjC;AAAA,IACF;AAAA,IACA,mBAAmBA;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,kBAAkBA;AAAA,MAChB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,aAAaA,aAAY,OAAO,aAAa,KAAQ,KAAS,sBAAsB,WAAW;AAAA,IAC/F,UAAU,OAAO,OAAO,YAAY,sBAAsB,QAAQ,EAAE,KAAK;AAAA,EAC3E;AACF;AAEO,SAAS,2BACd,QACA,cACA,cAAuC,MAClB;AACrB,QAAM,aAAa,sBAAsB,MAAM;AAC/C,QAAM,WAAW,mBAAAC,QAAK,KAAK,qBAAqB,YAAY,EAAE,YAAY,QAAQ;AAClF,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,iBAAiB,mBAAAA,QAAK,KAAK,UAAU,kBAAkB;AAAA,IACvD,aAAa,mBAAAA,QAAK,KAAK,UAAU,eAAe;AAAA,IAChD,gBAAgB,mBAAAA,QAAK,KAAK,UAAU,kBAAkB;AAAA,IACtD,qBAAqB,mBAAAA,QAAK,KAAK,UAAU,kBAAkB;AAAA,IAC3D,kBAAkB,mBAAAA,QAAK,KAAK,UAAU,oBAAoB;AAAA,IAC1D,mBAAmB,mBAAAA,QAAK,KAAK,UAAU,eAAe;AAAA,IACtD,iBAAiB,mBAAAA,QAAK,KAAK,UAAU,aAAa;AAAA,IAClD;AAAA,EACF;AACF;AAEO,SAAS,0BAA0B,KAAmC;AAC3E,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,SAAOF,yBAAwB,IAAI,MAAM,WAAW,CAAC;AACvD;AAEA,SAAS,aAAa,KAAyB,UAA0B;AACvE,QAAM,QAAQ,OAAO,OAAO,QAAQ,EAAE,KAAK,EAAE,QAAQ,SAAS,EAAE;AAChE,SAAO,SAAS;AAClB;AAEA,SAASA,yBAAwB,QAAiD;AAChF,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,oBAAI,IAAY;AAC/B,aAAW,SAAS,QAAQ;AAC1B,UAAM,aAAa,OAAO,SAAS,EAAE,EAAE,KAAK;AAC5C,QAAI,YAAY;AACd,aAAO,IAAI,UAAU;AAAA,IACvB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,MAAM;AACnB;AAEA,SAASC,aAAY,OAA2B,KAAa,KAAa,UAA0B;AAClG,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AACxD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,MAAM,KAAK;AACnC,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,UAAU,CAAC;AAChD;;;ANpJA,IAAM,iBAA4B;AAAA,EAChC,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc,CAAC,GAAG;AAAA,EAClB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,wBAAwB;AAAA,EACxB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,8BAA8B;AAAA,EAC9B,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,uBAAuB;AAAA,EACvB,eAAe;AAAA,EACf,KAAK,oBAAoB;AAAA,EACzB,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,eAAsB,uBAAgE;AACpF,QAAM,QAAQ,YAAY;AAC1B,QAAM,kBAAAE,QAAG,MAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AACnD,QAAM,kBAAAA,QAAG,MAAM,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACjD,QAAM,kBAAAA,QAAG,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAClD,QAAM,kBAAAA,QAAG,MAAM,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AACrD,QAAM,kBAAAA,QAAG,MAAM,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AACpD,SAAO;AACT;AAEO,SAAS,mBAA8B;AAC5C,SAAO,gBAAgB,cAAc;AACvC;AAEA,eAAsB,aAAiC;AACrD,QAAM,QAAQ,MAAM,qBAAqB;AAEzC,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAA,QAAG,SAAS,MAAM,YAAY,MAAM;AACtD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAOC,iBAAgB,eAAe,gBAAgB,MAAM,CAAC;AAAA,EAC/D,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,iBAAiB;AAAA,IAC1B;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,WAAW,QAAkC;AACjE,QAAM,QAAQ,MAAM,qBAAqB;AACzC,QAAM,aAAaA,iBAAgB,MAAM;AACzC,QAAM,kBAAAD,QAAG,UAAU,MAAM,YAAY,GAAG,KAAK,UAAU,YAAY,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACzF;AAEA,eAAsB,aACpB,SACoB;AACpB,QAAM,UAAU,MAAM,WAAW;AACjC,QAAM,OAAO,MAAM,QAAQ,OAAO;AAClC,QAAM,WAAW,IAAI;AACrB,SAAO;AACT;AAEA,eAAsB,qBAAqB,YAA0B,CAAC,GAA2B;AAC/F,QAAM,MAAM,UAAU,OAAO,QAAQ,IAAI;AACzC,kBAAgB,GAAG;AACnB,QAAM,QAAQ,MAAM,qBAAqB;AACzC,QAAM,aAAa,MAAM,WAAW;AACpC,QAAM,eAAe,MAAM,oBAAoB,GAAG;AAClD,QAAM,oBAAoB,gBAAgB,QAAQ,IAAI,8BAA8B,KAAK,WAAW,IAAI,WAAW;AACnH,QAAM,yBAAyB,QAAQ,IAAI,oCACvC,4BAA4B,QAAQ,IAAI,iCAAiC,IACzE,WAAW,SAAS;AACxB,QAAM,iBAAiB,wBAAwB;AAAA,IAC7C,GAAG,WAAW;AAAA,IACd,OAAO,QAAQ,IAAI,0BAA0B,WAAW,SAAS;AAAA,IACjE,YAAY,QAAQ,IAAI,iCAAiC,WAAW,SAAS;AAAA,IAC7E,UAAU,QAAQ,IAAI,8BAA8B,WAAW,SAAS;AAAA,IACxE,gBAAgB;AAAA,IAChB,SAAS;AAAA,MACP,GAAG,WAAW,SAAS;AAAA,MACvB,gBACE,gBAAgB,QAAQ,IAAI,wCAAwC,KAAK,WAAW,SAAS,QAAQ;AAAA,MACvG,OAAO,gBAAgB,QAAQ,IAAI,8BAA8B,KAAK,WAAW,SAAS,QAAQ;AAAA,MAClG,gBACE,gBAAgB,QAAQ,IAAI,yCAAyC,KACrE,WAAW,SAAS,QAAQ;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,GAAG,WAAW,SAAS;AAAA,MACvB,YACE,gBAAgB,QAAQ,IAAI,qCAAqC,KAAK,WAAW,SAAS,SAAS;AAAA,MACrG,aACE,gBAAgB,QAAQ,IAAI,uCAAuC,KACnE,WAAW,SAAS,SAAS;AAAA,MAC/B,YACE,gBAAgB,QAAQ,IAAI,sCAAsC,KAAK,WAAW,SAAS,SAAS;AAAA,IACxG;AAAA,IACA,mBACE,gBAAgB,QAAQ,IAAI,oCAAoC,KAAK,WAAW,SAAS;AAAA,IAC3F,kBACE,gBAAgB,QAAQ,IAAI,mCAAmC,KAAK,WAAW,SAAS;AAAA,EAC5F,CAAC;AACD,QAAM,uBAAuB,QAAQ,IAAI,kCACrC,0BAA0B,QAAQ,IAAI,+BAA+B,IACrE,WAAW,OAAO;AACtB,QAAM,eAAe,sBAAsB;AAAA,IACzC,GAAG,WAAW;AAAA,IACd,SAAS,QAAQ,IAAI,2BAA2B,WAAW,OAAO;AAAA,IAClE,YAAY,QAAQ,IAAI,+BAA+B,WAAW,OAAO;AAAA,IACzE,gBAAgB;AAAA,IAChB,SAAS;AAAA,MACP,GAAG,WAAW,OAAO;AAAA,MACrB,WACE,gBAAgB,QAAQ,IAAI,iCAAiC,KAAK,WAAW,OAAO,QAAQ;AAAA,MAC9F,gBACE,gBAAgB,QAAQ,IAAI,uCAAuC,KACnE,WAAW,OAAO,QAAQ;AAAA,IAC9B;AAAA,IACA,UAAU;AAAA,MACR,GAAG,WAAW,OAAO;AAAA,MACrB,YACE,gBAAgB,QAAQ,IAAI,mCAAmC,KAAK,WAAW,OAAO,SAAS;AAAA,MACjG,aACE,gBAAgB,QAAQ,IAAI,qCAAqC,KAAK,WAAW,OAAO,SAAS;AAAA,MACnG,YACE,gBAAgB,QAAQ,IAAI,oCAAoC,KAAK,WAAW,OAAO,SAAS;AAAA,MAClG,kBACE,gBAAgB,QAAQ,IAAI,0CAA0C,KACtE,WAAW,OAAO,SAAS;AAAA,IAC/B;AAAA,IACA,mBACE,gBAAgB,QAAQ,IAAI,kCAAkC,KAAK,WAAW,OAAO;AAAA,IACvF,kBACE,gBAAgB,QAAQ,IAAI,iCAAiC,KAAK,WAAW,OAAO;AAAA,IACtF,aAAa,gBAAgB,QAAQ,IAAI,4BAA4B,KAAK,WAAW,OAAO;AAAA,IAC5F,UAAU,QAAQ,IAAI,4BAA4B,WAAW,OAAO;AAAA,EACtE,CAAC;AACD,QAAM,oBAAoB,2BAA2B,cAAc,aAAa,YAAY;AAC5F,QAAM,oBAAoB,MAAM,IAAI,0BAA0B,kBAAkB,eAAe,EAAE,KAAK;AAEtG,QAAM,SAASC,iBAAgB;AAAA,IAC7B,GAAG;AAAA,IACH,OAAO,QAAQ,IAAI,iBAAiB,UAAU,SAAS,WAAW;AAAA,IAClE,SAAS,QAAQ,IAAI,oBAAoB,WAAW;AAAA,IACpD,MACE,eAAe,QAAQ,IAAI,YAAY,KACvC,UAAU,QACV,WAAW;AAAA,IACb,KAAK;AAAA,MACH,GAAG,WAAW;AAAA,MACd,SAAS,gBAAgB,QAAQ,IAAI,mBAAmB,KAAK,WAAW,IAAI;AAAA,MAC5E,YAAY;AAAA,QACV,GAAG,WAAW,IAAI;AAAA,QAClB,SAAS;AAAA,QACT,SAAS,0BAA0B,QAAQ,IAAI,8BAA8B,KAAK,WAAW,IAAI,WAAW;AAAA,QAC5G,UAAU,gBAAgB,QAAQ,IAAI,+BAA+B,KAAK,WAAW,IAAI,WAAW;AAAA,QACpG,UAAU,gBAAgB,QAAQ,IAAI,+BAA+B,KAAK,WAAW,IAAI,WAAW;AAAA,QACpG,aAAa,QAAQ,IAAI,wCAAwC,WAAW,IAAI,WAAW;AAAA,QAC3F,YAAY,6BAA6B,QAAQ,IAAI,kCAAkC,KAAK,WAAW,IAAI,WAAW;AAAA,QACtH,aAAa,gBAAgB,QAAQ,IAAI,mCAAmC,KAAK,WAAW,IAAI,WAAW;AAAA,MAC7G;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,GAAG;AAAA,IACD;AAAA,IACA,UAAU,MAAM;AAAA,IAChB,cAAc,aAAa;AAAA,EAC7B,CAAC;AAED,QAAM,SAAS,QAAQ,IAAI,mBAAmB;AAE9C,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,wBAAwB;AAAA,IAChC;AAAA,IACA,UAAU,6BAA6B,OAAO,UAAU,aAAa,YAAY;AAAA,IACjF,QAAQ,2BAA2B,OAAO,QAAQ,aAAa,cAAc,iBAAiB;AAAA,EAChG;AACF;AAEO,SAAS,eAAe,OAAuC;AACpE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,eAAe,aAAa;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,SAAS;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASA,iBACP,QACA,UAII,CAAC,GACM;AACX,QAAM,eACJ,MAAM,QAAQ,OAAO,YAAY,KAAK,OAAO,aAAa,SAAS,IAC/D,CAAC,GAAG,IAAI,IAAI,OAAO,aAAa,IAAI,CAAC,UAAU,OAAO,KAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,CAAC,IACrF,CAAC,GAAG;AAEV,SAAO;AAAA,IACL,UAAU;AAAA,IACV,SAAS,OAAO,SAAS,KAAK,KAAK,eAAe;AAAA,IAClD,OAAO,OAAO,OAAO,KAAK,KAAK,eAAe;AAAA,IAC9C,MAAM,eAAe,OAAO,IAAI,KAAK,eAAe;AAAA,IACpD;AAAA,IACA,qBAAqBC;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,uBAAuBA,aAAY,OAAO,uBAAuB,GAAG,KAAK,eAAe,qBAAqB;AAAA,IAC7G,iBAAiBA,aAAY,OAAO,iBAAiB,KAAO,KAAS,eAAe,eAAe;AAAA,IACnG,qBAAqBA;AAAA,MACnB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,mBAAmBA,aAAY,OAAO,mBAAmB,GAAG,IAAI,eAAe,iBAAiB;AAAA,IAChG,wBAAwBA;AAAA,MACtB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,cAAcA,aAAY,OAAO,cAAc,KAAO,KAAS,eAAe,YAAY;AAAA,IAC1F,kBAAkBA,aAAY,OAAO,kBAAkB,IAAI,KAAK,eAAe,gBAAgB;AAAA,IAC/F,2BAA2BA;AAAA,MACzB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,8BAA8BA;AAAA,MAC5B,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,uBAAuBA,aAAY,OAAO,uBAAuB,KAAO,KAAS,eAAe,qBAAqB;AAAA,IACrH,mBAAmBA,aAAY,OAAO,mBAAmB,GAAG,GAAG,eAAe,iBAAiB;AAAA,IAC/F,uBAAuBA;AAAA,MACrB,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB;AAAA,IACA,eAAe,QAAQ,OAAO,aAAa;AAAA,IAC3C,KAAK,mBAAmB,OAAO,KAAK,OAAO;AAAA,IAC3C,UAAU,wBAAwB,OAAO,QAAQ;AAAA,IACjD,QAAQ,sBAAsB,OAAO,MAAM;AAAA,EAC7C;AACF;AAEA,SAAS,eAAe,MAAiB,OAAsC;AAC7E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,KAAK;AAAA,MACH,GAAG,KAAK;AAAA,MACR,GAAI,MAAM,OAAO,CAAC;AAAA,MAClB,YAAY;AAAA,QACV,GAAG,KAAK,IAAI;AAAA,QACZ,GAAI,MAAM,KAAK,cAAc,CAAC;AAAA,MAChC;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,GAAG,KAAK;AAAA,MACR,GAAI,MAAM,YAAY,CAAC;AAAA,MACvB,SAAS;AAAA,QACP,GAAG,KAAK,SAAS;AAAA,QACjB,GAAI,MAAM,UAAU,WAAW,CAAC;AAAA,MAClC;AAAA,MACA,UAAU;AAAA,QACR,GAAG,KAAK,SAAS;AAAA,QACjB,GAAI,MAAM,UAAU,YAAY,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,GAAG,KAAK;AAAA,MACR,GAAI,MAAM,UAAU,CAAC;AAAA,MACrB,SAAS;AAAA,QACP,GAAG,KAAK,OAAO;AAAA,QACf,GAAI,MAAM,QAAQ,WAAW,CAAC;AAAA,MAChC;AAAA,MACA,UAAU;AAAA,QACR,GAAG,KAAK,OAAO;AAAA,QACf,GAAI,MAAM,QAAQ,YAAY,CAAC;AAAA,MACjC;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASA,aAAY,OAAe,KAAa,KAAa,UAA0B;AACtF,MAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC;AACvD;AAEA,SAAS,gBAAgB,OAAgD;AACvE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,UAAU,GAAG;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK,SAAS,MAAM,KAAK,EAAE,SAAS,UAAU,GAAG;AACpD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA+C;AACtE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,0BAA0B,OAAsF;AACvH,WAAS,SAAS,IAAI,KAAK,EAAE,YAAY,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,6BAA6B,OAAyF;AAC7H,WAAS,SAAS,IAAI,KAAK,EAAE,YAAY,GAAG;AAAA,IAC1C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,0BAA+C;AACtD,SAAO;AAAA,IACL,QAAQ,QAAQ,IAAI,oBAAoB,IAAI,KAAK;AAAA,IACjD,UAAU,QAAQ,IAAI,mBAAmB,6BAA6B,KAAK;AAAA,IAC3E,eAAe,QAAQ,IAAI,wBAAwB,OAAO,KAAK;AAAA,IAC/D,WAAW,QAAQ,IAAI,mBAAmB,MAAM,KAAK;AAAA,IACrD,aAAa,gBAAgB,QAAQ,IAAI,mBAAmB,KAAK;AAAA,IACjE,eAAe,gBAAgB,QAAQ,IAAI,qBAAqB,KAAK;AAAA,IACrE,gBAAgBA;AAAA,MACd,OAAO,SAAS,QAAQ,IAAI,2BAA2B,IAAI,EAAE;AAAA,MAC7D;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,WAAWA;AAAA,MACT,OAAO,SAAS,QAAQ,IAAI,qBAAqB,IAAI,EAAE;AAAA,MACvD;AAAA,MACA,KAAK,KAAK;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;AOhaA,IAAAC,qBAAiB;;;ACAV,SAAS,aAAa,OAAwB;AACnD,MAAI;AACF,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACNA,mBAAkB;;;ACAlB,IAAAC,kBAAe;AAEf,IAAI,eAAe;AACnB,IAAI,eAAe;AACnB,IAAI,kBAAkB;AAEf,SAAS,qBAA2B;AACzC,MAAI,iBAAiB;AACnB;AAAA,EACF;AAEA,oBAAkB;AAElB,UAAQ,OAAO,GAAG,SAAS,CAAC,UAAU;AACpC,QAAI,uBAAuB,KAAK,GAAG;AACjC,qBAAe;AACf;AAAA,IACF;AAEA,UAAM;AAAA,EACR,CAAC;AAED,UAAQ,OAAO,GAAG,SAAS,CAAC,UAAU;AACpC,QAAI,uBAAuB,KAAK,GAAG;AACjC,qBAAe;AACf;AAAA,IACF;AAEA,UAAM;AAAA,EACR,CAAC;AACH;AAEO,SAAS,YAAY,MAAuB;AACjD,SAAO,UAAU,GAAG,MAAM,QAAQ;AACpC;AAEO,SAAS,gBAAgB,OAAO,IAAa;AAClD,SAAO,YAAY,GAAG,IAAI;AAAA,CAAI;AAChC;AAEO,SAAS,YAAY,MAAuB;AACjD,SAAO,UAAU,GAAG,MAAM,QAAQ;AACpC;AAEO,SAAS,gBAAgB,OAAO,IAAa;AAClD,SAAO,YAAY,GAAG,IAAI;AAAA,CAAI;AAChC;AAEA,SAAS,UAAU,IAAY,MAAc,QAAsC;AACjF,MAAI,WAAW,WAAW,eAAe,cAAc;AACrD,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,WAAW,WAAW,QAAQ,SAAS,QAAQ;AAE9D,MAAI;AACF,QAAI,OAAO,OAAO;AAChB,aAAO,OAAO,MAAM,IAAI;AAAA,IAC1B;AAEA,oBAAAC,QAAG,UAAU,IAAI,MAAM,QAAW,MAAM;AACxC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,uBAAuB,KAAK,GAAG;AACjC,UAAI,WAAW,UAAU;AACvB,uBAAe;AAAA,MACjB,OAAO;AACL,uBAAe;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,uBAAuB,OAAyB;AACvD,QAAM,OAAO,OAAQ,MAA6B,QAAQ,EAAE;AAC5D,SAAO,SAAS,WAAW,SAAS,0BAA0B,SAAS;AACzE;;;AD5EO,IAAM,KAAK;AAAA,EAChB,KAAK,SAAuB;AAC1B,oBAAgB,GAAG,aAAAC,QAAM,KAAK,KAAK,CAAC,IAAI,OAAO,EAAE;AAAA,EACnD;AAAA,EACA,QAAQ,SAAuB;AAC7B,oBAAgB,GAAG,aAAAA,QAAM,MAAM,MAAM,CAAC,IAAI,OAAO,EAAE;AAAA,EACrD;AAAA,EACA,KAAK,SAAuB;AAC1B,oBAAgB,GAAG,aAAAA,QAAM,OAAO,GAAG,CAAC,IAAI,OAAO,EAAE;AAAA,EACnD;AAAA,EACA,MAAM,SAAuB;AAC3B,oBAAgB,GAAG,aAAAA,QAAM,IAAI,KAAK,CAAC,IAAI,OAAO,EAAE;AAAA,EAClD;AAAA,EACA,KAAK,SAAuB;AAC1B,oBAAgB,GAAG,aAAAA,QAAM,QAAQ,QAAQ,CAAC,IAAI,OAAO,EAAE;AAAA,EACzD;AAAA,EACA,IAAI,SAAuB;AACzB,oBAAgB,aAAAA,QAAM,KAAK,OAAO,CAAC;AAAA,EACrC;AAAA,EACA,QAAQ,SAAuB;AAC7B,oBAAgB,aAAAA,QAAM,KAAK,OAAO,CAAC;AAAA,EACrC;AAAA,EACA,MAAM,SAAuB;AAC3B,oBAAgB,OAAO;AAAA,EACzB;AACF;;;AFKO,SAAS,qBACd,QACA,SACgB;AAChB,MAAI,UAAU;AACd,QAAM,YAAY,MAAe,WAAW,QAAQ,aAAa,YAAY;AAE7E,QAAM,QAAqB;AAAA,IACzB,eAAe;AAAA,IACf,eAAe;AAAA,EACjB;AACA,QAAM,QAAQ,MAAY;AACxB,QAAI,CAAC,MAAM,iBAAiB,CAAC,MAAM,eAAe;AAChD;AAAA,IACF;AAEA,gBAAY,IAAI;AAChB,UAAM,gBAAgB;AACtB,UAAM,gBAAgB;AAAA,EACxB;AAEA,MAAI,QAAQ,aAAa;AACvB,YAAQ,YAAY,iBAAiB,SAAS,MAAM;AAClD,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,YAAM;AAAA,IACR,CAAC;AAAA,EACH;AAEA,QAAM,iBAAiB,MAAY;AACjC,QAAI,CAAC,OAAO,eAAe;AACzB;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,eAAe;AACxB,kBAAY,QAAQ,4BAA4B,oBAAoB,eAAe;AACnF,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAY;AACjC,QAAI,MAAM,eAAe;AACvB,kBAAY,IAAI;AAChB,YAAM,gBAAgB;AAAA,IACxB;AAEA,QAAI,CAAC,MAAM,eAAe;AACxB,UAAI,QAAQ,2BAA2B;AACrC,oBAAY,IAAI;AAAA,MAClB;AACA,YAAM,gBAAgB;AAAA,IACxB;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW;AAAA,MACT,iBAAiB,OAAO;AACtB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,YAAI,CAAC,OAAO,eAAe;AACzB;AAAA,QACF;AAEA,uBAAe;AACf,oBAAY,KAAK;AAAA,MACnB;AAAA,MACA,YAAY,MAAM;AAChB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,YAAI,CAAC,OAAO,eAAe;AACzB;AAAA,QACF;AAEA,uBAAe;AACf,oBAAY,GAAG,IAAI;AAAA,CAAI;AACvB,cAAM,gBAAgB;AAAA,MACxB;AAAA,MACA,iBAAiB,OAAO;AACtB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,uBAAe;AACf,oBAAY,KAAK;AAAA,MACnB;AAAA,MACA,gBAAgB,MAAM;AACpB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,uBAAe;AACf,oBAAY,IAAI;AAAA,MAClB;AAAA,MACA,kBAAkB;AAChB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,YAAI,MAAM,eAAe;AACvB,sBAAY,IAAI;AAChB,gBAAM,gBAAgB;AAAA,QACxB;AAEA,YAAI,MAAM,eAAe;AACvB,sBAAY,QAAQ,6BAA6B,IAAI;AACrD,gBAAM,gBAAgB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,WAAW,MAAM,MAAM;AACrB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,cAAM;AACN,cAAM,UAAU,qBAAqB,MAAM,MAAM,QAAQ,oBAAoB,KAAK,QAAQ,GAAG;AAC7F,WAAG,KAAK,QAAQ,OAAO;AACvB,YAAI,QAAQ,SAAS;AACnB,aAAG,IAAI;AAAA,EAAc,QAAQ,OAAO,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,MACA,aAAa,MAAM,QAAQ;AACzB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,cAAM;AACN,cAAM,UAAU,uBAAuB,MAAM,QAAQ,QAAQ,GAAG;AAChE,YAAI,QAAQ,SAAS;AACnB,aAAG,IAAI,YAAY,QAAQ,OAAO,EAAE;AAAA,QACtC;AACA,YAAI,QAAQ,SAAS;AACnB,aAAG,IAAI;AAAA,EAAc,QAAQ,OAAO,EAAE;AAAA,QACxC;AAAA,MACF;AAAA,MACA,YAAY,MAAM,OAAO;AACvB,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,cAAM;AACN,WAAG,KAAK,GAAG,IAAI,IAAI,QAAQ,cAAc,EAAE;AAC3C,WAAG,IAAIC,UAAS,OAAO,GAAG,CAAC;AAAA,MAC7B;AAAA,MACA,SAAS,MAAM;AACb,YAAI,UAAU,GAAG;AACf;AAAA,QACF;AAEA,cAAM;AACN,WAAG,IAAI,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASA,UAAS,OAAe,UAA0B;AACzD,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAEA,SAAS,qBACP,MACA,SACA,UACA,KACa;AACb,QAAM,SAAS,aAAa,OAAO;AACnC,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,WAAO;AAAA,MACL,SAAS,GAAG,IAAI,IAAIA,UAAS,SAAS,QAAQ,CAAC;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAO;AACb,QAAMC,SAAO,qBAAqB,gBAAgB,MAAM,MAAM,GAAG,GAAG;AACpE,QAAM,UAAU,gBAAgB,MAAM,SAAS;AAE/C,UAAQ,MAAM;AAAA,IACZ,KAAK,aAAa;AAChB,YAAM,QAAQ,gBAAgB,KAAK,YAAY,KAAK,QAAQ;AAC5D,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAIA,UAAQ,gBAAgB,GAAG,KAAK;AAAA,MACtD;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAIA,UAAQ,gBAAgB;AAAA,MAC9C;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAIA,UAAQ,gBAAgB,MAClC,KAAK,cAAc,OAAO,iBAAiB;AAAA,MAChD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAIA,UAAQ,gBAAgB,MAClC,OAAO,KAAK,YAAY,WAAW,YAAY,KAAK,OAAO,KAAK;AAAA,MACrE;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAIA,UAAQ,gBAAgB;AAAA,QAC5C,SAAS,UAAU,cAAc,SAAS,IAAK,IAAI;AAAA,MACrD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAIA,UAAQ,gBAAgB;AAAA,QAC5C,SAAS,UAAU,cAAc,SAAS,IAAK,IAAI;AAAA,MACrD;AAAA,IACF,KAAK,aAAa;AAChB,YAAM,SAAS,gBAAgB,MAAM,QAAQ;AAC7C,YAAM,UAAU,gBAAgB,MAAM,SAAS;AAC/C,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAIA,UAAQ,gBAAgB,MAClC,SAAS,WAAW,MAAM,KAAK,OAC/B,UAAU,YAAY,OAAO,KAAK;AAAA,QACrC,SAAS,UAAU,cAAc,SAAS,IAAK,IAAI;AAAA,MACrD;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB,YAAM,YAAY,gBAAgB,MAAM,YAAY;AACpD,YAAM,YAAY,gBAAgB,MAAM,YAAY;AACpD,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAIA,UAAQ,gBAAgB,MAClC,KAAK,gBAAgB,OAAO,sBAAsB;AAAA,QACrD,SAAS,wBAAwB,WAAW,SAAS;AAAA,MACvD;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO;AAAA,QACL,SAAS,GAAG,IAAI;AAAA,QAChB,SAAS,OAAO,KAAK,UAAU,WAAW,cAAc,KAAK,OAAO,GAAK,IAAI;AAAA,MAC/E;AAAA,IACF,KAAK,aAAa;AAChB,YAAM,UAAU,gBAAgB,MAAM,SAAS;AAC/C,YAAMC,OAAM,gBAAgB,MAAM,KAAK;AACvC,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAI,WAAW,EAAE,GAAG,KAAK,KAC/BA,OAAM,QAAQA,IAAG,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,UAAU,gBAAgB,MAAM,SAAS;AAC/C,YAAMA,OAAM,gBAAgB,MAAM,KAAK;AACvC,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAI,WAAW,EAAE,GAAG,KAAK,KAC/BA,OAAM,QAAQA,IAAG,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,KAAK,oBAAoB;AACvB,YAAM,QAAQ,gBAAgB,MAAM,QAAQ;AAC5C,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,SAAS,QAAQ,GAAG,KAAK;AAAA,MAC/C;AAAA,IACF;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,YAAY,gBAAgB,MAAM,YAAY;AACpD,YAAM,cAAc,gBAAgB,MAAM,aAAa;AACvD,aAAO;AAAA,QACL,SACE,GAAG,IAAI,IAAI,aAAa,EAAE,GAAG,KAAK,KACjC,cAAc,KAAK,WAAW,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,IACA,KAAK,mBAAmB;AACtB,YAAM,eAAe,gBAAgB,MAAM,MAAM;AACjD,YAAM,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI;AAC7E,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,gBAAgB,EAAE,GAAG,KAAK,KAAK,SAAS,SAAS,MAAM,KAAK;AAAA,MAClF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,mBAAmB;AACtB,YAAM,eAAe,gBAAgB,MAAM,MAAM;AACjD,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,gBAAgB,EAAE,GAAG,KAAK;AAAA,MAChD;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,UAAU,gBAAgB,MAAM,SAAS;AAC/C,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,WAAW,EAAE,GAAG,KAAK;AAAA,MAC3C;AAAA,IACF;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI;AAC7E,YAAM,SAAS,gBAAgB,MAAM,QAAQ;AAC7C,aAAO;AAAA,QACL,SACE,GAAG,IAAI,KAAK,UAAU,GAAG,MACxB,SAAS,WAAW,MAAM,KAAK;AAAA,MACpC;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,SAAS,OAAO,KAAK,YAAY,WAAW,KAAK,MAAM,KAAK,OAAO,IAAI;AAC7E,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,KAAK,UAAU,GAAG;AAAA,MACpC;AAAA,IACF;AAAA,IACA,KAAK,kBAAkB;AACrB,YAAM,WAAW,gBAAgB,MAAM,MAAM;AAC7C,YAAM,OAAO,gBAAgB,MAAM,MAAM;AACzC,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,YAAY,EAAE,GAAG,KAAK,KAAK,OAAO,SAAS,IAAI,KAAK;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,YAAY,gBAAgB,MAAM,IAAI;AAC5C,YAAM,UAAU,gBAAgB,MAAM,UAAU;AAChD,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,aAAa,EAAE,GAAG,KAAK,KAAK,UAAU,SAAS,OAAO,KAAK;AAAA,MACjF;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,SAAS;AAAA,MACX;AAAA,IACF,KAAK,cAAc;AACjB,YAAM,QAAQ,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC;AACxD,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,UAAU,MAAM,MAAM;AAAA,QACtC,SAAS,uBAAuB,KAAK;AAAA,MACvC;AAAA,IACF;AAAA,IACA,KAAK,cAAc;AACjB,YAAM,YAAY,gBAAgB,MAAM,MAAM;AAC9C,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAI,aAAa,EAAE,GAAG,KAAK;AAAA,MAC7C;AAAA,IACF;AAAA,IACA;AACE,aAAO;AAAA,QACL,SAAS,GAAG,IAAI,IAAIF,UAAS,SAAS,QAAQ,CAAC;AAAA,MACjD;AAAA,EACJ;AACF;AAEA,SAAS,uBAAuB,MAAc,WAAmB,KAA2B;AAC1F,QAAM,SAAS,aAAa,SAAS;AACrC,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,cAAc,WAAW,IAAK;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,SAAS;AACf,MAAI,SAAS,QAAQ;AACnB,UAAM,cAAc,gBAAgB,QAAQ,aAAa;AACzD,UAAM,YAAY,gBAAgB,QAAQ,WAAW;AACrD,WAAO;AAAA,MACL,SACE,CAAC,MAAM,WAAW,cAAc,IAAI,WAAW,MAAM,MAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,MAC1F,SACE,mBAAmB,QAAQ,GAAG,KAC9B,4BAA4B,QAAQ,GAAG;AAAA,IAC3C;AAAA,EACF;AAEA,QAAMC,SAAO,qBAAqB,gBAAgB,QAAQ,MAAM,GAAG,GAAG;AACtE,QAAM,UACJ,mBAAmB,QAAQ,GAAG,MAC7B,SAAS,eAAeE,sBAAqB,OAAO,SAAS,GAAG,IAAI,YACpE,SAAS,iBAAiBC,sBAAqB,OAAO,SAAS,GAAG,IAAI,YACtE,SAAS,qBAAqB,oBAAoB,OAAO,MAAM,IAAI,WACpE,4BAA4B,QAAQ,GAAG;AAEzC,SAAO;AAAA,IACL,SAAS,CAAC,MAAMH,MAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,SAAkC,KAAkC;AAC9F,aAAW,OAAO,CAAC,WAAW,WAAW,UAAU,iBAAiB,GAAG;AACrE,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,aAAO,cAAc,qBAAqB,OAAO,GAAG,GAAG,IAAK;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAASE,sBAAqB,OAAgB,KAAkC;AAC9E,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,OAAO,OAAO,SAAS,cAAc,SAAS;AACpD,UAAME,eAAc,qBAAqB,gBAAgB,QAAQ,MAAM,GAAG,GAAG;AAC7E,WAAOA,eAAc,GAAG,IAAI,IAAIA,YAAW,KAAK;AAAA,EAClD,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAASD,sBAAqB,OAAgB,KAAkC;AAC9E,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAMC,eAAc,qBAAqB,gBAAgB,QAAQ,MAAM,GAAG,GAAG;AAC7E,UAAM,OAAO,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO;AAC7D,UAAM,OAAO,gBAAgB,QAAQ,MAAM;AAC3C,QAAI,CAACA,gBAAe,CAAC,MAAM;AACzB,aAAO;AAAA,IACT;AAEA,WAAO,GAAGA,YAAW,GAAG,OAAO,IAAI,IAAI,KAAK,EAAE;AAAA,IAAO,IAAI;AAAA,EAC3D,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,oBAAoB,OAAoC;AAC/D,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,YAAsB,CAAC;AAE7B,aAAW,SAAS,MAAM,MAAM,GAAG,CAAC,GAAG;AACrC,QAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC;AAAA,IACF;AAEA,UAAM,SAAS;AACf,UAAM,OAAO,gBAAgB,QAAQ,MAAM,KAAK;AAChD,cAAU,KAAK,UAAU,IAAI,EAAE;AAE/B,QAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,iBAAW,OAAO,OAAO,QAAQ,MAAM,GAAG,CAAC,GAAG;AAC5C,YAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC;AAAA,QACF;AAEA,cAAM,YAAY;AAClB,cAAM,QAAQ,MAAM,QAAQ,UAAU,KAAK,IACvC,UAAU,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,IACtD;AACJ,YAAI,OAAO;AACT,oBAAU,KAAK,KAAK,KAAK,EAAE;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAEA,SAAS,4BAA4B,OAAgC,KAAkC;AACrG,QAAM,OAAO,CAAC,UAAU,SAAS,QAAQ,UAAU,iBAAiB,eAAe;AACnF,QAAM,YAAY,KACf,IAAI,CAAC,QAAQ;AACZ,UAAM,QAAQ,MAAM,GAAG;AACvB,WAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IACtD,GAAG,GAAG,KAAK,qBAAqB,OAAO,GAAG,KAAK,qBAAqB,OAAO,GAAG,CAAC,KAC/E;AAAA,EACN,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAEA,SAAS,uBAAuB,OAAoC;AAClE,MAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MACX,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,UAAU;AACd,QAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAAG;AAC/D,aAAO;AAAA,IACT;AAEA,UAAM,SAAS;AACf,UAAM,KAAK,gBAAgB,QAAQ,IAAI;AACvC,UAAM,OAAO,gBAAgB,QAAQ,MAAM;AAC3C,UAAM,SAAS,gBAAgB,QAAQ,QAAQ;AAC/C,QAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ;AAC3B,aAAO;AAAA,IACT;AAEA,WAAO,GAAG,iBAAiB,MAAM,CAAC,KAAK,EAAE,KAAK,IAAI;AAAA,EACpD,CAAC,EACA,OAAO,CAAC,SAAyB,QAAQ,IAAI,CAAC;AAEjD,SAAO,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI,IAAI;AAC/C;AAEA,SAAS,wBAAwB,WAA+B,WAAmD;AACjH,QAAM,YAAsB,CAAC;AAE7B,MAAI,WAAW;AACb,cAAU,KAAK;AAAA,EAAU,cAAc,WAAW,GAAG,CAAC,EAAE;AAAA,EAC1D;AAEA,MAAI,WAAW;AACb,cAAU,KAAK;AAAA,EAAU,cAAc,WAAW,GAAG,CAAC,EAAE;AAAA,EAC1D;AAEA,SAAO,UAAU,SAAS,IAAI,UAAU,KAAK,IAAI,IAAI;AACvD;AAEA,SAAS,gBAAgB,SAAkC,KAAiC;AAC1F,QAAM,QAAQ,QAAQ,GAAG;AACzB,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,IAAI,QAAQ;AACjE;AAEA,SAAS,gBAAgB,WAAoB,SAA0B;AACrE,QAAM,QAAQ,OAAO,cAAc,YAAY,OAAO,SAAS,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AACpG,QAAM,MAAM,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,IAAI,KAAK,MAAM,OAAO,IAAI;AAE5F,MAAI,SAAS,KAAK;AAChB,WAAO,IAAI,KAAK,IAAI,GAAG;AAAA,EACzB;AAEA,MAAI,OAAO;AACT,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAe,UAA0B;AAC9D,QAAM,aAAa,MAAM,QAAQ,SAAS,IAAI,EAAE,KAAK;AACrD,MAAI,WAAW,UAAU,UAAU;AACjC,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,WAAW,MAAM,GAAG,QAAQ,CAAC;AAAA;AACzC;AAEA,SAAS,qBAAqB,OAA2B,KAAkC;AACzF,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,mBAAAJ,QAAK,QAAQ,GAAG;AACtC,QAAM,kBAAkB,mBAAAA,QAAK,QAAQ,KAAK;AAC1C,MACE,oBAAoB,iBACpB,gBAAgB,WAAW,GAAG,aAAa,GAAG,mBAAAA,QAAK,GAAG,EAAE,GACxD;AACA,WAAO,mBAAAA,QAAK,SAAS,eAAe,eAAe,KAAK;AAAA,EAC1D;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAe,KAAsB;AACjE,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,mBAAAA,QAAK,QAAQ,GAAG,EAAE,QAAQ,uBAAuB,MAAM;AAC7E,QAAM,UAAU,IAAI,OAAO,GAAG,aAAa,iCAAiC,GAAG;AAE/E,SAAO,MAAM,QAAQ,SAAS,CAAC,UAAU,qBAAqB,OAAO,GAAG,KAAK,KAAK;AACpF;AAEA,SAAS,iBAAiB,QAAwB;AAChD,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AlBvoBA,eAAsB,kBAAkB,WAKrC;AACD,QAAM,MAAM,UAAU,MAAM,mBAAAK,QAAK,QAAQ,UAAU,GAAG,IAAI,QAAQ,IAAI;AACtE,QAAM,SAAS,MAAM,qBAAqB;AAAA,IACxC;AAAA,IACA,OAAO,UAAU;AAAA,IACjB,MAAM,sBAAsB,UAAU,IAAI;AAAA,EAC5C,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,OAAO;AAAA,IACd;AAAA,EACF;AACF;AAEA,eAAsB,iBACpB,QACA,KACA,QACA,SACA,cACwB;AACxB,QAAM,iBAAiB,qBAAqB,QAAQ;AAAA,IAClD;AAAA,IACA,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB,CAAC;AAED,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB;AAAA,MACvC,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,eAAe;AAAA,MAC1B,UAAU;AAAA,QACR,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF,CAAC;AACD,QAAI,OAAO,UAAU,OAAO,aAAa;AACvC,SAAG,KAAK,OAAO,WAAW;AAAA,IAC5B;AACA,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,mBAAe,MAAM;AACrB,UAAM;AAAA,EACR;AACF;AAEO,SAAS,kBAAkB,KAAsB,UAA8C;AACpG,UAAQ,KAAK;AAAA,IACX,KAAK,gBAAgB;AACnB,YAAM,SAAS,aAAa,QAAQ;AACpC,UAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,eAAO,OAAO,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAAA,MAC1C;AAEA,aAAO,SACJ,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,OAAO;AAAA,IACnB;AAAA,IACA,KAAK;AACH,aAAQ,aAAa,UAAU,aAAa;AAAA,IAC9C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,yBAAyB;AAC5B,YAAM,SAAS,OAAO,QAAQ;AAC9B,UAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,cAAM,IAAI,MAAM,yBAAyB,GAAG,GAAG;AAAA,MACjD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK,QAAQ;AACX,YAAM,SAAS,eAAe,QAAQ;AACtC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,MAAM,iBAAiB,QAAQ,EAAE;AAAA,MAC7C;AAEA,aAAO;AAAA,IACT;AAAA,IACA,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,UAAU;AACb,YAAM,SAAS,aAAa,QAAQ;AACpC,UAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,cAAM,IAAI,MAAM,8BAA8B,GAAG,GAAG;AAAA,MACtD;AAEA,aAAO;AAAA,IACT;AAAA,IACA;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,oBAAoB,SAAgD;AAClF,SAAO;AAAA,IACL,KAAK,OAAO,QAAQ,QAAQ,WAAW,QAAQ,MAAM;AAAA,IACrD,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,QAAQ;AAAA,IAC3D,MAAM,sBAAsB,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAQ,QAAQ,IAA8B;AAAA,EACvH;AACF;AAEO,SAAS,iBAAiB,OAAe,UAA0B;AACxE,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,MAAM,GAAG,QAAQ,CAAC;AACpC;AAEA,SAAS,sBAAsB,OAA8D;AAC3F,SAAO,OAAO,UAAU,WAAW,eAAe,KAAK,IAAI;AAC7D;;;AsBpJA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAEjB;AAOA,eAAsB,uBAAuB,KAAyC;AACpF,QAAM,UAAoB,CAAC;AAC3B,QAAM,UAAoB,CAAC;AAE3B,QAAM,aAAa,mBAAAC,QAAK,KAAK,KAAK,UAAU;AAC5C,QAAM,UAAU,mBAAAA,QAAK,KAAK,YAAY,MAAM;AAC5C,QAAM,iBAAiB,mBAAAA,QAAK,KAAK,YAAY,cAAc;AAC3D,QAAM,aAAa,mBAAAA,QAAK,KAAK,YAAY,gBAAgB;AACzD,QAAM,cAAc,wBAAwB,KAAK;AACjD,QAAM,qBAAqB,wBAAwB,IAAI;AAGvD,QAAM,kBAAAC,QAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE9C,MAAI,MAAMC,YAAW,OAAO,GAAG;AAC7B,YAAQ,KAAK,OAAO;AAAA,EACtB,OAAO;AACL,UAAM,kBAAAD,QAAG,UAAU,SAAS,aAAa,MAAM;AAC/C,YAAQ,KAAK,OAAO;AAAA,EACtB;AAEA,MAAI,MAAMC,YAAW,cAAc,GAAG;AACpC,YAAQ,KAAK,cAAc;AAAA,EAC7B,OAAO;AACL,UAAM,kBAAAD,QAAG,UAAU,gBAAgB,oBAAoB,MAAM;AAC7D,YAAQ,KAAK,cAAc;AAAA,EAC7B;AAEA,MAAI,MAAMC,YAAW,UAAU,GAAG;AAChC,YAAQ,KAAK,UAAU;AAAA,EACzB,OAAO;AACL,UAAM,kBAAAD,QAAG,UAAU,YAAY,+BAA+B,GAAG,MAAM;AACvE,YAAQ,KAAK,UAAU;AAAA,EACzB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAeC,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,kBAAAD,QAAG,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,wBAAwB,SAA0B;AACzD,QAAM,oBAAoB,UAAU,0CAA0C;AAE9E,SAAO;AAAA,IACL;AAAA,IACA,UACI,uIACA;AAAA,IACJ,UACI,gIACA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;AC9JA,IAAAE,uBAAoB;AAGpB;AAEA;AACA;AACAC;AACAA;AACAA;AAUA,IAAM,mBAAmB;AAEzB,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACxC,cAAc;AACZ,UAAM,8BAA8B;AAAA,EACtC;AACF;AAEA,eAAsB,kBAAkB,SAA+C;AACrF,QAAM,eAAe,IAAI,aAAa,QAAQ,OAAO,MAAM,WAAW;AACtE,QAAM,YAAY,IAAI,UAAU,QAAQ,OAAO;AAC/C,QAAM,YAAY,IAAI,UAAU,QAAQ,OAAO;AAC/C,QAAM,MAAM,IAAI,WAAW,QAAQ,OAAO;AAC1C,QAAM,iBAAiB,MAAM,UAAU,WAAW,QAAQ,IAAI;AAC9D,MAAI,UACF,gBAAgB,YACZ,MAAM,eAAe,cAAc,eAAe,SAAS,IAC3D;AAEN,MAAI,CAAC,SAAS;AACZ,cAAU,MAAM,aAAa,OAAO,QAAQ,OAAO;AAAA,EACrD;AAEA,QAAM,UAAU,aAAa,QAAQ,MAAM,QAAQ,MAAM,WAAW;AAAA,IAClE,WAAW,QAAQ;AAAA,IACnB,KAAK,qBAAAC,QAAQ;AAAA,EACf,CAAC;AAED,MAAI,mBAAmB;AAEvB,SAAO,MAAM;AACX,UAAM,mBAAmB,QAAQ,OAAO,EAAE,MAAM,MAAM,IAAI;AAC1D,UAAM,SAAS,MAAM,UAAU,WAAW,QAAQ,IAAI;AACtD,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY;AAC3C;AAAA,IACF;AAEA,UAAM,YAAmD,CAAC;AAC1D,QAAI,kBAAkB;AACpB,gBAAU,KAAK;AAAA,QACb,OAAO,QAAQ;AAAA,QACf,KAAK,QAAQ;AAAA,MACf,CAAC;AACD,yBAAmB;AAAA,IACrB;AAEA,UAAM,QAAQ,MAAM,IAAI,UAAU,QAAQ,IAAI;AAC9C,QAAI,MAAM,SAAS,GAAG;AACpB,gBAAU,KAAK;AAAA,QACb,OAAO;AAAA,QACP,KAAK,QAAQ;AAAA,MACf,CAAC;AAAA,IACH;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,YAAY,MAAM,UAAU,cAAc,QAAQ,IAAI;AAC5D,YAAM,WAAW,UAAU,CAAC;AAC5B,UAAI,UAAU;AACZ,cAAM,UAAU,MAAM,SAAS,IAAI,QAAQ,IAAI;AAC/C,YAAI,UAAU,QAAQ;AACtB,YAAI,eAAe;AACnB,YAAI;AACF,gBAAM,WAAW,MAAM,IAAI,cAAc,QAAQ,OAAO,EAAE,cAAc,SAAS,IAAI,SAAS,OAAO;AACrG,oBAAU,SAAS;AACnB,yBAAe;AAAA,kBAAqB,SAAS,IAAI,WAAW,SAAS,IAAI,aAAa,SAAS,MAAM;AAAA,QACvG,SAAS,OAAO;AACd,yBAAe;AAAA,kBAAqB,OAAQ,MAAgC,WAAW,KAAK,CAAC;AAAA,QAC/F;AAEA,kBAAU,KAAK;AAAA,UACb,KAAK;AAAA,UACL,OACE,uBAAuB,SAAS,EAAE,KAAK,SAAS,OAAO;AAAA,EAAK,SAAS,WAAW,oBAChF;AAAA,QACJ,CAAC;AAAA,MACH;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,UAAU,mBAAmB,QAAQ,MAAM,QAAQ,qBAAAA,QAAQ,GAAG;AACpE,YAAMC,OAAM,gBAAgB;AAC5B;AAAA,IACF;AAEA,UAAM,UAAU,mBAAmB,QAAQ,MAAM,WAAW,qBAAAD,QAAQ,GAAG;AAEvE,eAAW,YAAY,WAAW;AAChC,UAAI;AACF,cAAM,SAAS,MAAM,oBAAoB;AAAA,UACvC,OAAO,SAAS;AAAA,UAChB,KAAK,SAAS;AAAA,UACd,QAAQ,QAAQ;AAAA,UAChB;AAAA,UACA;AAAA,UACA,UAAU;AAAA,YACR,MAAM;AAAA,YACN,MAAM,QAAQ;AAAA,YACd,MAAM,QAAQ;AAAA,YACd,WAAW,MAAM,UAAU,WAAW,GAAG;AAAA,UAC3C;AAAA,UACA,SAAS,OAAO,EAAE,aAAa,MAAM;AACnC,kBAAM,mBAAmB,MAAM,UAAU,WAAW,QAAQ,IAAI;AAChE,gBAAI,CAAC,oBAAoB,iBAAiB,WAAW,YAAY;AAC/D,oBAAM,IAAI,sBAAsB;AAAA,YAClC;AAEA,kBAAM,cAAc,MAAM,IAAI,UAAU,QAAQ,IAAI;AACpD,mBAAO;AAAA,cACL,OACE,YAAY,SAAS,IACjB,4FACA;AAAA,YACR;AAAA,UACF;AAAA,QACF,CAAC;AACD,kBAAU,OAAO;AAEjB,cAAM,kBAAkB,MAAM,UAAU,WAAW,QAAQ,IAAI;AAC/D,YAAI,CAAC,mBAAmB,gBAAgB,WAAW,YAAY;AAC7D;AAAA,QACF;AAEA,YAAI,OAAO,QAAQ;AACjB;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YAAI,iBAAiB,uBAAuB;AAC1C;AAAA,QACF;AAEA,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,eAAe,eAAe,cAA4B,WAAmB;AAC3E,MAAI;AACF,WAAO,MAAM,aAAa,KAAK,SAAS;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,OAAM,IAA2B;AACxC,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,eAAW,SAAS,EAAE;AAAA,EACxB,CAAC;AACH;;;ACvKA,IAAAC,qBAAiB;AAIjB;AACA;;;ACLA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAgEV,IAAM,4BAAN,MAAgE;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,SAIT;AACD,UAAM,uBAAuB,QAAQ,WAAW,QAAQ,SAAS,EAAE;AACnE,SAAK,UAAU,GAAG,oBAAoB,OAAO,QAAQ,KAAK;AAC1D,SAAK,cAAc,GAAG,oBAAoB,YAAY,QAAQ,KAAK;AACnE,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,MAAM,WAAW,SAA+D;AAC9E,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,SAAS,QAAQ;AAAA,QACjB,iBAAiB,CAAC,SAAS;AAAA,MAC7B;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,WAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,SAAmE;AACnF,UAAM,UAAU,MAAM,KAAK,KAKxB,eAAe;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAED,WAAO;AAAA,MACL,WAAW,KAAK,MAAM,SAAS,cAAc,CAAC;AAAA,MAC9C,QAAQ,KAAK,MAAM,SAAS,MAAM,MAAM,QAAQ,MAAM;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAM,eAAe,SAAuD;AAC1E,UAAM,KAAK,KAAK,kBAAkB;AAAA,MAChC,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,SAAwD;AAC5E,UAAM,KAAK,KAAK,mBAAmB;AAAA,MACjC,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,MACpB,MAAM,QAAQ;AAAA,IAChB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,SAAsD;AACxE,UAAM,KAAK,KAAK,iBAAiB;AAAA,MAC/B,SAAS,QAAQ;AAAA,MACjB,YAAY,QAAQ;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,SAAqD;AACtE,UAAM,WAAW,QAAQ,UAAU,KAAK,KAAK,mBAAAC,QAAK,SAAS,QAAQ,QAAQ;AAC3E,UAAM,SAAS,MAAM,kBAAAC,QAAG,SAAS,QAAQ,QAAQ;AACjD,UAAM,OAAO,IAAI,SAAS;AAC1B,SAAK,IAAI,WAAW,OAAO,QAAQ,MAAM,CAAC;AAC1C,SAAK,IAAI,YAAY,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,QAAQ;AACjD,QAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,WAAK,IAAI,WAAW,QAAQ,QAAQ,KAAK,CAAC;AAAA,IAC5C;AAEA,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,iBAAiB;AAAA,MACpE,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAED,UAAM,UAAU,MAAM,SAAS,KAAK;AAIpC,QAAI,CAAC,SAAS,MAAM,QAAQ,OAAO,MAAM;AACvC,YAAM,IAAI,MAAM,QAAQ,eAAe,gDAAgD,SAAS,MAAM,EAAE;AAAA,IAC1G;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,SAAkE;AAC9E,UAAM,SAAS,MAAM,KAAK,KAGvB,WAAW;AAAA,MACZ,SAAS,QAAQ;AAAA,IACnB,CAAC;AAED,UAAM,WAAW,OAAO,QAAQ,aAAa,EAAE,EAAE,KAAK;AACtD,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,qDAAqD,QAAQ,MAAM,EAAE;AAAA,IACvF;AAEA,WAAO;AAAA,MACL;AAAA,MACA,UACE,OAAO,QAAQ,cAAc,YAAY,OAAO,SAAS,OAAO,SAAS,IACrE,KAAK,MAAM,OAAO,SAAS,IAC3B;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,SAAkD;AACnE,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,WAAW,IAAI,QAAQ,SAAS,QAAQ,SAAS,EAAE,CAAC,IAAI;AAAA,MACpG,QAAQ;AAAA,IACV,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,6CAA6C,SAAS,MAAM,EAAE;AAAA,IAChF;AAEA,UAAM,cAAc,MAAM,SAAS,YAAY;AAC/C,WAAO,OAAO,KAAK,WAAW;AAAA,EAChC;AAAA,EAEA,MAAc,KAAkB,QAAgB,MAA+B,QAAkC;AAC/G,UAAM,WAAW,MAAM,KAAK,UAAU,GAAG,KAAK,OAAO,IAAI,MAAM,IAAI;AAAA,MACjE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU,IAAI;AAAA,MACzB;AAAA,IACF,CAAC;AAED,UAAM,UAAU,MAAM,SAAS,KAAK;AAMpC,QAAI,CAAC,SAAS,MAAM,QAAQ,OAAO,MAAM;AACvC,YAAM,IAAI,MAAM,QAAQ,eAAe,gBAAgB,MAAM,uBAAuB,SAAS,MAAM,EAAE;AAAA,IACvG;AAEA,WAAO,QAAQ;AAAA,EACjB;AACF;;;ACzNA,IAAAC,sBAAmB;;;ACAnB,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAEjB,eAAsBC,cAAgB,UAAkB,UAAyB;AAC/E,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAC,QAAG,SAAS,UAAU,MAAM;AAC9C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsBC,yBAAwB,UAAkB,OAA+B;AAC7F,QAAM,kBAAAD,QAAG,MAAM,mBAAAE,QAAK,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC1D,QAAM,gBAAgB,GAAG,QAAQ,QAAQ,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAClE,QAAM,kBAAAF,QAAG,UAAU,eAAe,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC/E,QAAM,kBAAAA,QAAG,OAAO,eAAe,QAAQ;AACzC;;;ADkBO,IAAM,wBAAN,MAA4B;AAAA,EAGjC,YACmB,SAQjB;AARiB;AAAA,EAQhB;AAAA,EAXK,gBAAgB,QAAQ,QAAQ;AAAA,EAaxC,MAAM,QAAQ,OAA6E;AACzF,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,QAAmC;AAAA,QACvC,IAAI,oBAAAG,QAAO,WAAW;AAAA,QACtB,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,cAAc;AAAA,QACd,WAAW;AAAA,QACX,eAAe;AAAA,MACjB;AACA,cAAQ,KAAK,KAAK;AAClB,cAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,YAAY,MAAM,SAAS;AAC9D,YAAM,KAAK,aAAa,OAAO;AAC/B,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAKqB;AACrC,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,QAAmC;AAAA,QACvC,IAAI,oBAAAA,QAAO,WAAW;AAAA,QACtB,MAAM;AAAA,QACN,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,QACf,cAAc;AAAA,QACd,WAAW;AAAA,QACX,eAAe;AAAA,MACjB;AACA,cAAQ,KAAK,KAAK;AAClB,cAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,YAAY,MAAM,SAAS;AAC9D,YAAM,KAAK,aAAa,OAAO;AAC/B,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,QAAQ;AAEZ,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,gBAAgB,KAAK;AAC7B;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,KAAK,QAAQ,KAAK;AACxB,kBAAQ;AACR,gBAAM,gBAAgB,OAAO;AAC7B,eAAK,QAAQ,cAAc,KAAK;AAAA,QAClC,SAAS,OAAO;AACd,kBAAQ;AACR,gBAAM,gBAAgB;AACtB,gBAAM,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACvE,gBAAM,gBAAgB,MAAM,iBAAiB,MAAM,cAAc,KAAK,QAAQ,cAAc;AAC5F,eAAK,QAAQ,mBAAmB,OAAO,KAAK;AAAA,QAC9C;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,KAAK,aAAa,QAAQ,OAAO,CAAC,UAAU,OAAO,SAAS,MAAM,aAAa,CAAC,CAAC;AAAA,IACzF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAgD;AACpD,WAAO,KAAK,SAAS,YAAY,KAAK,YAAY,CAAC;AAAA,EACrD;AAAA,EAEA,MAAc,QAAQ,OAA6C;AACjE,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,KAAK,QAAQ,OAAO,aAAa;AAAA,QACrC,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM;AAAA,QAChB,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,OAAO,YAAY;AAAA,MACpC,QAAQ,MAAM;AAAA,MACd,MAAM,MAAM;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAAgD;AAC5D,UAAM,UAAU,MAAMC,cAA2D,KAAK,QAAQ,WAAW,IAAI;AAC7G,WAAO,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,aAAa,SAAiD;AAC1E,UAAMC,yBAAwB,KAAK,QAAQ,WAAW;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,MAAc;AACpB,WAAO,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,iBAAiB,cAAsB,QAA4C;AAC1F,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,GAAG,OAAO,aAAa,CAAC,CAAC;AAC9E,SAAO,KAAK,IAAI,OAAO,YAAY,OAAO,cAAc,KAAK,QAAQ;AACvE;;;AE3KO,SAAS,8BAA8C;AAC5D,SAAO;AAAA,IACL,KAAK,OAAO,SAAS;AACnB,cAAQ,IAAI,sBAAsB,OAAO,OAAO,CAAC;AAAA,IACnD;AAAA,IACA,MAAM,OAAO,SAAS;AACpB,cAAQ,MAAM,sBAAsB,OAAO,OAAO,CAAC;AAAA,IACrD;AAAA,EACF;AACF;AAEA,SAAS,sBAAsB,OAAe,UAA8B,CAAC,GAAW;AACtF,QAAM,YAAY,CAAC,cAAc,KAAK;AAEtC,MAAI,QAAQ,QAAQ;AAClB,cAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACzC;AACA,MAAI,QAAQ,QAAQ;AAClB,cAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACzC;AACA,MAAI,QAAQ,SAAS;AACnB,cAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAAA,EAC1C;AACA,MAAI,QAAQ,WAAW;AACrB,cAAU,KAAK,WAAW,QAAQ,SAAS,EAAE;AAAA,EAC/C;AACA,MAAI,QAAQ,WAAW;AACrB,cAAU,KAAK,SAAS,QAAQ,SAAS,EAAE;AAAA,EAC7C;AACA,MAAI,QAAQ,UAAU;AACpB,cAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AACA,MAAI,QAAQ,UAAU;AACpB,cAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AACA,MAAI,QAAQ,QAAQ;AAClB,cAAU,KAAK,QAAQ,MAAM;AAAA,EAC/B;AAEA,SAAO,UAAU,KAAK,GAAG;AAC3B;;;ACjDO,IAAM,0BAAN,MAAiE;AAAA,EACtE,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,OAA+B;AACnC,UAAM,UAAU,MAAMC,cAA6C,KAAK,UAAU,IAAI;AACtF,QAAI,CAAC,WAAW,CAAC,OAAO,SAAS,QAAQ,UAAU,GAAG;AACpD,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,MAAM,QAAQ,UAAoB;AAAA,EAChD;AAAA,EAEA,MAAM,KAAK,QAA+B;AACxC,UAAMC,yBAAwB,KAAK,UAAU;AAAA,MAC3C,YAAY,KAAK,MAAM,MAAM;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;;;ACxBA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAOjB,eAAsB,2BAA2B,SAIhB;AAC/B,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAM,cAAc,mBAAAC,QAAK,KAAK,QAAQ,UAAU,aAAa;AAC7D,QAAMC,kBAAiB,QAAQ,kBAAkB;AAEjD,QAAM,kBAAAC,QAAG,MAAM,QAAQ,UAAU,EAAE,WAAW,KAAK,CAAC;AAEpD,QAAM,cAAc,MAAM,YAAY,WAAW;AACjD,MAAI,eAAe,gBAAgB,aAAa,MAAMD,gBAAe,WAAW,GAAG;AACjF,UAAM,IAAI;AAAA,MACR,6CAA6C,WAAW;AAAA,IAC1D;AAAA,EACF;AAEA,QAAM,kBAAAC,QAAG,UAAU,aAAa,GAAG,SAAS;AAAA,GAAM,MAAM;AAExD,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU;AACd,YAAM,aAAa,MAAM,YAAY,WAAW;AAChD,UAAI,eAAe,WAAW;AAC5B;AAAA,MACF;AAEA,YAAM,kBAAAA,QAAG,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,eAAe,YAAY,UAA0C;AACnE,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAA,QAAG,SAAS,UAAU,MAAM;AAC9C,UAAM,SAAS,OAAO,SAAS,IAAI,KAAK,GAAG,EAAE;AAC7C,WAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAAA,EAC1D,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,sBAAsB,WAAqC;AACxE,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI;AACF,YAAQ,KAAK,WAAW,CAAC;AACzB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AClEO,SAAS,8BAA8B,UAAwB;AACpE,QAAM,aAAa,SAAS,KAAK;AACjC,MAAI,CAAC,YAAY;AACf;AAAA,EACF;AAEA,UAAQ,IAAI,qBAAqB;AACjC,UAAQ,IAAI,cAAc;AAC1B,UAAQ,IAAI,aAAa;AAC3B;;;ACUO,IAAM,8BAAN,MAAyE;AAAA,EAG9E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAFxC,gBAAgB,QAAQ,QAAQ;AAAA,EAIxC,MAAM,IAAI,SAAyD;AACjE,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,aAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,YAAY,OAAO,KAAK;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,SAAgD;AACxD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,YAAM,OAAO,SAAS,OAAO,CAAC,UAAU,MAAM,YAAY,QAAQ,OAAO;AACzE,WAAK,KAAK,OAAO;AACjB,WAAK,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC;AACpE,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,SAAgC;AAC3C,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,YAAM,OAAO,SAAS,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACjE,UAAI,KAAK,WAAW,SAAS,QAAQ;AACnC;AAAA,MACF;AAEA,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAA0C;AAC9C,WAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,MAAc,UAA6C;AACzD,UAAM,UAAU,MAAMC,cAA6D,KAAK,UAAU,IAAI;AACtG,WAAO,MAAM,QAAQ,SAAS,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAAA,EAChE;AAAA,EAEA,MAAc,SAAS,UAAmD;AACxE,UAAMC,yBAAwB,KAAK,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AClFA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;;;ACDV,IAAM,sBAAN,MAA0B;AAAA,EACd,QAAQ,oBAAI,IAA2B;AAAA,EAExD,MAAM,QAAW,SAAiB,MAAwC;AACxE,UAAM,WAAW,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;AAC5D,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,gBAAU;AAAA,IACZ,CAAC;AACD,UAAM,OAAO,SAAS,MAAM,MAAM,MAAS,EAAE,KAAK,MAAM,OAAO;AAC/D,SAAK,MAAM,IAAI,SAAS,IAAI;AAE5B,UAAM,SAAS,MAAM,MAAM,MAAS;AAEpC,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,cAAQ;AACR,UAAI,KAAK,MAAM,IAAI,OAAO,MAAM,MAAM;AACpC,aAAK,MAAM,OAAO,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACKO,IAAM,8BAAN,MAAyE;AAAA,EAG9E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAFxC,gBAAgB,QAAQ,QAAQ;AAAA,EAIxC,MAAM,IAAI,QAAiD;AACzD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,OAAO,OAAO,EAAE;AAC7D,WAAK,KAAK,MAAM;AAChB,WAAK,KAAK,CAAC,MAAM,UAAU;AACzB,YAAI,KAAK,cAAc,MAAM,WAAW;AACtC,iBAAO,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,QACvC;AAEA,eAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,MACrD,CAAC;AACD,YAAM,KAAK,SAAS,YAAY,MAAM,GAAG,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,SAA2D;AAC/E,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACnE,aAAO,QAAQ,QAAQ,SAAS,CAAC,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,SAAiB,QAAQ,GAAwC;AAChF,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACnE,aAAO,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,SAAS,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ;AAAA,IACjF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,UAA+C;AAC3D,UAAM,UAAU,MAAMC,cAAkE,KAAK,UAAU,IAAI;AAC3G,WAAO,MAAM,QAAQ,SAAS,WAAW,IAAI,QAAQ,cAAc,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,SAAS,SAAoD;AACzE,UAAMC,yBAAwB,KAAK,UAAU;AAAA,MAC3C,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAAS,YAAY,SAAqC,YAAgD;AACxG,MAAI,QAAQ,UAAU,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,MAAM,QAAQ,SAAS,UAAU;AAClD;;;AC7FO,IAAM,4BAAN,MAAgC;AAAA,EACrC,YACmB,KACA,aACA,QACjB;AAHiB;AACA;AACA;AAAA,EAChB;AAAA,EAEH,MAAM,WAAW,QAAiD;AAChE,UAAM,SAAS,MAAM,KAAK,YAAY,KAAK;AAC3C,WAAO,KAAK,IAAI,WAAW;AAAA,MACzB,QAAQ,UAAU;AAAA,MAClB,OAAO,KAAK,OAAO,QAAQ;AAAA,MAC3B,gBAAgB,KAAK,OAAO,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,UAAiC;AAC5C,UAAM,KAAK,YAAY,KAAK,WAAW,CAAC;AAAA,EAC1C;AACF;;;ACzBO,SAAS,qBAAqB,MAAc,WAAW,MAAiB;AAC7E,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC;AAC9C,MAAI,KAAK,UAAU,OAAO;AACxB,WAAO,CAAC,IAAI;AAAA,EACd;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI,YAAY;AAEhB,SAAO,UAAU,SAAS,OAAO;AAC/B,UAAM,MAAM,aAAa,WAAW,KAAK;AACzC,WAAO,KAAK,UAAU,MAAM,GAAG,GAAG,CAAC;AACnC,gBAAY,UAAU,MAAM,GAAG;AAAA,EACjC;AAEA,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,KAAK,SAAS;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,MAAc,OAAuB;AACzD,aAAW,aAAa,CAAC,QAAQ,MAAM,GAAG,GAAG;AAC3C,UAAM,MAAM,KAAK,YAAY,WAAW,KAAK;AAC7C,QAAI,MAAM,GAAG;AACX,aAAO,MAAM,UAAU,UAAU,QAAQ,MAAM,UAAU,SAAS;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AACT;;;ACjCA;AAKA;AAEA;;;ACTA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAQjB,IAAM,6BAA6B,KAAK,OAAO;AAE/C,eAAsB,2BAA2B,SAOX;AACpC,QAAM,aAAa,MAAM,QAAQ,IAAI,QAAQ;AAAA,IAC3C,QAAQ,QAAQ,QAAQ;AAAA,EAC1B,CAAC;AACD,QAAM,gBAAgB,QAAQ,QAAQ,YAAY,WAAW,YAAY;AACzE,QAAM,mBAAmB,4BAA4B,QAAQ,MAAM;AACnE,MAAI,OAAO,kBAAkB,YAAY,gBAAgB,kBAAkB;AACzE,UAAM,IAAI;AAAA,MACR,wCAAwC,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,MAAM,KAAK,aAAa,YAAY,gBAAgB;AAAA,IAC1I;AAAA,EACF;AAEA,QAAM,WAAW,MAAM,QAAQ,IAAI,aAAa,UAAU;AAC1D,MAAI,SAAS,aAAa,kBAAkB;AAC1C,UAAM,IAAI;AAAA,MACR,2CAA2C,QAAQ,QAAQ,YAAY,QAAQ,QAAQ,MAAM,KAAK,SAAS,UAAU,YAAY,gBAAgB;AAAA,IACnJ;AAAA,EACF;AAEA,QAAM,WAAW,mBAAAC,QAAK,KAAK,QAAQ,OAAO,UAAU,SAAS,oBAAoB,QAAQ,QAAQ,OAAO,CAAC;AACzG,QAAM,kBAAAC,QAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,eAAe,iBAAiB,QAAQ,QAAQ,YAAY,GAAG,QAAQ,QAAQ,YAAY,MAAM;AACvG,QAAM,gBAAgB,mBAAAD,QAAK,KAAK,UAAU,GAAG,OAAO,QAAQ,QAAQ,QAAQ,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,YAAY,EAAE;AAChH,QAAM,kBAAAC,QAAG,UAAU,eAAe,QAAQ;AAE1C,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,SAAmC;AAAA,IACvC,IAAI,GAAG,QAAQ,QAAQ,OAAO,IAAI,QAAQ,QAAQ,SAAS,IAAI,QAAQ,QAAQ,YAAY;AAAA,IAC3F,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ,QAAQ;AAAA,IAC3B,UAAU,QAAQ,QAAQ;AAAA,IAC1B,WAAW,QAAQ;AAAA,IACnB,gBAAgB,QAAQ,QAAQ;AAAA,IAChC,sBAAsB,QAAQ,QAAQ;AAAA,IACtC,kBAAkB,WAAW;AAAA,IAC7B;AAAA,IACA,UAAU,QAAQ,QAAQ;AAAA,IAC1B,UAAU,QAAQ,QAAQ;AAAA,IAC1B,UAAU,SAAS;AAAA,IACnB,SAAS,QAAQ,QAAQ,QAAQ;AAAA,IACjC,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACA,UAAQ,QAAQ,KAAK,2BAA2B;AAAA,IAC9C,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,IACnB,WAAW;AAAA,IACX,UAAU,QAAQ,QAAQ;AAAA,IAC1B,QAAQ,QAAQ,aAAa;AAAA,EAC/B,CAAC;AACD,SAAO;AACT;AAEO,SAAS,mBACd,OACA,mBACA,KACQ;AACR,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,sBAAsB,mBAAmB,GAAG;AAAA,EACjD,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,mBACd,SACA,YACA,mBACA,KACQ;AACR,QAAM,cACJ,QAAQ,QACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG,sBAAsB,CAAC,UAAU,GAAG,GAAG;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,GAAG,sBAAsB,mBAAmB,GAAG;AAAA,EACjD,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,sBAAsB,SAAqC,KAAuB;AACzF,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC,QAAQ;AAAA,EAClB;AAEA,SAAO,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACpC,UAAMC,eAAc,cAAc,OAAO,eAAe,GAAG;AAC3D,UAAM,OAAO,OAAO,OAAO,aAAa,WAAW,KAAK,OAAO,QAAQ,YAAY;AACnF,UAAM,UAAU,OAAO,UAAU,aAAa,OAAO,OAAO,KAAK;AACjE,WAAO,GAAG,QAAQ,CAAC,KAAK,OAAO,YAAY,mBAAAF,QAAK,SAAS,OAAO,aAAa,CAAC,OAAOE,YAAW,GAAG,IAAI,GAAG,OAAO;AAAA,EACnH,CAAC;AACH;AAEA,SAAS,iBAAiB,UAA0B;AAClD,QAAM,aAAa,SAAS,KAAK,EAAE,QAAQ,+BAA+B,GAAG;AAC7E,SAAO,cAAc;AACvB;AAEA,SAAS,oBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,qBAAqB,GAAG;AAC/C;AAEA,SAAS,cAAc,YAAoB,KAAqB;AAC9D,QAAM,WAAW,mBAAAF,QAAK,SAAS,KAAK,UAAU;AAC9C,SAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,mBAAAA,QAAK,WAAW,QAAQ,IAAI,WAAW;AAC/E;AAEA,SAAS,4BAA4B,QAAyB;AAC5D,QAAM,QAAS,QAAsD;AACrE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAEA,SAAO;AACT;;;ACrJA;AACAG;AACA;AACA;;;ACHA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AACjB,IAAAC,uBAAoB;AAEpB,IAAAC,gBAAsB;AAGtB;AACA;AACAC;AAEA,IAAM,4BAA4B,oBAAI,IAAI,CAAC,QAAQ,cAAc,CAAC;AAmBlE,eAAsB,oBAAoB,OAAqE;AAC7G,QAAM,QAAQ,MAAM,oBAAoB,MAAM,GAAG;AACjD,QAAM,aAAa,qBAAqB,MAAM,YAAY;AAC1D,QAAM,aAAa,WAAW;AAE9B,QAAM,CAAC,WAAW,aAAa,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjE,qBAAqB,MAAM,YAAY;AAAA,IACvC,gBAAgB,WAAW,cAAc;AAAA,IACzC,mBAAmB,WAAW,aAAa;AAAA,EAC7C,CAAC;AAED,QAAM,iBAAiB,MAAM,wBAAwB;AAAA,IACnD,GAAG,YAAY,IAAI,CAAC,WAAW,OAAO,GAAG;AAAA,IACzC,GAAG,eAAe,IAAI,CAAC,QAAQ,IAAI,GAAG;AAAA,EACxC,CAAC;AAED,QAAM,mBAAmB,MAAM,uBAAuB,MAAM,cAAc,SAAS;AACnF,QAAM,oBAAoB,MAAM,sBAAsB;AAAA,IACpD,aAAa,MAAM,OAAO,MAAM;AAAA,IAChC,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,EAC1B,CAAC;AACD,QAAM,2BAA2B,MAAM,OAAO,MAAM,aAAa,iBAAiB;AAClF,QAAM,mBAAmB,MAAM,qBAAqB;AAAA,IAClD,YAAY,MAAM,OAAO,MAAM;AAAA,IAC/B,cAAc,MAAM;AAAA,IACpB;AAAA,EACF,CAAC;AACD,QAAM,EAAE,gBAAgB,iBAAiB,IAAI,MAAM,6BAA6B,UAAU;AAC1F,QAAM,2BAA2B,YAAY,cAAc;AAE3D,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,qBAAqB;AAAA,IACrB,uBAAuB;AAAA,IACvB;AAAA,EACF;AACF;AAEA,eAAe,qBAAqB,SAAkF;AACpH,QAAM,YAAY,qBAAqB,OAAO,EAAE;AAChD,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAC,QAAG,SAAS,WAAW,MAAM;AAC/C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,MAAM,QAAQ,OAAO,KAAK,IAC7B,OAAO,MACJ,IAAI,CAAC,UAAU;AAAA,MACd,MAAM,OAAO,MAAM,QAAQ,EAAE,EAAE,KAAK;AAAA,MACpC,MAAM,OAAO,MAAM,QAAQ,EAAE,EAAE,KAAK;AAAA,MACpC,QAAQ,OAAO,MAAM,WAAW,WAAW,KAAK,SAAS;AAAA,IAC3D,EAAE,EACD,OAAO,CAAC,SAAS,KAAK,QAAQ,KAAK,IAAI,IAC1C,CAAC;AAAA,EACP,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,gBAAgB,gBAA0D;AACvF,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAA,QAAG,SAAS,gBAAgB,MAAM;AACpD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO,MAAM,QAAQ,OAAO,OAAO,IAC/B,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,MAC9B,KAAK,OAAO,QAAQ,QAAQ,YAAY,OAAO,SAAS,OAAO,GAAG,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,IACjG,EAAE,IACF,CAAC;AAAA,EACP,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,mBAAmB,eAAyD;AACzF,MAAI;AACF,UAAM,UAAU,MAAM,kBAAAA,QAAG,QAAQ,eAAe,EAAE,eAAe,KAAK,CAAC;AACvE,UAAM,UAAU,MAAM,QAAQ;AAAA,MAC5B,QACG,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,yBAAyB,KAAK,MAAM,IAAI,CAAC,EAC7E,IAAI,OAAO,UAAU;AACpB,cAAM,MAAM,MAAM,kBAAAA,QAAG,SAAS,mBAAAC,QAAK,KAAK,eAAe,MAAM,IAAI,GAAG,MAAM;AAC1E,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,eAAO;AAAA,UACL,KAAK,OAAO,OAAO,QAAQ,YAAY,OAAO,SAAS,OAAO,GAAG,IAAI,KAAK,MAAM,OAAO,GAAG,IAAI;AAAA,QAChG;AAAA,MACF,CAAC;AAAA,IACL;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAe,wBAAwB,MAAoD;AACzF,QAAM,aAAa,CAAC,GAAG,IAAI;AAAA,IACzB,KACG,OAAO,CAAC,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,CAAC,EACnG,IAAI,CAAC,UAAU,KAAK,MAAM,KAAK,CAAC;AAAA,EACrC,CAAC;AACD,QAAM,aAAuB,CAAC;AAE9B,aAAW,OAAO,YAAY;AAC5B,UAAM,SAAS,MAAM,qBAAqB,GAAG;AAC7C,QAAI,UAAU,CAACC,gBAAe,GAAG,GAAG;AAClC,iBAAW,KAAK,GAAG;AAAA,IACrB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,qBAAqB,KAA+B;AACjE,MAAI,CAACA,gBAAe,GAAG,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,qBAAAC,QAAQ,aAAa,SAAS;AAChC,cAAM,qBAAM,YAAY,CAAC,QAAQ,OAAO,GAAG,GAAG,MAAM,IAAI,GAAG;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,aAAa;AAAA,IACf,CAAC,EAAE,MAAM,MAAM,IAAI;AACnB,UAAM,mBAAmB,KAAK,IAAI,EAAE;AACpC,WAAO,CAACD,gBAAe,GAAG;AAAA,EAC5B;AAEA,MAAI;AACF,yBAAAC,QAAQ,KAAK,KAAK,SAAS;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,KAAK,IAAI,EAAE;AACpC,MAAI,CAACD,gBAAe,GAAG,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,yBAAAC,QAAQ,KAAK,KAAK,SAAS;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,KAAK,IAAI,EAAE;AACpC,SAAO,CAACD,gBAAe,GAAG;AAC5B;AAEA,eAAe,uBACb,SACA,WACmB;AACnB,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAQ,IAAI,cAAc,OAAO;AAEvC,aAAW,YAAY,WAAW;AAChC,QAAI,CAAC,SAAS,QAAQ,CAAC,SAAS,QAAQ,SAAS,WAAW,WAAW;AACrE;AAAA,IACF;AAEA,QAAI;AACF,YAAM,MAAM,OAAO,SAAS,MAAM;AAAA,QAChC,OAAO;AAAA,MACT,CAAC;AAAA,IACH,QAAQ;AACN,YAAM,kBAAAF,QAAG,GAAG,SAAS,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,IAAI;AAAA,IAC/E;AAEA,YAAQ,KAAK,SAAS,IAAI;AAAA,EAC5B;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,OAIf;AACpB,QAAM,aAAuB,CAAC;AAC9B,QAAM,eAAe,MAAM,8BAA8B,MAAM,YAAY;AAE3E,MAAI;AACF,UAAM,UAAU,MAAM,kBAAAA,QAAG,QAAQ,MAAM,aAAa,EAAE,eAAe,KAAK,CAAC;AAC3E,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,OAAO,GAAG;AACpD;AAAA,MACF;AAEA,YAAM,YAAY,mBAAAC,QAAK,SAAS,MAAM,MAAM,OAAO;AACnD,YAAM,eAAe,mBAAAA,QAAK,KAAK,MAAM,aAAa,MAAM,IAAI;AAC5D,YAAM,aAAa,MAAM,qBAAqB;AAC9C,UAAI,eAAe;AAEnB,UAAI,CAAC,YAAY;AACf,cAAM,MAAM,MAAM,kBAAAD,QAAG,SAAS,cAAc,MAAM;AAClD,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,uBAAe,MAAMI,oBAAmB,OAAO,OAAO,OAAO,EAAE,GAAG,YAAY;AAAA,MAChF;AAEA,UAAI,CAAC,cAAc,CAAC,cAAc;AAChC;AAAA,MACF;AAEA,YAAM,kBAAAJ,QAAG,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC;AACzC,iBAAW,KAAK,SAAS;AAAA,IAC3B;AAAA,EACF,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,qBAAqB,OAId;AACpB,QAAM,aAAuB,CAAC;AAC9B,QAAM,eAAe,MAAM,8BAA8B,MAAM,YAAY;AAC3E,QAAM,oBAAoB,IAAI,IAAI,MAAM,iBAAiB;AAEzD,MAAI;AACF,UAAM,UAAU,MAAM,kBAAAA,QAAG,QAAQ,MAAM,YAAY,EAAE,eAAe,KAAK,CAAC;AAC1E,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,OAAO,GAAG;AACpD;AAAA,MACF;AAEA,YAAM,WAAW,mBAAAC,QAAK,SAAS,MAAM,MAAM,OAAO;AAClD,YAAM,eAAe,mBAAAA,QAAK,KAAK,MAAM,YAAY,MAAM,IAAI;AAC3D,YAAM,MAAM,MAAM,kBAAAD,QAAG,SAAS,cAAc,MAAM;AAClD,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,YAAM,SACH,OAAO,OAAO,cAAc,YAAY,kBAAkB,IAAI,OAAO,SAAS,KAC9E,MAAMI,oBAAmB,OAAO,OAAO,OAAO,EAAE,GAAG,YAAY;AAClE,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AAEA,YAAM,kBAAAJ,QAAG,GAAG,cAAc,EAAE,OAAO,KAAK,CAAC;AACzC,YAAM,kBAAAA,QAAG,GAAG,mBAAAC,QAAK,KAAK,MAAM,YAAY,QAAQ,GAAG,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,IAAI;AACrG,iBAAW,KAAK,QAAQ;AAAA,IAC1B;AAAA,EACF,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,6BAA6B,YAGzC;AACD,QAAM,iBAA2B,CAAC;AAClC,QAAM,mBAA6B,CAAC;AAEpC,MAAI;AACF,UAAM,UAAU,MAAM,kBAAAD,QAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,eAAW,SAAS,SAAS;AAC3B,YAAM,eAAe,mBAAAC,QAAK,KAAK,YAAY,MAAM,IAAI;AACrD,UAAI,0BAA0B,IAAI,MAAM,IAAI,GAAG;AAC7C,yBAAiB,KAAK,MAAM,IAAI;AAChC;AAAA,MACF;AAEA,YAAM,kBAAAD,QAAG,GAAG,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC1D,qBAAe,KAAK,MAAM,IAAI;AAAA,IAChC;AAAA,EACF,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,YAAM;AAAA,IACR;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,2BACb,YACA,gBACA,WAAW,IACX,UAAU,IACK;AACf,WAAS,UAAU,GAAG,UAAU,UAAU,WAAW,GAAG;AACtD,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,eAAe,IAAI,OAAO,WAAW;AAAA,QACnC;AAAA,QACA,QAAQ,MAAMK,YAAW,mBAAAJ,QAAK,KAAK,YAAY,KAAK,CAAC;AAAA,MACvD,EAAE;AAAA,IACJ;AAEA,QAAI,UAAU,MAAM,CAAC,SAAS,KAAK,WAAW,KAAK,GAAG;AACpD;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,EAC7D;AACF;AAEA,eAAe,2BACb,aACA,mBACA,WAAW,IACX,UAAU,IACK;AACf,WAAS,UAAU,GAAG,UAAU,UAAU,WAAW,GAAG;AACtD,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,kBAAkB,IAAI,OAAO,eAAe;AAAA,QAC1C;AAAA,QACA,QAAQ,MAAMI,YAAW,mBAAAJ,QAAK,KAAK,aAAa,GAAG,SAAS,OAAO,CAAC;AAAA,MACtE,EAAE;AAAA,IACJ;AAEA,QAAI,UAAU,MAAM,CAAC,SAAS,KAAK,WAAW,KAAK,GAAG;AACpD;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,EAC7D;AACF;AAEA,SAASC,gBAAe,KAAsB;AAC5C,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,yBAAAC,QAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAAmB,KAAa,UAAkB,SAAgC;AAC/F,WAAS,UAAU,GAAG,UAAU,UAAU,WAAW,GAAG;AACtD,QAAI,CAACD,gBAAe,GAAG,GAAG;AACxB;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAAA,EAC7D;AACF;AAEA,eAAeG,YAAW,YAAsC;AAC9D,MAAI;AACF,UAAM,kBAAAL,QAAG,OAAO,UAAU;AAC1B,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeI,oBAAmB,YAAoB,kBAA4C;AAChG,MAAI,CAAC,WAAW,KAAK,KAAK,CAAC,iBAAiB,KAAK,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,MAAM,8BAA8B,UAAU;AACrE,QAAM,mBAAmB,MAAM,8BAA8B,gBAAgB;AAC7E,QAAM,WAAW,mBAAAH,QAAK,SAAS,kBAAkB,cAAc;AAC/D,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,mBAAAA,QAAK,WAAW,QAAQ;AACpF;AAEA,eAAe,8BAA8B,YAAqC;AAChF,MAAI,YAAY,mBAAAA,QAAK,QAAQ,UAAU;AACvC,QAAM,OAAiB,CAAC;AAExB,SAAO,MAAM;AACX,QAAI;AACF,YAAM,OAAO,MAAM,kBAAAD,QAAG,SAAS,SAAS;AACxC,aAAO,KAAK,SAAS,IAAI,mBAAAC,QAAK,KAAK,MAAM,GAAG,KAAK,QAAQ,CAAC,IAAI;AAAA,IAChE,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,eAAO,KAAK,SAAS,IAAI,mBAAAA,QAAK,KAAK,WAAW,GAAG,KAAK,QAAQ,CAAC,IAAI;AAAA,MACrE;AAAA,IACF;AAEA,UAAM,SAAS,mBAAAA,QAAK,QAAQ,SAAS;AACrC,QAAI,WAAW,WAAW;AACxB,aAAO,KAAK,SAAS,IAAI,mBAAAA,QAAK,KAAK,WAAW,GAAG,KAAK,QAAQ,CAAC,IAAI;AAAA,IACrE;AAEA,SAAK,KAAK,mBAAAA,QAAK,SAAS,SAAS,CAAC;AAClC,gBAAY;AAAA,EACd;AACF;;;ADhbAK;AACA;AACA;AACAA;AAEAA;;;AEVA;AAGO,SAAS,4BACd,SACQ;AACR,QAAM,UAAU,2BAA2B,OAAO;AAClD,QAAM,QAAQ;AAAA,IACZ,WAAW,aAAa,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAAA,IACtE,mBAAmB,QAAQ,aAAa;AAAA,IACxC,qBAAqB,eAAe,QAAQ,wBAAwB,CAAC;AAAA,IACrE,UAAU,YAAY,OAAO,CAAC;AAAA,IAC9B,eAAe,QAAQ,SAAS;AAAA,IAChC,wBAAwB,eAAe,QAAQ,mBAAmB,CAAC;AAAA,IACnE,kBAAkB,QAAQ,MAAM,kBAAkB,QAAQ,aAAa,eAAe,QAAQ,UAAU,iBAAiB,QAAQ,YAAY;AAAA,IAC7I,yBAAyB,QAAQ,oBAAoB,KAAK,KAAK,YAAY,QAAQ,oBAAoB,eAAe,CAAC;AAAA,IACvH,iBAAiB,QAAQ,YAAY,KAAK,KAAK,eAAe,QAAQ,YAAY,eAAe,CAAC;AAAA,EACpG;AAEA,MAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,UAAM,KAAK,YAAY;AACvB,eAAW,QAAQ,QAAQ,SAAS,MAAM,GAAG,CAAC,GAAG;AAC/C,YAAM;AAAA,QACJ,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,aAAa,eAAe,KAAK,eAAe,CAAC,QAAQ,KAAK,OAAO,WAAW,KAAK,UAAU;AAAA,MAClI;AAAA,IACF;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,aAAa,QAAgB,SAA2B;AAC/D,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,MAAM,KAAK,QAAQ,KAAK,IAAI,CAAC;AACzC;AAEA,SAAS,YAAY,SAAgE;AACnF,MAAI,QAAQ,MAAM,iBAAiB,eAAe;AAChD,WAAO,gBAAgB,QAAQ,MAAM,oBAAoB,IAAI,QAAQ,iBAAiB,QAAQ,MAAM,oBAAoB;AAAA,EAC1H;AAEA,QAAM,SAAS,SAAS,QAAQ,MAAM,gBAAgB,WAAW,QAAQ,MAAM,iBAAiB,UAAU,QAAQ,MAAM,gBAAgB;AACxI,MAAI,QAAQ,MAAM,iBAAiB,WAAW;AAC5C,WAAO,YAAY,MAAM,oBAAoB,QAAQ,MAAM,oBAAoB;AAAA,EACjF;AAEA,SAAO,UAAU,QAAQ,MAAM,uBAAuB,IAAI,cAAc,QAAQ,MAAM,oBAAoB,KAAK;AACjH;AAEA,SAAS,eAAe,YAA4B;AAClD,MAAI,cAAc,KAAO;AACvB,WAAO,IAAI,aAAa,KAAO,QAAQ,cAAc,MAAS,IAAI,CAAC,CAAC;AAAA,EACtE;AAEA,SAAO,GAAG,UAAU;AACtB;AAEA,SAAS,YAAY,YAA4B;AAC/C,MAAI,cAAc,SAAW;AAC3B,WAAO,IAAI,aAAa,SAAW,QAAQ,CAAC,CAAC;AAAA,EAC/C;AACA,MAAI,cAAc,MAAO;AACvB,WAAO,IAAI,aAAa,MAAO,QAAQ,CAAC,CAAC;AAAA,EAC3C;AAEA,SAAO,GAAG,UAAU;AACtB;;;AF/CA,IAAM,gBAAgB,oBAAI,IAAI,CAAC,KAAK,QAAQ,QAAQ,MAAM,SAAS,SAAS,gBAAM,eAAK,CAAC;AACxF,IAAM,iBAAiB,oBAAI,IAAI,CAAC,SAAS,UAAU,gBAAM,eAAK,CAAC;AAC/D,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,eAAK,CAAC;AAC9C,IAAM,mBAAmB,oBAAI,IAAI,CAAC,YAAY,eAAK,CAAC;AACpD,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,eAAK,CAAC;AAClD,IAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,eAAK,CAAC;AAChD,IAAM,mBAAmB,oBAAI,IAAI,CAAC,YAAY,UAAU,qBAAM,CAAC;AAC/D,IAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,eAAK,CAAC;AAChD,IAAM,gBAAgB,oBAAI,IAAI,CAAC,SAAS,eAAK,CAAC;AAC9C,IAAM,sBAAsB,oBAAI,IAAI,CAAC,eAAe,eAAK,CAAC;AAC1D,IAAM,iBAAiB,oBAAI,IAAI,CAAC,UAAU,qBAAM,CAAC;AACjD,IAAM,qBAAqB,oBAAI,IAAI,CAAC,cAAc,qBAAM,CAAC;AACzD,IAAM,qBAAqB,oBAAI,IAAI,CAAC,UAAU,eAAK,CAAC;AAE7C,SAAS,sBAAsB,OAAwB;AAC5D,SAAO,cAAc,IAAI,MAAM,KAAK,EAAE,YAAY,CAAC;AACrD;AAEA,eAAsB,mBACpB,OACA,SACA,QAC6B;AAC7B,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAE5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,UAAU,GAAG;AACrC,WAAO,KAAK,gBAAgB;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,IAAI,UAAU,GAAG;AAClC,UAAM,oBAAoB;AAAA,MACxB,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,kBAAkB,QAAQ,QAAQ;AAAA,IACpC,CAAC;AACD,WAAO,KAAK,wCAAwC;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,IAAI,UAAU,GAAG;AACjC,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AACA,WAAO;AAAA,EACT;AAEA,MAAI,mBAAmB,IAAI,UAAU,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,IAAI,UAAU,GAAG;AACpC,WAAO,KAAK,oBAAoB,QAAQ,QAAQ,EAAE,EAAE;AACpD,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,IAAI,UAAU,GAAG;AACnC,WAAO,KAAK,SAAS,QAAQ,OAAO,KAAK,SAAS,QAAQ,OAAO,IAAI,YAAY,QAAQ,OAAO,OAAO,EAAE;AACzG,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,IAAI,UAAU,GAAG;AAClC,WAAO,MAAM,gBAAgB,QAAQ,QAAQ,SAAS,CAAC;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,IAAI,UAAU,GAAG;AACpC,WAAO,MAAM,4BAA4B,QAAQ,OAAO,CAAC;AACzD,WAAO;AAAA,EACT;AAEA,MACE,eAAe,IAAI,UAAU,KAC7B,cAAc,IAAI,UAAU,KAC5B,oBAAoB,IAAI,UAAU,KAClC,eAAe,IAAI,UAAU,KAC7B,mBAAmB,IAAI,UAAU,GACjC;AACA,UAAM,iBAAiB,MAAM,mBAAmB,QAAQ,GAAG;AAC3D,UAAM,UAAU,eAAe;AAE/B,QAAI,eAAe,IAAI,UAAU,GAAG;AAClC,YAAM,mBAAmB,OAAO,EAAE,MAAM,MAAM,IAAI;AAClD,aAAO,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,UAAU,CAAC;AACrD,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,IAAI,UAAU,GAAG;AACjC,YAAM,mBAAmB,OAAO,EAAE,MAAM,MAAM,IAAI;AAClD,aAAO,MAAM,MAAM,IAAI,UAAU,OAAO,EAAE,iBAAiB,CAAC;AAC5D,aAAO;AAAA,IACT;AAEA,QAAI,oBAAoB,IAAI,UAAU,GAAG;AACvC,YAAM,wBAAwB,OAAO,EAAE,MAAM,MAAM,IAAI;AACvD,aAAO,MAAM,MAAM,IAAI,mBAAmB,OAAO,EAAE,UAAU,CAAC;AAC9D,aAAO;AAAA,IACT;AAEA,QAAI,mBAAmB,IAAI,UAAU,GAAG;AACtC,aAAO,MAAM,MAAM,IAAI,cAAc,OAAO,EAAE,UAAU,CAAC;AACzD,aAAO;AAAA,IACT;AAEA,UAAM,QAAQ,MAAM,IAAI,WAAW,OAAO,EAAE,UAAU,MAAM;AAC5D,WAAO;AAAA,MACL,MAAM,SAAS,IACX,MACG,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,YAAY,GAAG,QAAQ,IAAI,SAAS,QAAQ,IAAI,KAAK,QAAQ,OAAO,EAAE,EAC3E,KAAK,IAAI,IACZ;AAAA,IACN;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AGjKO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEJ,IAAM,sCACX;;;ACXF,IAAMC,kBAAiB,oBAAI,IAAI,CAAC,SAAS,UAAU,gBAAM,eAAK,CAAC;AAC/D,IAAMC,iBAAgB,oBAAI,IAAI,CAAC,SAAS,eAAK,CAAC;AAE9C,eAAsB,2BACpB,OACA,SACA,QAC6B;AAC7B,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAE5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAIA,eAAc,IAAI,UAAU,GAAG;AACjC,WAAO,MAAM,kBAAkB;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,UAAU,KAAKD,gBAAe,IAAI,UAAU,GAAG;AACvE,WAAO,KAAK,mCAAmC;AAC/C,WAAO;AAAA,EACT;AAEA,SAAO,mBAAyB,OAAO,SAAS,MAAM;AACxD;;;AClCO,IAAM,qBAAN,MAAoD;AAAA,EAGzD,YACmB,SAKjB;AALiB;AAAA,EAKhB;AAAA,EARc,UAA8B,CAAC;AAAA,EAUhD,MAAM,MAAoB;AACxB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,YAAY,IAAI,EAAE;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAoB;AACxB,SAAK,MAAM,UAAU,IAAI,EAAE;AAAA,EAC7B;AAAA,EAEA,IAAI,MAAoB;AACtB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,SAAS,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,UAAU,MAAoB;AAC5B,SAAK,MAAM,cAAc,IAAI,EAAE;AAAA,EACjC;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,MAAM;AACxD,UAAM,QAAQ,IAAI,KAAK;AAAA,EACzB;AAAA,EAEQ,MAAM,MAAoB;AAChC,eAAW,SAAS,qBAAqB,MAAM,KAAK,QAAQ,iBAAiB,GAAG;AAC9E,WAAK,QAAQ,KAAK,KAAK,QAAQ,aAAa,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA,IACzE;AAAA,EACF;AACF;;;AC5DA,IAAAE,oBAAe;AACf,IAAAC,qBAAiB;AAIjB;AACAC;AAGA,IAAM,2BAA2B,KAAK,OAAO;AAC7C,IAAM,oBAAoB;AAEnB,SAAS,2BAA2B,SAIxB;AACjB,SAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aACE;AAAA,QACF,YAAY;AAAA,UACV,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,WAAW;AAAA,cACT,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,SAAS;AAAA,cACP,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UACA,UAAU,CAAC,MAAM;AAAA,UACjB,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAM,OAAO,UAAU,OAAO;AAC9B,YAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,YAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,YAAM,QAAQ,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAEpC,UAAI,CAAC,MAAM,OAAO,GAAG;AACnB,cAAM,IAAI,MAAM,+CAA+C,QAAQ,EAAE;AAAA,MAC3E;AAEA,YAAM,iBAAiB,0BAA0B,QAAQ,OAAO,QAAQ;AACxE,UAAI,MAAM,OAAO,gBAAgB;AAC/B,cAAM,IAAI;AAAA,UACR,yCAAyC,QAAQ,KAAK,MAAM,IAAI,YAAY,cAAc;AAAA,QAC5F;AAAA,MACF;AAEA,YAAM,WACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,IACtD,KAAK,UAAU,KAAK,IACpB,mBAAAC,QAAK,SAAS,QAAQ;AAC5B,YAAM,UAAU,iBAAiB,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,MAAS;AAE5F,YAAM,QAAQ,cAAc,YAAY;AAAA,QACtC,QAAQ,QAAQ;AAAA,QAChB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,QAAQ,cAAc,SAAS;AACrC,cAAQ,QAAQ,KAAK,wBAAwB;AAAA,QAC3C,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,QAAQ,QAAQ,QAAQ;AAAA,MAC1B,CAAC;AAED,aAAO;AAAA,QACL,KAAK;AAAA,UACH;AAAA,YACE,IAAI;AAAA,YACJ,QAAQ,QAAQ;AAAA,YAChB;AAAA,YACA,MAAM;AAAA,YACN,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0BAA0B,QAAyB;AAC1D,QAAM,QAAS,QAAoD;AACnE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAA+C;AACvE,QAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAU,oBAAoB,aAAa,WAAW,MAAM,GAAG,iBAAiB;AACpG;;;AC5GO,SAAS,2BAA2B,SAIxB;AACjB,QAAM,iBAAiB;AAAA,IACrB,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACxB;AAEA,QAAM,sBAAsB,MAAY;AACtC,mBAAe,oBAAoB;AACnC,mBAAe,uBAAuB;AAAA,EACxC;AAEA,SAAO;AAAA,IACL,kBAAkB,MAAM;AACtB,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,UAAU,MAAM;AACd,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,kBAAkB,CAAC,UAAU;AAC3B,cAAQ,WAAW;AACnB,UAAI,eAAe,sBAAsB;AACvC,4BAAoB;AAAA,MACtB;AAEA,qBAAe,qBAAqB;AAAA,IACtC;AAAA,IACA,iBAAiB,CAAC,SAAS;AACzB,cAAQ,WAAW;AACnB,yBAAmB,SAAS,IAAI;AAChC,qBAAe,oBAAoB;AACnC,qBAAe,uBAAuB;AAAA,IACxC;AAAA,IACA,iBAAiB,CAAC,SAAS;AACzB,cAAQ,WAAW;AACnB,UAAI,eAAe,kBAAkB,SAAS,GAAG;AAC/C;AAAA,UACE;AAAA,UACA,OAAO,SAAS,YAAY,KAAK,SAAS,IAAI,OAAO,eAAe;AAAA,QACtE;AACA,4BAAoB;AACpB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,sBAAsB;AACxC,2BAAmB,SAAS,IAAI;AAAA,MAClC;AAEA,0BAAoB;AAAA,IACtB;AAAA,IACA,kBAAkB,MAAM;AACtB,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,aAAa,MAAM;AACjB,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,YAAY,CAAC,SAAS;AACpB,cAAQ,WAAW;AACnB,gCAA0B,SAAS,aAAa,IAAI;AAAA,IACtD;AAAA,IACA,cAAc,CAAC,MAAM,WAAW;AAC9B,cAAQ,WAAW;AACnB,UAAI,SAAS,cAAc;AACzB;AAAA,MACF;AAEA,YAAM,UAAU,mBAAmB,MAAM;AACzC,2BAAqB,SAAS,gBAAgB,OAAO;AAAA,IACvD;AAAA,IACA,aAAa,MAAM;AACjB,cAAQ,WAAW;AAAA,IACrB;AAAA,IACA,iBAAiB,MAAM;AACrB;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,WAAkC;AACnE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,SAAS;AACnC,QAAI,OAAO,OAAO,YAAY,YAAY,OAAO,QAAQ,SAAS,GAAG;AACnE,aAAO,OAAO;AAAA,IAChB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,kBACP,SAGA,SACM;AACN,uBAAqB,SAAS,aAAa,OAAO;AACpD;AAEA,SAAS,mBACP,SAGA,SACM;AACN,oBAAkB,SAAS,OAAO;AACpC;AAEA,SAAS,0BACP,SAIA,MACA,SACM;AACN,QAAM,OAAO,qBAAqB,OAAO;AACzC,MAAI,CAAC,MAAM;AACT;AAAA,EACF;AAEA,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,MAAI,QAAQ,mBAAmB,CAAC,QAAQ,gBAAgB,KAAK,GAAG;AAC9D;AAAA,EACF;AACA,UAAQ,eAAe,KAAK;AAC9B;AAEA,SAAS,qBACP,SAIA,MACA,SACM;AACN,MAAI,OAAO,YAAY,YAAY,QAAQ,WAAW,GAAG;AACvD;AAAA,EACF;AAEA,QAAM,QAA0B;AAAA,IAC9B;AAAA,IACA,MAAM;AAAA,EACR;AACA,MAAI,QAAQ,mBAAmB,CAAC,QAAQ,gBAAgB,KAAK,GAAG;AAC9D;AAAA,EACF;AACA,UAAQ,eAAe,KAAK;AAC9B;AAEA,SAAS,qBAAqB,OAA0C;AACtE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK,IAAI,QAAQ;AAChC;;;ACnKO,IAAM,qBAAN,MAAkC;AAAA,EAQvC,YACmB,SAWjB;AAXiB;AAYjB,SAAK,YAAY,2BAA2B;AAAA,MAC1C,YAAY,MAAM;AAChB,aAAK,iBAAiB;AAAA,MACxB;AAAA,MACA,gBAAgB,CAAC,UAAU;AACzB,aAAK,mBAAmB,MAAM,IAAI;AAAA,MACpC;AAAA,MACA,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EA7BgB;AAAA,EACC,cAAkC,CAAC;AAAA,EAC5C,eAAmD;AAAA,EACnD,cAAc,QAAQ,QAAQ;AAAA,EAC9B,iBAA0B;AAAA,EAC1B,iBAAiB;AAAA,EA0BzB,MAAM,QAAuB;AAC3B,SAAK,eAAe;AACpB,UAAM,KAAK,sBAAsB;AACjC,UAAM,KAAK,cAAc;AAAA,EAC3B;AAAA,EAEA,UAAgB;AACd,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,oBAA0B;AACxB;AAAA,EACF;AAAA,EAEA,MAAM,wBAAuC;AAC3C,WAAO,MAAM;AACX,YAAM,IAAI,QAAc,CAAC,YAAY,aAAa,OAAO,CAAC;AAC1D,YAAM,iBAAiB,KAAK;AAC5B,YAAM,cAAc,KAAK;AACzB,YAAM;AAEN,UAAI,KAAK,gBAAgB;AACvB,cAAM,KAAK;AAAA,MACb;AAEA,UAAI,mBAAmB,KAAK,gBAAgB;AAC1C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,mBAAyB;AAC/B,QAAI,KAAK,cAAc;AACrB;AAAA,IACF;AAEA,SAAK,YAAY,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAS,CAAC;AACzF,SAAK,gBAAgB,KAAK,QAAQ,sBAAsB;AAAA,MACtD,MAAM,KAAK,QAAQ,WAAW,KAAK,QAAQ,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,MACxE,KAAK,QAAQ;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,iBAAuB;AAC7B,SAAK,cAAc,OAAO;AAC1B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEQ,mBAAmB,MAAoB;AAC7C,SAAK,kBAAkB;AACvB,SAAK,cAAc,KAAK,YAAY,KAAK,YAAY;AACnD,UAAI,KAAK,gBAAgB;AACvB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,KAAK,QAAQ,sBAAsB,KAAK,QAAQ,QAAQ,IAAI;AAAA,MACpE,SAAS,OAAO;AACd,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,gBAA+B;AAC3C,QAAI,KAAK,YAAY,WAAW,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,QAAQ,IAAI,KAAK,WAAW;AAAA,EACpC;AACF;AAEA,SAAS,mBACP,UACA,YAC6B;AAC7B,QAAM,SAAS,YAAY,MAAM;AAC/B,SAAK,SAAS;AAAA,EAChB,GAAG,UAAU;AAEb,SAAO;AAAA,IACL,SAAS;AACP,oBAAc,MAAM;AAAA,IACtB;AAAA,EACF;AACF;;;ACrHO,IAAM,sBAAN,cAAkC,mBAAuC;AAAA,EAC9E,YACE,SAUA;AACA,UAAM;AAAA,MACJ,QAAQ;AAAA,QACN,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,YAAY,OAAO,WAAW,QAAQ,WAAW,OAAO,MAAM;AAAA,MAC9D,uBAAuB,QAAQ;AAAA,MAC/B,kBAAkB,QAAQ;AAAA,MAC1B,oBAAoB,QAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;;;AC1BO,SAAS,8BACd,SACA,QACA,SAMiC;AACjC,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,UAAU,CAAC,SAAS;AAClB,aAAO,KAAK,SAAS;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,cAAQ,UAAU,WAAW,IAAI;AAAA,IACnC;AAAA,IACA,YAAY,CAAC,MAAM,SAAS;AAC1B,aAAO,KAAK,aAAa;AAAA,QACvB,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,cAAc,MAAM,GAAG;AAAA,MACjC,CAAC;AACD,cAAQ,UAAU,aAAa,MAAM,IAAI;AAAA,IAC3C;AAAA,IACA,cAAc,CAAC,MAAM,WAAW;AAC9B,aAAO,KAAK,iBAAiB;AAAA,QAC3B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,SAAS,OAAO,MAAM;AAAA,MAChC,CAAC;AACD,cAAQ,UAAU,eAAe,MAAM,MAAM;AAAA,IAC/C;AAAA,IACA,aAAa,CAAC,MAAM,UAAU;AAC5B,aAAO,MAAM,eAAe;AAAA,QAC1B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,SAAS,MAAM,MAAM;AAAA,MAC/B,CAAC;AACD,cAAQ,UAAU,cAAc,MAAM,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAAS,cAAc,OAAe,WAAW,KAAa;AACnE,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAU,WAAW,aAAa,GAAG,WAAW,MAAM,GAAG,WAAW,CAAC,CAAC;AAC1F;;;AZzBA,eAAsB,gBAAgB,SAoBpB;AAChB,MAAI,UAAU,MAAM,mBAAmB,QAAQ,SAAS,OAAO;AAC/D,MAAI,UAAU,MAAM,iBAAiB,SAAS,OAAO;AACrD,QAAM,SAAS,IAAI,mBAAmB;AAAA,IACpC,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB,QAAQ,OAAO,SAAS;AAAA,IAC3C,cAAc,OAAO,QAAQ,SAAS,QAAQ,aAAa,QAAQ,IAAI;AAAA,EACzE,CAAC;AACD,UAAQ,OAAO,KAAK,iBAAiB;AAAA,IACnC,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,EACrB,CAAC;AAED,MAAI;AACF,QAAI,QAAQ,QAAQ,SAAS,mBAAmB;AAC9C,YAAM,qBAAqB,MAAM;AAAA,QAC/B,QAAQ,QAAQ;AAAA,QAChB;AAAA,UACE,KAAK,QAAQ;AAAA,UACb;AAAA,UACA,QAAQ,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAEA,UAAI,uBAAuB,WAAW;AACpC,gBAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD;AAAA,MACF;AAEA,UAAI,uBAAuB,aAAa;AACtC,gBAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD,eAAO,KAAK,uFAAuF;AACnG;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,oBAAoB;AAAA,MACtC,QAAQ,QAAQ,QAAQ;AAAA,MACxB,YAAY,OAAO,WAAW;AAC5B,cAAM,QAAQ,IAAI,eAAe;AAAA,UAC/B;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,MACA,uBAAuB,OAAO,QAAQ,SAAS,QAAQ,aAAa,OAAO,QAAQ,IAAI;AAAA,MACvF,kBAAkB,QAAQ,OAAO,SAAS;AAAA,IAC5C,CAAC;AACD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,qBAAqB,QAAQ,mBAAmB,QAAQ,QAAQ,OAAO;AAC7E,YAAQ,kBAAkB,QAAQ,QAAQ,SAAS;AAAA,MACjD;AAAA,MACA,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,wBAAwB,YAAY,QAAQ,sBAAsB;AAAA,IACpE,CAAC;AACD,YAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AAErD,UAAM,YAAY,MAAM,eAAe,QAAQ,SAAS,QAAQ,IAAI,OAAO;AAC3E,UAAM,YAAY,8BAA8B,SAAS,QAAQ,QAAQ;AAAA,MACvE,SAAS,QAAQ,QAAQ;AAAA,MACzB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,WAAW,QAAQ;AAAA,IACrB,CAAC;AACD,UAAM,eAAe,MAAM,0BAA0B,QAAQ,QAAQ;AAAA,MACnE,cAAc;AAAA,QACZ,2BAA2B;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,eAAe,QAAQ;AAAA,UACvB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI;AACF,UAAI,oBAAoB;AACtB,uBAAe,MAAM;AACnB,cAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,uBAAW,MAAM;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AACA,cAAQ,OAAO,KAAK,iBAAiB;AAAA,QACnC,SAAS,QAAQ,QAAQ;AAAA,QACzB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ,QAAQ,SAAS,yBAAyB,SAAS;AAAA,QACtE,UAAU,QAAQ,QAAQ,SAAS,yBAAyB,QAAQ,QAAQ,WAAW;AAAA,MACzF,CAAC;AACD,YAAM,SAAS,OAAO,QAAQ,WAAW,qBAAqB;AAAA,QAC5D,OAAO;AAAA,QACP,KAAK,QAAQ;AAAA,QACb,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,aAAa,WAAW;AAAA,QACxB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AACD,gBAAU,OAAO;AACjB,UAAI,OAAO,UAAU,OAAO,aAAa;AACvC,eAAO,KAAK,OAAO,WAAW;AAC9B,gBAAQ,kBAAkB;AAAA,MAC5B;AACA,cAAQ,OAAO,KAAK,kBAAkB;AAAA,QACpC,SAAS,QAAQ,QAAQ;AAAA,QACzB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,QAAQ,OAAO,aAAa,SAAS,IAAI,WAAW,OAAO,aAAa,MAAM,KAAK;AAAA,MACrF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAgB;AACnC,kBAAU,MAAM;AAAA,MAClB;AAEA,UAAI,aAAa,KAAK,GAAG;AACvB,gBAAQ,kBAAkB;AAC1B,eAAO,KAAK,0CAA0C;AACtD,gBAAQ,OAAO,KAAK,gBAAgB;AAAA,UAClC,SAAS,QAAQ,QAAQ;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,kBAAkB;AAC1B,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,KAAK,4EAA4E;AACxF,gBAAQ,OAAO,MAAM,eAAe;AAAA,UAClC,SAAS,QAAQ,QAAQ;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,WAAW,QAAQ;AAAA,UACnB,QAAQ,gBAAgB,KAAK;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF,UAAE;AACA,cAAQ,gBAAgB,QAAQ,QAAQ,OAAO;AAC/C,YAAM,QAAQ,MAAM;AACpB,cAAQ,QAAQ;AAChB,YAAM,aAAa,QAAQ,EAAE,MAAM,MAAM,MAAS;AAAA,IACpD;AAAA,EACF,UAAE;AACA,YAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD,cAAU,aAAa,SAAS,QAAQ,EAAE;AAC1C,UAAM,QAAQ,gBAAgB,IAAI,OAAO;AACzC,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAe,eACb,SACA,WACA,SAOiB;AACjB,MAAI,QAAQ,SAAS,wBAAwB;AAC3C,UAAM,aAAa,MAAM,2BAA2B;AAAA,MAClD,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ,OAAO;AAAA,MACvB;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,UAAM,QAAQ,gBAAgB,IAAI,UAAU;AAC5C,UAAMC,qBAAoB,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,SAAS,CAAC;AACrF,WAAO,mBAAmB,SAAS,YAAYA,oBAAmB,QAAQ,GAAG;AAAA,EAC/E;AAEA,QAAM,oBAAoB,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,SAAS,CAAC;AACrF,SAAO,mBAAmB,QAAQ,MAAM,mBAAmB,QAAQ,GAAG;AACxE;AAEA,eAAe,mBACb,SACA,SAKiC;AACjC,QAAM,WAAW,MAAM,QAAQ,gBAAgB,IAAI,QAAQ,OAAO;AAClE,MAAI,UAAU;AACZ,WAAO,aAAa,UAAU,SAAS,SAAS;AAAA,EAClD;AAEA,QAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,OAAO,QAAQ,GAAG,CAAC;AAC9F,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAkC;AAAA,IACtC,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACA,QAAM,QAAQ,gBAAgB,IAAI,OAAO;AACzC,SAAO;AACT;AAEA,eAAe,iBACb,SACA,SAKwB;AACxB,MAAI;AACF,WAAO,MAAM,QAAQ,aAAa,KAAK,QAAQ,SAAS;AAAA,EAC1D,QAAQ;AACN,UAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,OAAO,QAAQ,GAAG,CAAC;AAC9F,UAAM,cAAc,aAAa,SAAS,QAAQ,EAAE;AACpD,UAAM,QAAQ,gBAAgB,IAAI,WAAW;AAC7C,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,SAAiC,WAA2C;AAChG,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;Aa/RO,SAAS,uBACd,QACA,SAC0B;AAC1B,QAAM,UAAU,OAAO;AACvB,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,MAAM;AAC7B,QAAM,mBAAmB,OAAO,WAAW,YAAY,OAAO,SAAS,MAAM,IAAI,KAAK,MAAM,MAAM,IAAI;AACtG,QAAM,SAAS,QAAQ,KAAK;AAC5B,QAAM,WAAW,QAAQ,KAAK;AAC9B,QAAM,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,IAAI,KAAK;AAC1D,QAAM,WAAW,QAAQ;AAEzB,MAAI,aAAa,WAAW;AAC1B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,oBAAoB;AAAA,MAC5B;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,qBAAqB,MAAM;AAC7B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ,oBAAoB;AAAA,MAC5B;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,eAAe,SAAS,gBAAgB,GAAG;AACtD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,UAAU,WAAW,SAAS,gBAAgB;AAChD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,SAAS,oBAAoB,MAAM;AAAA,MACnC,QAAQ;AAAA,MACR;AAAA,MACA,WAAW,QAAQ;AAAA,MACnB;AAAA,MACA,QAAQ,SAAS;AAAA,MACjB,cAAc,SAAS;AAAA,MACvB,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,MACnB,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,OAAO;AAAA,MACjB,QAAQ;AAAA,MACR;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,OAAO;AAAA,IACjB,SAAS,oBAAoB,MAAM;AAAA,IACnC,QAAQ;AAAA,IACR;AAAA,IACA,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA,KAAK;AAAA,EACP;AACF;;;AlB7DO,IAAM,kBAAN,MAAsB;AAAA,EAiB3B,YAA6B,SAAiC;AAAjC;AAC3B,SAAK,eAAe,QAAQ,gBAAgB,IAAI,oBAAoB;AACpE,SAAK,gBACH,QAAQ,iBACR,IAAI,0BAA0B,QAAQ,KAAK,QAAQ,aAAa,QAAQ,OAAO,QAAQ;AACzF,SAAK,kBACH,QAAQ,mBACR,IAAI,4BAA4B,mBAAAC,QAAK,KAAK,QAAQ,OAAO,SAAS,UAAU,kBAAkB,CAAC;AACjG,SAAK,SAAS,QAAQ,UAAU,4BAA4B;AAAA,EAC9D;AAAA,EAzBiB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,oBAAI,IAAmB;AAAA,EACvC,cAAc,oBAAI,IAAgC;AAAA,EAClD,sBAAsB,oBAAI,IAAY;AAAA,EACtC,uBAIZ,CAAC;AAAA,EACW,mBAAmB,oBAAI,IAAY;AAAA,EACnC,mBAAmB,oBAAI,IAAoB;AAAA,EACpD,UAAU;AAAA,EAalB,OAAa;AACX,SAAK,UAAU;AACf,SAAK,oBAAoB,4BAA4B;AAAA,EACvD;AAAA,EAEA,MAAM,IAAI,QAAqC;AAC7C,UAAM,KAAK,qBAAqB;AAChC,SAAK,OAAO,KAAK,kBAAkB;AAAA,MACjC,QAAQ,SAAS,KAAK,QAAQ,OAAO,SAAS,QAAQ;AAAA,IACxD,CAAC;AAED,QAAI;AACF,aAAO,CAAC,KAAK,WAAW,CAAC,QAAQ,SAAS;AACxC,YAAI;AACF,gBAAM,KAAK,iBAAiB,MAAM;AAAA,QACpC,SAAS,OAAO;AACd,cAAI,QAAQ,SAAS;AACnB;AAAA,UACF;AAEA,eAAK,OAAO,MAAM,mBAAmB;AAAA,YACnC,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC/D,CAAC;AACD,gBAAM,KAAK,MAAM,KAAK,QAAQ,OAAO,SAAS,QAAQ,cAAc;AAAA,QACtE;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAqC;AACjD,UAAM,KAAK,sBAAsB,MAAM;AAAA,EACzC;AAAA,EAEA,MAAc,sBAAsB,QAAqC;AACvE,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAE1C,UAAM,UAAU,MAAM,KAAK,cAAc,WAAW,MAAM;AAC1D,UAAM,YAA6B,CAAC;AACpC,eAAW,UAAU,SAAS;AAC5B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,cAAc,MAAM;AAChD,UAAI,MAAM;AACR,kBAAU,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,QAAQ,IAAI,SAAS;AAAA,IAC7B;AACA,eAAW,UAAU,SAAS;AAC5B,YAAM,KAAK,cAAc,OAAO,OAAO,SAAS;AAAA,IAClD;AAEA,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAc,iBAAiB,QAAqC;AAClE,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAE1C,UAAM,UAAU,MAAM,KAAK,cAAc,WAAW,MAAM;AAE1D,eAAW,UAAU,SAAS;AAC5B,UAAI,KAAK,iBAAiB,IAAI,OAAO,SAAS,GAAG;AAC/C;AAAA,MACF;AAEA,WAAK,iBAAiB,IAAI,OAAO,SAAS;AAC1C,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,cAAc,MAAM;AAChD,WAAK,yBAAyB,OAAO,WAAW,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;AAAA,IACpE;AAEA,UAAM,KAAK,0BAA0B;AACrC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAM,cAA6B;AACjC,WAAO,KAAK,cAAc,OAAO,GAAG;AAClC,YAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,aAAa,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAc,cAAc,QAEzB;AACD,UAAM,aAAa,uBAAuB,QAAQ;AAAA,MAChD,gBAAgB,KAAK,QAAQ,OAAO,SAAS;AAAA,IAC/C,CAAC;AAED,QAAI,WAAW,SAAS,UAAU;AAChC,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAEA,QAAI,WAAW,SAAS,qBAAqB,cAAc,WAAW,IAAI,GAAG;AAC3E,YAAM,KAAK,kBAAkB,UAAU;AACvC,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAEA,SAAK,OAAO,KAAK,4BAA4B;AAAA,MAC3C,SAAS,WAAW;AAAA,MACpB,QAAQ,WAAW;AAAA,MACnB,QAAQ,WAAW;AAAA,MACnB,WAAW,WAAW,SAAS,yBAAyB,SAAS;AAAA,MACjE,UAAU,WAAW,SAAS,yBAAyB,WAAW,WAAW;AAAA,IAC/E,CAAC;AAED,SAAK,qBAAqB,WAAW,OAAO;AAC5C,UAAM,OAAO,KAAK,aAAa,QAAQ,WAAW,SAAS,YAAY;AACrE,YAAM,gBAAgB;AAAA,QACpB,KAAK,KAAK,QAAQ;AAAA,QAClB,QAAQ,KAAK,QAAQ;AAAA,QACrB,KAAK,KAAK,QAAQ;AAAA,QAClB,cAAc,KAAK,QAAQ;AAAA,QAC3B,iBAAiB,KAAK,QAAQ;AAAA,QAC9B,iBAAiB,KAAK;AAAA,QACtB,eAAe,KAAK,QAAQ;AAAA,QAC5B,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,SAAS,KAAK,QAAQ;AAAA,QACtB,cAAc,CAAC,QAAQ,SAAS,KAAK,aAAa,QAAQ,IAAI;AAAA,QAC9D,uBAAuB,CAAC,YAAY,KAAK,qBAAqB,OAAO;AAAA,QACrE,oBAAoB,CAAC,YAAY,KAAK,oBAAoB,OAAO,OAAO;AAAA,QACxE,mBAAmB,CAAC,SAAS,eAAe;AAC1C,eAAK,YAAY,IAAI,SAAS,UAAU;AAAA,QAC1C;AAAA,QACA,iBAAiB,CAAC,YAAY;AAC5B,eAAK,YAAY,OAAO,OAAO;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,SAAS,WAAW;AAAA,QACpB,QAAQ,WAAW;AAAA,QACnB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,kBAAkB,SAAgD;AAC9E,UAAM,aAAa,KAAK,YAAY,IAAI,QAAQ,OAAO;AACvD,QAAI,cAAc,CAAC,WAAW,WAAW,OAAO,SAAS;AACvD,iBAAW,WAAW,MAAM;AAC5B,YAAM,KAAK,aAAa,QAAQ,QAAQ,iFAAiF;AACzH,YAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,WAAK,OAAO,KAAK,kBAAkB;AAAA,QACjC,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,WAAW,WAAW;AAAA,MACxB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB,QAAQ,OAAO,IAAI,GAAG;AAChD,WAAK,oBAAoB,IAAI,QAAQ,OAAO;AAC5C,YAAM,KAAK,aAAa,QAAQ,QAAQ,iFAAiF;AACzH,YAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,WAAK,OAAO,KAAK,8BAA8B;AAAA,QAC7C,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,KAAK,aAAa,QAAQ,QAAQ,wCAAwC;AAChF,UAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,SAAK,OAAO,KAAK,sCAAsC;AAAA,MACrD,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAAa,QAAgB,MAA6B;AACtE,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,eAAW,SAAS,qBAAqB,MAAM,KAAK,QAAQ,OAAO,SAAS,iBAAiB,GAAG;AAC9F,YAAM,KAAK,QAAQ,cAAc,QAAQ;AAAA,QACvC;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,WAAK,OAAO,KAAK,qBAAqB;AAAA,QACpC;AAAA,QACA,QAAQ,cAAc,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAc,uBAAsC;AAClD,UAAM,kBAAAC,QAAG,MAAM,KAAK,QAAQ,OAAO,SAAS,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EAC3E;AAAA,EAEQ,UACN,MACA,SAKe;AACf,UAAM,UAAU,KACb,MAAM,CAAC,UAAU;AAChB,WAAK,OAAO,MAAM,2BAA2B;AAAA,QAC3C,GAAG;AAAA,QACH,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC/D,CAAC;AACD,YAAM;AAAA,IACR,CAAC,EACA,QAAQ,YAAY;AACnB,WAAK,cAAc,OAAO,OAAO;AACjC,UAAI;AACF,cAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,MAC5C,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,0BAA0B;AAAA,UAC1C,GAAG;AAAA,UACH,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC/D,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AACH,SAAK,cAAc,IAAI,OAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAAuB;AACjD,eAAW,cAAc,KAAK,YAAY,OAAO,GAAG;AAClD,UAAI,CAAC,WAAW,WAAW,OAAO,SAAS;AACzC,mBAAW,WAAW,MAAM,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,IAA2B;AAC7C,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,OAAO;AACtB,YAAM,KAAK,QAAQ,MAAM,EAAE;AAC3B;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACxD;AAAA,EAEQ,qBAAqB,SAAuB;AAClD,SAAK,iBAAiB,IAAI,SAAS,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAAA,EACzE;AAAA,EAEQ,qBAAqB,SAAuB;AAClD,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAClE,QAAI,cAAc,GAAG;AACnB,WAAK,iBAAiB,OAAO,OAAO;AACpC;AAAA,IACF;AAEA,SAAK,iBAAiB,IAAI,SAAS,SAAS;AAAA,EAC9C;AAAA,EAEQ,mBAAmB,SAAyB;AAClD,WAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK;AAAA,EAC/C;AAAA,EAEQ,yBAAyB,UAAkB,OAA8B;AAC/E,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAEA,YAAQ,IAAI,KAAK,EACd,KAAK,MAAM;AACV,YAAM,UAAU;AAAA,IAClB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAM,QAAQ;AACd,YAAM,UAAU;AAAA,IAClB,CAAC;AAEH,SAAK,qBAAqB,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,MAAc,4BAA2C;AACvD,WAAO,KAAK,qBAAqB,SAAS,GAAG;AAC3C,YAAM,OAAO,KAAK,qBAAqB,CAAC;AACxC,UAAI,CAAC,KAAK,SAAS;AACjB;AAAA,MACF;AAEA,UAAI,KAAK,OAAO;AACd,cAAM,KAAK;AAAA,MACb;AAEA,YAAM,KAAK,cAAc,OAAO,KAAK,QAAQ;AAC7C,WAAK,qBAAqB,MAAM;AAChC,WAAK,iBAAiB,OAAO,KAAK,QAAQ;AAAA,IAC5C;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAAwB;AAC7C,SAAO,MAAM,KAAK,EAAE,YAAY,MAAM;AACxC;;;AT3WA,eAAsB,sBAAsB,SAGf;AAC3B,QAAM,SAAS,4BAA4B;AAC3C,gCAA8B,QAAQ,OAAO,SAAS,QAAQ;AAC9D,QAAM,MAAM,IAAI,0BAA0B;AAAA,IACxC,OAAO,QAAQ,OAAO,SAAS;AAAA,IAC/B,YAAY,QAAQ,OAAO,SAAS;AAAA,EACtC,CAAC;AACD,QAAM,WAAW,QAAQ,OAAO,SAAS;AAEzC,SAAO,IAAI,gBAAgB;AAAA,IACzB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,cAAc,IAAI,aAAa,QAAQ,OAAO,MAAM,WAAW;AAAA,IAC/D,iBAAiB,IAAI,4BAA4B,mBAAAC,QAAK,KAAK,UAAU,kBAAkB,CAAC;AAAA,IACxF,aAAa,IAAI,wBAAwB,mBAAAA,QAAK,KAAK,UAAU,aAAa,CAAC;AAAA,IAC3E,eAAe,IAAI,sBAAsB;AAAA,MACvC,WAAW,mBAAAA,QAAK,KAAK,UAAU,eAAe;AAAA,MAC9C,QAAQ;AAAA,MACR,gBAAgB,QAAQ,OAAO,SAAS;AAAA,MACxC,YAAY,OAAO;AACjB,eAAO,KAAK,iBAAiB;AAAA,UAC3B,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM,SAAS,SAAS,MAAM,WAAW;AAAA,UACnD,QAAQ,MAAM,SAAS,SAAS,cAAc;AAAA,QAChD,CAAC;AAAA,MACH;AAAA,MACA,iBAAiB,OAAO,OAAO;AAC7B,eAAO,MAAM,mBAAmB;AAAA,UAC9B,QAAQ,MAAM;AAAA,UACd,UAAU,MAAM,SAAS,SAAS,MAAM,WAAW;AAAA,UACnD,QAAQ,gBAAgB,KAAK;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,yBACd,SACA,cAiBM;AACN,QAAM,kBAAkB,QAAQ,QAAQ,UAAU,EAAE,YAAY,sCAAsC;AAEtG,kBACG,QAAQ,OAAO,EACf,YAAY,yDAAyD,EACrE,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,aAAa,eAAe,aAAa,gBAAgB,CAAC;AAChF,QAAI,CAAC,QAAQ,OAAO,SAAS,OAAO;AAClC,YAAM,IAAI,MAAM,8EAA8E;AAAA,IAChG;AAEA,QAAI,QAAQ,OAAO,SAAS,eAAe,WAAW,GAAG;AACvD,YAAM,IAAI,MAAM,uGAAuG;AAAA,IACzH;AAEA,UAAM,OAAO,OAAO,aAAa,sBAAsB,4BAA4B;AAAA,MACjF,UAAU,QAAQ,OAAO,SAAS;AAAA,IACpC,CAAC;AACD,UAAM,UAAU,OAAO,aAAa,yBAAyB,uBAAuB;AAAA,MAClF,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,YAAQ;AAAA,MACN,uDAAuD,QAAQ,OAAO,SAAS,eAAe,KAAK,GAAG,CAAC,UAAU,QAAQ,OAAO,SAAS,QAAQ,UAAU,QAAQ,OAAO,SAAS,YAAY,QAAQ;AAAA,IACzM;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,iBAAiB,oBAAoB,MAAM;AAC/C,iBAAW,MAAM;AACjB,cAAQ,OAAO;AAAA,IACjB,CAAC;AAED,QAAI;AACF,YAAM,QAAQ,IAAI,WAAW,MAAM;AAAA,IACrC,UAAE;AACA,qBAAe;AACf,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AACL;AAEA,SAAS,oBAAoB,YAAoC;AAC/D,QAAM,UAAU,MAAM;AACpB,eAAW;AAAA,EACb;AACA,UAAQ,KAAK,UAAU,OAAO;AAC9B,UAAQ,KAAK,WAAW,OAAO;AAE/B,SAAO,MAAM;AACX,YAAQ,IAAI,UAAU,OAAO;AAC7B,YAAQ,IAAI,WAAW,OAAO;AAAA,EAChC;AACF;;;A4BjIA;AAMA;AAcO,IAAM,2BAAN,MAA+B;AAAA,EAMpC,YAA6B,SAA0C;AAA1C;AAC3B,SAAK,UAAU,QAAQ;AAAA,EACzB;AAAA,EAPQ;AAAA,EACA,eAAe;AAAA,EACf,sBAA8C;AAAA,EAC9C,wBAAwB;AAAA,EAMhC,MAAM,MAA8B;AAClC,UAAM,mBAAmB,KAAK,QAAQ,MAAM,MAAM,cAAc,MAAM;AACpE,WAAK,gBAAgB;AAAA,IACvB,CAAC;AAED,QAAI;AACF,aAAO,MAAM;AACX,cAAM,SAAS,MAAM,KAAK,QAAQ,MAAM,MAAM,UAAU,IAAI;AAC5D,YAAI,OAAO,SAAS,UAAU;AAC5B,eAAK,oBAAoB,mEAAmE;AAC5F;AAAA,QACF;AAEA,cAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,YAAI,CAAC,OAAO;AACV;AAAA,QACF;AAEA,cAAM,WAAW,MAAM,KAAK,YAAY,KAAK;AAC7C,YAAI,aAAa,QAAQ;AACvB,iBAAO,KAAK;AAAA,QACd;AAAA,MACF;AAAA,IACF,UAAE;AACA,uBAAiB;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAc,YAAY,OAA4C;AACpE,QAAI;AACJ,QAAI;AACF,2BAAqB,OAAO,KAAK,QAAQ,uBAAuB;AAAA,QAC9D;AAAA,QACA;AAAA,UACE,KAAK,KAAK,QAAQ;AAAA,UAClB,SAAS,KAAK;AAAA,UACd,QAAQ,KAAK,QAAQ;AAAA,QACvB;AAAA,QACA,KAAK,QAAQ,MAAM;AAAA,MACrB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,QAAQ,MAAM,OAAO,MAAM,gBAAgB,KAAK,CAAC;AACtD,aAAO;AAAA,IACT;AAEA,QAAI,uBAAuB,YAAY;AACrC,YAAM,KAAK,QAAQ,KAAK;AAAA,IAC1B,WAAW,uBAAuB,aAAa;AAC7C,YAAM,KAAK,qBAAqB;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,uBAAsC;AAClD,SAAK,QAAQ,MAAM,OAAO,KAAK,sEAAsE;AACrG,UAAM,YAAY,MAAM,KAAK,QAAQ,MAAM,MAAM,cAAc,SAAI;AAEnE,QAAI,UAAU,SAAS,UAAU;AAC/B,WAAK,QAAQ,MAAM,OAAO,KAAK,8BAA8B;AAC7D;AAAA,IACF;AAEA,QAAI,UAAU,SAAS,UAAU;AAC/B,WAAK,QAAQ,MAAM,OAAO,KAAK,oCAAoC;AACnE;AAAA,IACF;AAEA,UAAM,QAAQ,UAAU,MAAM,KAAK;AACnC,QAAI,CAAC,OAAO;AACV,WAAK,QAAQ,MAAM,OAAO,KAAK,gDAAgD;AAC/E;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,KAAK;AAAA,EAC1B;AAAA,EAEQ,kBAAwB;AAC9B,QAAI,KAAK,gBAAgB,KAAK,uBAAuB,CAAC,KAAK,oBAAoB,OAAO,SAAS;AAC7F,WAAK,oBAAoB,MAAM;AAC/B,WAAK,oBAAoB,wDAAwD;AACjF;AAAA,IACF;AAEA,SAAK,oBAAoB,mEAAmE;AAAA,EAC9F;AAAA,EAEQ,oBAAoB,SAAuB;AACjD,UAAM,MAAM,KAAK,IAAI;AACrB,QAAI,MAAM,KAAK,wBAAwB,KAAK;AAC1C;AAAA,IACF;AAEA,SAAK,wBAAwB;AAC7B,SAAK,QAAQ,MAAM,OAAO,UAAU,OAAO;AAAA,EAC7C;AAAA,EAEA,MAAc,QAAQ,OAA8B;AAClD,SAAK,eAAe;AACpB,UAAM,aAAa,IAAI,gBAAgB;AACvC,SAAK,sBAAsB;AAC3B,UAAM,cAAc,KAAK,QAAQ,MAAM,kBAAkB;AAAA,MACvD,KAAK,KAAK,QAAQ;AAAA,MAClB,QAAQ,KAAK,QAAQ;AAAA,MACrB,aAAa,WAAW;AAAA,IAC1B,CAAC;AAED,QAAI;AACF,YAAM,SAAS,OAAO,KAAK,QAAQ,WAAW,qBAAqB;AAAA,QACjE;AAAA,QACA,KAAK,KAAK,QAAQ;AAAA,QAClB,QAAQ,KAAK,QAAQ;AAAA,QACrB,SAAS,KAAK;AAAA,QACd,cAAc,KAAK,QAAQ;AAAA,QAC3B,aAAa,WAAW;AAAA,QACxB,WAAW,YAAY;AAAA,QACvB,UAAU;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AAED,WAAK,UAAU,OAAO;AACtB,UAAI,OAAO,UAAU,OAAO,aAAa;AACvC,aAAK,QAAQ,MAAM,OAAO,KAAK,OAAO,WAAW;AAAA,MACnD;AAAA,IACF,SAAS,OAAO;AACd,kBAAY,MAAM;AAElB,UAAI,iBAAiB,gBAAgB;AACnC,aAAK,UAAU,MAAM;AAAA,MACvB;AAEA,UAAI,aAAa,KAAK,GAAG;AACvB,aAAK,QAAQ,MAAM,OAAO,KAAK,0CAA0C;AAAA,MAC3E,OAAO;AACL,aAAK,QAAQ,MAAM,OAAO,MAAM,gBAAgB,KAAK,CAAC;AACtD,aAAK,QAAQ,MAAM,OAAO,KAAK,4EAA4E;AAAA,MAC7G;AAAA,IACF,UAAE;AACA,kBAAY,QAAQ;AACpB,WAAK,eAAe;AACpB,WAAK,sBAAsB;AAAA,IAC7B;AAAA,EACF;AACF;;;AC/KA,IAAAC,gBAAkB;AAKlB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEJ,SAAS,yBAAyB,SAKhC;AACP,UAAQ,OAAO,MAAM,cAAAC,QAAM,KAAK,cAAAA,QAAM,YAAY,cAAc,CAAC,CAAC;AAClE,UAAQ,OAAO,IAAI,YAAY,QAAQ,QAAQ,EAAE,EAAE;AACnD,UAAQ,OAAO,IAAI,QAAQ,QAAQ,GAAG,EAAE;AAExC,QAAM,YAAY,QAAQ,OAAO,SAAS,UAAU,UAAU;AAC9D,QAAM,iBAAiB,QAAQ,OAAO,SAAS,UAAU,6BAA6B;AACtF,UAAQ,OAAO,IAAI,iBAAiB,SAAS,EAAE;AAC/C,UAAQ,OAAO,IAAI,gBAAgB,cAAc,EAAE;AACnD,UAAQ,OAAO,IAAI,WAAW;AAC9B,UAAQ,OAAO,IAAI,uCAAmB;AACtC,UAAQ,OAAO,IAAI,+DAAuB;AAC1C,UAAQ,OAAO,IAAI,mDAAqB;AACxC,UAAQ,OAAO,IAAI,6CAAoB;AACvC,UAAQ,OAAO,IAAI,mDAAqB;AACxC,UAAQ,OAAO,IAAI,mDAAqB;AACxC,UAAQ,OAAO,IAAI,6CAAoB;AACvC,UAAQ,OAAO,IAAI,6CAAoB;AACvC,UAAQ,OAAO,IAAI,+DAAuB;AAC1C,UAAQ,OAAO,IAAI,2BAAiB;AACpC,UAAQ,OAAO,IAAI,mDAAqB;AACxC,UAAQ,OAAO,IAAI,qDAAuB;AAC5C;;;ACrCO,SAAS,sBAAuC;AACrD,MAAI,kBAAkB;AAEtB,SAAO;AAAA,IACL,OAAO,GAAG;AAAA,IACV,MAAM,GAAG;AAAA,IACT,MAAM,GAAG;AAAA,IACT,OAAO,GAAG;AAAA,IACV,KAAK,GAAG;AAAA,IACR,SAAS,GAAG;AAAA,IACZ,MAAM,GAAG;AAAA,IACT,UAAU,SAAS;AACjB,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,MAAM,kBAAkB,KAAK;AAC/B;AAAA,MACF;AAEA,wBAAkB;AAClB,kBAAY,IAAI;AAChB,SAAG,KAAK,OAAO;AAAA,IACjB;AAAA,EACF;AACF;;;AC1BA,2BAAqB;AAIrB,eAAsB,oBACpB,aACA,aACwB;AACxB,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,qBAAAC,QAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AAED,QAAI,UAAU;AAEd,UAAM,UAAU,MAAY;AAC1B,SAAG,mBAAmB,MAAM;AAC5B,SAAG,mBAAmB,OAAO;AAC7B,SAAG,mBAAmB,QAAQ;AAAA,IAChC;AAEA,UAAM,SAAS,CAAC,UAA+B;AAC7C,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ;AACR,SAAG,MAAM;AACT,cAAQ,KAAK;AAAA,IACf;AAEA,OAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,aAAO,IAAI;AAAA,IACb,CAAC;AAED,OAAG,GAAG,UAAU,MAAM;AACpB,kBAAY;AACZ,SAAG,OAAO;AAAA,IACZ,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ;AACR,cAAQ,IAAI;AAAA,IACd,CAAC;AAED,OAAG,UAAU,WAAW;AACxB,OAAG,OAAO;AAAA,EACZ,CAAC;AACH;AAOA,eAAsB,mBAAmB,aAAyB,cAAc,WAAqC;AACnH,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,KAAK,qBAAAA,QAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,UAAU;AAAA,IACZ,CAAC;AAED,UAAM,QAAkB,CAAC;AACzB,QAAI,UAAU;AAEd,UAAM,UAAU,MAAY;AAC1B,SAAG,mBAAmB,MAAM;AAC5B,SAAG,mBAAmB,OAAO;AAC7B,SAAG,mBAAmB,QAAQ;AAAA,IAChC;AAEA,UAAM,SAAS,CAAC,UAAsC;AACpD,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ;AACR,SAAG,MAAM;AACT,cAAQ,KAAK;AAAA,IACf;AAEA,OAAG,GAAG,QAAQ,CAAC,SAAS;AACtB,YAAM,UAAU,KAAK,KAAK;AAC1B,UAAI,YAAY,SAAS;AACvB,eAAO,EAAE,MAAM,UAAU,OAAO,MAAM,KAAK,IAAI,EAAE,CAAC;AAClD;AAAA,MACF;AAEA,UAAI,YAAY,YAAY;AAC1B,eAAO,EAAE,MAAM,SAAS,CAAC;AACzB;AAAA,MACF;AAEA,YAAM,KAAK,IAAI;AACf,SAAG,OAAO;AAAA,IACZ,CAAC;AAED,OAAG,GAAG,UAAU,MAAM;AACpB,kBAAY;AACZ,SAAG,OAAO;AAAA,IACZ,CAAC;AAED,OAAG,GAAG,SAAS,MAAM;AACnB,UAAI,SAAS;AACX;AAAA,MACF;AAEA,gBAAU;AACV,cAAQ;AACR,cAAQ,EAAE,MAAM,MAAM,CAAC;AAAA,IACzB,CAAC;AAED,OAAG,UAAU,WAAW;AACxB,OAAG,OAAO;AAAA,EACZ,CAAC;AACH;AAEO,SAAS,0BAA0C;AACxD,QAAM,YAAY,oBAAI,IAAgB;AACtC,QAAM,kBAAkB,MAAY;AAClC,eAAW,YAAY,WAAW;AAChC,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,UAAU,cAAc,MAAM;AAClC,YAAM,QAAQ,MAAM,oBAAoB,aAAa,eAAe;AACpE,aAAO,UAAU,OAAO,EAAE,MAAM,SAAS,IAAI,EAAE,MAAM,UAAU,MAAM;AAAA,IACvE;AAAA,IACA,MAAM,cAAc,cAAc,WAAM;AACtC,YAAM,SAAS,MAAM,mBAAmB,iBAAiB,WAAW;AACpE,UAAI,OAAO,SAAS,OAAO;AACzB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,aAAO;AAAA,IACT;AAAA,IACA,cAAc,SAAS;AACrB,gBAAU,IAAI,OAAO;AACrB,aAAO,MAAM;AACX,kBAAU,OAAO,OAAO;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF;;;ACxJA,IAAM,qBAAqB,CAAC,eAAU,eAAU,eAAU,eAAU,eAAU,aAAQ;AAQ/E,SAAS,qBAAqB,UAKjC,CAAC,GAAmB;AACtB,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,aAAa,KAAK,IAAI,IAAI,QAAQ,cAAc,EAAE;AACxD,QAAM,UAAU,QAAQ,WAAW,QAAQ,OAAO;AAClD,QAAM,SAAS;AACf,QAAM,QAAQ,QAAQ,UAAU,CAAC,SAAiB;AAChD,gBAAY,IAAI;AAAA,EAClB;AAEA,MAAI,aAAa;AACjB,MAAI,QAA+B;AACnC,MAAI,SAAS;AACb,MAAI,aAAa;AAEjB,QAAM,SAAS,MAAY;AACzB,UAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,IAAI,KAAK;AAC5C,kBAAc,aAAa,KAAK,OAAO;AACvC,iBAAa,MAAM;AACnB,UAAM,KAAK,KAAK,EAAE;AAAA,EACpB;AAEA,QAAM,QAAQ,MAAY;AACxB,QAAI,cAAc,GAAG;AACnB;AAAA,IACF;AACA,UAAM,KAAK,IAAI,OAAO,UAAU,CAAC,IAAI;AACrC,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL,QAAc;AACZ,UAAI,CAAC,WAAW,QAAQ;AACtB;AAAA,MACF;AACA,eAAS;AACT,aAAO;AACP,cAAQ,YAAY,QAAQ,UAAU;AACtC,YAAM,QAAQ;AAAA,IAChB;AAAA,IACA,OAAa;AACX,UAAI,CAAC,QAAQ;AACX;AAAA,MACF;AACA,eAAS;AACT,UAAI,OAAO;AACT,sBAAc,KAAK;AACnB,gBAAQ;AAAA,MACV;AACA,YAAM;AAAA,IACR;AAAA,IACA,WAAoB;AAClB,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,6BACd,WACA,aACgB;AAChB,SAAO;AAAA,IACL,SAAS,MAAM;AACb,kBAAY;AACZ,gBAAU,WAAW,IAAI;AAAA,IAC3B;AAAA,IACA,iBAAiB,OAAO;AACtB,kBAAY;AACZ,gBAAU,mBAAmB,KAAK;AAAA,IACpC;AAAA,IACA,gBAAgB,UAAU;AACxB,kBAAY;AACZ,gBAAU,kBAAkB,QAAQ;AAAA,IACtC;AAAA,IACA,gBAAgB,MAAM;AACpB,kBAAY;AACZ,gBAAU,kBAAkB,IAAI;AAAA,IAClC;AAAA,IACA,iBAAiB,OAAO;AACtB,kBAAY;AACZ,gBAAU,mBAAmB,KAAK;AAAA,IACpC;AAAA,IACA,YAAY,MAAM;AAChB,kBAAY;AACZ,gBAAU,cAAc,IAAI;AAAA,IAC9B;AAAA,IACA,WAAW,MAAM,MAAM;AACrB,kBAAY;AACZ,gBAAU,aAAa,MAAM,IAAI;AAAA,IACnC;AAAA,IACA,aAAa,MAAM,QAAQ;AACzB,kBAAY;AACZ,gBAAU,eAAe,MAAM,MAAM;AAAA,IACvC;AAAA,IACA,YAAY,MAAM,OAAO;AACvB,kBAAY;AACZ,gBAAU,cAAc,MAAM,KAAK;AAAA,IACrC;AAAA,EACF;AACF;;;AC9GO,SAAS,qBAAqB,SAMV;AACzB,QAAM,iBAAiB,qBAAqB,QAAQ,QAAQ;AAAA,IAC1D,KAAK,QAAQ;AAAA,IACb,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,2BAA2B;AAAA,IAC3B,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,aAAa,QAAQ;AAAA,EACvB,CAAC;AACD,QAAM,iBAAiB,qBAAqB,EAAE,OAAO,WAAW,CAAC;AACjE,QAAM,YAAY,6BAA6B,eAAe,WAAW,MAAM;AAC7E,mBAAe,KAAK;AAAA,EACtB,CAAC;AAED,YAAU,mBAAmB,MAAM;AACjC,mBAAe,MAAM;AAAA,EACvB;AACA,YAAU,kBAAkB,MAAM;AAChC,mBAAe,KAAK;AAAA,EACtB;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AACN,qBAAe,KAAK;AACpB,qBAAe,MAAM;AAAA,IACvB;AAAA,IACA,UAAU;AACR,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF;AACF;;;ACrCO,SAAS,4BAA8C;AAC5D,SAAO;AAAA,IACL,OAAO,wBAAwB;AAAA,IAC/B,QAAQ,oBAAoB;AAAA,IAC5B,kBAAkB,SAAS;AACzB,aAAO,qBAAqB,OAAO;AAAA,IACrC;AAAA,EACF;AACF;;;ACeA,eAAsB,qBACpB,SACA,eAAiD,CAAC,GACnC;AACf,QAAM,QAAQ,aAAa,SAAS,0BAA0B;AAC9D,GAAC,aAAa,eAAe,CAAC,YAAY;AACxC,6BAAyB;AAAA,MACvB,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ,MAAM;AAAA,IACxB,CAAC;AAAA,EACH,IAAI;AAAA,IACF,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB,SAAS,QAAQ;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,SACJ,aAAa,eAAe;AAAA,IAC1B,GAAG;AAAA,IACH;AAAA,EACF,CAAC,KACD,IAAI,yBAAyB;AAAA,IAC3B,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAEH,QAAM,OAAO,IAAI;AACnB;;;AC1DA,IAAAC,oBAAe;AAIf;AACA;;;ACuBO,IAAM,4BAAN,MAAqE;AAAA,EAG1E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAFxC,gBAAgB,QAAQ,QAAQ;AAAA,EAIxC,MAAM,IAAI,QAA+C;AACvD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,OAAO,OAAO,EAAE;AAC7D,WAAK,KAAK,MAAM;AAChB,WAAK,KAAK,CAAC,MAAM,UAAU;AACzB,YAAI,KAAK,cAAc,MAAM,WAAW;AACtC,iBAAO,KAAK,GAAG,cAAc,MAAM,EAAE;AAAA,QACvC;AAEA,eAAO,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,MACrD,CAAC;AACD,YAAM,KAAK,SAASC,aAAY,MAAM,GAAG,CAAC;AAAA,IAC5C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,SAAyD;AAC7E,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACnE,aAAO,QAAQ,QAAQ,SAAS,CAAC,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,SAAiB,QAAQ,GAAsC;AAC9E,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,UAAU,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACnE,aAAO,QAAQ,MAAM,KAAK,IAAI,GAAG,QAAQ,SAAS,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ;AAAA,IACjF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,UAA6C;AACzD,UAAM,UAAU,MAAM,aAAgE,KAAK,UAAU,IAAI;AACzG,WAAO,MAAM,QAAQ,SAAS,WAAW,IAAI,QAAQ,cAAc,CAAC;AAAA,EACtE;AAAA,EAEA,MAAc,SAAS,SAAkD;AACvE,UAAM,wBAAwB,KAAK,UAAU;AAAA,MAC3C,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEA,SAASA,aAAY,SAAmC,YAA8C;AACpG,MAAI,QAAQ,UAAU,YAAY;AAChC,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,MAAM,QAAQ,SAAS,UAAU;AAClD;;;AClGA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAGjB,uBAAqC;AA+C9B,IAAM,uBAAuB;AACpC,IAAM,0BAA0B;AAChC,IAAM,gCAAgC;AACtC,IAAM,wBAAwB;AAEvB,IAAM,wBAAN,MAAwD;AAAA,EACrD,gBAAwD;AAAA,EAC/C;AAAA,EAQjB,YAAY,SAMT;AACD,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,MAAM,YAAY,SAA0D;AAC1E,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,SAAS,MAAM,OAAO;AAAA,MAC1B;AAAA,QACE,WAAW,QAAQ;AAAA,QACnB,YAAY,QAAQ;AAAA,QACpB,YAAY,QAAQ;AAAA,MACtB;AAAA,MACA,QAAQ;AAAA,IACV;AAEA,QAAI,CAAC,OAAO,aAAa,CAAC,OAAO,WAAW;AAC1C,YAAM,IAAI,MAAM,OAAO,WAAW,4BAA4B;AAAA,IAChE;AAEA,UAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,WAAO;AAAA,MACL,OAAO,OAAO;AAAA,MACd,SAAS,OAAO,UAAU,KAAK,KAAK,OAAO,QAAQ,KAAK;AAAA,MACxD,YAAY,OAAO,WAAW,KAAK;AAAA,MACnC,OAAO,OAAO,QAAQ,KAAK,KAAK;AAAA,MAChC,QAAQ,OAAO,SAAS,KAAK,KAAK;AAAA,MAClC,aAAa;AAAA,MACb,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,SAAyB,WAAiD;AACzF,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,MAAM,OAAO,WAAW,WAAW,QAAW,SAAS;AACxE,WAAO;AAAA,MACL,UAAU,MAAM,QAAQ,SAAS,IAAI,IAAK,SAAS,OAA8B,CAAC;AAAA,MAClF,SAAS,OAAO,SAAS,aAAa,YAAY,SAAS,SAAS,KAAK,IAAI,SAAS,WAAW;AAAA,MACjG,sBACE,OAAO,SAAS,2BAA2B,YAAY,OAAO,SAAS,SAAS,sBAAsB,IAClG,KAAK,MAAM,SAAS,sBAAsB,IAC1C;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,QAAgB,cAAmD;AACvF,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,MAAM,OAAO,UAAU,QAAQ,YAAY;AAC5D,WAAO;AAAA,MACL,cACE,OAAO,SAAS,kBAAkB,YAAY,SAAS,cAAc,KAAK,IACtE,SAAS,gBACT;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,QAAgB,cAAsB,QAA+B;AACpF,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,OAAO,WAAW,QAAQ,cAAc,MAAM;AAAA,EACtD;AAAA,EAEA,MAAM,SAAS,SAA+C;AAC5D,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,OAAO,YAAY;AAAA,MACvB,cAAc;AAAA,MACd,YAAY,QAAQ;AAAA,MACpB,WAAW,QAAQ;AAAA,MACnB,cAAc;AAAA,MACd,eAAe;AAAA,MACf,eAAe,QAAQ;AAAA,MACvB,WAAW;AAAA,QACT;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,YACT,MAAM,QAAQ;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,SAAgD;AAC9D,UAAM,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,UAAU,SAAgD;AAC9D,UAAM,KAAK,UAAU,OAAO;AAAA,EAC9B;AAAA,EAEA,MAAM,SAAS,SAA+C;AAC5D,UAAM,KAAK,UAAU,SAAS,QAAQ,QAAQ;AAAA,EAChD;AAAA,EAEA,MAAM,cAAc,OAA+G;AACjI,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,WAAO,OAAO,cAAc,KAAK;AAAA,EACnC;AAAA,EAEA,MAAM,cAAc,OAAiJ;AACnK,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,WAAO,OAAO,cAAc,KAAK;AAAA,EACnC;AAAA,EAEA,MAAc,UAAU,SAAiC,kBAA0C;AACjG,UAAM,SAAS,MAAM,KAAK,UAAU;AACpC,UAAM,WAAW,kBAAkB,KAAK,KAAK,mBAAAC,QAAK,SAAS,QAAQ,QAAQ;AAC3E,UAAM,QAAQ,MAAM,kBAAAC,QAAG,SAAS,QAAQ,QAAQ;AAChD,UAAM,OAAO;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,SAAS,KAAK,KAAK;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,MAAc,YAA6C;AACzD,SAAK,kBAAkB,KAAK,aAAa;AACzC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,YAAY,SAKH;AACf,WAAO;AAAA,MACL,UAAU,QAAQ;AAAA,MAClB,cAAc,QAAQ;AAAA,MACtB,WAAW,QAAQ,UAAU,KAAK,KAAK;AAAA,MACvC,YAAY,QAAQ;AAAA,MACpB,cAAc,OAAO,UAAU,eAAe;AAC5C,cAAM,UAAU,UAAM,iBAAAC,QAAW,UAAU,UAAU;AACrD,eAAO,QAAQ;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAgD;AAC5D,UAAM,MAAM,MAAM,iBAAiB;AACnC,WAAO,IAAI,IAAI,OAAO,KAAK,eAAe,SAAS,IAAI,KAAK,YAAY,KAAK,cAAc,CAAC;AAAA,EAC9F;AACF;AA0CA,IAAI,sBAAyH;AAE7H,eAAe,mBAA+G;AAC5H,0BACE,OAAO,+BAA+B;AACxC,SAAO;AACT;;;ACjPO,IAAM,8BAAN,MAAyE;AAAA,EAG9E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAFxC,gBAAgB,QAAQ,QAAQ;AAAA,EAIxC,MAAM,IAAI,SAA2D;AACnE,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,aAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,YAAY,OAAO,KAAK;AAAA,IACjE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,QAAiD;AACzD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,OAAO,QAAQ,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO,OAAO;AACvE,WAAK,KAAK;AAAA,QACR,GAAG;AAAA,QACH,cAAc,OAAO,aAAa,KAAK;AAAA,QACvC,QAAQ,OAAO,OAAO,KAAK;AAAA,MAC7B,CAAC;AACD,WAAK,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC;AACpE,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,SAAiB,QAA+B;AAChE,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,QAAQ;AACnC,YAAM,WAAW,QAAQ,KAAK,CAAC,WAAW,OAAO,YAAY,OAAO;AACpE,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,YAAM,OAAO,QACV,OAAO,CAAC,WAAW,OAAO,YAAY,OAAO,EAC7C,OAAO;AAAA,QACN,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,eAAe;AAAA,QACf,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC;AACH,WAAK,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC;AACpE,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAAe,SAAyC;AAC5D,UAAM,SAAS,MAAM,KAAK,IAAI,OAAO;AACrC,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,CAAC,OAAO,aAAa,KAAK,GAAG;AACxE,aAAO;AAAA,IACT;AAEA,WAAO,OAAO;AAAA,EAChB;AAAA,EAEA,MAAM,OAA4C;AAChD,WAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,MAAc,UAA+C;AAC3D,UAAM,UAAU,MAAM,aAA8D,KAAK,UAAU,IAAI;AACvG,WAAO,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,SAAS,SAAoD;AACzE,UAAM,wBAAwB,KAAK,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AC1GA,IAAAC,sBAAmB;AAMZ,IAAM,kCAAN,cAA8C,MAAM;AAAA,EACzD,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAsDO,IAAM,sBAAN,MAA0B;AAAA,EAG/B,YACmB,SAUjB;AAViB;AAAA,EAUhB;AAAA,EAbK,gBAAgB,QAAQ,QAAQ;AAAA,EAexC,MAAM,YAAY,OAA4F;AAC5G,WAAO,KAAK,QAAQ;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,MAAM,MAAM;AAAA,MACZ,UAAU,wBAAwB;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAAmH;AACpI,WAAO,KAAK,QAAQ;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,OAAmH;AACpI,WAAO,KAAK,QAAQ;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAMmB;AACnC,WAAO,KAAK,QAAQ;AAAA,MAClB,SAAS,MAAM;AAAA,MACf,QAAQ,MAAM;AAAA,MACd,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAA0B;AAC9B,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,MAAM,KAAK,IAAI;AACrB,UAAI,QAAQ;AACZ,YAAM,cAAqC,CAAC;AAE5C,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,gBAAgB,KAAK;AAC7B,sBAAY,KAAK,KAAK;AACtB;AAAA,QACF;AAEA,cAAM,QAAQ,MAAM,KAAK,QAAQ,kBAAkB,eAAe,MAAM,OAAO;AAC/E,YAAI,CAAC,OAAO;AACV,gBAAM,gBAAgB,MAAM,KAAK,oBAAoB,MAAM,OAAO;AAClE,cAAI,MAAM,kBAAkB,iBAAiB,MAAM,cAAc,eAAe;AAC9E,oBAAQ;AACR,kBAAM,gBAAgB;AACtB,kBAAM,YAAY;AAAA,UACpB;AACA,sBAAY,KAAK,KAAK;AACtB,eAAK,QAAQ,YAAY,OAAO,aAAa;AAC7C;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,KAAK,QAAQ,OAAO,KAAK;AAC/B,kBAAQ;AACR,eAAK,QAAQ,aAAa,KAAK;AAAA,QACjC,SAAS,OAAO;AACd,cAAI,8BAA8B,KAAK,GAAG;AACxC,kBAAM,KAAK,QAAQ,kBAAkB,YAAY,MAAM,SAASC,iBAAgB,KAAK,CAAC;AACtF,gBAAI,MAAM,kBAAkB,2BAA2B,MAAM,cAAcA,iBAAgB,KAAK,GAAG;AACjG,sBAAQ;AAAA,YACV;AACA,kBAAM,gBAAgB;AACtB,kBAAM,YAAYA,iBAAgB,KAAK;AACvC,wBAAY,KAAK,KAAK;AACtB,iBAAK,QAAQ,YAAY,OAAO,uBAAuB;AACvD;AAAA,UACF;AAEA,kBAAQ;AACR,gBAAM,gBAAgB;AACtB,gBAAM,gBAAgB;AACtB,gBAAM,YAAYA,iBAAgB,KAAK;AACvC,gBAAM,gBAAgB,MAAMC,kBAAiB,MAAM,cAAc,KAAK,QAAQ,cAAc;AAC5F,sBAAY,KAAK,KAAK;AACtB,eAAK,QAAQ,mBAAmB,OAAO,KAAK;AAAA,QAC9C;AAAA,MACF;AAEA,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AAEA,YAAM,KAAK,aAAa,WAAW;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAA8C;AAClD,WAAO,KAAK,SAAS,YAAY,KAAK,YAAY,CAAC;AAAA,EACrD;AAAA,EAEA,MAAM,mBAAmB,OAAgE;AACvF,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,QACZ,WACY;AACZ,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,UAAU,MAAM,KAAK,YAAY;AACvC,YAAM,MAAM,KAAK,IAAI;AACrB,YAAM,QAAQ;AAAA,QACZ,IAAI,oBAAAC,QAAO,WAAW;AAAA,QACtB,cAAc;AAAA,QACd,WAAW;AAAA,QACX,eAAe;AAAA,QACf,GAAG;AAAA,MACL;AACA,cAAQ,KAAK,KAAK;AAClB,cAAQ,KAAK,CAAC,MAAM,UAAU,KAAK,YAAY,MAAM,SAAS;AAC9D,YAAM,KAAK,aAAa,OAAO;AAC/B,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,QAAQ,OAA4B,cAAqC;AACrF,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,KAAK,QAAQ,OAAO,SAAS;AAAA,QACjC,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,KAAK,QAAQ,OAAO,UAAU;AAAA,QAClC,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,KAAK,QAAQ,OAAO,UAAU;AAAA,QAClC,QAAQ,MAAM;AAAA,QACd;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,MACjB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,OAAO,SAAS;AAAA,MACjC,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,SAAS,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,oBAAoB,SAAuD;AACvF,UAAM,SAAS,MAAM,KAAK,QAAQ,kBAAkB,IAAI,OAAO;AAC/D,WAAO,QAAQ,WAAW,YAAY,0BAA0B;AAAA,EAClE;AAAA,EAEA,MAAc,cAA8C;AAC1D,UAAM,UAAU,MAAM,aAAyD,KAAK,QAAQ,WAAW,IAAI;AAC3G,WAAO,MAAM,QAAQ,SAAS,OAAO,IAAI,QAAQ,UAAU,CAAC;AAAA,EAC9D;AAAA,EAEA,MAAc,aAAa,SAA+C;AACxE,UAAM,wBAAwB,KAAK,QAAQ,WAAW;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,MAAc;AACpB,WAAO,KAAK,QAAQ,MAAM,KAAK,KAAK,IAAI;AAAA,EAC1C;AACF;AAEA,SAAS,0BAAkC;AACzC,SAAO,kBAAkB,oBAAAA,QAAO,WAAW,CAAC;AAC9C;AAEA,SAASD,kBAAiB,cAAsB,QAA0C;AACxF,QAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,eAAe,GAAG,OAAO,aAAa,CAAC,CAAC;AAC9E,SAAO,KAAK,IAAI,OAAO,YAAY,OAAO,cAAc,KAAK,QAAQ;AACvE;AAEA,SAAS,8BAA8B,OAAyB;AAC9D,MAAI,iBAAiB,iCAAiC;AACpD,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UAAU,YACjB,UAAU,QACV,UAAU,SACV,OAAQ,MAA6B,IAAI,MAAM,uBAC/C;AACA,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UAAU,YACjB,UAAU,QACV,YAAY,SACZ,sBAAsB,KAAK,OAAQ,MAA+B,MAAM,CAAC,GACzE;AACA,WAAO;AAAA,EACT;AAEA,SAAO,sBAAsB,KAAKD,iBAAgB,KAAK,CAAC;AAC1D;AAEA,SAASA,iBAAgB,OAAwB;AAC/C,SAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC9D;;;AC3TO,SAAS,4BAA0C;AACxD,SAAO;AAAA,IACL,KAAK,OAAO,SAAS;AACnB,cAAQ,IAAI,oBAAoB,OAAO,OAAO,CAAC;AAAA,IACjD;AAAA,IACA,MAAM,OAAO,SAAS;AACpB,cAAQ,MAAM,oBAAoB,OAAO,OAAO,CAAC;AAAA,IACnD;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAe,UAA4B,CAAC,GAAW;AAClF,QAAM,YAAY,CAAC,YAAY,KAAK;AACpC,MAAI,QAAQ,QAAQ;AAClB,cAAU,KAAK,QAAQ,QAAQ,MAAM,EAAE;AAAA,EACzC;AACA,MAAI,QAAQ,SAAS;AACnB,cAAU,KAAK,QAAQ,QAAQ,OAAO,EAAE;AAAA,EAC1C;AACA,MAAI,QAAQ,WAAW;AACrB,cAAU,KAAK,WAAW,QAAQ,SAAS,EAAE;AAAA,EAC/C;AACA,MAAI,QAAQ,WAAW;AACrB,cAAU,KAAK,SAAS,QAAQ,SAAS,EAAE;AAAA,EAC7C;AACA,MAAI,QAAQ,UAAU;AACpB,cAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AACA,MAAI,QAAQ,UAAU;AACpB,cAAU,KAAK,QAAQ,QAAQ,QAAQ,EAAE;AAAA,EAC3C;AACA,MAAI,QAAQ,QAAQ;AAClB,cAAU,KAAK,QAAQ,MAAM;AAAA,EAC/B;AACA,SAAO,UAAU,KAAK,GAAG;AAC3B;;;AC7CO,IAAM,sBAAN,MAA6D;AAAA,EAKlE,YACmB,QACA,cACA,QACjB;AAHiB;AACA;AACA;AAEjB,SAAK,YAAY,OAAO,QAAQ;AAAA,EAClC;AAAA,EAVQ,SAAS;AAAA,EACT,UAAyB;AAAA,EACzB;AAAA,EAUR,MAAM,KAAK,QAAmD;AAC5D,QAAI,QAAQ,SAAS;AACnB,aAAO;AAAA,QACL,UAAU,CAAC;AAAA,QACX,SAAS,KAAK;AAAA,MAChB;AAAA,IACF;AAEA,UAAM,KAAK,aAAa;AACxB,UAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,KAAK,SAAS,KAAK,WAAW,MAAM;AAC/E,QACE,OAAO,MAAM,yBAAyB,YACtC,OAAO,SAAS,MAAM,oBAAoB,KAC1C,MAAM,uBAAuB,GAC7B;AACA,WAAK,YAAY,KAAK,MAAM,MAAM,oBAAoB;AAAA,IACxD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,SAAuC;AAClD,UAAM,KAAK,aAAa;AACxB,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,SAAK,UAAU;AACf,UAAM,KAAK,aAAa,KAAK,OAAO;AAAA,EACtC;AAAA,EAEA,MAAc,eAA8B;AAC1C,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AAEA,SAAK,UAAU,MAAM,KAAK,aAAa,KAAK;AAC5C,SAAK,SAAS;AAAA,EAChB;AACF;;;ACxDA,IAAAG,oBAAe;AACf,IAAAC,qBAAiB;AAOjB,eAAsB,yBAAyB,SAIhB;AAC7B,QAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAM,cAAc,mBAAAC,QAAK,KAAK,QAAQ,UAAU,aAAa;AAC7D,QAAMC,kBAAiB,QAAQ,kBAAkBC;AAEjD,QAAM,kBAAAC,QAAG,MAAM,QAAQ,UAAU,EAAE,WAAW,KAAK,CAAC;AAEpD,QAAM,cAAc,MAAMC,aAAY,WAAW;AACjD,MAAI,eAAe,gBAAgB,aAAa,MAAMH,gBAAe,WAAW,GAAG;AACjF,UAAM,IAAI,MAAM,2CAA2C,WAAW,wDAAwD;AAAA,EAChI;AAEA,QAAM,kBAAAE,QAAG,UAAU,aAAa,GAAG,SAAS;AAAA,GAAM,MAAM;AAExD,SAAO;AAAA,IACL;AAAA,IACA,MAAM,UAAU;AACd,YAAM,aAAa,MAAMC,aAAY,WAAW;AAChD,UAAI,eAAe,WAAW;AAC5B;AAAA,MACF;AAEA,YAAM,kBAAAD,QAAG,GAAG,aAAa,EAAE,OAAO,KAAK,CAAC;AAAA,IAC1C;AAAA,EACF;AACF;AAEA,eAAeC,aAAY,UAA0C;AACnE,MAAI;AACF,UAAM,MAAM,MAAM,kBAAAD,QAAG,SAAS,UAAU,MAAM;AAC9C,UAAM,SAAS,OAAO,SAAS,IAAI,KAAK,GAAG,EAAE;AAC7C,WAAO,OAAO,SAAS,MAAM,KAAK,SAAS,IAAI,SAAS;AAAA,EAC1D,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAeD,uBAAsB,WAAqC;AACxE,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,GAAG;AACjD,WAAO;AAAA,EACT;AAEA,MAAI;AACF,YAAQ,KAAK,WAAW,CAAC;AACzB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC7CO,IAAM,4BAAN,MAAqE;AAAA,EAG1E,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAFxC,gBAAgB,QAAQ,QAAQ;AAAA,EAIxC,MAAM,IAAI,SAAuD;AAC/D,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,aAAO,SAAS,KAAK,CAAC,YAAY,QAAQ,YAAY,OAAO,KAAK;AAAA,IACpE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,SAA8C;AACtD,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,YAAM,OAAO,SAAS,OAAO,CAAC,UAAU,MAAM,YAAY,QAAQ,OAAO;AACzE,WAAK,KAAK,OAAO;AACjB,WAAK,KAAK,CAAC,MAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO,CAAC;AACpE,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAO,SAAgC;AAC3C,UAAM,KAAK,SAAS,YAAY;AAC9B,YAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,YAAM,OAAO,SAAS,OAAO,CAAC,UAAU,MAAM,YAAY,OAAO;AACjE,UAAI,KAAK,WAAW,SAAS,QAAQ;AACnC;AAAA,MACF;AAEA,YAAM,KAAK,SAAS,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAwC;AAC5C,WAAO,KAAK,SAAS,YAAY,KAAK,QAAQ,CAAC;AAAA,EACjD;AAAA,EAEA,MAAc,UAA2C;AACvD,UAAM,UAAU,MAAM,aAA2D,KAAK,UAAU,IAAI;AACpG,WAAO,MAAM,QAAQ,SAAS,QAAQ,IAAI,QAAQ,WAAW,CAAC;AAAA,EAChE;AAAA,EAEA,MAAc,SAAS,UAAiD;AACtE,UAAM,wBAAwB,KAAK,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,SAAY,WAAyC;AACjE,UAAM,WAAW,KAAK;AACtB,QAAI;AACJ,SAAK,gBAAgB,IAAI,QAAc,CAAC,YAAY;AAClD,gBAAU;AAAA,IACZ,CAAC;AAED,UAAM,SAAS,MAAM,MAAM,MAAS;AACpC,QAAI;AACF,aAAO,MAAM,UAAU;AAAA,IACzB,UAAE;AACA,cAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACjFA,IAAAG,oBAAe;AACf,IAAAC,qBAAiB;;;ACDV,IAAMC,uBAAN,MAA0B;AAAA,EACd,QAAQ,oBAAI,IAA2B;AAAA,EAExD,MAAM,QAAW,SAAiB,MAAwC;AACxE,UAAM,WAAW,KAAK,MAAM,IAAI,OAAO,KAAK,QAAQ,QAAQ;AAC5D,QAAI;AACJ,UAAM,UAAU,IAAI,QAAc,CAAC,YAAY;AAC7C,gBAAU;AAAA,IACZ,CAAC;AACD,UAAM,OAAO,SAAS,MAAM,MAAM,MAAS,EAAE,KAAK,MAAM,OAAO;AAC/D,SAAK,MAAM,IAAI,SAAS,IAAI;AAE5B,UAAM,SAAS,MAAM,MAAM,MAAS;AAEpC,QAAI;AACF,aAAO,MAAM,KAAK;AAAA,IACpB,UAAE;AACA,cAAQ;AACR,UAAI,KAAK,MAAM,IAAI,OAAO,MAAM,MAAM;AACpC,aAAK,MAAM,OAAO,OAAO;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AACF;;;ACvBO,SAAS,mBAAmB,MAAc,WAAW,MAAiB;AAC3E,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC;AAC9C,MAAI,OAAO,WAAW,MAAM,MAAM,KAAK,OAAO;AAC5C,WAAO,CAAC,IAAI;AAAA,EACd;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI,YAAY;AAEhB,SAAO,OAAO,WAAW,WAAW,MAAM,IAAI,OAAO;AACnD,UAAM,MAAMC,cAAa,WAAW,KAAK;AACzC,WAAO,KAAK,UAAU,MAAM,GAAG,GAAG,CAAC;AACnC,gBAAY,UAAU,MAAM,GAAG;AAAA,EACjC;AAEA,MAAI,WAAW;AACb,WAAO,KAAK,SAAS;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAASA,cAAa,MAAc,OAAuB;AACzD,MAAI,YAAY;AAChB,MAAI,YAAY;AAEhB,aAAW,QAAQ,MAAM;AACvB,UAAM,YAAY,OAAO,WAAW,MAAM,MAAM;AAChD,QAAI,YAAY,YAAY,OAAO;AACjC;AAAA,IACF;AAEA,iBAAa;AACb,iBAAa,KAAK;AAAA,EACpB;AAEA,QAAM,OAAO,KAAK,MAAM,GAAG,SAAS;AACpC,aAAW,aAAa,CAAC,QAAQ,MAAM,GAAG,GAAG;AAC3C,UAAM,MAAM,KAAK,YAAY,SAAS;AACtC,QAAI,MAAM,GAAG;AACX,aAAO,MAAM,UAAU;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,YAAY,IAAI,YAAY;AACrC;;;ACtCA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,iBAAiB;AACvB,IAAM,kBAAkB;AAEjB,SAAS,sBACd,SACA,SAGyB;AACzB,QAAM,SAAS,OAAO,QAAQ,gBAAgB,EAAE,EAAE,KAAK;AACvD,QAAM,kBAAkB,OAAO,QAAQ,cAAc,EAAE,EAAE,KAAK;AAC9D,QAAM,UAAU,OAAO,QAAQ,YAAY,EAAE,EAAE,KAAK;AACpD,QAAM,eAAe,OAAO,QAAQ,iBAAiB,EAAE,EAAE,KAAK;AAC9D,QAAM,WAAW,MAAM,QAAQ,QAAQ,SAAS,IAAI,QAAQ,YAAY,CAAC;AACzE,QAAM,cAAc,UAAU,QAAQ,YAAY;AAClD,QAAM,OAAO,YAAY,QAAQ;AAEjC,MAAI,SAAS;AACX,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,UAAU;AAAA,MAClB;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,gBAAgB,kBAAkB;AACpC,UAAM,WAAW,OAAO,QAAQ,aAAa,EAAE,EAAE,KAAK;AACtD,QAAI,mBAAmB,QAAQ,eAAe,SAAS,eAAe,KAAK,YAAY,MAAM;AAC3F,YAAM,aAA4C;AAAA,QAChD,MAAM;AAAA,QACN,SAAS,kBAAkB,eAAe;AAAA,QAC1C,QAAQ;AAAA,QACR,WAAW,UAAU,QAAQ,UAAU;AAAA,QACvC,KAAK,UAAU,QAAQ,GAAG;AAAA,QAC1B;AAAA,QACA;AAAA,QACA,KAAK;AAAA,MACP;AACA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,mBAAmB,UAAU;AAAA,MACrC,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,CAAC,QAAQ,eAAe,SAAS,MAAM,GAAG;AACvD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,UAAU;AAAA,MAClB,KAAK;AAAA,IACP;AAAA,EACF;AAEA,MAAI,gBAAgB,KAAK,gBAAgB,mBAAmB;AAC1D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,QAAM,OAAO;AAAA,IACX,SAAS,kBAAkB,MAAM;AAAA,IACjC;AAAA,IACA,WAAW,UAAU,QAAQ,UAAU;AAAA,IACvC,KAAK,UAAU,QAAQ,GAAG;AAAA,IAC1B;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AAEA,QAAM,YAAY,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,mBAAmB,KAAK,YAAY,KAAK;AACjG,MAAI,WAAW,YAAY,OAAO;AAChC,UAAM,aAAwC;AAAA,MAC5C,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,UAAU,WAAW;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,WAAW,KAAK;AAC9F,MAAI,UAAU,WAAW,OAAO;AAC9B,UAAM,aAAuC;AAAA,MAC3C,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,SAAS,UAAU;AAAA,MAC1B,UAAU,wBAAwB,SAAS,UAAU,SAAS;AAAA,MAC9D,UAAU,qBAAqB,SAAS,UAAU,GAAG;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,mBAAmB,KAAK,YAAY,KAAK;AACjG,MAAI,WAAW,YAAY,OAAO;AAChC,UAAM,aAAwC;AAAA,MAC5C,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,UAAU,WAAW;AAAA,IAC9B;AACA,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,mBAAmB,KAAK,YAAY,KAAK;AACjG,MAAI,WAAW,YAAY,OAAO;AAChC,UAAM,aAAwC;AAAA,MAC5C,GAAG;AAAA,MACH,MAAM;AAAA,MACN,WAAW;AAAA,MACX,OAAO,UAAU,WAAW;AAAA,MAC5B,iBAAiB,wBAAwB,UAAU,WAAW,IAAI;AAAA,MAClE,YAAY,kBAAkB,UAAU,WAAW,WAAW;AAAA,MAC9D,OAAO,UAAU;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,MAAM;AACb,UAAM,aAAuC;AAAA,MAC3C,GAAG;AAAA,MACH,MAAM;AAAA,IACR;AACA,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,KAAK,CAAC,SAAS,KAAK,SAAS,kBAAkB,KAAK,SAAS,eAAe,GAAG;AAC1F,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR;AAAA,MACA,KAAK;AAAA,IACP;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,SAAS,SAAS,IAAI,wBAAwB;AAAA,IACtD;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEA,SAAS,YAAY,UAAmH;AACtI,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,SAAS,gBAAgB;AAChC,YAAM,OAAO,wBAAwB,KAAK,WAAW,IAAI;AACzD,UAAI,MAAM;AACR,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,UAAU;AAC3B,QAAI,KAAK,SAAS,iBAAiB;AACjC,YAAM,aAAa,wBAAwB,KAAK,YAAY,IAAI;AAChE,UAAI,YAAY;AACd,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAoC;AACnE,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,MAAM,KAAK;AAC9B,SAAO,cAAc;AACvB;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,UAAM,SAAS,OAAO,SAAS,MAAM,KAAK,GAAG,EAAE;AAC/C,WAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA,EAC5C;AACA,SAAO;AACT;AAEA,SAAS,UAAU,OAAwB;AACzC,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,OAAoC;AAC7D,QAAM,SAAS,qBAAqB,KAAK;AACzC,SAAO,OAAO,WAAW,YAAY,SAAS,IAAI,SAAS;AAC7D;;;AC7NA;AAKA;AAEA;;;ACPA,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAcjB,IAAMC,8BAA6B,KAAK,OAAO;AAE/C,eAAsB,yBAAyB,SAOX;AAClC,QAAM,QAAQ,QAAQ,QAAQ,SAAS,0BACnC,MAAM,QAAQ,OAAO,cAAc;AAAA,IACjC,OAAO,QAAQ,QAAQ;AAAA,IACvB,aAAa,QAAQ,QAAQ;AAAA,EAC/B,CAAC,IACD,MAAM,QAAQ,OAAO,cAAc,QAAQ,QAAQ,KAAK;AAC5D,QAAM,mBAAmBC,6BAA4B,QAAQ,MAAM;AACnE,MAAI,MAAM,aAAa,kBAAkB;AACvC,UAAM,IAAI;AAAA,MACR,4CAA4C,QAAQ,QAAQ,SAAS,KAAK,MAAM,UAAU,YAAY,gBAAgB;AAAA,IACxH;AAAA,EACF;AAEA,QAAM,WAAW,mBAAAC,QAAK,KAAK,QAAQ,OAAO,UAAU,SAASC,qBAAoB,QAAQ,QAAQ,OAAO,CAAC;AACzG,QAAM,kBAAAC,QAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAM,gBAAgB,mBAAAF,QAAK,KAAK,UAAU,wBAAwB,QAAQ,OAAO,CAAC;AAClF,QAAM,kBAAAE,QAAG,UAAU,eAAe,KAAK;AAEvC,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY;AACzC,QAAM,SAAiC;AAAA,IACrC,IAAI,GAAG,QAAQ,QAAQ,OAAO,IAAI,QAAQ,QAAQ,SAAS,IAAI,QAAQ,QAAQ,SAAS;AAAA,IACxF,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ,QAAQ;AAAA,IAC3B,KAAK,QAAQ,QAAQ;AAAA,IACrB,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ,QAAQ;AAAA,IAC3B;AAAA,IACA,UAAU,uBAAuB,QAAQ,OAAO;AAAA,IAChD,UAAU,MAAM;AAAA,IAChB,MAAM,QAAQ,QAAQ,QAAQ;AAAA,IAC9B,cAAc,QAAQ,QAAQ;AAAA,IAC9B,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACA,MAAI,QAAQ,QAAQ,SAAS,2BAA2B,QAAQ,QAAQ,iBAAiB;AACvF,WAAO,OAAO,QAAQ,QAAQ;AAAA,EAChC;AAEA,UAAQ,QAAQ,KAAK,iCAAiC;AAAA,IACpD,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ,QAAQ;AAAA,IAC3B,UAAU,OAAO;AAAA,IACjB,QAAQ,QAAQ,aAAa;AAAA,EAC/B,CAAC;AACD,SAAO;AACT;AAEO,SAAS,yBACd,OACA,mBACA,KACQ;AACR,MAAI,kBAAkB,WAAW,GAAG;AAClC,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAGC,uBAAsB,mBAAmB,GAAG;AAAA,EACjD,EAAE,KAAK,IAAI;AACb;AAEO,SAAS,0BACd,SACA,YACA,mBACA,KACQ;AACR,QAAM,cACJ,QAAQ,QACR;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAGA,uBAAsB,CAAC,UAAU,GAAG,GAAG;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,GAAGA,uBAAsB,mBAAmB,GAAG;AAAA,EACjD,EAAE,KAAK,IAAI;AACb;AAEA,SAASA,uBAAsB,SAAmC,KAAuB;AACvF,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,CAAC,QAAQ;AAAA,EAClB;AAEA,SAAO,QAAQ,IAAI,CAAC,QAAQ,UAAU;AACpC,UAAMC,eAAcC,eAAc,OAAO,eAAe,GAAG;AAC3D,UAAM,OAAO,OAAO,OAAO,aAAa,WAAW,KAAK,OAAO,QAAQ,YAAY;AACnF,UAAM,QAAQ,OAAO,OAAO,UAAU,OAAO,IAAI,KAAK;AACtD,WAAO,GAAG,QAAQ,CAAC,KAAK,OAAO,YAAY,mBAAAL,QAAK,SAAS,OAAO,aAAa,CAAC,OAAOI,YAAW,GAAG,IAAI,GAAG,KAAK;AAAA,EACjH,CAAC;AACH;AAEA,SAAS,wBACP,SACQ;AACR,QAAM,SAAS,GAAG,OAAO,QAAQ,OAAO,QAAQ,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,SAAS;AAChG,MAAI,QAAQ,SAAS,0BAA0B,QAAQ,UAAU;AAC/D,WAAO,GAAG,MAAM,IAAIE,kBAAiB,QAAQ,QAAQ,CAAC;AAAA,EACxD;AACA,MAAI,QAAQ,SAAS,yBAAyB;AAC5C,WAAO,GAAG,MAAM;AAAA,EAClB;AACA,MAAI,QAAQ,SAAS,yBAAyB;AAC5C,WAAO,GAAG,MAAM;AAAA,EAClB;AACA,SAAO,GAAG,MAAM;AAClB;AAEA,SAAS,uBACP,SACoB;AACpB,MAAI,QAAQ,SAAS,0BAA0B,QAAQ,UAAU;AAC/D,WAAOA,kBAAiB,QAAQ,QAAQ;AAAA,EAC1C;AACA,MAAI,QAAQ,SAAS,yBAAyB;AAC5C,WAAO,SAAS,QAAQ,SAAS;AAAA,EACnC;AACA,MAAI,QAAQ,SAAS,yBAAyB;AAC5C,WAAO,SAAS,QAAQ,SAAS;AAAA,EACnC;AACA,MAAI,QAAQ,SAAS,yBAAyB;AAC5C,WAAO,SAAS,QAAQ,SAAS;AAAA,EACnC;AACA,SAAO;AACT;AAEA,SAASA,kBAAiB,UAA0B;AAClD,QAAM,aAAa,SAAS,KAAK,EAAE,QAAQ,+BAA+B,GAAG;AAC7E,SAAO,cAAc;AACvB;AAEA,SAASL,qBAAoB,OAAuB;AAClD,SAAO,MAAM,QAAQ,qBAAqB,GAAG;AAC/C;AAEA,SAASI,eAAc,YAAoB,KAAqB;AAC9D,QAAM,WAAW,mBAAAL,QAAK,SAAS,KAAK,UAAU;AAC9C,SAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,mBAAAA,QAAK,WAAW,QAAQ,IAAI,WAAW;AAC/E;AAEA,SAASD,6BAA4B,QAAyB;AAC5D,QAAM,QAAS,QAAsD;AACrE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AACA,SAAOD;AACT;;;ACrLO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,IAAI;AAEJ,IAAM,oCACX;;;ACdF,IAAMS,kBAAiB,oBAAI,IAAI,CAAC,SAAS,UAAU,gBAAM,eAAK,CAAC;AAC/D,IAAMC,iBAAgB,oBAAI,IAAI,CAAC,SAAS,eAAK,CAAC;AAE9C,eAAsB,yBACpB,OACA,SACA,QAC6B;AAC7B,QAAM,aAAa,MAAM,KAAK,EAAE,YAAY;AAC5C,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,MAAIA,eAAc,IAAI,UAAU,GAAG;AACjC,WAAO,MAAM,gBAAgB;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,sBAAsB,UAAU,KAAKD,gBAAe,IAAI,UAAU,GAAG;AACvE,WAAO,KAAK,iCAAiC;AAC7C,WAAO;AAAA,EACT;AAEA,SAAO,mBAAyB,OAAO,SAAS,MAAM;AACxD;;;AC9BO,IAAM,mBAAN,MAAkD;AAAA,EAGvD,YACmB,SAKjB;AALiB;AAAA,EAKhB;AAAA,EARc,UAA8B,CAAC;AAAA,EAUhD,MAAM,MAAoB;AACxB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,YAAY,IAAI,EAAE;AAAA,EAC/B;AAAA,EAEA,MAAM,MAAoB;AACxB,SAAK,MAAM,UAAU,IAAI,EAAE;AAAA,EAC7B;AAAA,EAEA,IAAI,MAAoB;AACtB,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,QAAQ,MAAoB;AAC1B,SAAK,MAAM,IAAI;AAAA,EACjB;AAAA,EAEA,KAAK,MAAoB;AACvB,SAAK,MAAM,SAAS,IAAI,EAAE;AAAA,EAC5B;AAAA,EAEA,UAAU,MAAoB;AAC5B,SAAK,MAAM,cAAc,IAAI,EAAE;AAAA,EACjC;AAAA,EAEA,MAAM,QAAuB;AAC3B,QAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B;AAAA,IACF;AAEA,UAAM,QAAQ,KAAK,QAAQ,OAAO,GAAG,KAAK,QAAQ,MAAM;AACxD,UAAM,QAAQ,IAAI,KAAK;AAAA,EACzB;AAAA,EAEQ,MAAM,MAAoB;AAChC,eAAW,SAAS,mBAAmB,MAAM,KAAK,QAAQ,iBAAiB,GAAG;AAC5E,WAAK,QAAQ,KAAK,KAAK,QAAQ,aAAa,KAAK,QAAQ,QAAQ,KAAK,CAAC;AAAA,IACzE;AAAA,EACF;AACF;;;AC5DA,IAAAE,oBAAe;AACf,IAAAC,qBAAiB;AAIjB;AACAC;AAGA,IAAMC,4BAA2B,KAAK,OAAO;AAC7C,IAAMC,qBAAoB;AAEnB,SAAS,yBAAyB,SAKtB;AACjB,SAAO;AAAA,IACL,YAAY;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aACE;AAAA,QACF,YAAY;AAAA,UACV,MAAM;AAAA,UACN,YAAY;AAAA,YACV,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,WAAW;AAAA,cACT,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,YACA,SAAS;AAAA,cACP,MAAM;AAAA,cACN,aAAa;AAAA,YACf;AAAA,UACF;AAAA,UACA,UAAU,CAAC,MAAM;AAAA,UACjB,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA,MAAM,QAAQ,SAAS,SAAS;AAC9B,YAAM,OAAO,UAAU,OAAO;AAC9B,YAAM,aAAaC,YAAW,KAAK,MAAM,MAAM;AAC/C,YAAM,WAAW,kBAAkB,YAAY,QAAQ,KAAK,QAAQ,MAAM;AAC1E,YAAM,QAAQ,MAAM,kBAAAC,QAAG,KAAK,QAAQ;AAEpC,UAAI,CAAC,MAAM,OAAO,GAAG;AACnB,cAAM,IAAI,MAAM,6CAA6C,QAAQ,EAAE;AAAA,MACzE;AAEA,YAAM,iBAAiBC,2BAA0B,QAAQ,OAAO,MAAM;AACtE,UAAI,MAAM,OAAO,gBAAgB;AAC/B,cAAM,IAAI,MAAM,uCAAuC,QAAQ,KAAK,MAAM,IAAI,YAAY,cAAc,UAAU;AAAA,MACpH;AAEA,YAAM,WACJ,OAAO,KAAK,cAAc,YAAY,KAAK,UAAU,KAAK,IACtD,KAAK,UAAU,KAAK,IACpB,mBAAAC,QAAK,SAAS,QAAQ;AAC5B,YAAM,UAAUC,kBAAiB,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU,MAAS;AAC5F,YAAM,OAAO,iBAAiB,QAAQ,KAAK,iBAAiB,mBAAAD,QAAK,SAAS,QAAQ,CAAC;AAEnF,UAAI,QAAQ,KAAK,WAAW,QAAQ,GAAG;AACrC,cAAM,IAAI,MAAM,2HAA2H;AAAA,MAC7I;AAEA,UAAI,QAAQ,YAAY,IAAI,GAAG;AAC7B,cAAM,QAAQ,cAAc,aAAa;AAAA,UACvC,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ;AAAA,UAChB,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AACD,cAAM,QAAQ,cAAc,SAAS;AACrC,gBAAQ,QAAQ,KAAK,yBAAyB;AAAA,UAC5C,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ;AAAA,UAChB;AAAA,UACA,QAAQ,mBAAmB,QAAQ;AAAA,QACrC,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,QAAQ,QAAQ;AAAA,cAChB,MAAM;AAAA,cACN;AAAA,cACA,MAAM,MAAM;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,YAAY,IAAI,GAAG;AAC7B,cAAM,QAAQ,cAAc,aAAa;AAAA,UACvC,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ;AAAA,UAChB,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AACD,cAAM,QAAQ,cAAc,SAAS;AACrC,gBAAQ,QAAQ,KAAK,yBAAyB;AAAA,UAC5C,SAAS,QAAQ;AAAA,UACjB,QAAQ,QAAQ;AAAA,UAChB;AAAA,UACA,QAAQ,mBAAmB,QAAQ;AAAA,QACrC,CAAC;AAED,eAAO;AAAA,UACL,KAAK;AAAA,YACH;AAAA,cACE,IAAI;AAAA,cACJ,QAAQ,QAAQ;AAAA,cAChB,MAAM;AAAA,cACN;AAAA,cACA,MAAM,MAAM;AAAA,cACZ,QAAQ;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,QAAQ,cAAc,YAAY;AAAA,QACtC,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,QAAQ,cAAc,SAAS;AACrC,cAAQ,QAAQ,KAAK,yBAAyB;AAAA,QAC5C,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,QAAQ,kBAAkB,QAAQ;AAAA,MACpC,CAAC;AAED,aAAO;AAAA,QACL,KAAK;AAAA,UACH;AAAA,YACE,IAAI;AAAA,YACJ,QAAQ,QAAQ;AAAA,YAChB,MAAM;AAAA,YACN;AAAA,YACA,MAAM,MAAM;AAAA,YACZ,QAAQ;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASD,2BAA0B,QAAyB;AAC1D,QAAM,QAAS,QAAoD;AACnE,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,KAAK,QAAQ,GAAG;AACpE,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAEA,SAAOJ;AACT;AAEA,SAASM,kBAAiB,OAA+C;AACvE,QAAM,aAAa,OAAO,KAAK;AAC/B,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAUL,qBAAoB,aAAa,WAAW,MAAM,GAAGA,kBAAiB;AACpG;AAEA,SAAS,iBAAiB,UAA0B;AAClD,QAAM,YAAY,mBAAAI,QAAK,QAAQ,QAAQ,EAAE,KAAK,EAAE,YAAY;AAC5D,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,KAAK,WAAW,QAAQ;AACjC;AAEA,SAAS,YAAY,MAAuB;AAC1C,SAAO,KAAK,WAAW,QAAQ;AACjC;;;AC7NO,IAAM,oBAAN,cAAgC,mBAAuC;AAAA,EAC5E,YACE,SAUA;AACA,UAAM;AAAA,MACJ,QAAQ;AAAA,QACN,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,YAAY,OAAO,WAAW,QAAQ,WAAW,OAAO,MAAM;AAAA,MAC9D,uBAAuB,QAAQ;AAAA,MAC/B,iBAAiB,CAAC,UAAU,MAAM,SAAS;AAAA,MAC3C,kBAAkB,QAAQ;AAAA,MAC1B,oBAAoB,QAAQ;AAAA,IAC9B,CAAC;AAAA,EACH;AACF;;;AC3BO,SAAS,4BACd,SACA,QACA,SAKiC;AACjC,SAAO;AAAA,IACL,GAAG,QAAQ;AAAA,IACX,UAAU,CAAC,SAAS;AAClB,aAAO,KAAK,SAAS;AAAA,QACnB,GAAG;AAAA,QACH,QAAQ;AAAA,MACV,CAAC;AACD,cAAQ,UAAU,WAAW,IAAI;AAAA,IACnC;AAAA,IACA,YAAY,CAAC,MAAM,SAAS;AAC1B,aAAO,KAAK,aAAa;AAAA,QACvB,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQE,eAAc,MAAM,GAAG;AAAA,MACjC,CAAC;AACD,cAAQ,UAAU,aAAa,MAAM,IAAI;AAAA,IAC3C;AAAA,IACA,cAAc,CAAC,MAAM,WAAW;AAC9B,aAAO,KAAK,iBAAiB;AAAA,QAC3B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,SAAS,OAAO,MAAM;AAAA,MAChC,CAAC;AACD,cAAQ,UAAU,eAAe,MAAM,MAAM;AAAA,IAC/C;AAAA,IACA,aAAa,CAAC,MAAM,UAAU;AAC5B,aAAO,MAAM,eAAe;AAAA,QAC1B,GAAG;AAAA,QACH,UAAU;AAAA,QACV,QAAQ,SAAS,MAAM,MAAM;AAAA,MAC/B,CAAC;AACD,cAAQ,UAAU,cAAc,MAAM,KAAK;AAAA,IAC7C;AAAA,EACF;AACF;AAEO,SAASA,eAAc,OAAe,WAAW,KAAa;AACnE,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAU,WAAW,aAAa,GAAG,WAAW,MAAM,GAAG,WAAW,CAAC,CAAC;AAC1F;;;APxBA,eAAsB,cAAc,SAgBlB;AAChB,MAAI,UAAU,MAAMC,oBAAmB,QAAQ,SAAS,OAAO;AAC/D,MAAI,UAAU,MAAMC,kBAAiB,SAAS,OAAO;AACrD,QAAM,SAAS,IAAI,iBAAiB;AAAA,IAClC,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB,QAAQ,OAAO,OAAO;AAAA,IACzC,cAAc,OAAO,QAAQ,SAAS,QAAQ,aAAa,QAAQ,IAAI;AAAA,EACzE,CAAC;AACD,UAAQ,OAAO,KAAK,iBAAiB;AAAA,IACnC,SAAS,QAAQ,QAAQ;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ;AAAA,EACrB,CAAC;AAED,MAAI;AACF,QAAI,QAAQ,QAAQ,SAAS,wBAAwB;AACnD,YAAM,qBAAqB,MAAM;AAAA,QAC/B,QAAQ,QAAQ;AAAA,QAChB;AAAA,UACE,KAAK,QAAQ;AAAA,UACb;AAAA,UACA,QAAQ,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,MACF;AAEA,UAAI,uBAAuB,WAAW;AACpC,gBAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD;AAAA,MACF;AAEA,UAAI,uBAAuB,aAAa;AACtC,gBAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD,eAAO,KAAK,qFAAqF;AACjG;AAAA,MACF;AAAA,IACF;AAEA,QAAI,sBAAqD;AACzD,UAAM,sBAAsB,YAAoC;AAC9D,8BAAwB,QAAQ,OAAO;AAAA,QACrC,QAAQ,QAAQ;AAAA,QAChB,QAAQ,QAAQ;AAAA,MAClB,EACG,KAAK,CAAC,WAAW,OAAO,YAAY,EACpC,MAAM,MAAM,IAAI;AACnB,aAAO;AAAA,IACT;AACA,UAAM,UAAU,IAAI,kBAAkB;AAAA,MACpC,QAAQ,QAAQ,QAAQ;AAAA,MACxB,YAAY,OAAO,WAAW;AAC5B,cAAM,eAAe,MAAM,oBAAoB;AAC/C,YAAI,CAAC,cAAc;AACjB;AAAA,QACF;AAEA,cAAM,QAAQ,OAAO,WAAW,QAAQ,cAAc,oBAAoB;AAAA,MAC5E;AAAA,MACA,uBAAuB,OAAO,QAAQ,SAAS,QAAQ,aAAa,OAAO,QAAQ,IAAI;AAAA,MACvF,kBAAkB,QAAQ,OAAO,OAAO;AAAA,IAC1C,CAAC;AACD,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,qBAAqB,QAAQ,mBAAmB,QAAQ,QAAQ,OAAO;AAC7E,YAAQ,kBAAkB,QAAQ,QAAQ,SAAS;AAAA,MACjD;AAAA,MACA,QAAQ,QAAQ,QAAQ;AAAA,MACxB,WAAW,QAAQ;AAAA,MACnB,wBAAwB,YAAY,QAAQ,sBAAsB;AAAA,IACpE,CAAC;AACD,YAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AAErD,UAAM,YAAY,MAAMC,gBAAe,QAAQ,SAAS,QAAQ,IAAI,OAAO;AAC3E,UAAM,YAAY,4BAA4B,SAAS,QAAQ,QAAQ;AAAA,MACrE,SAAS,QAAQ,QAAQ;AAAA,MACzB,QAAQ,QAAQ,QAAQ;AAAA,MACxB,WAAW,QAAQ;AAAA,IACrB,CAAC;AACD,UAAM,eAAe,MAAM,0BAA0B,QAAQ,QAAQ;AAAA,MACnE,cAAc;AAAA,QACZ,yBAAyB;AAAA,UACvB,SAAS,QAAQ,QAAQ;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,eAAe,QAAQ;AAAA,UACvB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI;AACF,UAAI,oBAAoB;AACtB,uBAAe,MAAM;AACnB,cAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,uBAAW,MAAM;AAAA,UACnB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,cAAQ,OAAO,KAAK,iBAAiB;AAAA,QACnC,SAAS,QAAQ,QAAQ;AAAA,QACzB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,WAAW,QAAQ,QAAQ,SAAS,yBAAyB,SAAS,QAAQ,QAAQ;AAAA,QACtF,UAAU,QAAQ,QAAQ,SAAS,yBAAyB,QAAQ,QAAQ,WAAW;AAAA,MACzF,CAAC;AACD,YAAM,SAAS,OAAO,QAAQ,WAAW,qBAAqB;AAAA,QAC5D,OAAO;AAAA,QACP,KAAK,QAAQ;AAAA,QACb,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA,cAAc,QAAQ;AAAA,QACtB,aAAa,WAAW;AAAA,QACxB;AAAA,QACA;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF,CAAC;AACD,gBAAU,OAAO;AACjB,UAAI,OAAO,UAAU,OAAO,aAAa;AACvC,eAAO,KAAK,OAAO,WAAW;AAC9B,gBAAQ,kBAAkB;AAAA,MAC5B;AACA,cAAQ,OAAO,KAAK,kBAAkB;AAAA,QACpC,SAAS,QAAQ,QAAQ;AAAA,QACzB,QAAQ,QAAQ,QAAQ;AAAA,QACxB,WAAW,QAAQ;AAAA,QACnB,QAAQ,OAAO,aAAa,SAAS,IAAI,WAAW,OAAO,aAAa,MAAM,KAAK;AAAA,MACrF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,UAAI,iBAAiB,gBAAgB;AACnC,kBAAU,MAAM;AAAA,MAClB;AAEA,UAAI,aAAa,KAAK,GAAG;AACvB,gBAAQ,kBAAkB;AAC1B,eAAO,KAAK,0CAA0C;AACtD,gBAAQ,OAAO,KAAK,gBAAgB;AAAA,UAClC,SAAS,QAAQ,QAAQ;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,WAAW,QAAQ;AAAA,QACrB,CAAC;AAAA,MACH,OAAO;AACL,gBAAQ,kBAAkB;AAC1B,eAAO,MAAM,gBAAgB,KAAK,CAAC;AACnC,eAAO,KAAK,4EAA4E;AACxF,gBAAQ,OAAO,MAAM,eAAe;AAAA,UAClC,SAAS,QAAQ,QAAQ;AAAA,UACzB,QAAQ,QAAQ,QAAQ;AAAA,UACxB,WAAW,QAAQ;AAAA,UACnB,QAAQ,gBAAgB,KAAK;AAAA,QAC/B,CAAC;AAAA,MACH;AAAA,IACF,UAAE;AACA,cAAQ,gBAAgB,QAAQ,QAAQ,OAAO;AAC/C,YAAM,QAAQ,MAAM;AACpB,cAAQ,QAAQ;AAChB,YAAM,aAAa,QAAQ,EAAE,MAAM,MAAM,MAAS;AAAA,IACpD;AAAA,EACF,UAAE;AACA,YAAQ,sBAAsB,QAAQ,QAAQ,OAAO;AACrD,cAAUC,cAAa,SAAS,QAAQ,EAAE;AAC1C,UAAM,QAAQ,gBAAgB,IAAI,OAAO;AACzC,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAeD,gBACb,SACA,WACA,SAOiB;AACjB,MAAI,QAAQ,SAAS,wBAAwB;AAC3C,UAAME,qBAAoB,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,SAAS,CAAC;AACrF,WAAO,yBAAyB,QAAQ,MAAMA,oBAAmB,QAAQ,GAAG;AAAA,EAC9E;AAEA,QAAM,aAAa,MAAM,yBAAyB;AAAA,IAChD,QAAQ,QAAQ;AAAA,IAChB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ,OAAO;AAAA,IACvB;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACD,QAAM,QAAQ,gBAAgB,IAAI,UAAU;AAC5C,QAAM,oBAAoB,MAAM,QAAQ,gBAAgB,WAAW,QAAQ,SAAS,CAAC;AACrF,SAAO,0BAA0B,SAAS,YAAY,mBAAmB,QAAQ,GAAG;AACtF;AAEA,eAAeJ,oBACb,SACA,SAK+B;AAC/B,QAAM,WAAW,MAAM,QAAQ,gBAAgB,IAAI,QAAQ,OAAO;AAClE,MAAI,UAAU;AACZ,WAAOG,cAAa,UAAU,SAAS,SAAS;AAAA,EAClD;AAEA,QAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,OAAO,QAAQ,GAAG,CAAC;AAC9F,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,UAAgC;AAAA,IACpC,SAAS,QAAQ;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,WAAW,QAAQ;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACA,QAAM,QAAQ,gBAAgB,IAAI,OAAO;AACzC,SAAO;AACT;AAEA,eAAeF,kBACb,SACA,SAKwB;AACxB,MAAI;AACF,WAAO,MAAM,QAAQ,aAAa,KAAK,QAAQ,SAAS;AAAA,EAC1D,QAAQ;AACN,UAAM,UAAU,MAAM,QAAQ,aAAa,KAAK,MAAM,QAAQ,aAAa,OAAO,QAAQ,GAAG,CAAC;AAC9F,UAAM,cAAcE,cAAa,SAAS,QAAQ,EAAE;AACpD,UAAM,QAAQ,gBAAgB,IAAI,WAAW;AAC7C,WAAO;AAAA,EACT;AACF;AAEA,SAASA,cAAa,SAA+B,WAAyC;AAC5F,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACF;;;AQvSA,IAAAE,uBAAmB;AACnB,IAAAC,oBAAe;AACf,IAAAC,qBAAiB;AAEV,IAAM,uCAAuC;AAapD,eAAsB,0BAA0B,SAIT;AACrC,QAAM,qBAAqB,QAAQ,sBAAsB;AACzD,MAAI,QAAQ,KAAK,UAAU,oBAAoB;AAC7C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,MAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,cAAc,mBAAAC,QAAK,KAAK,QAAQ,UAAU,kBAAkB;AAClE,QAAM,kBAAAC,QAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC/C,QAAM,WAAW,iBAAiB,KAAK,IAAI,CAAC,IAAI,qBAAAC,QAAO,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/E,QAAM,WAAW,mBAAAF,QAAK,KAAK,aAAa,QAAQ;AAChD,QAAM,kBAAAC,QAAG,UAAU,UAAU,QAAQ,MAAM,MAAM;AAEjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF;AACF;;;AZAO,IAAM,gBAAN,MAAoB;AAAA,EAkBzB,YAA6B,SAA+B;AAA/B;AAC3B,SAAK,eAAe,QAAQ,gBAAgB,IAAIE,qBAAoB;AACpE,SAAK,gBACH,QAAQ,iBACR,IAAI,oBAAoB,QAAQ,QAAQ,QAAQ,cAAc,QAAQ,OAAO,MAAM;AACrF,SAAK,kBACH,QAAQ,mBACR,IAAI;AAAA,MACF,QAAQ,OAAO,OAAO,uBAAuB,mBAAAC,QAAK,KAAK,QAAQ,OAAO,OAAO,UAAU,kBAAkB;AAAA,IAC3G;AACF,SAAK,SAAS,QAAQ,UAAU,0BAA0B;AAAA,EAC5D;AAAA,EA5BiB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,oBAAI,IAAmB;AAAA,EACvC,cAAc,oBAAI,IAA8B;AAAA,EAChD,sBAAsB,oBAAI,IAAY;AAAA,EACtC,sBAKZ,CAAC;AAAA,EACW,qBAAqB,oBAAI,IAAY;AAAA,EACrC,mBAAmB,oBAAI,IAAoB;AAAA,EACpD,UAAU;AAAA,EAelB,OAAa;AACX,SAAK,UAAU;AACf,SAAK,oBAAoB,0BAA0B;AAAA,EACrD;AAAA,EAEA,MAAM,IAAI,QAAqC;AAC7C,UAAM,KAAK,qBAAqB;AAChC,SAAK,OAAO,KAAK,kBAAkB;AAAA,MACjC,QAAQ,SAAS,KAAK,QAAQ,OAAO,OAAO,QAAQ;AAAA,IACtD,CAAC;AAED,QAAI;AACF,aAAO,CAAC,KAAK,WAAW,CAAC,QAAQ,SAAS;AACxC,YAAI;AACF,gBAAM,KAAK,iBAAiB,MAAM;AAAA,QACpC,SAAS,OAAO;AACd,cAAI,QAAQ,SAAS;AACnB;AAAA,UACF;AAEA,eAAK,OAAO,MAAM,mBAAmB;AAAA,YACnC,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC/D,CAAC;AACD,gBAAM,KAAK,MAAM,KAAK,QAAQ,OAAO,OAAO,QAAQ,cAAc;AAAA,QACpE;AAAA,MACF;AAAA,IACF,UAAE;AACA,YAAM,KAAK,YAAY;AAAA,IACzB;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAqC;AACjD,UAAM,KAAK,sBAAsB,MAAM;AAAA,EACzC;AAAA,EAEA,MAAc,sBAAsB,QAAqC;AACvE,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAE1C,UAAM,QAAQ,MAAM,KAAK,cAAc,KAAK,MAAM;AAClD,UAAM,YAA6B,CAAC;AACpC,eAAW,WAAW,MAAM,UAAU;AACpC,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,eAAe,OAAO;AAClD,UAAI,MAAM;AACR,kBAAU,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,YAAM,QAAQ,IAAI,SAAS;AAAA,IAC7B;AACA,QAAI,MAAM,SAAS;AACjB,YAAM,KAAK,QAAQ,aAAa,KAAK,MAAM,OAAO;AAAA,IACpD;AACA,UAAM,KAAK,cAAc,OAAO,MAAM,OAAO;AAC7C,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAc,iBAAiB,QAAqC;AAClE,UAAM,KAAK,qBAAqB;AAChC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAE1C,UAAM,QAAQ,MAAM,KAAK,cAAc,KAAK,MAAM;AAClD,UAAM,YAA6B,CAAC;AACpC,UAAM,cAAwB,CAAC;AAE/B,eAAW,WAAW,MAAM,UAAU;AACpC,YAAM,aAAa,oBAAoB,OAAO;AAC9C,UAAI,KAAK,mBAAmB,IAAI,UAAU,GAAG;AAC3C;AAAA,MACF;AAEA,WAAK,mBAAmB,IAAI,UAAU;AACtC,kBAAY,KAAK,UAAU;AAE3B,YAAM,EAAE,KAAK,IAAI,MAAM,KAAK,eAAe,OAAO;AAClD,UAAI,MAAM;AACR,kBAAU,KAAK,IAAI;AAAA,MACrB;AAAA,IACF;AAEA,SAAK,wBAAwB,MAAM,SAAS,aAAa,SAAS;AAClE,UAAM,KAAK,yBAAyB;AACpC,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAM,cAA6B;AACjC,WAAO,KAAK,cAAc,OAAO,GAAG;AAClC,YAAM,QAAQ,WAAW,CAAC,GAAG,KAAK,aAAa,CAAC;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAE1B;AACD,UAAM,aAAa,sBAAsB,SAAS;AAAA,MAChD,gBAAgB,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7C,CAAC;AAED,QAAI,WAAW,SAAS,UAAU;AAChC,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAEA,QAAI,WAAW,SAAS,sBAAsB;AAC5C,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAEA,UAAM,KAAK,oBAAoB,WAAW,SAAS,WAAW,QAAQ,WAAW,YAAY;AAE7F,QAAI,WAAW,SAAS,0BAA0BC,eAAc,WAAW,IAAI,GAAG;AAChF,YAAM,KAAK,kBAAkB,UAAU;AACvC,aAAO,EAAE,MAAM,KAAK;AAAA,IACtB;AAEA,SAAK,OAAO,KAAK,4BAA4B;AAAA,MAC3C,SAAS,WAAW;AAAA,MACpB,QAAQ,WAAW;AAAA,MACnB,WAAW,WAAW,SAAS,yBAAyB,SAAS,WAAW;AAAA,MAC5E,UAAU,WAAW,SAAS,yBAAyB,WAAW,WAAW;AAAA,IAC/E,CAAC;AAED,SAAK,qBAAqB,WAAW,OAAO;AAC5C,UAAM,OAAO,KAAK,aAAa,QAAQ,WAAW,SAAS,YAAY;AACrE,YAAM,cAAc;AAAA,QAClB,KAAK,KAAK,QAAQ;AAAA,QAClB,QAAQ,KAAK,QAAQ;AAAA,QACrB,QAAQ,KAAK,QAAQ;AAAA,QACrB,cAAc,KAAK,QAAQ;AAAA,QAC3B,iBAAiB,KAAK,QAAQ;AAAA,QAC9B,iBAAiB,KAAK;AAAA,QACtB,eAAe,KAAK,QAAQ;AAAA,QAC5B,QAAQ,KAAK;AAAA,QACb,SAAS;AAAA,QACT,SAAS,KAAK,QAAQ;AAAA,QACtB,cAAc,CAAC,QAAQ,SAAS,KAAK,aAAa,QAAQ,IAAI;AAAA,QAC9D,uBAAuB,CAAC,YAAY,KAAK,qBAAqB,OAAO;AAAA,QACrE,oBAAoB,CAAC,YAAY,KAAK,oBAAoB,OAAO,OAAO;AAAA,QACxE,mBAAmB,CAAC,SAAS,eAAe;AAC1C,eAAK,YAAY,IAAI,SAAS,UAAU;AAAA,QAC1C;AAAA,QACA,iBAAiB,CAAC,YAAY;AAC5B,eAAK,YAAY,OAAO,OAAO;AAAA,QACjC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AACD,WAAO;AAAA,MACL,MAAM,KAAK,UAAU,MAAM;AAAA,QACzB,SAAS,WAAW;AAAA,QACpB,QAAQ,WAAW;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,SAAiB,QAAgB,cAAqC;AACtG,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ,kBAAkB,IAAI;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,kBAAkB,SAAkD;AAChF,UAAM,aAAa,KAAK,YAAY,IAAI,QAAQ,OAAO;AACvD,QAAI,cAAc,CAAC,WAAW,WAAW,OAAO,SAAS;AACvD,iBAAW,WAAW,MAAM;AAC5B,YAAM,KAAK,aAAa,QAAQ,QAAQ,mFAAmF;AAC3H,YAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,WAAK,OAAO,KAAK,kBAAkB;AAAA,QACjC,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,WAAW,WAAW;AAAA,MACxB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,KAAK,mBAAmB,QAAQ,OAAO,IAAI,GAAG;AAChD,WAAK,oBAAoB,IAAI,QAAQ,OAAO;AAC5C,YAAM,KAAK,aAAa,QAAQ,QAAQ,mFAAmF;AAC3H,YAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,WAAK,OAAO,KAAK,8BAA8B;AAAA,QAC7C,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AAEA,UAAM,KAAK,aAAa,QAAQ,QAAQ,sCAAsC;AAC9E,UAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C,SAAK,OAAO,KAAK,sCAAsC;AAAA,MACrD,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,aAAa,QAAgB,MAA6B;AACtE,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AAEA,UAAM,UAAU,kBAAkB,MAAM;AACxC,UAAM,UAAU,MAAM,0BAA0B;AAAA,MAC9C,UAAU,KAAK,QAAQ,OAAO,OAAO;AAAA,MACrC;AAAA,IACF,CAAC;AAED,QAAI,QAAQ,SAAS,QAAQ;AAC3B,YAAM,KAAK,QAAQ,cAAc,YAAY;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,MACpB,CAAC;AACD,WAAK,OAAO,KAAK,qBAAqB;AAAA,QACpC;AAAA,QACA;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,QAAQC,eAAc,IAAI;AAAA,MAC5B,CAAC;AACD,YAAM,KAAK,QAAQ,cAAc,SAAS;AAC1C;AAAA,IACF;AAEA,eAAW,SAAS,mBAAmB,QAAQ,MAAM,KAAK,QAAQ,OAAO,OAAO,iBAAiB,GAAG;AAClG,YAAM,KAAK,QAAQ,cAAc,YAAY;AAAA,QAC3C;AAAA,QACA;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AACD,WAAK,OAAO,KAAK,qBAAqB;AAAA,QACpC;AAAA,QACA;AAAA,QACA,QAAQA,eAAc,KAAK;AAAA,MAC7B,CAAC;AAAA,IACH;AAEA,UAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAc,uBAAsC;AAClD,UAAM,kBAAAC,QAAG,MAAM,KAAK,QAAQ,OAAO,OAAO,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EACzE;AAAA,EAEQ,UACN,MACA,SAIe;AACf,UAAM,UAAU,KACb,MAAM,CAAC,UAAU;AAChB,WAAK,OAAO,MAAM,2BAA2B;AAAA,QAC3C,GAAG;AAAA,QACH,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC/D,CAAC;AACD,YAAM;AAAA,IACR,CAAC,EACA,QAAQ,YAAY;AACnB,WAAK,cAAc,OAAO,OAAO;AACjC,UAAI;AACF,cAAM,KAAK,QAAQ,cAAc,SAAS;AAAA,MAC5C,SAAS,OAAO;AACd,aAAK,OAAO,MAAM,0BAA0B;AAAA,UAC1C,GAAG;AAAA,UACH,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC/D,CAAC;AACD,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AACH,SAAK,cAAc,IAAI,OAAO;AAC9B,WAAO;AAAA,EACT;AAAA,EAEQ,oBAAoB,SAAuB;AACjD,eAAW,cAAc,KAAK,YAAY,OAAO,GAAG;AAClD,UAAI,CAAC,WAAW,WAAW,OAAO,SAAS;AACzC,mBAAW,WAAW,MAAM,OAAO;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,IAA2B;AAC7C,QAAI,CAAC,OAAO,SAAS,EAAE,KAAK,MAAM,GAAG;AACnC;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ,OAAO;AACtB,YAAM,KAAK,QAAQ,MAAM,EAAE;AAC3B;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACxD;AAAA,EAEQ,qBAAqB,SAAuB;AAClD,SAAK,iBAAiB,IAAI,SAAS,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAAA,EACzE;AAAA,EAEQ,qBAAqB,SAAuB;AAClD,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,mBAAmB,OAAO,IAAI,CAAC;AAClE,QAAI,cAAc,GAAG;AACnB,WAAK,iBAAiB,OAAO,OAAO;AACpC;AAAA,IACF;AAEA,SAAK,iBAAiB,IAAI,SAAS,SAAS;AAAA,EAC9C;AAAA,EAEQ,mBAAmB,SAAyB;AAClD,WAAO,KAAK,iBAAiB,IAAI,OAAO,KAAK;AAAA,EAC/C;AAAA,EAEQ,wBACN,SACA,aACA,OACM;AACN,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAEA,YAAQ,IAAI,KAAK,EACd,KAAK,MAAM;AACV,YAAM,UAAU;AAAA,IAClB,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,YAAM,QAAQ;AACd,YAAM,UAAU;AAAA,IAClB,CAAC;AAEH,SAAK,oBAAoB,KAAK,KAAK;AAAA,EACrC;AAAA,EAEA,MAAc,2BAA0C;AACtD,WAAO,KAAK,oBAAoB,SAAS,GAAG;AAC1C,YAAM,OAAO,KAAK,oBAAoB,CAAC;AACvC,UAAI,CAAC,KAAK,SAAS;AACjB;AAAA,MACF;AAEA,UAAI,KAAK,OAAO;AACd,cAAM,KAAK;AAAA,MACb;AAEA,UAAI,KAAK,SAAS;AAChB,cAAM,KAAK,QAAQ,aAAa,KAAK,KAAK,OAAO;AAAA,MACnD;AACA,YAAM,KAAK,cAAc,OAAO,KAAK,OAAO;AAC5C,WAAK,oBAAoB,MAAM;AAE/B,iBAAW,cAAc,KAAK,aAAa;AACzC,aAAK,mBAAmB,OAAO,UAAU;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAASF,eAAc,OAAwB;AAC7C,SAAO,MAAM,KAAK,EAAE,YAAY,MAAM;AACxC;AAEA,SAASC,eAAc,OAAe,WAAW,KAAa;AAC5D,QAAM,aAAa,MAAM,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACnD,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AAEA,SAAO,WAAW,UAAU,WAAW,aAAa,GAAG,WAAW,MAAM,GAAG,WAAW,CAAC,CAAC;AAC1F;AAEA,SAAS,oBAAoB,SAAmC;AAC9D,SAAO,GAAG,QAAQ,GAAG,IAAI,QAAQ,UAAU;AAC7C;;;Aa5bO,IAAM,yBAAN,MAA+D;AAAA,EACpE,YAA6B,UAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhD,MAAM,OAA+B;AACnC,UAAM,UAAU,MAAM,aAA0C,KAAK,UAAU,IAAI;AACnF,QAAI,CAAC,WAAW,OAAO,QAAQ,YAAY,YAAY,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAC9E,aAAO;AAAA,IACT;AAEA,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAM,KAAK,SAAgC;AACzC,UAAM,wBAAwB,KAAK,UAAU;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,wBAAwB,KAAK,UAAU,IAAI;AAAA,EACnD;AACF;;;AtBVA,eAAsB,YAAY,SAGhB;AAChB,QAAM,UAAU,QAAQ,OAAO;AAC/B,QAAM,SAAS,IAAI,sBAAsB;AAAA,IACvC,SAAS,QAAQ;AAAA,IACjB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACD,QAAM,cAAc,MAAM,OAAO,YAAY;AAAA,IAC3C,WAAW,QAAQ;AAAA,IACnB,SAAS,SAAS;AAChB,cAAQ,IAAI,OAAO;AAAA,IACrB;AAAA,IACA,YAAY;AACV,cAAQ,IAAI,mDAAmD;AAAA,IACjE;AAAA,IACA,UAAU,SAAS,aAAa;AAC9B,cAAQ,IAAI,iCAAiC,OAAO,IAAI,WAAW,GAAG;AAAA,IACxE;AAAA,EACF,CAAC;AAED,QAAM,kBAAAE,QAAG,MAAM,QAAQ,UAAU,EAAE,WAAW,KAAK,CAAC;AACpD,QAAM,IAAI,0BAA0B,QAAQ,eAAe,EAAE,KAAK,WAAW;AAC7E,QAAM,IAAI,uBAAuB,QAAQ,WAAW,EAAE,MAAM;AAC5D,QAAM,kBAAAA,QAAG,GAAG,QAAQ,kBAAkB,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC5E,QAAM,kBAAAA,QAAG,GAAG,QAAQ,mBAAmB,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAE7E,UAAQ;AAAA,IACN,gCAAgC,YAAY,UAAU,SAAS,QAAQ,YAAY,SAAS,SAAS,UAAU,QAAQ,QAAQ;AAAA,EACjI;AACF;AAEA,eAAsB,aAAa,SAGjB;AAChB,QAAM,UAAU,QAAQ,OAAO;AAC/B,QAAM,IAAI,0BAA0B,QAAQ,eAAe,EAAE,MAAM;AACnE,QAAM,IAAI,uBAAuB,QAAQ,WAAW,EAAE,MAAM;AAC5D,QAAM,kBAAAA,QAAG,GAAG,QAAQ,kBAAkB,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAC5E,QAAM,kBAAAA,QAAG,GAAG,QAAQ,mBAAmB,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,MAAS;AAE7E,UAAQ,IAAI,6BAA6B,QAAQ,QAAQ,EAAE;AAC7D;AAEA,eAAsB,oBAAoB,SAGf;AACzB,QAAM,SAAS,0BAA0B;AACzC,QAAM,cAAc,QAAQ,OAAO,OAAO;AAC1C,MAAI,CAAC,aAAa,OAAO;AACvB,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AAEA,QAAM,SAAS,IAAI,sBAAsB;AAAA,IACvC,OAAO,YAAY;AAAA,IACnB,SAAS,YAAY,WAAW,QAAQ,OAAO,OAAO;AAAA,IACtD,YAAY,YAAY,cAAc,QAAQ,OAAO,OAAO;AAAA,IAC5D,UAAU,QAAQ,OAAO,OAAO;AAAA,EAClC,CAAC;AACD,QAAM,eAAe,IAAI,uBAAuB,QAAQ,OAAO,OAAO,WAAW;AACjF,QAAM,oBAAoB,IAAI,4BAA4B,QAAQ,OAAO,OAAO,gBAAgB;AAChG,QAAM,gBAAgB,IAAI,oBAAoB;AAAA,IAC5C,WAAW,QAAQ,OAAO,OAAO;AAAA,IACjC,QAAQ;AAAA,IACR;AAAA,IACA,gBAAgB,QAAQ,OAAO,OAAO;AAAA,IACtC,WAAW,OAAO;AAChB,aAAO,KAAK,iBAAiB;AAAA,QAC3B,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM,SAAS,SAAS,MAAM,WAAW;AAAA,QACnD,QAAQ,QAAQ,MAAM,IAAI;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB,OAAO,OAAO;AAC7B,aAAO,MAAM,mBAAmB;AAAA,QAC9B,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM,SAAS,SAAS,MAAM,WAAW;AAAA,QACnD,QAAQ,gBAAgB,KAAK;AAAA,MAC/B,CAAC;AAAA,IACH;AAAA,IACA,UAAU,OAAO,QAAQ;AACvB,aAAO,KAAK,oBAAoB;AAAA,QAC9B,SAAS,MAAM;AAAA,QACf,QAAQ,MAAM;AAAA,QACd,UAAU,MAAM,SAAS,SAAS,MAAM,WAAW;AAAA,QACnD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,IAAI,cAAc;AAAA,IACvB,KAAK,QAAQ;AAAA,IACb,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA,cAAc,IAAI,aAAa,QAAQ,OAAO,MAAM,WAAW;AAAA,IAC/D,iBAAiB,IAAI,0BAA0B,QAAQ,OAAO,OAAO,cAAc;AAAA,IACnF;AAAA,IACA;AAAA,IACA,iBAAiB,IAAI,0BAA0B,QAAQ,OAAO,OAAO,mBAAmB;AAAA,IACxF;AAAA,IACA,eAAe,IAAI,oBAAoB,QAAQ,cAAc,QAAQ,OAAO,MAAM;AAAA,IAClF;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBACd,SACA,cAmBM;AACN,QAAM,gBAAgB,QAAQ,QAAQ,QAAQ,EAAE,YAAY,oCAAoC;AAEhG,gBACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,aAAa,eAAe,aAAa,gBAAgB,CAAC;AAChF,WAAO,aAAa,eAAe,aAAa;AAAA,MAC9C,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AAEH,gBACG,QAAQ,OAAO,EACf,YAAY,uDAAuD,EACnE,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,aAAa,eAAe,aAAa,gBAAgB,CAAC;AAChF,QAAI,CAAC,QAAQ,OAAO,OAAO,aAAa,OAAO;AAC7C,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAEA,QAAI,QAAQ,OAAO,OAAO,eAAe,WAAW,GAAG;AACrD,YAAM,IAAI,MAAM,iGAAiG;AAAA,IACnH;AAEA,UAAM,OAAO,OAAO,aAAa,sBAAsB,0BAA0B;AAAA,MAC/E,UAAU,QAAQ,OAAO,OAAO;AAAA,IAClC,CAAC;AACD,UAAM,UAAU,OAAO,aAAa,uBAAuB,qBAAqB;AAAA,MAC9E,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IAClB,CAAC;AACD,YAAQ;AAAA,MACN,gDAAgD,QAAQ,OAAO,OAAO,eAAe,KAAK,GAAG,CAAC,UAAU,QAAQ,OAAO,OAAO,QAAQ;AAAA,IACxI;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,iBAAiBC,qBAAoB,MAAM;AAC/C,iBAAW,MAAM;AACjB,cAAQ,OAAO;AAAA,IACjB,CAAC;AAED,QAAI;AACF,YAAM,QAAQ,IAAI,WAAW,MAAM;AAAA,IACrC,UAAE;AACA,qBAAe;AACf,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF,CAAC;AAEH,gBACG,QAAQ,QAAQ,EAChB,YAAY,yCAAyC,EACrD,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,aAAa,eAAe,aAAa,gBAAgB,CAAC;AAChF,WAAO,aAAa,gBAAgB,cAAc;AAAA,MAChD,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AACL;AAEA,SAASA,qBAAoB,YAAoC;AAC/D,QAAM,UAAU,MAAM;AACpB,eAAW;AAAA,EACb;AACA,UAAQ,KAAK,UAAU,OAAO;AAC9B,UAAQ,KAAK,WAAW,OAAO;AAE/B,SAAO,MAAM;AACX,YAAQ,IAAI,UAAU,OAAO;AAC7B,YAAQ,IAAI,WAAW,OAAO;AAAA,EAChC;AACF;;;A9DrKO,SAAS,gBAAgB,eAAuC,CAAC,GAAY;AAClF,QAAM,UAAU,IAAI,yBAAQ;AAC5B,QAAM,mBAAmB,aAAa,oBAAoB;AAC1D,QAAMC,yBAAwB,aAAa,yBAAyB;AACpE,QAAMC,uBAAsB,aAAa,uBAAuB;AAChE,QAAM,2BAA2B,aAAa,kBAAkB;AAEhE,UACG,KAAK,SAAS,EACd,YAAY,2CAA2C,EACvD,OAAO,uBAAuB,+BAA+B,EAC7D;AAAA,IACC;AAAA,IACA;AAAA,IACA,CAAC,UAAkB;AACjB,YAAM,SAAS,eAAe,KAAK;AACnC,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,4CAA2B,iBAAiB,KAAK,EAAE;AAAA,MAC/D;AAEA,aAAO;AAAA,IACT;AAAA,EACF,EACC,OAAO,oBAAoB,gCAAgC,EAC3D,SAAS,eAAe,uFAAuF,EAC/G,OAAO,OAAO,gBAA0B;AACvC,UAAM,SAAS,YAAY,KAAK,GAAG,EAAE,KAAK;AAC1C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,eAAe,IAAI,aAAa,QAAQ,MAAM,WAAW;AAC/D,UAAM,UAAU,MAAM,aAAa,OAAO,QAAQ,GAAG;AAErD,QAAI,CAAC,QAAQ;AACX,YAAM,iBAAiB;AAAA,QACrB,KAAK,QAAQ;AAAA,QACb,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,iBAAiB,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,SAAS,YAAY;AACrG,OAAG,IAAI,YAAY,YAAY,EAAE,EAAE;AAAA,EACrC,CAAC;AAEH,UACG,QAAQ,KAAK,EACb,YAAY,yCAAyC,EACrD,SAAS,eAAe,gBAAgB,EACxC,OAAO,OAAO,gBAA0B;AACvC,UAAM,SAAS,YAAY,KAAK,GAAG,EAAE,KAAK;AAC1C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,eAAe,IAAI,aAAa,QAAQ,MAAM,WAAW;AAC/D,UAAM,UAAU,MAAM,aAAa,OAAO,QAAQ,GAAG;AACrD,UAAM,cAAc,MAAM,iBAAiB,QAAQ,QAAQ,KAAK,QAAQ,QAAQ,SAAS,YAAY;AAErG,OAAG,IAAI,YAAY,YAAY,EAAE,EAAE;AAAA,EACrC,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,yEAAyE,EACrF,SAAS,eAAe,YAAY,EACpC,OAAO,OAAO,cAAkC;AAC/C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,eAAe,IAAI,aAAa,QAAQ,MAAM,WAAW;AAC/D,UAAM,UAAU,YAAY,MAAM,aAAa,KAAK,SAAS,IAAI,MAAM,aAAa,WAAW;AAE/F,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0BAA0B;AAAA,IAC5C;AAEA,UAAM,iBAAiB;AAAA,MACrB,KAAK,QAAQ,UAAU,MAAM,QAAQ,MAAM,QAAQ;AAAA,MACnD,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAEH,UACG,QAAQ,UAAU,EAClB,YAAY,uBAAuB,EACnC,OAAO,uBAAuB,8BAA8B,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,GAAG,EAAE,EACrG,OAAO,OAAO,YAAgC;AAC7C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,eAAe,IAAI,aAAa,QAAQ,MAAM,WAAW;AAC/D,UAAM,WAAW,MAAM,aAAa,KAAK,QAAQ,SAAS,EAAE;AAE5D,QAAI,SAAS,WAAW,GAAG;AACzB,SAAG,KAAK,wBAAwB;AAChC;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B;AAAA,QACE;AAAA,UACE,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ,SAAS;AAAA,UACjB,YAAY,QAAQ,YAAY;AAAA,QAClC,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,sFAAsF,EAClG,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,SAAS,MAAM,uBAAuB,QAAQ,GAAG;AAEvD,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,SAAG,QAAQ,WAAW,OAAO,QAAQ,MAAM,WAAW;AACtD,iBAAW,YAAY,OAAO,SAAS;AACrC,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,SAAG,KAAK,WAAW,OAAO,QAAQ,MAAM,oBAAoB;AAC5D,iBAAW,YAAY,OAAO,SAAS;AACrC,wBAAgB,QAAQ;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,SAAS,EACjB,YAAY,uDAAuD,EACnE,SAAS,cAAc,oBAAoB,EAC3C,OAAO,uBAAuB,6BAA6B,CAAC,UAAU,OAAO,SAAS,OAAO,EAAE,GAAG,EAAE,EACpG,OAAO,OAAO,UAA8B,YAAgC;AAC3E,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,cAAc,IAAI,YAAY,QAAQ,MAAM,UAAU;AAE5D,QAAI,UAAU;AACZ,YAAM,SAAS,MAAM,YAAY,KAAK,QAAQ;AAC9C,sBAAgB,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAC/C;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,YAAY,KAAK,QAAQ,SAAS,EAAE;AAC1D,QAAI,QAAQ,WAAW,GAAG;AACxB,SAAG,KAAK,0BAA0B;AAClC;AAAA,IACF;AAEA,eAAW,UAAU,SAAS;AAC5B;AAAA,QACE;AAAA,UACE,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,SAAS,OAAO,WAAW,MAAM;AAAA,UACjC,OAAO,WAAW,WAAW;AAAA,UAC7B,iBAAiB,OAAO,SAAS,EAAE;AAAA,QACrC,EAAE,KAAK,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,0DAA0D,EACtE,SAAS,cAAc,oBAAoB,EAC3C,OAAO,OAAO,aAAiC;AAC9C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,cAAc,IAAI,YAAY,QAAQ,MAAM,UAAU;AAC5D,UAAM,SAAS,MAAM,YAAY,KAAK,QAAQ;AAE9C,OAAG,QAAQ,SAAS,OAAO,OAAO,EAAE,EAAE;AACtC,eAAW,YAAY,OAAO,eAAe;AAC3C,sBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,8DAA8D,EAC1E,SAAS,YAAY,oBAAoB,EACzC,OAAO,OAAO,WAA+B;AAC5C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,SAAS,UAAM,qBAAM,OAAO,SAAS,CAAC,QAAQ,MAAM,MAAM,IAAI,CAAC,MAAM,GAAG;AAAA,MAC5E,KAAK,QAAQ;AAAA,MACb,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAED,SAAK,OAAO,YAAY,KAAK,GAAG;AAC9B,YAAM,IAAI,MAAM,OAAO,OAAO,kBAAkB;AAAA,IAClD;AAEA,UAAM,SAAS,OAAO,KAAK,KAAK;AAChC,oBAAgB,SAAS,SAAS,UAAU;AAAA,EAC9C,CAAC;AAEH,QAAM,gBAAgB,QAAQ,QAAQ,QAAQ,EAAE,YAAY,gCAAgC;AAE5F,gBACG,QAAQ,MAAM,EACd,YAAY,6CAA6C,EACzD,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,SAAS,MAAM,WAAW;AAChC;AAAA,MACE,KAAK;AAAA,QACH;AAAA,UACE,GAAG;AAAA,UACH,QAAQ,QAAQ,OAAO,SAAS,QAAQ;AAAA,UACxC,UAAU;AAAA,YACR,GAAG,OAAO;AAAA,YACV,OAAO,QAAQ,OAAO,SAAS,QAAQ,QAAQ;AAAA,YAC/C,UAAU,QAAQ,OAAO,SAAS;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,YACN,GAAG,OAAO;AAAA,YACV,aAAa,QAAQ,OAAO,OAAO,cAAc,QAAQ;AAAA,YACzD,UAAU,QAAQ,OAAO,OAAO;AAAA,UAClC;AAAA,UACA,YAAY,QAAQ,MAAM;AAAA,UAC1B,aAAa,QAAQ,MAAM;AAAA,UAC3B,YAAY,QAAQ,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAEH,gBACG,QAAQ,MAAM,EACd,YAAY,4BAA4B,EACxC,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,oBAAgB,QAAQ,MAAM,UAAU;AAAA,EAC1C,CAAC;AAEH,gBACG,QAAQ,KAAK,EACb,YAAY,oBAAoB,EAChC,SAAS,SAAS,YAAY,EAC9B,OAAO,OAAO,QAAgB;AAC7B,UAAM,SAAS,MAAM,WAAW;AAChC,QAAI,EAAE,OAAO,SAAS;AACpB,YAAM,IAAI,MAAM,uBAAuB,GAAG,EAAE;AAAA,IAC9C;AAEA,UAAM,WAAW;AACjB,oBAAgB,KAAK,UAAU,OAAO,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,EAC3D,CAAC;AAEH,gBACG,QAAQ,KAAK,EACb,YAAY,0DAA0D,EACtE,SAAS,SAAS,YAAY,EAC9B,SAAS,WAAW,cAAc,EAClC,OAAO,OAAO,KAAa,UAAkB;AAC5C,UAAM,OAAO,MAAM,aAAa,CAAC,WAAW;AAC1C,UAAI,EAAE,OAAO,SAAS;AACpB,cAAM,IAAI,MAAM,uBAAuB,GAAG,EAAE;AAAA,MAC9C;AAEA,YAAM,WAAW;AACjB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,CAAC,QAAQ,GAAG,kBAAkB,UAAU,KAAK;AAAA,MAC/C;AAAA,IACF,CAAC;AAED,OAAG,QAAQ,WAAW,GAAG,EAAE;AAC3B,oBAAgB,KAAK,UAAU,KAAK,GAAsB,GAAG,MAAM,CAAC,CAAC;AAAA,EACvE,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,oDAAoD,EAChE,OAAO,YAAY;AAClB,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAElF,OAAG,KAAK,WAAW,QAAQ,MAAM,UAAU,EAAE;AAC7C,OAAG,KAAK,aAAa,QAAQ,MAAM,WAAW,EAAE;AAChD,OAAG,KAAK,UAAU,QAAQ,OAAO,KAAK,EAAE;AACxC,OAAG,KAAK,YAAY,QAAQ,OAAO,OAAO,EAAE;AAC5C,OAAG,KAAK,SAAS,QAAQ,OAAO,IAAI,EAAE;AAEtC,QAAI,CAAC,QAAQ,OAAO,QAAQ;AAC1B,SAAG,KAAK,+CAA+C;AACvD;AAAA,IACF;AAEA,UAAM,SAAS,IAAI,eAAAC,QAAO;AAAA,MACxB,QAAQ,QAAQ,OAAO;AAAA,MACvB,SAAS,QAAQ,OAAO;AAAA,IAC1B,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,OAAO,KAAK;AACxC,UAAM,QAAQ,MAAM,QAAQ,OAAO,IAAI,IAAI,OAAO,KAAK,SAAS;AAChE,OAAG,QAAQ,yBAAyB,KAAK,EAAE;AAAA,EAC7C,CAAC;AAEH,2BAAyB,SAAS;AAAA,IAChC,iBAAiB,MAAM,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IACzD,gBAAgB;AAAA,IAChB,uBAAAF;AAAA,IACA,oBAAoB,aAAa,sBAAsB;AAAA,EACzD,CAAC;AACD,yBAAuB,SAAS;AAAA,IAC9B,iBAAiB,MAAM,oBAAoB,QAAQ,KAAK,CAAC;AAAA,IACzD,gBAAgB;AAAA,IAChB,aAAa,aAAa,eAAe;AAAA,IACzC,qBAAAC;AAAA,IACA,cAAc,aAAa,gBAAgB;AAAA,IAC3C,oBAAoB,aAAa,4BAA4B;AAAA,EAC/D,CAAC;AAED,QAAM,gBAAgB,QAAQ,QAAQ,YAAY;AAElD,gBACG,QAAQ,YAAY,EACpB,eAAe,oBAAoB,mBAAmB,EACtD,OAAO,OAAO,YAA+B;AAC5C,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,oBAAoB;AAAA,MACxB,SAAS,QAAQ;AAAA,MACjB,OAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH,CAAC;AAEH,gBACG,QAAQ,UAAU,EAClB,eAAe,iBAAiB,eAAe,EAC/C,eAAe,iBAAiB,eAAe,EAC/C,eAAe,qBAAqB,yBAAyB,EAC7D,OAAO,OAAO,YAA4D;AACzE,UAAM,UAAU,MAAM,yBAAyB,oBAAoB,QAAQ,KAAK,CAAC,CAAC;AAClF,UAAM,kBAAkB;AAAA,MACtB,SAAS,QAAQ;AAAA,MACjB,QAAQ,QAAQ;AAAA,MAChB,MAAM,QAAQ;AAAA,MACd,MAAM,QAAQ;AAAA,MACd,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH,CAAC;AAEH,SAAO;AACT;AAEA,eAAsB,OACpB,OAAiB,QAAQ,MACzB,eAAuC,CAAC,GACzB;AACf,qBAAmB;AACnB,QAAM,UAAU,gBAAgB,YAAY;AAC5C,QAAM,QAAQ,WAAW,IAAI;AAC/B;AAEA,IAAI,OAAO,YAAY,eAAe,OAAO,WAAW,eAAe,QAAQ,SAAS,QAAQ;AAC9F,OAAK,OAAO,EAAE,MAAM,CAAC,UAAmB;AACtC,OAAG,MAAM,gBAAgB,KAAK,CAAC;AAC/B,YAAQ,WAAW;AAAA,EACrB,CAAC;AACH;","names":["path","fs","import_promises","import_node_path","path","fs","fs","path","import_promises","import_node_path","path","path","crypto","import_promises","import_node_path","fs","crypto","normalizeText","truncate","path","import_node_crypto","import_node_path","oneLine","takeLastUnique","formatList","truncate","safeParseObject","path","import_node_path","normalizeStatus","normalizeText","normalizeText","truncate","normalizeText","normalizeText","normalizeTimestamp","init_state","normalizeToolStats","init_state","init_state","safeParseJson","crypto","import_node_crypto","import_promises","import_node_path","fs","path","crypto","import_node_crypto","import_promises","import_node_path","init_store","path","fs","record","init_prompt","init_prompt","truncate","oneLine","truncate","oneLine","path","fs","import_promises","import_node_path","session","normalizeText","sleep","import_promises","fs","normalizeId","normalizeName","normalizeText","normalizeStatus","crypto","truncate","import_node_crypto","import_promises","import_node_path","fs","path","normalizeStatus","normalizeText","import_promises","import_node_path","init_store","fs","path","normalizeText","normalizeName","import_promises","init_store","fs","process","init_store","isProcessAlive","process","import_node_process","init_reconcile","normalizeName","path","normalizeStatus","formatMarker","pathExists","fs","import_promises","import_node_path","import_execa","init_store","init_store","init_reconcile","path","crypto","fs","import_node_crypto","import_promises","import_node_path","init_errors","readString","fs","path","import_promises","import_node_path","init_shared","import_promises","init_shared","readString","fs","init_reconcile","init_shared","readString","path","import_node_path","init_shared","readString","init_store","init_shared","readString","init_store","init_shared","init_shared","path","fs","mammoth","stripHtml","decodeHtmlEntities","import_promises","path","isDirectory","fs","escapeRegex","import_promises","import_node_path","path","fg","isDirectory","import_node_path","import_promises","import_node_path","init_errors","init_shared","readString","path","fs","import_promises","init_shared","readString","fs","init_store","init_shared","import_promises","init_shared","readString","fs","isDirectory","init_store","init_shared","init_shared","readString","import_node_path","init_errors","init_shared","readString","path","fs","AdmZip","import_promises","readString","import_promises","sleep","fs","fs","AdmZip","import_promises","import_adm_zip","readString","path","fs","import_promises","import_node_path","init_errors","init_shared","path","import_node_path","init_shared","init_errors","SUPPORTED_EXTENSIONS","SUPPORTED_EXTENSIONS","SUPPORTED_EXTENSIONS","init_shared","readString","request","fs","path","import_promises","import_node_path","path","describeScalar","describeArrayCount","import_node_path","init_errors","init_shared","readString","init_shared","import_promises","import_node_path","init_errors","init_shared","readString","fs","path","init_errors","init_shared","readString","import_promises","import_fast_glob","init_shared","readString","fs","fg","init_shared","readString","init_store","init_shared","readString","init_store","init_shared","readString","request","path","import_node_path","import_node_child_process","init_spawn","init_spawn","init_store","init_shared","readString","truncate","init_shared","readString","runSubagentTask","init_store","init_shared","init_store","init_shared","readString","init_store","init_shared","init_store","init_shared","init_store","init_shared","init_shared","init_store","init_shared","readString","init_store","init_shared","init_store","init_shared","readString","init_store","init_shared","readString","init_store","init_shared","init_store","init_shared","readString","import_promises","import_node_path","init_errors","init_shared","readString","path","fs","import_promises","init_shared","readString","fs","init_shared","path","import_node_path","path","clampNumber","import_node_path","normalizeStringArray","normalizeStringMap","clampNumber","init_config","fs","path","pathExists","import_promises","import_node_path","fs","path","import_promises","import_node_path","import_execa","readFlagValue","fs","path","import_promises","import_node_path","readFlagValue","fs","path","import_promises","import_node_path","import_client","init_client","init_client","init_config","init_client","init_shared","init_errors","normalizeText","init_state","init_state","path","fs","import_promises","import_node_path","import_execa","init_types","path","uniqueList","import_node_path","init_types","uniquePaths","path","fg","fs","import_promises","import_node_path","import_fast_glob","init_discovery","init_discovery","path","isRegularFile","fs","import_promises","import_node_path","OpenAI","sleep","init_store","init_state","import_execa","import_openai","isTimedOutError","readExitCode","readProcessOutput","init_store","import_node_path","import_node_crypto","normalizeText","crypto","normalizeOptionalText","init_store","init_spawn","init_reconcile","init_store","init_store","compareTasks","truncate","import_promises","import_node_path","path","uniquePaths","fs","dotenv","init_config","import_node_path","envPaths","path","import_node_path","clampNumber","path","import_promises","import_node_path","fs","path","import_node_path","normalizeAllowedUserIds","clampNumber","path","fs","normalizeConfig","clampNumber","import_node_path","import_node_fs","fs","chalk","truncate","path","cwd","formatEntriesPreview","formatMatchesPreview","displayPath","path","import_promises","import_node_path","path","fs","fileExists","import_node_process","init_store","process","sleep","import_node_path","import_promises","import_node_path","path","fs","import_node_crypto","import_promises","import_node_path","readJsonFile","fs","writeJsonFileAtomically","path","crypto","readJsonFile","writeJsonFileAtomically","readJsonFile","writeJsonFileAtomically","import_promises","import_node_path","path","isProcessAlive","fs","readJsonFile","writeJsonFileAtomically","import_promises","import_node_path","readJsonFile","writeJsonFileAtomically","import_promises","import_node_path","path","fs","displayPath","init_reconcile","import_promises","import_node_path","import_node_process","import_execa","init_store","fs","path","isProcessAlive","process","isSameOrDescendant","pathExists","init_store","RESET_COMMANDS","HELP_COMMANDS","import_promises","import_node_path","init_shared","readString","fs","path","recentAttachments","path","fs","path","import_chalk","chalk","readline","import_promises","trimRecords","import_promises","import_node_path","path","fs","decodeSilk","import_node_crypto","getErrorMessage","computeBackoffMs","crypto","import_promises","import_node_path","path","isProcessAlive","defaultIsProcessAlive","fs","readPidFile","import_promises","import_node_path","PerPeerCommandQueue","findCutPoint","import_promises","import_node_path","DEFAULT_MAX_DOWNLOAD_BYTES","readConfiguredDownloadLimit","path","sanitizePathSegment","fs","formatAttachmentLines","displayPath","toDisplayPath","sanitizeFileName","RESET_COMMANDS","HELP_COMMANDS","import_promises","import_node_path","init_shared","DEFAULT_MAX_UPLOAD_BYTES","MAX_CAPTION_CHARS","readString","fs","readConfiguredUploadLimit","path","normalizeCaption","summarizeText","getOrCreateBinding","loadBoundSession","buildTurnInput","touchBinding","recentAttachments","import_node_crypto","import_promises","import_node_path","path","fs","crypto","PerPeerCommandQueue","path","isStopCommand","summarizeText","fs","fs","bindShutdownSignals","createTelegramService","createWeixinService","OpenAI"]}