skill-distill 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +236 -58
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.js +236 -58
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/validation.ts","../src/loaders/claude.ts","../src/loaders/base.ts","../src/loaders/codex.ts","../src/loaders/cursor.ts","../src/loaders/index.ts","../src/core/llm-engine.ts","../src/prompts/index.ts","../src/core/preprocessor.ts","../src/core/failed-filter.ts","../src/core/parameter-extractor.ts","../src/core/distiller.ts","../src/prompt-handler/classifier.ts","../src/prompt-handler/fuser.ts","../src/prompt-handler/prompt-handler.ts","../src/prompt-handler/interactive.ts","../src/generators/skill-generator.ts","../src/generators/frontmatter-builder.ts","../src/generators/markdown-renderer.ts","../src/generators/directory-builder.ts","../src/generators/template-validator.ts","../src/formatters/claude-formatter.ts","../src/formatters/codex-formatter.ts","../src/formatters/cursor-formatter.ts","../src/formatters/converter.ts","../src/formatters/validator.ts","../src/installers/claude.ts","../src/installers/base.ts","../src/installers/codex.ts","../src/installers/cursor.ts","../src/installers/index.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\n\nexport const logger = {\n info: (msg: string) => console.log(chalk.blue('ℹ'), msg),\n success: (msg: string) => console.log(chalk.green('✓'), msg),\n warn: (msg: string) => console.log(chalk.yellow('⚠'), msg),\n error: (msg: string) => console.log(chalk.red('✗'), msg),\n step: (msg: string) => console.log(chalk.cyan('→'), msg),\n};\n","import { promises as fs } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nexport function expandHome(path: string): string {\n if (path.startsWith('~')) {\n return join(homedir(), path.slice(1));\n }\n return path;\n}\n\nexport async function ensureDir(path: string): Promise<void> {\n await fs.mkdir(path, { recursive: true });\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJson<T>(path: string): Promise<T> {\n const content = await fs.readFile(path, 'utf-8');\n return JSON.parse(content) as T;\n}\n\nexport async function writeJson(path: string, data: unknown): Promise<void> {\n await fs.writeFile(path, JSON.stringify(data, null, 2));\n}\n","import { z } from 'zod';\n\nexport const SessionIdSchema = z.string().min(1, 'Session ID is required');\n\nexport const PlatformSchema = z.enum(['claude', 'codex', 'cursor']);\n\nexport const DistillOptionsSchema = z.object({\n sessionId: z.string().optional(),\n last: z.boolean().optional(),\n prompts: z.array(z.string()).optional(),\n format: z.enum(['claude', 'codex', 'cursor', 'all']).optional(),\n outputDir: z.string().optional(),\n install: z.boolean().optional(),\n interactive: z.boolean().optional(),\n});\n\nexport function validateSessionId(id: unknown): string {\n return SessionIdSchema.parse(id);\n}\n\nexport function validatePlatform(platform: unknown): 'claude' | 'codex' | 'cursor' {\n return PlatformSchema.parse(platform);\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo, SessionLoaderOptions } from './base.js';\nimport type { Session, Message } from '../types/session.js';\n\ninterface ClaudeSessionFile {\n id: string;\n createdAt: string;\n updatedAt: string;\n messages: ClaudeMessage[];\n}\n\ninterface ClaudeMessage {\n role: 'human' | 'assistant';\n content: string;\n createdAt: string;\n toolUseBlocks?: Array<{\n name: string;\n input: Record<string, unknown>;\n }>;\n toolResultBlocks?: Array<{\n toolUseId: string;\n content: string;\n isError: boolean;\n }>;\n}\n\nexport class ClaudeSessionLoader extends SessionLoader {\n constructor(options: SessionLoaderOptions = {}) {\n super(options);\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.claude', 'projects');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n const sessions: SessionInfo[] = [];\n\n try {\n const projectDirs = await fs.readdir(this.basePath);\n\n for (const projectDir of projectDirs) {\n const projectPath = join(this.basePath, projectDir);\n const stat = await fs.stat(projectPath);\n\n if (!stat.isDirectory()) continue;\n\n const sessionsPath = join(projectPath, 'sessions');\n try {\n const sessionFiles = await fs.readdir(sessionsPath);\n\n for (const file of sessionFiles) {\n if (!file.endsWith('.json')) continue;\n\n const sessionPath = join(sessionsPath, file);\n const sessionData = await this.readSessionFile(sessionPath);\n\n if (sessionData) {\n sessions.push({\n id: sessionData.id,\n projectPath: projectDir,\n startTime: sessionData.createdAt,\n endTime: sessionData.updatedAt,\n messageCount: sessionData.messages.length,\n summary: this.extractSummary(sessionData.messages),\n });\n }\n }\n } catch {\n continue;\n }\n }\n } catch (error) {\n throw new Error(`Failed to list sessions: ${error}`);\n }\n\n return sessions;\n }\n\n async getSession(id: string): Promise<Session> {\n const sessions = await this.listSessions();\n const sessionInfo = sessions.find((s) => s.id === id);\n\n if (!sessionInfo) {\n throw new Error(`Session not found: ${id}`);\n }\n\n const sessionPath = join(this.basePath, sessionInfo.projectPath, 'sessions', `${id}.json`);\n\n const data = await this.readSessionFile(sessionPath);\n if (!data) {\n throw new Error(`Failed to read session: ${id}`);\n }\n\n return this.transformSession(data, sessionInfo.projectPath);\n }\n\n private async readSessionFile(path: string): Promise<ClaudeSessionFile | null> {\n try {\n const content = await fs.readFile(path, 'utf-8');\n return JSON.parse(content) as ClaudeSessionFile;\n } catch {\n return null;\n }\n }\n\n private transformSession(data: ClaudeSessionFile, projectPath: string): Session {\n return {\n id: data.id,\n projectPath,\n startTime: data.createdAt,\n endTime: data.updatedAt,\n messages: data.messages.map((msg) => this.transformMessage(msg)),\n };\n }\n\n private transformMessage(msg: ClaudeMessage): Message {\n return {\n role: msg.role === 'human' ? 'user' : 'assistant',\n content: msg.content,\n timestamp: msg.createdAt,\n toolCalls: msg.toolUseBlocks?.map((t) => ({\n name: t.name,\n input: t.input,\n })),\n toolResults: msg.toolResultBlocks?.map((t) => ({\n name: t.toolUseId,\n output: t.content,\n success: !t.isError,\n })),\n };\n }\n\n private extractSummary(messages: ClaudeMessage[]): string {\n const firstUserMessage = messages.find((m) => m.role === 'human');\n if (!firstUserMessage) return '';\n\n const content = firstUserMessage.content;\n return content.length > 100 ? content.slice(0, 100) + '...' : content;\n }\n}\n","import type { Session } from '../types/session.js';\n\nexport interface SessionInfo {\n id: string;\n projectPath: string;\n startTime: string;\n endTime?: string;\n messageCount: number;\n summary?: string;\n}\n\nexport interface SessionLoaderOptions {\n basePath?: string;\n projectPath?: string;\n}\n\nexport abstract class SessionLoader {\n protected basePath: string;\n protected projectPath?: string;\n\n constructor(options: SessionLoaderOptions = {}) {\n this.basePath = options.basePath ?? this.getDefaultBasePath();\n this.projectPath = options.projectPath;\n }\n\n abstract getDefaultBasePath(): string;\n abstract listSessions(): Promise<SessionInfo[]>;\n abstract getSession(id: string): Promise<Session>;\n\n async getLatestSession(): Promise<Session> {\n const sessions = await this.listSessions();\n if (sessions.length === 0) {\n throw new Error('No sessions found');\n }\n const sorted = sessions.sort(\n (a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime()\n );\n return this.getSession(sorted[0].id);\n }\n\n async searchSessions(query: string): Promise<SessionInfo[]> {\n const sessions = await this.listSessions();\n const lowerQuery = query.toLowerCase();\n return sessions.filter(\n (s) =>\n s.summary?.toLowerCase().includes(lowerQuery) ||\n s.projectPath.toLowerCase().includes(lowerQuery)\n );\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo } from './base.js';\nimport type { Session } from '../types/session.js';\n\nexport class CodexSessionLoader extends SessionLoader {\n getDefaultBasePath(): string {\n return join(homedir(), '.codex', 'history');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n return [];\n }\n\n async getSession(_id: string): Promise<Session> {\n throw new Error('Codex session loading not yet implemented');\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo } from './base.js';\nimport type { Session } from '../types/session.js';\n\nexport class CursorSessionLoader extends SessionLoader {\n getDefaultBasePath(): string {\n return join(homedir(), '.cursor', 'workspaceStorage');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n return [];\n }\n\n async getSession(_id: string): Promise<Session> {\n throw new Error('Cursor session loading not yet implemented');\n }\n}\n","import { SessionLoader, SessionLoaderOptions } from './base.js';\nimport { ClaudeSessionLoader } from './claude.js';\nimport { CodexSessionLoader } from './codex.js';\nimport { CursorSessionLoader } from './cursor.js';\n\nexport type Platform = 'claude' | 'codex' | 'cursor';\n\nexport function createSessionLoader(\n platform: Platform,\n options?: SessionLoaderOptions\n): SessionLoader {\n switch (platform) {\n case 'claude':\n return new ClaudeSessionLoader(options);\n case 'codex':\n return new CodexSessionLoader(options);\n case 'cursor':\n return new CursorSessionLoader(options);\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport { SessionLoader, SessionInfo, SessionLoaderOptions } from './base.js';\nexport { ClaudeSessionLoader } from './claude.js';\nexport { CodexSessionLoader } from './codex.js';\nexport { CursorSessionLoader } from './cursor.js';\n","import Anthropic from '@anthropic-ai/sdk';\nimport { z } from 'zod';\nimport type { Session, Message } from '../types/session.js';\nimport type { Skill } from '../types/skill.js';\nimport * as prompts from '../prompts/index.js';\n\nconst IntentSchema = z.object({\n goal: z.string().describe('The user core objective'),\n problem: z.string().describe('The problem to solve'),\n outcome: z.string().describe('The final result'),\n triggers: z.array(z.string()).describe('Trigger phrases list'),\n category: z.string().describe('Task category'),\n});\n\nconst StepSchema = z.object({\n title: z.string(),\n description: z.string(),\n substeps: z.array(z.string()).optional(),\n isKeyStep: z.boolean(),\n toolsUsed: z.array(z.string()).optional(),\n});\n\nconst StepsResultSchema = z.object({\n steps: z.array(StepSchema),\n parameters: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['string', 'boolean', 'number']),\n description: z.string(),\n defaultValue: z.unknown().optional(),\n })\n ),\n prerequisites: z.array(z.string()),\n errorHandling: z.record(z.string()),\n});\n\nexport type Intent = z.infer<typeof IntentSchema>;\nexport type DistilledStep = z.infer<typeof StepSchema>;\nexport type StepsResult = z.infer<typeof StepsResultSchema>;\n\ninterface LLMEngineOptions {\n apiKey?: string;\n model?: string;\n maxTokens?: number;\n}\n\ninterface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport class LLMEngine {\n private client: Anthropic;\n private model: string;\n private maxTokens: number;\n private totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n constructor(options: LLMEngineOptions = {}) {\n this.client = new Anthropic({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n this.model = options.model ?? 'claude-sonnet-4-20250514';\n this.maxTokens = options.maxTokens ?? 4096;\n }\n\n async extractIntent(session: Session): Promise<Intent> {\n const conversationText = this.formatConversation(session.messages);\n\n const response = await this.chat(\n prompts.intentExtraction(conversationText),\n prompts.SYSTEM_ANALYST\n );\n\n return this.parseJson(response, IntentSchema);\n }\n\n async distillSteps(\n session: Session,\n intent: Intent,\n userPrompts?: string[]\n ): Promise<StepsResult> {\n const conversationText = this.formatConversation(session.messages);\n\n const promptAdditions = userPrompts?.length\n ? `\\n\\nUser additional instructions:\\n${userPrompts.map((p) => `- ${p}`).join('\\n')}`\n : '';\n\n const response = await this.chat(\n prompts.stepDistillation(conversationText, intent, promptAdditions),\n prompts.SYSTEM_ANALYST\n );\n\n return this.parseJson(response, StepsResultSchema);\n }\n\n async enhanceQuality(skill: Partial<Skill>): Promise<Skill> {\n const response = await this.chat(\n prompts.qualityEnhancement(JSON.stringify(skill, null, 2)),\n prompts.SYSTEM_SKILL_WRITER\n );\n\n return this.parseJson(response, z.any()) as Skill;\n }\n\n async generateDescription(intent: Intent): Promise<string> {\n const response = await this.chat(\n prompts.descriptionGeneration(intent),\n prompts.SYSTEM_SKILL_WRITER\n );\n\n return response.trim();\n }\n\n async chat(prompt: string, system?: string): Promise<string> {\n const response = await this.withRetry(async () => {\n return this.client.messages.create({\n model: this.model,\n max_tokens: this.maxTokens,\n system: system ?? prompts.SYSTEM_DEFAULT,\n messages: [{ role: 'user', content: prompt }],\n });\n });\n\n this.totalUsage.inputTokens += response.usage.input_tokens;\n this.totalUsage.outputTokens += response.usage.output_tokens;\n\n const textBlock = response.content.find((b) => b.type === 'text');\n if (!textBlock || textBlock.type !== 'text') {\n throw new Error('No text response from LLM');\n }\n\n return textBlock.text;\n }\n\n getTokenUsage(): TokenUsage {\n return { ...this.totalUsage };\n }\n\n private formatConversation(messages: Message[]): string {\n return messages\n .map((m) => {\n const role = m.role === 'user' ? 'User' : 'Assistant';\n let content = `[${role}]: ${m.content}`;\n\n if (m.toolCalls?.length) {\n content += `\\n [Tools Used]: ${m.toolCalls.map((t) => t.name).join(', ')}`;\n }\n\n return content;\n })\n .join('\\n\\n');\n }\n\n private parseJson<T>(text: string, schema: z.ZodSchema<T>): T {\n const jsonMatch = text.match(/```json\\n?([\\s\\S]*?)\\n?```/) || text.match(/\\{[\\s\\S]*\\}/);\n\n if (!jsonMatch) {\n throw new Error('No JSON found in response');\n }\n\n const jsonStr = jsonMatch[1] || jsonMatch[0];\n const parsed = JSON.parse(jsonStr);\n\n return schema.parse(parsed);\n }\n\n private async withRetry<T>(fn: () => Promise<T>, maxRetries = 3, delay = 1000): Promise<T> {\n let lastError: Error | undefined;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof Anthropic.RateLimitError) {\n await this.sleep(delay * (i + 1) * 2);\n } else if (error instanceof Anthropic.APIError) {\n await this.sleep(delay * (i + 1));\n } else {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","export const SYSTEM_DEFAULT = `You are Skill Distill, an expert at analyzing AI agent conversations and extracting reusable patterns.`;\n\nexport const SYSTEM_ANALYST = `You are an expert conversation analyst. Your task is to:\n1. Understand the user's original intent\n2. Identify key steps and patterns\n3. Filter out failed attempts and trial-and-error\n4. Extract reusable knowledge\n\nAlways respond in valid JSON format.`;\n\nexport const SYSTEM_SKILL_WRITER = `You are an expert at writing Claude Code Skills. You follow these rules:\n1. Use third-person in descriptions (\"This skill should be used when...\")\n2. Use imperative/infinitive form in steps (\"Parse the file...\", not \"You should parse...\")\n3. Include specific trigger phrases\n4. Keep content focused and lean\n5. Follow Claude Code Skill format exactly`;\n\nexport function intentExtraction(conversation: string): string {\n return `Analyze the following conversation between a user and an AI assistant.\n\n<conversation>\n${conversation}\n</conversation>\n\nExtract the user's intent and provide a structured analysis.\n\nRespond with a JSON object containing:\n- goal: The user's core objective (what they wanted to achieve)\n- problem: The problem they were trying to solve\n- outcome: What was ultimately accomplished\n- triggers: An array of 3-5 specific phrases that would trigger this type of task (e.g., \"migrate to RSC\", \"add server components\")\n- category: The category of this task (e.g., \"refactoring\", \"feature-development\", \"debugging\", \"configuration\")\n\n\\`\\`\\`json\n{\n \"goal\": \"...\",\n \"problem\": \"...\",\n \"outcome\": \"...\",\n \"triggers\": [\"...\", \"...\"],\n \"category\": \"...\"\n}\n\\`\\`\\``;\n}\n\nexport function stepDistillation(\n conversation: string,\n intent: { goal: string; problem: string },\n userPromptAdditions: string\n): string {\n return `Based on the following conversation, extract the key steps that were taken to achieve the goal.\n\n<goal>\n${intent.goal}\n</goal>\n\n<problem>\n${intent.problem}\n</problem>\n\n<conversation>\n${conversation}\n</conversation>\n${userPromptAdditions}\n\nInstructions:\n1. Identify the SUCCESSFUL steps that led to the outcome (filter out failed attempts)\n2. Generalize specific values into parameters where appropriate\n3. Identify prerequisites needed before starting\n4. Note any error handling patterns discovered\n\nRespond with a JSON object:\n\n\\`\\`\\`json\n{\n \"steps\": [\n {\n \"title\": \"Step title\",\n \"description\": \"What to do in this step (use imperative form)\",\n \"substeps\": [\"optional substep 1\", \"optional substep 2\"],\n \"isKeyStep\": true,\n \"toolsUsed\": [\"tool1\", \"tool2\"]\n }\n ],\n \"parameters\": [\n {\n \"name\": \"parameter_name\",\n \"type\": \"string\",\n \"description\": \"What this parameter controls\",\n \"defaultValue\": \"optional default\"\n }\n ],\n \"prerequisites\": [\n \"Prerequisite 1\",\n \"Prerequisite 2\"\n ],\n \"errorHandling\": {\n \"Error scenario 1\": \"How to handle it\",\n \"Error scenario 2\": \"How to handle it\"\n }\n}\n\\`\\`\\``;\n}\n\nexport function qualityEnhancement(skillJson: string): string {\n return `Review and enhance the following Skill definition for quality and completeness.\n\n<skill>\n${skillJson}\n</skill>\n\nImprovements to make:\n1. Ensure all steps use imperative form (\"Do X\" not \"You should do X\")\n2. Add any missing error handling scenarios\n3. Improve trigger phrases to be more specific\n4. Add example usage phrases\n5. Ensure prerequisites are complete\n6. Add any missing notes or warnings\n\nReturn the enhanced Skill as a complete JSON object with the same structure but improved content.`;\n}\n\nexport function descriptionGeneration(intent: { goal: string; triggers: string[] }): string {\n return `Generate a Claude Code Skill description based on the following:\n\nGoal: ${intent.goal}\nTrigger phrases: ${intent.triggers.join(', ')}\n\nRequirements:\n1. Use third-person format: \"This skill should be used when...\"\n2. Include the specific trigger phrases in quotes\n3. Be concise but descriptive (1-2 sentences)\n\nExample format:\n\"This skill should be used when the user asks to \\\\\"migrate to RSC\\\\\", \\\\\"convert to Server Components\\\\\", or mentions React Server Components migration. Provides step-by-step guidance for the migration process.\"\n\nGenerate only the description text, no additional formatting.`;\n}\n","import type { Message } from '../types/session.js';\n\nexport interface ProcessedMessage extends Message {\n turnIndex: number;\n hasToolCalls: boolean;\n hasCodeBlocks: boolean;\n codeBlocks: string[];\n sentiment: 'positive' | 'negative' | 'neutral';\n}\n\nexport interface PreprocessResult {\n messages: ProcessedMessage[];\n totalTurns: number;\n toolCallCount: number;\n}\n\nexport class ConversationPreprocessor {\n private positiveSignals = [\n 'perfect',\n 'great',\n 'thanks',\n 'good',\n 'works',\n 'done',\n '好的',\n '可以',\n '完成',\n '成功',\n '对的',\n ];\n\n private negativeSignals = [\n 'wrong',\n 'error',\n 'fail',\n \"doesn't work\",\n 'not working',\n 'not right',\n 'undo',\n '不对',\n '错误',\n '失败',\n '撤销',\n '回滚',\n ];\n\n process(messages: Message[]): PreprocessResult {\n let turnIndex = 0;\n let toolCallCount = 0;\n\n const processed = messages.map((msg) => {\n if (msg.role === 'user') {\n turnIndex++;\n }\n\n const hasToolCalls = (msg.toolCalls?.length ?? 0) > 0;\n if (hasToolCalls) {\n toolCallCount += msg.toolCalls!.length;\n }\n\n const codeBlocks = this.extractCodeBlocks(msg.content);\n\n return {\n ...msg,\n turnIndex,\n hasToolCalls,\n hasCodeBlocks: codeBlocks.length > 0,\n codeBlocks,\n sentiment: this.analyzeSentiment(msg.content),\n };\n });\n\n return {\n messages: processed,\n totalTurns: turnIndex,\n toolCallCount,\n };\n }\n\n private extractCodeBlocks(content: string): string[] {\n const regex = /```[\\w]*\\n([\\s\\S]*?)```/g;\n const blocks: string[] = [];\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push(match[1].trim());\n }\n\n return blocks;\n }\n\n private analyzeSentiment(content: string): 'positive' | 'negative' | 'neutral' {\n const lower = content.toLowerCase();\n\n const hasPositive = this.positiveSignals.some((s) => lower.includes(s));\n const hasNegative = this.negativeSignals.some((s) => lower.includes(s));\n\n if (hasPositive && !hasNegative) return 'positive';\n if (hasNegative) return 'negative';\n return 'neutral';\n }\n}\n","import type { ProcessedMessage } from './preprocessor.js';\n\nexport interface FilterResult {\n messages: ProcessedMessage[];\n removedCount: number;\n removedTurns: number[];\n}\n\nexport class FailedAttemptFilter {\n private failureIndicators = {\n userSignals: [\n 'not working',\n \"doesn't work\",\n 'wrong',\n 'undo',\n 'revert',\n 'go back',\n 'try again',\n \"that's not right\",\n 'actually',\n '不对',\n '撤销',\n '回滚',\n '重试',\n '换个方法',\n ],\n assistantSignals: [\n 'sorry',\n 'apologize',\n 'my mistake',\n 'let me try again',\n 'I made an error',\n 'that was incorrect',\n '抱歉',\n '对不起',\n '我的错误',\n '让我重试',\n ],\n toolFailures: ['error', 'failed', 'exception', 'not found', 'permission denied'],\n };\n\n filter(messages: ProcessedMessage[]): FilterResult {\n const failedTurns = this.identifyFailedTurns(messages);\n\n const filtered = messages.filter((msg) => !failedTurns.has(msg.turnIndex));\n\n return {\n messages: filtered,\n removedCount: messages.length - filtered.length,\n removedTurns: Array.from(failedTurns),\n };\n }\n\n private identifyFailedTurns(messages: ProcessedMessage[]): Set<number> {\n const failedTurns = new Set<number>();\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const nextMsg = messages[i + 1];\n\n if (msg.role === 'user' && this.hasFailureSignal(msg.content, 'userSignals')) {\n if (msg.turnIndex > 1) {\n failedTurns.add(msg.turnIndex - 1);\n }\n }\n\n if (msg.role === 'assistant' && this.hasFailureSignal(msg.content, 'assistantSignals')) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.toolResults?.some((r) => !r.success)) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.toolResults?.some((r) => this.hasFailureSignal(r.output, 'toolFailures'))) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.role === 'user' && nextMsg?.role === 'user') {\n failedTurns.add(msg.turnIndex);\n }\n }\n\n return failedTurns;\n }\n\n private hasFailureSignal(\n content: string,\n signalType: keyof typeof this.failureIndicators\n ): boolean {\n const lower = content.toLowerCase();\n return this.failureIndicators[signalType].some((signal) => lower.includes(signal.toLowerCase()));\n }\n}\n","import type { SkillStep, SkillParameter } from '../types/skill.js';\nimport type { DistilledStep } from './llm-engine.js';\n\ninterface ExtractResult {\n steps: SkillStep[];\n parameters: SkillParameter[];\n}\n\nexport class ParameterExtractor {\n private patterns = [\n { regex: /(?:src|lib|app|components|pages)\\/[\\w\\-/]+\\.\\w+/g, type: 'path' as const },\n { regex: /(?:src|lib|app|components|pages)\\/[\\w\\-/]+/g, type: 'directory' as const },\n {\n regex: /\\b[a-z][a-zA-Z0-9]*(?:Component|Hook|Service|Controller|Module)\\b/g,\n type: 'name' as const,\n },\n { regex: /:\\d{4,5}\\b/g, type: 'port' as const },\n { regex: /https?:\\/\\/[^\\s]+/g, type: 'url' as const },\n ];\n\n extract(steps: DistilledStep[], existingParams: SkillParameter[]): ExtractResult {\n const extractedParams = new Map<string, SkillParameter>();\n\n existingParams.forEach((p) => {\n extractedParams.set(p.name, {\n ...p,\n required: p.default === undefined,\n });\n });\n\n const processedSteps: SkillStep[] = steps\n .filter((s) => s.isKeyStep)\n .map((step) => {\n let description = step.description;\n\n for (const pattern of this.patterns) {\n const matches = description.match(pattern.regex);\n if (matches) {\n for (const match of matches) {\n const paramName = this.generateParamName(match, pattern.type);\n\n if (!extractedParams.has(paramName)) {\n extractedParams.set(paramName, {\n name: paramName,\n type: 'string',\n description: `${pattern.type} parameter extracted from step`,\n default: match,\n required: false,\n });\n }\n\n description = description.replace(match, `{${paramName}}`);\n }\n }\n }\n\n return {\n title: step.title,\n description,\n substeps: step.substeps,\n };\n });\n\n return {\n steps: processedSteps,\n parameters: Array.from(extractedParams.values()),\n };\n }\n\n private generateParamName(value: string, type: string): string {\n switch (type) {\n case 'path': {\n const fileName = value.split('/').pop() ?? 'file';\n return `${fileName.replace(/\\.\\w+$/, '')}_path`;\n }\n case 'directory': {\n const dirName = value.split('/').pop() ?? 'dir';\n return `${dirName}_dir`;\n }\n case 'name':\n return value.toLowerCase().replace(/component|hook|service/gi, '') + '_name';\n case 'port':\n return 'port';\n case 'url':\n return 'api_url';\n default:\n return `param_${type}`;\n }\n }\n}\n","import type { Session } from '../types/session.js';\nimport type { Skill, SkillStep, SkillParameter } from '../types/skill.js';\nimport { LLMEngine, Intent, StepsResult } from './llm-engine.js';\nimport { ConversationPreprocessor } from './preprocessor.js';\nimport { FailedAttemptFilter } from './failed-filter.js';\nimport { ParameterExtractor } from './parameter-extractor.js';\n\nexport interface DistillerOptions {\n userPrompts?: string[];\n skipFailedFilter?: boolean;\n verbose?: boolean;\n}\n\nexport interface DistillResult {\n skill: Skill;\n metadata: {\n sessionId: string;\n distilledAt: string;\n tokenUsage: { input: number; output: number };\n stepsFiltered: number;\n };\n}\n\nexport class Distiller {\n private llmEngine: LLMEngine;\n private preprocessor: ConversationPreprocessor;\n private failedFilter: FailedAttemptFilter;\n private parameterExtractor: ParameterExtractor;\n\n constructor(llmEngine?: LLMEngine) {\n this.llmEngine = llmEngine ?? new LLMEngine();\n this.preprocessor = new ConversationPreprocessor();\n this.failedFilter = new FailedAttemptFilter();\n this.parameterExtractor = new ParameterExtractor();\n }\n\n async distill(session: Session, options: DistillerOptions = {}): Promise<DistillResult> {\n const { userPrompts, skipFailedFilter, verbose } = options;\n\n if (verbose) console.log('Preprocessing conversation...');\n const preprocessed = this.preprocessor.process(session.messages);\n\n let filteredMessages = preprocessed.messages;\n let stepsFiltered = 0;\n\n if (!skipFailedFilter) {\n if (verbose) console.log('Filtering failed attempts...');\n const filterResult = this.failedFilter.filter(preprocessed.messages);\n filteredMessages = filterResult.messages;\n stepsFiltered = filterResult.removedCount;\n }\n\n const filteredSession: Session = {\n ...session,\n messages: filteredMessages,\n };\n\n if (verbose) console.log('Extracting intent...');\n const intent = await this.llmEngine.extractIntent(filteredSession);\n\n if (verbose) console.log('Distilling steps...');\n const stepsResult = await this.llmEngine.distillSteps(filteredSession, intent, userPrompts);\n\n if (verbose) console.log('Extracting parameters...');\n const { steps: parameterizedSteps, parameters } = this.parameterExtractor.extract(\n stepsResult.steps,\n this.convertParameters(stepsResult.parameters)\n );\n\n if (verbose) console.log('Generating description...');\n const description = await this.llmEngine.generateDescription(intent);\n\n const skill = this.assembleSkill(\n intent,\n description,\n parameterizedSteps,\n parameters,\n stepsResult\n );\n\n if (verbose) console.log('Enhancing quality...');\n const enhancedSkill = await this.llmEngine.enhanceQuality(skill);\n\n const tokenUsage = this.llmEngine.getTokenUsage();\n\n return {\n skill: enhancedSkill,\n metadata: {\n sessionId: session.id,\n distilledAt: new Date().toISOString(),\n tokenUsage: {\n input: tokenUsage.inputTokens,\n output: tokenUsage.outputTokens,\n },\n stepsFiltered,\n },\n };\n }\n\n private convertParameters(\n params: { name: string; type: 'string' | 'boolean' | 'number'; description: string; defaultValue?: unknown }[]\n ): SkillParameter[] {\n return params.map((p) => ({\n name: p.name,\n type: p.type,\n description: p.description,\n default: p.defaultValue,\n required: p.defaultValue === undefined,\n }));\n }\n\n private assembleSkill(\n intent: Intent,\n description: string,\n steps: SkillStep[],\n parameters: SkillParameter[],\n stepsResult: StepsResult\n ): Skill {\n return {\n metadata: {\n name: this.generateName(intent),\n description,\n version: '1.0.0',\n },\n overview: intent.goal,\n triggers: intent.triggers,\n prerequisites: stepsResult.prerequisites,\n steps,\n parameters,\n errorHandling: stepsResult.errorHandling,\n examples: this.generateExamples(intent.triggers),\n notes: [],\n };\n }\n\n private generateName(intent: Intent): string {\n const words = intent.goal\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 2)\n .slice(0, 4);\n\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n }\n\n private generateExamples(triggers: string[]): string[] {\n return triggers.slice(0, 3).map((trigger) => `Help me ${trigger.toLowerCase()}`);\n }\n}\n","import type { ClassifiedPrompt, PromptType } from './types.js';\n\ninterface KeywordPattern {\n keywords: string[];\n type: PromptType;\n}\n\nexport class PromptClassifier {\n private patterns: {\n zh: KeywordPattern[];\n en: KeywordPattern[];\n };\n\n constructor(private language: 'en' | 'zh' = 'zh') {\n this.patterns = {\n zh: [\n // Order matters: more specific patterns (exclude with negation) must come before generic ones\n { keywords: ['不要', '排除', '跳过', '忽略', '不包含', '去掉'], type: 'exclude' },\n { keywords: ['重点', '关注', '强调', '着重', '特别注意'], type: 'focus' },\n { keywords: ['需要', '必须', '兼容', '要求', '确保', '支持'], type: 'constraint' },\n { keywords: ['添加', '补充', '包含', '加入', '增加'], type: 'supplement' },\n { keywords: ['详细', '简洁', '适合', '风格', '形式'], type: 'style' },\n ],\n en: [\n // Order matters: \"don't include\" must be checked before \"include\"\n { keywords: [\"don't include\", 'exclude', 'skip', 'ignore', 'without', 'do not include'], type: 'exclude' },\n { keywords: ['focus', 'emphasize', 'highlight', 'prioritize'], type: 'focus' },\n { keywords: ['must', 'require', 'compatible', 'ensure', 'support'], type: 'constraint' },\n { keywords: ['add', 'include', 'supplement', 'incorporate'], type: 'supplement' },\n { keywords: ['detailed', 'concise', 'style', 'format', 'suitable'], type: 'style' },\n ],\n };\n }\n\n classify(prompt: string): ClassifiedPrompt {\n const lower = prompt.toLowerCase();\n const patterns = this.patterns[this.language];\n\n let matchedType: PromptType = 'supplement';\n let matchedKeywords: string[] = [];\n\n for (const pattern of patterns) {\n const foundKeywords = pattern.keywords.filter((k) => lower.includes(k.toLowerCase()));\n if (foundKeywords.length > 0) {\n matchedType = pattern.type;\n matchedKeywords = foundKeywords;\n break;\n }\n }\n\n const target = this.extractTarget(prompt, matchedKeywords);\n\n return {\n original: prompt,\n type: matchedType,\n keywords: matchedKeywords,\n target,\n };\n }\n\n private extractTarget(prompt: string, keywords: string[]): string | undefined {\n if (!keywords.length) return undefined;\n\n for (const keyword of keywords) {\n const index = prompt.toLowerCase().indexOf(keyword.toLowerCase());\n if (index !== -1) {\n const after = prompt.slice(index + keyword.length).trim();\n const match = after.match(/^[^,。,.!!??]+/);\n if (match) {\n return match[0].trim();\n }\n }\n }\n\n return undefined;\n }\n}\n","import type { ClassifiedPrompt, PromptEffect } from './types.js';\n\nexport class PromptFuser {\n fuse(prompts: ClassifiedPrompt[]): PromptEffect {\n const effect: PromptEffect = {};\n\n for (const prompt of prompts) {\n switch (prompt.type) {\n case 'focus':\n this.applyFocus(prompt, effect);\n break;\n case 'constraint':\n this.applyConstraint(prompt, effect);\n break;\n case 'supplement':\n this.applySupplement(prompt, effect);\n break;\n case 'style':\n this.applyStyle(prompt, effect);\n break;\n case 'exclude':\n this.applyExclude(prompt, effect);\n break;\n }\n }\n\n return effect;\n }\n\n private applyFocus(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.stepWeights) {\n effect.stepWeights = new Map();\n }\n\n if (prompt.target) {\n effect.stepWeights.set(prompt.target.toLowerCase(), 2.0);\n }\n }\n\n private applyConstraint(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.additionalPrerequisites) {\n effect.additionalPrerequisites = [];\n }\n\n effect.additionalPrerequisites.push(prompt.original);\n }\n\n private applySupplement(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.stepEnrichments) {\n effect.stepEnrichments = new Map();\n }\n\n const existing = effect.stepEnrichments.get('additional') ?? [];\n existing.push(prompt.original);\n effect.stepEnrichments.set('additional', existing);\n }\n\n private applyStyle(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n const lower = prompt.original.toLowerCase();\n\n if (lower.includes('详细') || lower.includes('detailed')) {\n effect.verbosityLevel = 'detailed';\n } else if (lower.includes('简洁') || lower.includes('concise')) {\n effect.verbosityLevel = 'minimal';\n } else {\n effect.verbosityLevel = 'standard';\n }\n }\n\n private applyExclude(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.excludePatterns) {\n effect.excludePatterns = [];\n }\n\n if (prompt.target) {\n effect.excludePatterns.push(prompt.target.toLowerCase());\n }\n }\n}\n","import type { ClassifiedPrompt, PromptEffect } from './types.js';\nimport { PromptClassifier } from './classifier.js';\nimport { PromptFuser } from './fuser.js';\n\nexport interface PromptHandlerOptions {\n language?: 'en' | 'zh';\n}\n\nexport class PromptHandler {\n private classifier: PromptClassifier;\n private fuser: PromptFuser;\n\n constructor(options: PromptHandlerOptions = {}) {\n this.classifier = new PromptClassifier(options.language ?? 'zh');\n this.fuser = new PromptFuser();\n }\n\n process(prompts: string[]): PromptEffect {\n const classified = prompts.map((p) => this.classifier.classify(p));\n return this.fuser.fuse(classified);\n }\n\n classify(prompt: string): ClassifiedPrompt {\n return this.classifier.classify(prompt);\n }\n\n toPromptText(prompts: string[]): string {\n if (!prompts.length) return '';\n\n const classified = prompts.map((p) => this.classifier.classify(p));\n\n const sections = {\n focus: classified.filter((c) => c.type === 'focus'),\n constraint: classified.filter((c) => c.type === 'constraint'),\n supplement: classified.filter((c) => c.type === 'supplement'),\n style: classified.filter((c) => c.type === 'style'),\n exclude: classified.filter((c) => c.type === 'exclude'),\n };\n\n const parts: string[] = ['## User Instructions'];\n\n if (sections.focus.length) {\n parts.push('\\n### Focus Areas');\n sections.focus.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.constraint.length) {\n parts.push('\\n### Constraints');\n sections.constraint.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.supplement.length) {\n parts.push('\\n### Additional Content');\n sections.supplement.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.style.length) {\n parts.push('\\n### Output Style');\n sections.style.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.exclude.length) {\n parts.push('\\n### Exclusions');\n sections.exclude.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n return parts.join('\\n');\n }\n}\n","import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nexport interface CollectedPrompts {\n prompts: string[];\n confirmed: boolean;\n}\n\nexport async function collectPromptsInteractively(): Promise<CollectedPrompts> {\n const prompts: string[] = [];\n\n console.log(chalk.cyan('\\n📝 添加附加指令 (可选)'));\n console.log(chalk.gray(' 输入空行完成收集\\n'));\n\n for (;;) {\n const { prompt } = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: '指令:',\n prefix: chalk.yellow('→'),\n },\n ]);\n\n if (!prompt.trim()) {\n break;\n }\n\n prompts.push(prompt.trim());\n }\n\n if (prompts.length === 0) {\n return { prompts: [], confirmed: true };\n }\n\n console.log(chalk.cyan('\\n📋 已收集的指令:'));\n prompts.forEach((p, i) => {\n console.log(chalk.gray(` ${i + 1}. ${p}`));\n });\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: '使用这些指令?',\n default: true,\n },\n ]);\n\n return { prompts, confirmed: confirm };\n}\n\nexport async function selectPromptsFromSuggestions(suggestions: string[]): Promise<string[]> {\n const { selected } = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'selected',\n message: '选择要应用的指令:',\n choices: suggestions.map((s) => ({ name: s, value: s })),\n },\n ]);\n\n return selected;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { Skill } from '../types/skill.js';\nimport { FrontmatterBuilder } from './frontmatter-builder.js';\nimport { MarkdownRenderer } from './markdown-renderer.js';\nimport { DirectoryBuilder } from './directory-builder.js';\nimport { TemplateValidator, ValidationResult } from './template-validator.js';\nimport { ensureDir } from '../utils/fs.js';\n\nexport interface GenerateOptions {\n outputDir: string;\n overwrite?: boolean;\n includeReferences?: boolean;\n includeExamples?: boolean;\n}\n\nexport interface GenerateResult {\n skillPath: string;\n files: string[];\n validation: ValidationResult;\n}\n\nexport class SkillGenerator {\n private frontmatterBuilder: FrontmatterBuilder;\n private markdownRenderer: MarkdownRenderer;\n private directoryBuilder: DirectoryBuilder;\n private validator: TemplateValidator;\n\n constructor() {\n this.frontmatterBuilder = new FrontmatterBuilder();\n this.markdownRenderer = new MarkdownRenderer();\n this.directoryBuilder = new DirectoryBuilder();\n this.validator = new TemplateValidator();\n }\n\n async generate(skill: Skill, options: GenerateOptions): Promise<GenerateResult> {\n const { outputDir, overwrite = false, includeReferences = true } = options;\n\n const skillDirName = this.toKebabCase(skill.metadata.name);\n const skillDir = join(outputDir, skillDirName);\n\n if (!overwrite && (await this.exists(skillDir))) {\n throw new Error(`Skill directory already exists: ${skillDir}`);\n }\n\n await this.directoryBuilder.create(skillDir, {\n includeReferences,\n includeExamples: options.includeExamples ?? false,\n });\n\n const content = this.renderSkill(skill);\n const validation = this.validator.validate(content, skill);\n\n const skillPath = join(skillDir, 'SKILL.md');\n await fs.writeFile(skillPath, content, 'utf-8');\n\n const files = [skillPath];\n\n if (includeReferences && skill.references?.length) {\n const refPath = await this.generateReferences(skillDir, skill);\n files.push(refPath);\n }\n\n return {\n skillPath,\n files,\n validation,\n };\n }\n\n renderSkill(skill: Skill): string {\n const parts: string[] = [];\n\n parts.push(this.frontmatterBuilder.build(skill.metadata));\n parts.push(this.markdownRenderer.renderTitle(skill.metadata.name));\n parts.push(this.markdownRenderer.renderOverview(skill.overview));\n parts.push(this.markdownRenderer.renderTriggers(skill.triggers));\n\n if (skill.prerequisites.length) {\n parts.push(this.markdownRenderer.renderPrerequisites(skill.prerequisites));\n }\n\n parts.push(this.markdownRenderer.renderSteps(skill.steps));\n\n if (skill.parameters.length) {\n parts.push(this.markdownRenderer.renderParameters(skill.parameters));\n }\n\n if (Object.keys(skill.errorHandling).length) {\n parts.push(this.markdownRenderer.renderErrorHandling(skill.errorHandling));\n }\n\n if (skill.examples.length) {\n parts.push(this.markdownRenderer.renderExamples(skill.examples));\n }\n\n if (skill.references?.length) {\n parts.push(this.markdownRenderer.renderReferences(skill.references));\n }\n\n if (skill.notes?.length) {\n parts.push(this.markdownRenderer.renderNotes(skill.notes));\n }\n\n return parts.join('\\n\\n');\n }\n\n private async generateReferences(skillDir: string, skill: Skill): Promise<string> {\n const refDir = join(skillDir, 'references');\n await ensureDir(refDir);\n\n const patternsPath = join(refDir, 'patterns.md');\n const patternsContent = `# Patterns and Best Practices\n\nThis file contains detailed patterns extracted from the original conversation.\n\n## Common Patterns\n\n${skill.notes?.map((n) => `- ${n}`).join('\\n') || 'No additional patterns documented.'}\n`;\n\n await fs.writeFile(patternsPath, patternsContent, 'utf-8');\n return patternsPath;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n\n private async exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { stringify } from 'yaml';\nimport type { SkillMetadata } from '../types/skill.js';\n\nexport class FrontmatterBuilder {\n build(metadata: SkillMetadata): string {\n const frontmatter: Record<string, string> = {\n name: metadata.name,\n description: metadata.description,\n version: metadata.version,\n };\n\n if (metadata.license) {\n frontmatter.license = metadata.license;\n }\n\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n defaultStringType: 'PLAIN',\n });\n\n return `---\\n${yaml}---`;\n }\n\n validateDescription(description: string): boolean {\n const thirdPersonStart = description.toLowerCase().startsWith('this skill');\n const hasTriggerPhrases = description.includes('\"') || description.includes(\"'\");\n\n return thirdPersonStart && hasTriggerPhrases;\n }\n}\n","import type { SkillStep, SkillParameter } from '../types/skill.js';\n\nexport class MarkdownRenderer {\n renderTitle(name: string): string {\n return `# ${name}`;\n }\n\n renderOverview(overview: string): string {\n return `## Overview\\n\\n${overview}`;\n }\n\n renderTriggers(triggers: string[]): string {\n const lines = [\"## When This Skill Applies\", '', \"This skill activates when the user's request involves:\"];\n\n triggers.forEach((trigger) => {\n lines.push(`- ${trigger}`);\n });\n\n return lines.join('\\n');\n }\n\n renderPrerequisites(prerequisites: string[]): string {\n const lines = ['## Prerequisites', ''];\n\n prerequisites.forEach((prereq) => {\n lines.push(`- ${prereq}`);\n });\n\n return lines.join('\\n');\n }\n\n renderSteps(steps: SkillStep[]): string {\n const lines = ['## Core Workflow', ''];\n\n steps.forEach((step, index) => {\n lines.push(`### Step ${index + 1}: ${step.title}`);\n lines.push('');\n lines.push(step.description);\n\n if (step.substeps?.length) {\n lines.push('');\n step.substeps.forEach((substep, i) => {\n lines.push(`${i + 1}. ${substep}`);\n });\n }\n\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n renderParameters(parameters: SkillParameter[]): string {\n const lines = [\n '## Parameters',\n '',\n '| Parameter | Type | Default | Description |',\n '|-----------|------|---------|-------------|',\n ];\n\n parameters.forEach((param) => {\n const defaultVal = param.default !== undefined ? `\\`${param.default}\\`` : '-';\n const required = param.required ? ' (required)' : '';\n lines.push(`| \\`${param.name}\\` | ${param.type} | ${defaultVal} | ${param.description}${required} |`);\n });\n\n return lines.join('\\n');\n }\n\n renderErrorHandling(errorHandling: Record<string, string>): string {\n const lines = ['## Error Handling', ''];\n\n Object.entries(errorHandling).forEach(([error, solution]) => {\n lines.push(`- **${error}**: ${solution}`);\n });\n\n return lines.join('\\n');\n }\n\n renderExamples(examples: string[]): string {\n const lines = ['## Example Usage', ''];\n\n examples.forEach((example) => {\n lines.push('```');\n lines.push(example);\n lines.push('```');\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n renderReferences(references: string[]): string {\n const lines = ['## Additional Resources', '', '### Reference Files', ''];\n\n references.forEach((ref) => {\n lines.push(`- **\\`${ref}\\`**`);\n });\n\n return lines.join('\\n');\n }\n\n renderNotes(notes: string[]): string {\n const lines = ['## Notes', ''];\n\n notes.forEach((note) => {\n lines.push(`- ${note}`);\n });\n\n return lines.join('\\n');\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\nexport interface DirectoryOptions {\n includeReferences: boolean;\n includeExamples: boolean;\n includeScripts: boolean;\n}\n\nexport class DirectoryBuilder {\n async create(basePath: string, options: Partial<DirectoryOptions> = {}): Promise<void> {\n const { includeReferences = true, includeExamples = false, includeScripts = false } = options;\n\n await fs.mkdir(basePath, { recursive: true });\n\n if (includeReferences) {\n await fs.mkdir(join(basePath, 'references'), { recursive: true });\n }\n\n if (includeExamples) {\n await fs.mkdir(join(basePath, 'examples'), { recursive: true });\n }\n\n if (includeScripts) {\n await fs.mkdir(join(basePath, 'scripts'), { recursive: true });\n }\n }\n\n async listStructure(basePath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function walk(dir: string, prefix: string = '') {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n files.push(`${relativePath}/`);\n await walk(join(dir, entry.name), relativePath);\n } else {\n files.push(relativePath);\n }\n }\n }\n\n await walk(basePath);\n return files;\n }\n}\n","import type { Skill } from '../types/skill.js';\n\nexport interface ValidationError {\n field: string;\n message: string;\n severity: 'error' | 'warning';\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nexport class TemplateValidator {\n validate(content: string, skill: Skill): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n this.validateFrontmatter(content, skill, errors, warnings);\n this.validateRequiredSections(content, errors);\n this.validateWritingStyle(content, warnings);\n this.validateLength(content, warnings);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n private validateFrontmatter(\n content: string,\n skill: Skill,\n errors: ValidationError[],\n warnings: ValidationError[]\n ): void {\n if (!content.startsWith('---')) {\n errors.push({\n field: 'frontmatter',\n message: 'Missing YAML frontmatter',\n severity: 'error',\n });\n return;\n }\n\n if (!skill.metadata.description.toLowerCase().includes('this skill')) {\n warnings.push({\n field: 'description',\n message: 'Description should start with \"This skill should be used when...\"',\n severity: 'warning',\n });\n }\n\n if (!skill.metadata.description.includes('\"')) {\n warnings.push({\n field: 'description',\n message: 'Description should include specific trigger phrases in quotes',\n severity: 'warning',\n });\n }\n }\n\n private validateRequiredSections(content: string, errors: ValidationError[]): void {\n const requiredSections = [\n { pattern: /^## Overview/m, name: 'Overview' },\n { pattern: /^## (When This Skill Applies|Triggers)/m, name: 'Triggers' },\n { pattern: /^## (Core Workflow|Steps)/m, name: 'Steps' },\n ];\n\n for (const section of requiredSections) {\n if (!section.pattern.test(content)) {\n errors.push({\n field: section.name,\n message: `Missing required section: ${section.name}`,\n severity: 'error',\n });\n }\n }\n }\n\n private validateWritingStyle(content: string, warnings: ValidationError[]): void {\n const secondPersonPatterns = [/\\bYou should\\b/gi, /\\bYou need to\\b/gi, /\\bYou can\\b/gi, /\\bYou must\\b/gi];\n\n for (const pattern of secondPersonPatterns) {\n if (pattern.test(content)) {\n warnings.push({\n field: 'style',\n message: `Avoid second person (\"${pattern.source}\"). Use imperative form instead.`,\n severity: 'warning',\n });\n }\n }\n }\n\n private validateLength(content: string, warnings: ValidationError[]): void {\n const wordCount = content.split(/\\s+/).length;\n\n if (wordCount > 5000) {\n warnings.push({\n field: 'length',\n message: `SKILL.md is too long (${wordCount} words). Consider moving content to references/`,\n severity: 'warning',\n });\n }\n\n if (wordCount < 200) {\n warnings.push({\n field: 'length',\n message: `SKILL.md is very short (${wordCount} words). Consider adding more detail.`,\n severity: 'warning',\n });\n }\n }\n}\n","import { stringify } from 'yaml';\nimport type { Skill, SkillStep, SkillParameter } from '../types/skill.js';\n\nexport interface ConvertOptions {\n includeMetadata?: boolean;\n includeExamples?: boolean;\n verbose?: boolean;\n}\n\nexport class ClaudeFormatter {\n format(skill: Skill, options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(this.formatFrontmatter(skill));\n parts.push(`# ${skill.metadata.name}`);\n parts.push(`## Overview\\n\\n${skill.overview}`);\n parts.push(this.formatTriggers(skill.triggers));\n\n if (skill.prerequisites.length > 0) {\n parts.push(this.formatPrerequisites(skill.prerequisites));\n }\n\n parts.push(this.formatSteps(skill.steps));\n\n if (skill.parameters.length > 0) {\n parts.push(this.formatParameters(skill.parameters));\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push(this.formatErrorHandling(skill.errorHandling));\n }\n\n if (options.includeExamples !== false && skill.examples.length > 0) {\n parts.push(this.formatExamples(skill.examples));\n }\n\n if (skill.notes && skill.notes.length > 0) {\n parts.push(this.formatNotes(skill.notes));\n }\n\n return parts.join('\\n\\n');\n }\n\n private formatFrontmatter(skill: Skill): string {\n const data: Record<string, string> = {\n name: skill.metadata.name,\n description: skill.metadata.description,\n version: skill.metadata.version,\n };\n\n if (skill.metadata.license) {\n data.license = skill.metadata.license;\n }\n\n return `---\\n${stringify(data)}---`;\n }\n\n private formatTriggers(triggers: string[]): string {\n const lines = ['## When This Skill Applies', '', 'This skill activates when:'];\n triggers.forEach((t) => lines.push(`- ${t}`));\n return lines.join('\\n');\n }\n\n private formatPrerequisites(prerequisites: string[]): string {\n const lines = ['## Prerequisites', ''];\n prerequisites.forEach((p) => lines.push(`- ${p}`));\n return lines.join('\\n');\n }\n\n private formatSteps(steps: SkillStep[]): string {\n const lines = ['## Core Workflow', ''];\n\n steps.forEach((step, i) => {\n lines.push(`### Step ${i + 1}: ${step.title}`);\n lines.push('');\n lines.push(step.description);\n\n if (step.substeps?.length) {\n lines.push('');\n step.substeps.forEach((sub, j) => {\n lines.push(`${j + 1}. ${sub}`);\n });\n }\n\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n private formatParameters(parameters: SkillParameter[]): string {\n const lines = [\n '## Parameters',\n '',\n '| Parameter | Type | Default | Description |',\n '|-----------|------|---------|-------------|',\n ];\n\n parameters.forEach((p) => {\n const def = p.default !== undefined ? `\\`${p.default}\\`` : '-';\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${def} | ${p.description} |`);\n });\n\n return lines.join('\\n');\n }\n\n private formatErrorHandling(errorHandling: Record<string, string>): string {\n const lines = ['## Error Handling', ''];\n Object.entries(errorHandling).forEach(([error, solution]) => {\n lines.push(`- **${error}**: ${solution}`);\n });\n return lines.join('\\n');\n }\n\n private formatExamples(examples: string[]): string {\n const lines = ['## Example Usage', ''];\n examples.forEach((ex) => {\n lines.push('```');\n lines.push(ex);\n lines.push('```');\n lines.push('');\n });\n return lines.join('\\n').trim();\n }\n\n private formatNotes(notes: string[]): string {\n const lines = ['## Notes', ''];\n notes.forEach((n) => lines.push(`- ${n}`));\n return lines.join('\\n');\n }\n}\n","import { stringify } from 'yaml';\nimport type { Skill } from '../types/skill.js';\nimport type { ConvertOptions } from './claude-formatter.js';\n\nexport class CodexFormatter {\n format(skill: Skill, _options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(this.formatFrontmatter(skill));\n parts.push('# Agent Instructions');\n parts.push('');\n parts.push(skill.overview);\n parts.push('');\n parts.push('## Capabilities');\n parts.push('');\n skill.triggers.forEach((t) => parts.push(`- ${t}`));\n parts.push('');\n parts.push('## Workflow');\n parts.push('');\n skill.steps.forEach((step, i) => {\n parts.push(`${i + 1}. **${step.title}**: ${step.description}`);\n if (step.substeps?.length) {\n step.substeps.forEach((sub) => {\n parts.push(` - ${sub}`);\n });\n }\n });\n\n if (skill.prerequisites.length > 0) {\n parts.push('');\n parts.push('## Prerequisites');\n parts.push('');\n skill.prerequisites.forEach((p) => parts.push(`- ${p}`));\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push('');\n parts.push('## Error Handling');\n parts.push('');\n Object.entries(skill.errorHandling).forEach(([error, solution]) => {\n parts.push(`- ${error}: ${solution}`);\n });\n }\n\n return parts.join('\\n');\n }\n\n private formatFrontmatter(skill: Skill): string {\n const data = {\n name: this.toKebabCase(skill.metadata.name),\n description: skill.metadata.description,\n model: 'o4-mini',\n };\n\n return `---\\n${stringify(data)}---`;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import type { Skill } from '../types/skill.js';\nimport type { ConvertOptions } from './claude-formatter.js';\n\nexport class CursorFormatter {\n format(skill: Skill, _options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(`# ${skill.metadata.name}`);\n parts.push(`# Generated by Skill Distill`);\n parts.push('');\n parts.push('## Overview');\n parts.push('');\n parts.push(skill.overview);\n parts.push('');\n parts.push('## Workflow Rules');\n parts.push('');\n\n skill.steps.forEach((step) => {\n parts.push(`### ${step.title}`);\n parts.push('');\n parts.push(step.description);\n\n if (step.substeps?.length) {\n parts.push('');\n step.substeps.forEach((sub) => {\n parts.push(`- ${sub}`);\n });\n }\n parts.push('');\n });\n\n if (skill.prerequisites.length > 0) {\n parts.push('## Constraints');\n parts.push('');\n skill.prerequisites.forEach((p) => {\n parts.push(`- ${p}`);\n });\n parts.push('');\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push('## Error Handling');\n parts.push('');\n Object.entries(skill.errorHandling).forEach(([error, solution]) => {\n parts.push(`- When encountering \"${error}\": ${solution}`);\n });\n parts.push('');\n }\n\n if (skill.parameters.length > 0) {\n parts.push('## Parameters');\n parts.push('');\n parts.push('The following parameters can be customized:');\n parts.push('');\n skill.parameters.forEach((p) => {\n const def = p.default ? ` (default: ${p.default})` : '';\n parts.push(`- \\`${p.name}\\`: ${p.description}${def}`);\n });\n }\n\n return parts.join('\\n');\n }\n}\n","import type { Skill } from '../types/skill.js';\nimport { ClaudeFormatter, ConvertOptions } from './claude-formatter.js';\nimport { CodexFormatter } from './codex-formatter.js';\nimport { CursorFormatter } from './cursor-formatter.js';\n\nexport type OutputFormat = 'claude' | 'codex' | 'cursor';\n\nexport { ConvertOptions };\n\nexport class FormatConverter {\n private claudeFormatter: ClaudeFormatter;\n private codexFormatter: CodexFormatter;\n private cursorFormatter: CursorFormatter;\n\n constructor() {\n this.claudeFormatter = new ClaudeFormatter();\n this.codexFormatter = new CodexFormatter();\n this.cursorFormatter = new CursorFormatter();\n }\n\n convert(skill: Skill, format: OutputFormat, options?: ConvertOptions): string {\n switch (format) {\n case 'claude':\n return this.toClaudeFormat(skill, options);\n case 'codex':\n return this.toCodexFormat(skill, options);\n case 'cursor':\n return this.toCursorFormat(skill, options);\n default:\n throw new Error(`Unsupported format: ${format}`);\n }\n }\n\n convertAll(skill: Skill, options?: ConvertOptions): Map<OutputFormat, string> {\n const results = new Map<OutputFormat, string>();\n results.set('claude', this.toClaudeFormat(skill, options));\n results.set('codex', this.toCodexFormat(skill, options));\n results.set('cursor', this.toCursorFormat(skill, options));\n return results;\n }\n\n toClaudeFormat(skill: Skill, options?: ConvertOptions): string {\n return this.claudeFormatter.format(skill, options);\n }\n\n toCodexFormat(skill: Skill, options?: ConvertOptions): string {\n return this.codexFormatter.format(skill, options);\n }\n\n toCursorFormat(skill: Skill, options?: ConvertOptions): string {\n return this.cursorFormatter.format(skill, options);\n }\n}\n","export interface FormatValidation {\n valid: boolean;\n format: string;\n errors: string[];\n warnings: string[];\n}\n\nexport class FormatValidator {\n validateClaude(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!content.startsWith('---')) {\n errors.push('Missing YAML frontmatter');\n }\n\n if (!content.includes('name:')) {\n errors.push('Missing name in frontmatter');\n }\n if (!content.includes('description:')) {\n errors.push('Missing description in frontmatter');\n }\n\n if (!content.includes('## Overview')) {\n errors.push('Missing Overview section');\n }\n if (!content.includes('## Core Workflow') && !content.includes('## Steps')) {\n errors.push('Missing Core Workflow section');\n }\n\n if (/\\bYou should\\b/i.test(content)) {\n warnings.push('Avoid \"You should\" - use imperative form');\n }\n\n return {\n valid: errors.length === 0,\n format: 'claude',\n errors,\n warnings,\n };\n }\n\n validateCodex(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!content.startsWith('---')) {\n errors.push('Missing YAML frontmatter');\n }\n\n if (!content.includes('model:')) {\n warnings.push('Missing model specification');\n }\n\n return {\n valid: errors.length === 0,\n format: 'codex',\n errors,\n warnings,\n };\n }\n\n validateCursor(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (content.trim().length < 100) {\n warnings.push('Content seems too short');\n }\n\n return {\n valid: errors.length === 0,\n format: 'cursor',\n errors,\n warnings,\n };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport { SkillGenerator } from '../generators/skill-generator.js';\nimport type { Skill } from '../types/skill.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\n\nexport class ClaudeCodeInstaller extends AgentInstaller {\n private generator: SkillGenerator;\n\n constructor(basePath?: string) {\n super(basePath);\n this.generator = new SkillGenerator();\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.claude', 'plugins', 'local', 'skills');\n }\n\n getPlatformName(): string {\n return 'Claude Code';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false, backup = true, verify = true } = options;\n\n const skillDirName = this.toKebabCase(skill.metadata.name);\n const skillPath = join(this.basePath, skillDirName);\n\n if (await fileExists(skillPath)) {\n if (!overwrite) {\n return {\n success: false,\n path: skillPath,\n message: `Skill already exists: ${skillPath}. Use --overwrite to replace.`,\n };\n }\n\n if (backup) {\n const backupPath = `${skillPath}.backup.${Date.now()}`;\n await fs.rename(skillPath, backupPath);\n }\n }\n\n await ensureDir(this.basePath);\n\n const result = await this.generator.generate(skill, {\n outputDir: this.basePath,\n overwrite: true,\n });\n\n if (verify) {\n const verified = await this.verifyInstallation(skillPath);\n if (!verified) {\n return {\n success: false,\n path: skillPath,\n message: 'Installation verification failed',\n };\n }\n }\n\n return {\n success: true,\n path: result.skillPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(skillName: string): Promise<void> {\n const skillPath = join(this.basePath, this.toKebabCase(skillName));\n\n if (!(await fileExists(skillPath))) {\n throw new Error(`Skill not found: ${skillName}`);\n }\n\n await fs.rm(skillPath, { recursive: true });\n }\n\n async list(): Promise<InstalledSkill[]> {\n const skills: InstalledSkill[] = [];\n\n try {\n const entries = await fs.readdir(this.basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillMdPath = join(this.basePath, entry.name, 'SKILL.md');\n\n if (await fileExists(skillMdPath)) {\n const content = await fs.readFile(skillMdPath, 'utf-8');\n const metadata = this.parseMetadata(content);\n const stat = await fs.stat(skillMdPath);\n\n skills.push({\n name: metadata.name ?? entry.name,\n path: join(this.basePath, entry.name),\n version: metadata.version ?? '0.0.0',\n installedAt: stat.mtime.toISOString(),\n });\n }\n }\n } catch {\n // Directory doesn't exist or not readable - return empty list\n }\n\n return skills;\n }\n\n private async verifyInstallation(skillPath: string): Promise<boolean> {\n const skillMd = join(skillPath, 'SKILL.md');\n\n if (!(await fileExists(skillMd))) {\n return false;\n }\n\n const content = await fs.readFile(skillMd, 'utf-8');\n\n if (!content.startsWith('---')) {\n return false;\n }\n\n const metadata = this.parseMetadata(content);\n return !!(metadata.name && metadata.description);\n }\n\n private parseMetadata(content: string): Record<string, string> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const yaml = match[1];\n const metadata: Record<string, string> = {};\n\n yaml.split('\\n').forEach((line) => {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n metadata[key] = value;\n }\n });\n\n return metadata;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import type { Skill } from '../types/skill.js';\n\nexport interface InstallOptions {\n overwrite?: boolean;\n backup?: boolean;\n verify?: boolean;\n}\n\nexport interface InstallResult {\n success: boolean;\n path: string;\n message: string;\n backupPath?: string;\n}\n\nexport interface InstalledSkill {\n name: string;\n path: string;\n version: string;\n installedAt: string;\n}\n\nexport abstract class AgentInstaller {\n protected basePath: string;\n\n constructor(basePath?: string) {\n this.basePath = basePath ?? this.getDefaultBasePath();\n }\n\n abstract getDefaultBasePath(): string;\n abstract getPlatformName(): string;\n\n abstract install(skill: Skill, options?: InstallOptions): Promise<InstallResult>;\n abstract uninstall(skillName: string): Promise<void>;\n abstract list(): Promise<InstalledSkill[]>;\n\n async verify(skillName: string): Promise<boolean> {\n const installed = await this.list();\n return installed.some((s) => s.name === skillName);\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport type { Skill } from '../types/skill.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\nimport { FormatConverter } from '../formatters/converter.js';\n\nexport class CodexInstaller extends AgentInstaller {\n private converter: FormatConverter;\n\n constructor(basePath?: string) {\n super(basePath);\n this.converter = new FormatConverter();\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.codex', 'agents');\n }\n\n getPlatformName(): string {\n return 'Codex CLI';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false } = options;\n\n const agentName = this.toKebabCase(skill.metadata.name);\n const agentPath = join(this.basePath, `${agentName}.md`);\n\n if ((await fileExists(agentPath)) && !overwrite) {\n return {\n success: false,\n path: agentPath,\n message: `Agent already exists: ${agentPath}`,\n };\n }\n\n await ensureDir(this.basePath);\n\n const content = this.converter.toCodexFormat(skill);\n await fs.writeFile(agentPath, content, 'utf-8');\n\n return {\n success: true,\n path: agentPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(skillName: string): Promise<void> {\n const agentPath = join(this.basePath, `${this.toKebabCase(skillName)}.md`);\n\n if (!(await fileExists(agentPath))) {\n throw new Error(`Agent not found: ${skillName}`);\n }\n\n await fs.unlink(agentPath);\n }\n\n async list(): Promise<InstalledSkill[]> {\n const skills: InstalledSkill[] = [];\n\n try {\n const files = await fs.readdir(this.basePath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const agentPath = join(this.basePath, file);\n const stat = await fs.stat(agentPath);\n\n skills.push({\n name: file.replace('.md', ''),\n path: agentPath,\n version: '0.0.0',\n installedAt: stat.mtime.toISOString(),\n });\n }\n } catch {\n // Directory doesn't exist or not readable - return empty list\n }\n\n return skills;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport type { Skill } from '../types/skill.js';\nimport { fileExists } from '../utils/fs.js';\nimport { FormatConverter } from '../formatters/converter.js';\n\nexport class CursorInstaller extends AgentInstaller {\n private converter: FormatConverter;\n private projectPath: string;\n\n constructor(projectPath: string) {\n super(projectPath);\n this.projectPath = projectPath;\n this.converter = new FormatConverter();\n }\n\n getDefaultBasePath(): string {\n return this.projectPath;\n }\n\n getPlatformName(): string {\n return 'Cursor';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false, backup = true } = options;\n\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (await fileExists(rulesPath)) {\n if (!overwrite) {\n return {\n success: false,\n path: rulesPath,\n message: '.cursorrules already exists. Use --overwrite to replace.',\n };\n }\n\n if (backup) {\n const backupPath = `${rulesPath}.backup.${Date.now()}`;\n await fs.copyFile(rulesPath, backupPath);\n }\n }\n\n const content = this.converter.toCursorFormat(skill);\n await fs.writeFile(rulesPath, content, 'utf-8');\n\n return {\n success: true,\n path: rulesPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(_skillName: string): Promise<void> {\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (!(await fileExists(rulesPath))) {\n throw new Error('.cursorrules not found');\n }\n\n await fs.unlink(rulesPath);\n }\n\n async list(): Promise<InstalledSkill[]> {\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (!(await fileExists(rulesPath))) {\n return [];\n }\n\n const stat = await fs.stat(rulesPath);\n\n return [\n {\n name: 'cursorrules',\n path: rulesPath,\n version: '0.0.0',\n installedAt: stat.mtime.toISOString(),\n },\n ];\n }\n}\n","import { AgentInstaller } from './base.js';\nimport { ClaudeCodeInstaller } from './claude.js';\nimport { CodexInstaller } from './codex.js';\nimport { CursorInstaller } from './cursor.js';\n\nexport type InstallerPlatform = 'claude' | 'codex' | 'cursor';\n\nexport interface InstallerOptions {\n basePath?: string;\n projectPath?: string;\n}\n\nexport function createInstaller(\n platform: InstallerPlatform,\n options: InstallerOptions = {}\n): AgentInstaller {\n switch (platform) {\n case 'claude':\n return new ClaudeCodeInstaller(options.basePath);\n case 'codex':\n return new CodexInstaller(options.basePath);\n case 'cursor':\n if (!options.projectPath) {\n throw new Error('Cursor installer requires projectPath');\n }\n return new CursorInstaller(options.projectPath);\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport { AgentInstaller, type InstallOptions, type InstallResult, type InstalledSkill } from './base.js';\nexport { ClaudeCodeInstaller } from './claude.js';\nexport { CodexInstaller } from './codex.js';\nexport { CursorInstaller } from './cursor.js';\n","export * from './types/index.js';\nexport * from './utils/index.js';\nexport * from './loaders/index.js';\nexport * from './core/index.js';\nexport * from './prompt-handler/index.js';\nexport * from './generators/index.js';\nexport * from './formatters/index.js';\nexport * from './installers/index.js';\n\nexport const VERSION = '0.1.0';\n"],"mappings":";AAAA,OAAO,WAAW;AAEX,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,KAAK,QAAG,GAAG,GAAG;AAAA,EACvD,SAAS,CAAC,QAAgB,QAAQ,IAAI,MAAM,MAAM,QAAG,GAAG,GAAG;AAAA,EAC3D,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,OAAO,QAAG,GAAG,GAAG;AAAA,EACzD,OAAO,CAAC,QAAgB,QAAQ,IAAI,MAAM,IAAI,QAAG,GAAG,GAAG;AAAA,EACvD,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,KAAK,QAAG,GAAG,GAAG;AACzD;;;ACRA,SAAS,YAAY,UAAU;AAC/B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,WAAW,MAAsB;AAC/C,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEA,eAAsB,UAAU,MAA6B;AAC3D,QAAM,GAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAC1C;AAEA,eAAsB,WAAW,MAAgC;AAC/D,MAAI;AACF,UAAM,GAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,SAAY,MAA0B;AAC1D,QAAM,UAAU,MAAM,GAAG,SAAS,MAAM,OAAO;AAC/C,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAsB,UAAU,MAAc,MAA8B;AAC1E,QAAM,GAAG,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACxD;;;AC/BA,SAAS,SAAS;AAEX,IAAM,kBAAkB,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAElE,IAAM,iBAAiB,EAAE,KAAK,CAAC,UAAU,SAAS,QAAQ,CAAC;AAE3D,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,KAAK,CAAC,UAAU,SAAS,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EAC9D,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,aAAa,EAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAEM,SAAS,kBAAkB,IAAqB;AACrD,SAAO,gBAAgB,MAAM,EAAE;AACjC;AAEO,SAAS,iBAAiB,UAAkD;AACjF,SAAO,eAAe,MAAM,QAAQ;AACtC;;;ACtBA,SAAS,YAAYA,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;;;ACcjB,IAAe,gBAAf,MAA6B;AAAA,EACxB;AAAA,EACA;AAAA,EAEV,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,WAAW,QAAQ,YAAY,KAAK,mBAAmB;AAC5D,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA,EAMA,MAAM,mBAAqC;AACzC,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AACA,UAAM,SAAS,SAAS;AAAA,MACtB,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AACA,WAAO,KAAK,WAAW,OAAO,CAAC,EAAE,EAAE;AAAA,EACrC;AAAA,EAEA,MAAM,eAAe,OAAuC;AAC1D,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,SAAS;AAAA,MACd,CAAC,MACC,EAAE,SAAS,YAAY,EAAE,SAAS,UAAU,KAC5C,EAAE,YAAY,YAAY,EAAE,SAAS,UAAU;AAAA,IACnD;AAAA,EACF;AACF;;;ADrBO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,YAAY,UAAgC,CAAC,GAAG;AAC9C,UAAM,OAAO;AAAA,EACf;AAAA,EAEA,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,WAAW,UAAU;AAAA,EAC9C;AAAA,EAEA,MAAM,eAAuC;AAC3C,UAAM,WAA0B,CAAC;AAEjC,QAAI;AACF,YAAM,cAAc,MAAMC,IAAG,QAAQ,KAAK,QAAQ;AAElD,iBAAW,cAAc,aAAa;AACpC,cAAM,cAAcF,MAAK,KAAK,UAAU,UAAU;AAClD,cAAM,OAAO,MAAME,IAAG,KAAK,WAAW;AAEtC,YAAI,CAAC,KAAK,YAAY,EAAG;AAEzB,cAAM,eAAeF,MAAK,aAAa,UAAU;AACjD,YAAI;AACF,gBAAM,eAAe,MAAME,IAAG,QAAQ,YAAY;AAElD,qBAAW,QAAQ,cAAc;AAC/B,gBAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAE7B,kBAAM,cAAcF,MAAK,cAAc,IAAI;AAC3C,kBAAM,cAAc,MAAM,KAAK,gBAAgB,WAAW;AAE1D,gBAAI,aAAa;AACf,uBAAS,KAAK;AAAA,gBACZ,IAAI,YAAY;AAAA,gBAChB,aAAa;AAAA,gBACb,WAAW,YAAY;AAAA,gBACvB,SAAS,YAAY;AAAA,gBACrB,cAAc,YAAY,SAAS;AAAA,gBACnC,SAAS,KAAK,eAAe,YAAY,QAAQ;AAAA,cACnD,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,4BAA4B,KAAK,EAAE;AAAA,IACrD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,IAA8B;AAC7C,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,UAAM,cAAc,SAAS,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAEpD,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,sBAAsB,EAAE,EAAE;AAAA,IAC5C;AAEA,UAAM,cAAcA,MAAK,KAAK,UAAU,YAAY,aAAa,YAAY,GAAG,EAAE,OAAO;AAEzF,UAAM,OAAO,MAAM,KAAK,gBAAgB,WAAW;AACnD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI,MAAM,2BAA2B,EAAE,EAAE;AAAA,IACjD;AAEA,WAAO,KAAK,iBAAiB,MAAM,YAAY,WAAW;AAAA,EAC5D;AAAA,EAEA,MAAc,gBAAgB,MAAiD;AAC7E,QAAI;AACF,YAAM,UAAU,MAAME,IAAG,SAAS,MAAM,OAAO;AAC/C,aAAO,KAAK,MAAM,OAAO;AAAA,IAC3B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAyB,aAA8B;AAC9E,WAAO;AAAA,MACL,IAAI,KAAK;AAAA,MACT;AAAA,MACA,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,UAAU,KAAK,SAAS,IAAI,CAAC,QAAQ,KAAK,iBAAiB,GAAG,CAAC;AAAA,IACjE;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAA6B;AACpD,WAAO;AAAA,MACL,MAAM,IAAI,SAAS,UAAU,SAAS;AAAA,MACtC,SAAS,IAAI;AAAA,MACb,WAAW,IAAI;AAAA,MACf,WAAW,IAAI,eAAe,IAAI,CAAC,OAAO;AAAA,QACxC,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,MACF,aAAa,IAAI,kBAAkB,IAAI,CAAC,OAAO;AAAA,QAC7C,MAAM,EAAE;AAAA,QACR,QAAQ,EAAE;AAAA,QACV,SAAS,CAAC,EAAE;AAAA,MACd,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEQ,eAAe,UAAmC;AACxD,UAAM,mBAAmB,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,OAAO;AAChE,QAAI,CAAC,iBAAkB,QAAO;AAE9B,UAAM,UAAU,iBAAiB;AACjC,WAAO,QAAQ,SAAS,MAAM,QAAQ,MAAM,GAAG,GAAG,IAAI,QAAQ;AAAA,EAChE;AACF;;;AE9IA,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAIjB,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,UAAU,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAAW,KAA+B;AAC9C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;;;ACjBA,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAIjB,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,WAAW,kBAAkB;AAAA,EACtD;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAAW,KAA+B;AAC9C,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACF;;;ACVO,SAAS,oBACd,UACA,SACe;AACf,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,oBAAoB,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,IAAI,mBAAmB,OAAO;AAAA,IACvC,KAAK;AACH,aAAO,IAAI,oBAAoB,OAAO;AAAA,IACxC;AACE,YAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,EACvD;AACF;;;ACrBA,OAAO,eAAe;AACtB,SAAS,KAAAC,UAAS;;;ACDX,IAAM,iBAAiB;AAEvB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B,SAAS,iBAAiB,cAA8B;AAC7D,SAAO;AAAA;AAAA;AAAA,EAGP,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBd;AAEO,SAAS,iBACd,cACA,QACA,qBACQ;AACR,SAAO;AAAA;AAAA;AAAA,EAGP,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAIX,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA,EAId,YAAY;AAAA;AAAA,EAEZ,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCrB;AAEO,SAAS,mBAAmB,WAA2B;AAC5D,SAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYX;AAEO,SAAS,sBAAsB,QAAsD;AAC1F,SAAO;AAAA;AAAA,QAED,OAAO,IAAI;AAAA,mBACA,OAAO,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7C;;;ADlIA,IAAM,eAAeC,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,EACnD,SAASA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,EACnD,SAASA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,EAC/C,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,sBAAsB;AAAA,EAC7D,UAAUA,GAAE,OAAO,EAAE,SAAS,eAAe;AAC/C,CAAC;AAED,IAAM,aAAaA,GAAE,OAAO;AAAA,EAC1B,OAAOA,GAAE,OAAO;AAAA,EAChB,aAAaA,GAAE,OAAO;AAAA,EACtB,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,WAAWA,GAAE,QAAQ;AAAA,EACrB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC;AAED,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,OAAOA,GAAE,MAAM,UAAU;AAAA,EACzB,YAAYA,GAAE;AAAA,IACZA,GAAE,OAAO;AAAA,MACP,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,KAAK,CAAC,UAAU,WAAW,QAAQ,CAAC;AAAA,MAC5C,aAAaA,GAAE,OAAO;AAAA,MACtB,cAAcA,GAAE,QAAQ,EAAE,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EACA,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACjC,eAAeA,GAAE,OAAOA,GAAE,OAAO,CAAC;AACpC,CAAC;AAiBM,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAyB,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,EAEnE,YAAY,UAA4B,CAAC,GAAG;AAC1C,SAAK,SAAS,IAAI,UAAU;AAAA,MAC1B,QAAQ,QAAQ,UAAU,QAAQ,IAAI;AAAA,IACxC,CAAC;AACD,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,SAAmC;AACrD,UAAM,mBAAmB,KAAK,mBAAmB,QAAQ,QAAQ;AAEjE,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,iBAAiB,gBAAgB;AAAA,MACjC;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAU,YAAY;AAAA,EAC9C;AAAA,EAEA,MAAM,aACJ,SACA,QACA,aACsB;AACtB,UAAM,mBAAmB,KAAK,mBAAmB,QAAQ,QAAQ;AAEjE,UAAM,kBAAkB,aAAa,SACjC;AAAA;AAAA;AAAA,EAAsC,YAAY,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACjF;AAEJ,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,iBAAiB,kBAAkB,QAAQ,eAAe;AAAA,MAC1D;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAU,iBAAiB;AAAA,EACnD;AAAA,EAEA,MAAM,eAAe,OAAuC;AAC1D,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,mBAAmB,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MACjD;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAUA,GAAE,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,oBAAoB,QAAiC;AACzD,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,sBAAsB,MAAM;AAAA,MAC5B;AAAA,IACV;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,KAAK,QAAgB,QAAkC;AAC3D,UAAM,WAAW,MAAM,KAAK,UAAU,YAAY;AAChD,aAAO,KAAK,OAAO,SAAS,OAAO;AAAA,QACjC,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,QAAQ,UAAkB;AAAA,QAC1B,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,SAAK,WAAW,eAAe,SAAS,MAAM;AAC9C,SAAK,WAAW,gBAAgB,SAAS,MAAM;AAE/C,UAAM,YAAY,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAChE,QAAI,CAAC,aAAa,UAAU,SAAS,QAAQ;AAC3C,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA,EAEA,gBAA4B;AAC1B,WAAO,EAAE,GAAG,KAAK,WAAW;AAAA,EAC9B;AAAA,EAEQ,mBAAmB,UAA6B;AACtD,WAAO,SACJ,IAAI,CAAC,MAAM;AACV,YAAM,OAAO,EAAE,SAAS,SAAS,SAAS;AAC1C,UAAI,UAAU,IAAI,IAAI,MAAM,EAAE,OAAO;AAErC,UAAI,EAAE,WAAW,QAAQ;AACvB,mBAAW;AAAA,kBAAqB,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3E;AAEA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAAA,EAEQ,UAAa,MAAc,QAA2B;AAC5D,UAAM,YAAY,KAAK,MAAM,4BAA4B,KAAK,KAAK,MAAM,aAAa;AAEtF,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,UAAU,UAAU,CAAC,KAAK,UAAU,CAAC;AAC3C,UAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,UAAa,IAAsB,aAAa,GAAG,QAAQ,KAAkB;AACzF,QAAI;AAEJ,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,SAAS,OAAO;AACd,oBAAY;AAEZ,YAAI,iBAAiB,UAAU,gBAAgB;AAC7C,gBAAM,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC;AAAA,QACtC,WAAW,iBAAiB,UAAU,UAAU;AAC9C,gBAAM,KAAK,MAAM,SAAS,IAAI,EAAE;AAAA,QAClC,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AACF;;;AE/KO,IAAM,2BAAN,MAA+B;AAAA,EAC5B,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEQ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,QAAQ,UAAuC;AAC7C,QAAI,YAAY;AAChB,QAAI,gBAAgB;AAEpB,UAAM,YAAY,SAAS,IAAI,CAAC,QAAQ;AACtC,UAAI,IAAI,SAAS,QAAQ;AACvB;AAAA,MACF;AAEA,YAAM,gBAAgB,IAAI,WAAW,UAAU,KAAK;AACpD,UAAI,cAAc;AAChB,yBAAiB,IAAI,UAAW;AAAA,MAClC;AAEA,YAAM,aAAa,KAAK,kBAAkB,IAAI,OAAO;AAErD,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,eAAe,WAAW,SAAS;AAAA,QACnC;AAAA,QACA,WAAW,KAAK,iBAAiB,IAAI,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAA2B;AACnD,UAAM,QAAQ;AACd,UAAM,SAAmB,CAAC;AAC1B,QAAI;AAEJ,YAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC7C,aAAO,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAsD;AAC7E,UAAM,QAAQ,QAAQ,YAAY;AAElC,UAAM,cAAc,KAAK,gBAAgB,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AACtE,UAAM,cAAc,KAAK,gBAAgB,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AAEtE,QAAI,eAAe,CAAC,YAAa,QAAO;AACxC,QAAI,YAAa,QAAO;AACxB,WAAO;AAAA,EACT;AACF;;;AC7FO,IAAM,sBAAN,MAA0B;AAAA,EACvB,oBAAoB;AAAA,IAC1B,aAAa;AAAA,MACX;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,IACA,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc,CAAC,SAAS,UAAU,aAAa,aAAa,mBAAmB;AAAA,EACjF;AAAA,EAEA,OAAO,UAA4C;AACjD,UAAM,cAAc,KAAK,oBAAoB,QAAQ;AAErD,UAAM,WAAW,SAAS,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,SAAS,CAAC;AAEzE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,cAAc,SAAS,SAAS,SAAS;AAAA,MACzC,cAAc,MAAM,KAAK,WAAW;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,oBAAoB,UAA2C;AACrE,UAAM,cAAc,oBAAI,IAAY;AAEpC,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,UAAU,SAAS,IAAI,CAAC;AAE9B,UAAI,IAAI,SAAS,UAAU,KAAK,iBAAiB,IAAI,SAAS,aAAa,GAAG;AAC5E,YAAI,IAAI,YAAY,GAAG;AACrB,sBAAY,IAAI,IAAI,YAAY,CAAC;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,eAAe,KAAK,iBAAiB,IAAI,SAAS,kBAAkB,GAAG;AACtF,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,aAAa,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;AAC5C,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,aAAa,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,QAAQ,cAAc,CAAC,GAAG;AACjF,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,SAAS,UAAU,SAAS,SAAS,QAAQ;AACnD,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBACN,SACA,YACS;AACT,UAAM,QAAQ,QAAQ,YAAY;AAClC,WAAO,KAAK,kBAAkB,UAAU,EAAE,KAAK,CAAC,WAAW,MAAM,SAAS,OAAO,YAAY,CAAC,CAAC;AAAA,EACjG;AACF;;;ACrFO,IAAM,qBAAN,MAAyB;AAAA,EACtB,WAAW;AAAA,IACjB,EAAE,OAAO,oDAAoD,MAAM,OAAgB;AAAA,IACnF,EAAE,OAAO,+CAA+C,MAAM,YAAqB;AAAA,IACnF;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,EAAE,OAAO,eAAe,MAAM,OAAgB;AAAA,IAC9C,EAAE,OAAO,sBAAsB,MAAM,MAAe;AAAA,EACtD;AAAA,EAEA,QAAQ,OAAwB,gBAAiD;AAC/E,UAAM,kBAAkB,oBAAI,IAA4B;AAExD,mBAAe,QAAQ,CAAC,MAAM;AAC5B,sBAAgB,IAAI,EAAE,MAAM;AAAA,QAC1B,GAAG;AAAA,QACH,UAAU,EAAE,YAAY;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,UAAM,iBAA8B,MACjC,OAAO,CAAC,MAAM,EAAE,SAAS,EACzB,IAAI,CAAC,SAAS;AACb,UAAI,cAAc,KAAK;AAEvB,iBAAW,WAAW,KAAK,UAAU;AACnC,cAAM,UAAU,YAAY,MAAM,QAAQ,KAAK;AAC/C,YAAI,SAAS;AACX,qBAAW,SAAS,SAAS;AAC3B,kBAAM,YAAY,KAAK,kBAAkB,OAAO,QAAQ,IAAI;AAE5D,gBAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACnC,8BAAgB,IAAI,WAAW;AAAA,gBAC7B,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa,GAAG,QAAQ,IAAI;AAAA,gBAC5B,SAAS;AAAA,gBACT,UAAU;AAAA,cACZ,CAAC;AAAA,YACH;AAEA,0BAAc,YAAY,QAAQ,OAAO,IAAI,SAAS,GAAG;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY,MAAM,KAAK,gBAAgB,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAe,MAAsB;AAC7D,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ;AACX,cAAM,WAAW,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AAC3C,eAAO,GAAG,SAAS,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,eAAO,GAAG,OAAO;AAAA,MACnB;AAAA,MACA,KAAK;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,4BAA4B,EAAE,IAAI;AAAA,MACvE,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,SAAS,IAAI;AAAA,IACxB;AAAA,EACF;AACF;;;AClEO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,WAAuB;AACjC,SAAK,YAAY,aAAa,IAAI,UAAU;AAC5C,SAAK,eAAe,IAAI,yBAAyB;AACjD,SAAK,eAAe,IAAI,oBAAoB;AAC5C,SAAK,qBAAqB,IAAI,mBAAmB;AAAA,EACnD;AAAA,EAEA,MAAM,QAAQ,SAAkB,UAA4B,CAAC,GAA2B;AACtF,UAAM,EAAE,aAAa,kBAAkB,QAAQ,IAAI;AAEnD,QAAI,QAAS,SAAQ,IAAI,+BAA+B;AACxD,UAAM,eAAe,KAAK,aAAa,QAAQ,QAAQ,QAAQ;AAE/D,QAAI,mBAAmB,aAAa;AACpC,QAAI,gBAAgB;AAEpB,QAAI,CAAC,kBAAkB;AACrB,UAAI,QAAS,SAAQ,IAAI,8BAA8B;AACvD,YAAM,eAAe,KAAK,aAAa,OAAO,aAAa,QAAQ;AACnE,yBAAmB,aAAa;AAChC,sBAAgB,aAAa;AAAA,IAC/B;AAEA,UAAM,kBAA2B;AAAA,MAC/B,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAEA,QAAI,QAAS,SAAQ,IAAI,sBAAsB;AAC/C,UAAM,SAAS,MAAM,KAAK,UAAU,cAAc,eAAe;AAEjE,QAAI,QAAS,SAAQ,IAAI,qBAAqB;AAC9C,UAAM,cAAc,MAAM,KAAK,UAAU,aAAa,iBAAiB,QAAQ,WAAW;AAE1F,QAAI,QAAS,SAAQ,IAAI,0BAA0B;AACnD,UAAM,EAAE,OAAO,oBAAoB,WAAW,IAAI,KAAK,mBAAmB;AAAA,MACxE,YAAY;AAAA,MACZ,KAAK,kBAAkB,YAAY,UAAU;AAAA,IAC/C;AAEA,QAAI,QAAS,SAAQ,IAAI,2BAA2B;AACpD,UAAM,cAAc,MAAM,KAAK,UAAU,oBAAoB,MAAM;AAEnE,UAAM,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAS,SAAQ,IAAI,sBAAsB;AAC/C,UAAM,gBAAgB,MAAM,KAAK,UAAU,eAAe,KAAK;AAE/D,UAAM,aAAa,KAAK,UAAU,cAAc;AAEhD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,QACR,WAAW,QAAQ;AAAA,QACnB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,YAAY;AAAA,UACV,OAAO,WAAW;AAAA,UAClB,QAAQ,WAAW;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBACN,QACkB;AAClB,WAAO,OAAO,IAAI,CAAC,OAAO;AAAA,MACxB,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,UAAU,EAAE,iBAAiB;AAAA,IAC/B,EAAE;AAAA,EACJ;AAAA,EAEQ,cACN,QACA,aACA,OACA,YACA,aACO;AACP,WAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM,KAAK,aAAa,MAAM;AAAA,QAC9B;AAAA,QACA,SAAS;AAAA,MACX;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,eAAe,YAAY;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,eAAe,YAAY;AAAA,MAC3B,UAAU,KAAK,iBAAiB,OAAO,QAAQ;AAAA,MAC/C,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,aAAa,QAAwB;AAC3C,UAAM,QAAQ,OAAO,KAClB,YAAY,EACZ,QAAQ,gBAAgB,EAAE,EAC1B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,CAAC;AAEb,WAAO,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,EAC1E;AAAA,EAEQ,iBAAiB,UAA8B;AACrD,WAAO,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,WAAW,QAAQ,YAAY,CAAC,EAAE;AAAA,EACjF;AACF;;;AC9IO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,YAAoB,WAAwB,MAAM;AAA9B;AAClB,SAAK,WAAW;AAAA,MACd,IAAI;AAAA;AAAA,QAEF,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,sBAAO,cAAI,GAAG,MAAM,UAAU;AAAA,QACnE,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,0BAAM,GAAG,MAAM,QAAQ;AAAA,QAC5D,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,aAAa;AAAA,QACrE,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,aAAa;AAAA,QAC/D,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,QAAQ;AAAA,MAC5D;AAAA,MACA,IAAI;AAAA;AAAA,QAEF,EAAE,UAAU,CAAC,iBAAiB,WAAW,QAAQ,UAAU,WAAW,gBAAgB,GAAG,MAAM,UAAU;AAAA,QACzG,EAAE,UAAU,CAAC,SAAS,aAAa,aAAa,YAAY,GAAG,MAAM,QAAQ;AAAA,QAC7E,EAAE,UAAU,CAAC,QAAQ,WAAW,cAAc,UAAU,SAAS,GAAG,MAAM,aAAa;AAAA,QACvF,EAAE,UAAU,CAAC,OAAO,WAAW,cAAc,aAAa,GAAG,MAAM,aAAa;AAAA,QAChF,EAAE,UAAU,CAAC,YAAY,WAAW,SAAS,UAAU,UAAU,GAAG,MAAM,QAAQ;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA,EAxBQ;AAAA,EA0BR,SAAS,QAAkC;AACzC,UAAM,QAAQ,OAAO,YAAY;AACjC,UAAM,WAAW,KAAK,SAAS,KAAK,QAAQ;AAE5C,QAAI,cAA0B;AAC9B,QAAI,kBAA4B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,YAAM,gBAAgB,QAAQ,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS,EAAE,YAAY,CAAC,CAAC;AACpF,UAAI,cAAc,SAAS,GAAG;AAC5B,sBAAc,QAAQ;AACtB,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,cAAc,QAAQ,eAAe;AAEzD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,QAAgB,UAAwC;AAC5E,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,OAAO,YAAY,EAAE,QAAQ,QAAQ,YAAY,CAAC;AAChE,UAAI,UAAU,IAAI;AAChB,cAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ,MAAM,EAAE,KAAK;AACxD,cAAM,QAAQ,MAAM,MAAM,eAAe;AACzC,YAAI,OAAO;AACT,iBAAO,MAAM,CAAC,EAAE,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC1EO,IAAM,cAAN,MAAkB;AAAA,EACvB,KAAK,SAA2C;AAC9C,UAAM,SAAuB,CAAC;AAE9B,eAAW,UAAU,SAAS;AAC5B,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,eAAK,WAAW,QAAQ,MAAM;AAC9B;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,QAAQ,MAAM;AACnC;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,QAAQ,MAAM;AACnC;AAAA,QACF,KAAK;AACH,eAAK,WAAW,QAAQ,MAAM;AAC9B;AAAA,QACF,KAAK;AACH,eAAK,aAAa,QAAQ,MAAM;AAChC;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,QAA0B,QAA4B;AACvE,QAAI,CAAC,OAAO,aAAa;AACvB,aAAO,cAAc,oBAAI,IAAI;AAAA,IAC/B;AAEA,QAAI,OAAO,QAAQ;AACjB,aAAO,YAAY,IAAI,OAAO,OAAO,YAAY,GAAG,CAAG;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAA0B,QAA4B;AAC5E,QAAI,CAAC,OAAO,yBAAyB;AACnC,aAAO,0BAA0B,CAAC;AAAA,IACpC;AAEA,WAAO,wBAAwB,KAAK,OAAO,QAAQ;AAAA,EACrD;AAAA,EAEQ,gBAAgB,QAA0B,QAA4B;AAC5E,QAAI,CAAC,OAAO,iBAAiB;AAC3B,aAAO,kBAAkB,oBAAI,IAAI;AAAA,IACnC;AAEA,UAAM,WAAW,OAAO,gBAAgB,IAAI,YAAY,KAAK,CAAC;AAC9D,aAAS,KAAK,OAAO,QAAQ;AAC7B,WAAO,gBAAgB,IAAI,cAAc,QAAQ;AAAA,EACnD;AAAA,EAEQ,WAAW,QAA0B,QAA4B;AACvE,UAAM,QAAQ,OAAO,SAAS,YAAY;AAE1C,QAAI,MAAM,SAAS,cAAI,KAAK,MAAM,SAAS,UAAU,GAAG;AACtD,aAAO,iBAAiB;AAAA,IAC1B,WAAW,MAAM,SAAS,cAAI,KAAK,MAAM,SAAS,SAAS,GAAG;AAC5D,aAAO,iBAAiB;AAAA,IAC1B,OAAO;AACL,aAAO,iBAAiB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,aAAa,QAA0B,QAA4B;AACzE,QAAI,CAAC,OAAO,iBAAiB;AAC3B,aAAO,kBAAkB,CAAC;AAAA,IAC5B;AAEA,QAAI,OAAO,QAAQ;AACjB,aAAO,gBAAgB,KAAK,OAAO,OAAO,YAAY,CAAC;AAAA,IACzD;AAAA,EACF;AACF;;;ACtEO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,aAAa,IAAI,iBAAiB,QAAQ,YAAY,IAAI;AAC/D,SAAK,QAAQ,IAAI,YAAY;AAAA,EAC/B;AAAA,EAEA,QAAQ,SAAiC;AACvC,UAAM,aAAa,QAAQ,IAAI,CAAC,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AACjE,WAAO,KAAK,MAAM,KAAK,UAAU;AAAA,EACnC;AAAA,EAEA,SAAS,QAAkC;AACzC,WAAO,KAAK,WAAW,SAAS,MAAM;AAAA,EACxC;AAAA,EAEA,aAAa,SAA2B;AACtC,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,UAAM,aAAa,QAAQ,IAAI,CAAC,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AAEjE,UAAM,WAAW;AAAA,MACf,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,MAClD,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAC5D,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAC5D,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,MAClD,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,IACxD;AAEA,UAAM,QAAkB,CAAC,sBAAsB;AAE/C,QAAI,SAAS,MAAM,QAAQ;AACzB,YAAM,KAAK,mBAAmB;AAC9B,eAAS,MAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7D;AAEA,QAAI,SAAS,WAAW,QAAQ;AAC9B,YAAM,KAAK,mBAAmB;AAC9B,eAAS,WAAW,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClE;AAEA,QAAI,SAAS,WAAW,QAAQ;AAC9B,YAAM,KAAK,0BAA0B;AACrC,eAAS,WAAW,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClE;AAEA,QAAI,SAAS,MAAM,QAAQ;AACzB,YAAM,KAAK,oBAAoB;AAC/B,eAAS,MAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7D;AAEA,QAAI,SAAS,QAAQ,QAAQ;AAC3B,YAAM,KAAK,kBAAkB;AAC7B,eAAS,QAAQ,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC/D;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACpEA,OAAO,cAAc;AACrB,OAAOC,YAAW;AAOlB,eAAsB,8BAAyD;AAC7E,QAAM,UAAoB,CAAC;AAE3B,UAAQ,IAAIA,OAAM,KAAK,iEAAkB,CAAC;AAC1C,UAAQ,IAAIA,OAAM,KAAK,sDAAc,CAAC;AAEtC,aAAS;AACP,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO;AAAA,MACvC;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQA,OAAM,OAAO,QAAG;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB;AAAA,IACF;AAEA,YAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,EAC5B;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,SAAS,CAAC,GAAG,WAAW,KAAK;AAAA,EACxC;AAEA,UAAQ,IAAIA,OAAM,KAAK,mDAAc,CAAC;AACtC,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,YAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,EAAE,QAAQ,IAAI,MAAM,SAAS,OAAO;AAAA,IACxC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SAAO,EAAE,SAAS,WAAW,QAAQ;AACvC;AAEA,eAAsB,6BAA6B,aAA0C;AAC3F,QAAM,EAAE,SAAS,IAAI,MAAM,SAAS,OAAO;AAAA,IACzC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,YAAY,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,IACzD;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AC/DA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,iBAAiB;AAGnB,IAAM,qBAAN,MAAyB;AAAA,EAC9B,MAAM,UAAiC;AACrC,UAAM,cAAsC;AAAA,MAC1C,MAAM,SAAS;AAAA,MACf,aAAa,SAAS;AAAA,MACtB,SAAS,SAAS;AAAA,IACpB;AAEA,QAAI,SAAS,SAAS;AACpB,kBAAY,UAAU,SAAS;AAAA,IACjC;AAEA,UAAM,OAAO,UAAU,aAAa;AAAA,MAClC,WAAW;AAAA,MACX,mBAAmB;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,EAAQ,IAAI;AAAA,EACrB;AAAA,EAEA,oBAAoB,aAA8B;AAChD,UAAM,mBAAmB,YAAY,YAAY,EAAE,WAAW,YAAY;AAC1E,UAAM,oBAAoB,YAAY,SAAS,GAAG,KAAK,YAAY,SAAS,GAAG;AAE/E,WAAO,oBAAoB;AAAA,EAC7B;AACF;;;AC3BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAY,MAAsB;AAChC,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,eAAe,UAA0B;AACvC,WAAO;AAAA;AAAA,EAAkB,QAAQ;AAAA,EACnC;AAAA,EAEA,eAAe,UAA4B;AACzC,UAAM,QAAQ,CAAC,8BAA8B,IAAI,wDAAwD;AAEzG,aAAS,QAAQ,CAAC,YAAY;AAC5B,YAAM,KAAK,KAAK,OAAO,EAAE;AAAA,IAC3B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,oBAAoB,eAAiC;AACnD,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,kBAAc,QAAQ,CAAC,WAAW;AAChC,YAAM,KAAK,KAAK,MAAM,EAAE;AAAA,IAC1B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,YAAY,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE;AACjD,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,SAAS,MAAM;AACpC,gBAAM,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,EAAE;AAAA,QACnC,CAAC;AAAA,MACH;AAEA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,iBAAiB,YAAsC;AACrD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,UAAU;AAC5B,YAAM,aAAa,MAAM,YAAY,SAAY,KAAK,MAAM,OAAO,OAAO;AAC1E,YAAM,WAAW,MAAM,WAAW,gBAAgB;AAClD,YAAM,KAAK,OAAO,MAAM,IAAI,QAAQ,MAAM,IAAI,MAAM,UAAU,MAAM,MAAM,WAAW,GAAG,QAAQ,IAAI;AAAA,IACtG,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,oBAAoB,eAA+C;AACjE,UAAM,QAAQ,CAAC,qBAAqB,EAAE;AAEtC,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AAC3D,YAAM,KAAK,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,IAC1C,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,eAAe,UAA4B;AACzC,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,aAAS,QAAQ,CAAC,YAAY;AAC5B,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,iBAAiB,YAA8B;AAC7C,UAAM,QAAQ,CAAC,2BAA2B,IAAI,uBAAuB,EAAE;AAEvE,eAAW,QAAQ,CAAC,QAAQ;AAC1B,YAAM,KAAK,SAAS,GAAG,MAAM;AAAA,IAC/B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,YAAY,OAAyB;AACnC,UAAM,QAAQ,CAAC,YAAY,EAAE;AAE7B,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AC/GA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AAQd,IAAM,mBAAN,MAAuB;AAAA,EAC5B,MAAM,OAAO,UAAkB,UAAqC,CAAC,GAAkB;AACrF,UAAM,EAAE,oBAAoB,MAAM,kBAAkB,OAAO,iBAAiB,MAAM,IAAI;AAEtF,UAAMD,IAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAE5C,QAAI,mBAAmB;AACrB,YAAMA,IAAG,MAAMC,MAAK,UAAU,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAClE;AAEA,QAAI,iBAAiB;AACnB,YAAMD,IAAG,MAAMC,MAAK,UAAU,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAChE;AAEA,QAAI,gBAAgB;AAClB,YAAMD,IAAG,MAAMC,MAAK,UAAU,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,UAAqC;AACvD,UAAM,QAAkB,CAAC;AAEzB,mBAAe,KAAK,KAAa,SAAiB,IAAI;AACpD,YAAM,UAAU,MAAMD,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,iBAAW,SAAS,SAAS;AAC3B,cAAM,eAAe,SAAS,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM;AAEhE,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,KAAK,GAAG,YAAY,GAAG;AAC7B,gBAAM,KAAKC,MAAK,KAAK,MAAM,IAAI,GAAG,YAAY;AAAA,QAChD,OAAO;AACL,gBAAM,KAAK,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACT;AACF;;;ACnCO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,SAAS,SAAiB,OAAgC;AACxD,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA8B,CAAC;AAErC,SAAK,oBAAoB,SAAS,OAAO,QAAQ,QAAQ;AACzD,SAAK,yBAAyB,SAAS,MAAM;AAC7C,SAAK,qBAAqB,SAAS,QAAQ;AAC3C,SAAK,eAAe,SAAS,QAAQ;AAErC,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBACN,SACA,OACA,QACA,UACM;AACN,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,SAAS,YAAY,YAAY,EAAE,SAAS,YAAY,GAAG;AACpE,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,MAAM,SAAS,YAAY,SAAS,GAAG,GAAG;AAC7C,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,yBAAyB,SAAiB,QAAiC;AACjF,UAAM,mBAAmB;AAAA,MACvB,EAAE,SAAS,iBAAiB,MAAM,WAAW;AAAA,MAC7C,EAAE,SAAS,2CAA2C,MAAM,WAAW;AAAA,MACvE,EAAE,SAAS,8BAA8B,MAAM,QAAQ;AAAA,IACzD;AAEA,eAAW,WAAW,kBAAkB;AACtC,UAAI,CAAC,QAAQ,QAAQ,KAAK,OAAO,GAAG;AAClC,eAAO,KAAK;AAAA,UACV,OAAO,QAAQ;AAAA,UACf,SAAS,6BAA6B,QAAQ,IAAI;AAAA,UAClD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAAiB,UAAmC;AAC/E,UAAM,uBAAuB,CAAC,oBAAoB,qBAAqB,iBAAiB,gBAAgB;AAExG,eAAW,WAAW,sBAAsB;AAC1C,UAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,SAAS,yBAAyB,QAAQ,MAAM;AAAA,UAChD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,SAAiB,UAAmC;AACzE,UAAM,YAAY,QAAQ,MAAM,KAAK,EAAE;AAEvC,QAAI,YAAY,KAAM;AACpB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,yBAAyB,SAAS;AAAA,QAC3C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,KAAK;AACnB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,2BAA2B,SAAS;AAAA,QAC7C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AJ5FO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,qBAAqB,IAAI,mBAAmB;AACjD,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,YAAY,IAAI,kBAAkB;AAAA,EACzC;AAAA,EAEA,MAAM,SAAS,OAAc,SAAmD;AAC9E,UAAM,EAAE,WAAW,YAAY,OAAO,oBAAoB,KAAK,IAAI;AAEnE,UAAM,eAAe,KAAK,YAAY,MAAM,SAAS,IAAI;AACzD,UAAM,WAAWC,MAAK,WAAW,YAAY;AAE7C,QAAI,CAAC,aAAc,MAAM,KAAK,OAAO,QAAQ,GAAI;AAC/C,YAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;AAAA,IAC/D;AAEA,UAAM,KAAK,iBAAiB,OAAO,UAAU;AAAA,MAC3C;AAAA,MACA,iBAAiB,QAAQ,mBAAmB;AAAA,IAC9C,CAAC;AAED,UAAM,UAAU,KAAK,YAAY,KAAK;AACtC,UAAM,aAAa,KAAK,UAAU,SAAS,SAAS,KAAK;AAEzD,UAAM,YAAYA,MAAK,UAAU,UAAU;AAC3C,UAAMC,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,UAAM,QAAQ,CAAC,SAAS;AAExB,QAAI,qBAAqB,MAAM,YAAY,QAAQ;AACjD,YAAM,UAAU,MAAM,KAAK,mBAAmB,UAAU,KAAK;AAC7D,YAAM,KAAK,OAAO;AAAA,IACpB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAsB;AAChC,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,mBAAmB,MAAM,MAAM,QAAQ,CAAC;AACxD,UAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,SAAS,IAAI,CAAC;AACjE,UAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAC/D,UAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAE/D,QAAI,MAAM,cAAc,QAAQ;AAC9B,YAAM,KAAK,KAAK,iBAAiB,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC3E;AAEA,UAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,KAAK,CAAC;AAEzD,QAAI,MAAM,WAAW,QAAQ;AAC3B,YAAM,KAAK,KAAK,iBAAiB,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACrE;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,QAAQ;AAC3C,YAAM,KAAK,KAAK,iBAAiB,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC3E;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAAA,IACjE;AAEA,QAAI,MAAM,YAAY,QAAQ;AAC5B,YAAM,KAAK,KAAK,iBAAiB,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACrE;AAEA,QAAI,MAAM,OAAO,QAAQ;AACvB,YAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,KAAK,CAAC;AAAA,IAC3D;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,mBAAmB,UAAkB,OAA+B;AAChF,UAAM,SAASD,MAAK,UAAU,YAAY;AAC1C,UAAM,UAAU,MAAM;AAEtB,UAAM,eAAeA,MAAK,QAAQ,aAAa;AAC/C,UAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,KAAK,oCAAoC;AAAA;AAGlF,UAAMC,IAAG,UAAU,cAAc,iBAAiB,OAAO;AACzD,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AAAA,EAEA,MAAc,OAAO,MAAgC;AACnD,QAAI;AACF,YAAMA,IAAG,OAAO,IAAI;AACpB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AK5IA,SAAS,aAAAC,kBAAiB;AASnB,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,OAAc,UAA0B,CAAC,GAAW;AACzD,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACxC,UAAM,KAAK,KAAK,MAAM,SAAS,IAAI,EAAE;AACrC,UAAM,KAAK;AAAA;AAAA,EAAkB,MAAM,QAAQ,EAAE;AAC7C,UAAM,KAAK,KAAK,eAAe,MAAM,QAAQ,CAAC;AAE9C,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,KAAK,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC1D;AAEA,UAAM,KAAK,KAAK,YAAY,MAAM,KAAK,CAAC;AAExC,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,KAAK,KAAK,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACpD;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,KAAK,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC1D;AAEA,QAAI,QAAQ,oBAAoB,SAAS,MAAM,SAAS,SAAS,GAAG;AAClE,YAAM,KAAK,KAAK,eAAe,MAAM,QAAQ,CAAC;AAAA,IAChD;AAEA,QAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,YAAM,KAAK,KAAK,YAAY,MAAM,KAAK,CAAC;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,OAAsB;AAC9C,UAAM,OAA+B;AAAA,MACnC,MAAM,MAAM,SAAS;AAAA,MACrB,aAAa,MAAM,SAAS;AAAA,MAC5B,SAAS,MAAM,SAAS;AAAA,IAC1B;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,WAAK,UAAU,MAAM,SAAS;AAAA,IAChC;AAEA,WAAO;AAAA,EAAQA,WAAU,IAAI,CAAC;AAAA,EAChC;AAAA,EAEQ,eAAe,UAA4B;AACjD,UAAM,QAAQ,CAAC,8BAA8B,IAAI,4BAA4B;AAC7E,aAAS,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAC5C,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBAAoB,eAAiC;AAC3D,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AACrC,kBAAc,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AACjD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,YAAY,OAA4B;AAC9C,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,KAAK,YAAY,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;AAC7C,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,KAAK,MAAM;AAChC,gBAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;AAAA,QAC/B,CAAC;AAAA,MACH;AAEA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEQ,iBAAiB,YAAsC;AAC7D,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,MAAM;AACxB,YAAM,MAAM,EAAE,YAAY,SAAY,KAAK,EAAE,OAAO,OAAO;AAC3D,YAAM,KAAK,OAAO,EAAE,IAAI,QAAQ,EAAE,IAAI,MAAM,GAAG,MAAM,EAAE,WAAW,IAAI;AAAA,IACxE,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBAAoB,eAA+C;AACzE,UAAM,QAAQ,CAAC,qBAAqB,EAAE;AACtC,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AAC3D,YAAM,KAAK,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,IAC1C,CAAC;AACD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,eAAe,UAA4B;AACjD,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AACrC,aAAS,QAAQ,CAAC,OAAO;AACvB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AACD,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEQ,YAAY,OAAyB;AAC3C,UAAM,QAAQ,CAAC,YAAY,EAAE;AAC7B,UAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AACzC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AClIA,SAAS,aAAAC,kBAAiB;AAInB,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAO,OAAc,WAA2B,CAAC,GAAW;AAC1D,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACxC,UAAM,KAAK,sBAAsB;AACjC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,QAAQ;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,SAAS,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAClD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAM,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,OAAO,KAAK,WAAW,EAAE;AAC7D,UAAI,KAAK,UAAU,QAAQ;AACzB,aAAK,SAAS,QAAQ,CAAC,QAAQ;AAC7B,gBAAM,KAAK,QAAQ,GAAG,EAAE;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,kBAAkB;AAC7B,YAAM,KAAK,EAAE;AACb,YAAM,cAAc,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,IACzD;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,mBAAmB;AAC9B,YAAM,KAAK,EAAE;AACb,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AACjE,cAAM,KAAK,KAAK,KAAK,KAAK,QAAQ,EAAE;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,kBAAkB,OAAsB;AAC9C,UAAM,OAAO;AAAA,MACX,MAAM,KAAK,YAAY,MAAM,SAAS,IAAI;AAAA,MAC1C,aAAa,MAAM,SAAS;AAAA,MAC5B,OAAO;AAAA,IACT;AAEA,WAAO;AAAA,EAAQA,WAAU,IAAI,CAAC;AAAA,EAChC;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AC5DO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,OAAc,WAA2B,CAAC,GAAW;AAC1D,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,MAAM,SAAS,IAAI,EAAE;AACrC,UAAM,KAAK,8BAA8B;AACzC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,QAAQ;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,EAAE;AAEb,UAAM,MAAM,QAAQ,CAAC,SAAS;AAC5B,YAAM,KAAK,OAAO,KAAK,KAAK,EAAE;AAC9B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,QAAQ;AAC7B,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB,CAAC;AAAA,MACH;AACA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,gBAAgB;AAC3B,YAAM,KAAK,EAAE;AACb,YAAM,cAAc,QAAQ,CAAC,MAAM;AACjC,cAAM,KAAK,KAAK,CAAC,EAAE;AAAA,MACrB,CAAC;AACD,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,mBAAmB;AAC9B,YAAM,KAAK,EAAE;AACb,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AACjE,cAAM,KAAK,wBAAwB,KAAK,MAAM,QAAQ,EAAE;AAAA,MAC1D,CAAC;AACD,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,6CAA6C;AACxD,YAAM,KAAK,EAAE;AACb,YAAM,WAAW,QAAQ,CAAC,MAAM;AAC9B,cAAM,MAAM,EAAE,UAAU,cAAc,EAAE,OAAO,MAAM;AACrD,cAAM,KAAK,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,GAAG,GAAG,EAAE;AAAA,MACtD,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACrDO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,SAAK,iBAAiB,IAAI,eAAe;AACzC,SAAK,kBAAkB,IAAI,gBAAgB;AAAA,EAC7C;AAAA,EAEA,QAAQ,OAAc,QAAsB,SAAkC;AAC5E,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,KAAK,eAAe,OAAO,OAAO;AAAA,MAC3C,KAAK;AACH,eAAO,KAAK,cAAc,OAAO,OAAO;AAAA,MAC1C,KAAK;AACH,eAAO,KAAK,eAAe,OAAO,OAAO;AAAA,MAC3C;AACE,cAAM,IAAI,MAAM,uBAAuB,MAAM,EAAE;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,WAAW,OAAc,SAAqD;AAC5E,UAAM,UAAU,oBAAI,IAA0B;AAC9C,YAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,CAAC;AACzD,YAAQ,IAAI,SAAS,KAAK,cAAc,OAAO,OAAO,CAAC;AACvD,YAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,CAAC;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,OAAc,SAAkC;AAC7D,WAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AAAA,EACnD;AAAA,EAEA,cAAc,OAAc,SAAkC;AAC5D,WAAO,KAAK,eAAe,OAAO,OAAO,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,OAAc,SAAkC;AAC7D,WAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AAAA,EACnD;AACF;;;AC7CO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,eAAe,SAAmC;AAChD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAEA,QAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,aAAO,KAAK,6BAA6B;AAAA,IAC3C;AACA,QAAI,CAAC,QAAQ,SAAS,cAAc,GAAG;AACrC,aAAO,KAAK,oCAAoC;AAAA,IAClD;AAEA,QAAI,CAAC,QAAQ,SAAS,aAAa,GAAG;AACpC,aAAO,KAAK,0BAA0B;AAAA,IACxC;AACA,QAAI,CAAC,QAAQ,SAAS,kBAAkB,KAAK,CAAC,QAAQ,SAAS,UAAU,GAAG;AAC1E,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAEA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,eAAS,KAAK,0CAA0C;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,SAAmC;AAC/C,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAEA,QAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG;AAC/B,eAAS,KAAK,6BAA6B;AAAA,IAC7C;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,SAAmC;AAChD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,QAAQ,KAAK,EAAE,SAAS,KAAK;AAC/B,eAAS,KAAK,yBAAyB;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC7EA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;;;ACoBjB,IAAe,iBAAf,MAA8B;AAAA,EACzB;AAAA,EAEV,YAAY,UAAmB;AAC7B,SAAK,WAAW,YAAY,KAAK,mBAAmB;AAAA,EACtD;AAAA,EASA,MAAM,OAAO,WAAqC;AAChD,UAAM,YAAY,MAAM,KAAK,KAAK;AAClC,WAAO,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,EACnD;AACF;;;ADhCO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAC9C;AAAA,EAER,YAAY,UAAmB;AAC7B,UAAM,QAAQ;AACd,SAAK,YAAY,IAAI,eAAe;AAAA,EACtC;AAAA,EAEA,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,WAAW,WAAW,SAAS,QAAQ;AAAA,EAChE;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,OAAO,SAAS,MAAM,SAAS,KAAK,IAAI;AAE5D,UAAM,eAAe,KAAK,YAAY,MAAM,SAAS,IAAI;AACzD,UAAM,YAAYD,MAAK,KAAK,UAAU,YAAY;AAElD,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS,yBAAyB,SAAS;AAAA,QAC7C;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,cAAM,aAAa,GAAG,SAAS,WAAW,KAAK,IAAI,CAAC;AACpD,cAAME,IAAG,OAAO,WAAW,UAAU;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,SAAS,MAAM,KAAK,UAAU,SAAS,OAAO;AAAA,MAClD,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,IACb,CAAC;AAED,QAAI,QAAQ;AACV,YAAM,WAAW,MAAM,KAAK,mBAAmB,SAAS;AACxD,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAAkC;AAChD,UAAM,YAAYF,MAAK,KAAK,UAAU,KAAK,YAAY,SAAS,CAAC;AAEjE,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACjD;AAEA,UAAME,IAAG,GAAG,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,SAA2B,CAAC;AAElC,QAAI;AACF,YAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,UAAU,EAAE,eAAe,KAAK,CAAC;AAEvE,iBAAW,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,cAAM,cAAcF,MAAK,KAAK,UAAU,MAAM,MAAM,UAAU;AAE9D,YAAI,MAAM,WAAW,WAAW,GAAG;AACjC,gBAAM,UAAU,MAAME,IAAG,SAAS,aAAa,OAAO;AACtD,gBAAM,WAAW,KAAK,cAAc,OAAO;AAC3C,gBAAM,OAAO,MAAMA,IAAG,KAAK,WAAW;AAEtC,iBAAO,KAAK;AAAA,YACV,MAAM,SAAS,QAAQ,MAAM;AAAA,YAC7B,MAAMF,MAAK,KAAK,UAAU,MAAM,IAAI;AAAA,YACpC,SAAS,SAAS,WAAW;AAAA,YAC7B,aAAa,KAAK,MAAM,YAAY;AAAA,UACtC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,WAAqC;AACpE,UAAM,UAAUA,MAAK,WAAW,UAAU;AAE1C,QAAI,CAAE,MAAM,WAAW,OAAO,GAAI;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAME,IAAG,SAAS,SAAS,OAAO;AAElD,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,cAAc,OAAO;AAC3C,WAAO,CAAC,EAAE,SAAS,QAAQ,SAAS;AAAA,EACtC;AAAA,EAEQ,cAAc,SAAyC;AAC7D,UAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,QAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,WAAmC,CAAC;AAE1C,SAAK,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AACjC,YAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,UAAI,aAAa,GAAG;AAClB,cAAM,MAAM,KAAK,MAAM,GAAG,UAAU,EAAE,KAAK;AAC3C,cAAM,QAAQ,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAC9C,iBAAS,GAAG,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AEzJA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAMjB,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACzC;AAAA,EAER,YAAY,UAAmB;AAC7B,UAAM,QAAQ;AACd,SAAK,YAAY,IAAI,gBAAgB;AAAA,EACvC;AAAA,EAEA,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,UAAU,QAAQ;AAAA,EAC3C;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,MAAM,IAAI;AAE9B,UAAM,YAAY,KAAK,YAAY,MAAM,SAAS,IAAI;AACtD,UAAM,YAAYD,MAAK,KAAK,UAAU,GAAG,SAAS,KAAK;AAEvD,QAAK,MAAM,WAAW,SAAS,KAAM,CAAC,WAAW;AAC/C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,yBAAyB,SAAS;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,UAAU,KAAK,UAAU,cAAc,KAAK;AAClD,UAAME,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAAkC;AAChD,UAAM,YAAYF,MAAK,KAAK,UAAU,GAAG,KAAK,YAAY,SAAS,CAAC,KAAK;AAEzE,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACjD;AAEA,UAAME,IAAG,OAAO,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,SAA2B,CAAC;AAElC,QAAI;AACF,YAAM,QAAQ,MAAMA,IAAG,QAAQ,KAAK,QAAQ;AAE5C,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,cAAM,YAAYF,MAAK,KAAK,UAAU,IAAI;AAC1C,cAAM,OAAO,MAAME,IAAG,KAAK,SAAS;AAEpC,eAAO,KAAK;AAAA,UACV,MAAM,KAAK,QAAQ,OAAO,EAAE;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AC5FA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AAMd,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAC1C;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,UAAM,WAAW;AACjB,SAAK,cAAc;AACnB,SAAK,YAAY,IAAI,gBAAgB;AAAA,EACvC;AAAA,EAEA,qBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,OAAO,SAAS,KAAK,IAAI;AAE7C,UAAM,YAAYC,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,cAAM,aAAa,GAAG,SAAS,WAAW,KAAK,IAAI,CAAC;AACpD,cAAMC,IAAG,SAAS,WAAW,UAAU;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,eAAe,KAAK;AACnD,UAAMA,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAmC;AACjD,UAAM,YAAYD,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,UAAMC,IAAG,OAAO,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,YAAYD,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,MAAMC,IAAG,KAAK,SAAS;AAEpC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,MAAM,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;;;ACvEO,SAAS,gBACd,UACA,UAA4B,CAAC,GACb;AAChB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,oBAAoB,QAAQ,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,eAAe,QAAQ,QAAQ;AAAA,IAC5C,KAAK;AACH,UAAI,CAAC,QAAQ,aAAa;AACxB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,aAAO,IAAI,gBAAgB,QAAQ,WAAW;AAAA,IAChD;AACE,YAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,EACvD;AACF;;;ACpBO,IAAM,UAAU;","names":["fs","join","homedir","join","homedir","fs","join","homedir","join","homedir","join","homedir","join","homedir","z","z","chalk","fs","join","fs","join","join","fs","stringify","stringify","fs","join","homedir","join","homedir","fs","fs","join","homedir","join","homedir","fs","fs","join","join","fs"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/validation.ts","../src/loaders/claude.ts","../src/loaders/base.ts","../src/loaders/codex.ts","../src/loaders/cursor.ts","../src/loaders/index.ts","../src/core/llm-engine.ts","../src/prompts/index.ts","../src/core/preprocessor.ts","../src/core/failed-filter.ts","../src/core/parameter-extractor.ts","../src/core/distiller.ts","../src/prompt-handler/classifier.ts","../src/prompt-handler/fuser.ts","../src/prompt-handler/prompt-handler.ts","../src/prompt-handler/interactive.ts","../src/generators/skill-generator.ts","../src/generators/frontmatter-builder.ts","../src/generators/markdown-renderer.ts","../src/generators/directory-builder.ts","../src/generators/template-validator.ts","../src/formatters/claude-formatter.ts","../src/formatters/codex-formatter.ts","../src/formatters/cursor-formatter.ts","../src/formatters/converter.ts","../src/formatters/validator.ts","../src/installers/claude.ts","../src/installers/base.ts","../src/installers/codex.ts","../src/installers/cursor.ts","../src/installers/index.ts","../src/index.ts"],"sourcesContent":["import chalk from 'chalk';\n\nexport const logger = {\n info: (msg: string) => console.log(chalk.blue('ℹ'), msg),\n success: (msg: string) => console.log(chalk.green('✓'), msg),\n warn: (msg: string) => console.log(chalk.yellow('⚠'), msg),\n error: (msg: string) => console.log(chalk.red('✗'), msg),\n step: (msg: string) => console.log(chalk.cyan('→'), msg),\n};\n","import { promises as fs } from 'fs';\nimport { homedir } from 'os';\nimport { join } from 'path';\n\nexport function expandHome(path: string): string {\n if (path.startsWith('~')) {\n return join(homedir(), path.slice(1));\n }\n return path;\n}\n\nexport async function ensureDir(path: string): Promise<void> {\n await fs.mkdir(path, { recursive: true });\n}\n\nexport async function fileExists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJson<T>(path: string): Promise<T> {\n const content = await fs.readFile(path, 'utf-8');\n return JSON.parse(content) as T;\n}\n\nexport async function writeJson(path: string, data: unknown): Promise<void> {\n await fs.writeFile(path, JSON.stringify(data, null, 2));\n}\n","import { z } from 'zod';\n\nexport const SessionIdSchema = z.string().min(1, 'Session ID is required');\n\nexport const PlatformSchema = z.enum(['claude', 'codex', 'cursor']);\n\nexport const DistillOptionsSchema = z.object({\n sessionId: z.string().optional(),\n last: z.boolean().optional(),\n prompts: z.array(z.string()).optional(),\n format: z.enum(['claude', 'codex', 'cursor', 'all']).optional(),\n outputDir: z.string().optional(),\n install: z.boolean().optional(),\n interactive: z.boolean().optional(),\n});\n\nexport function validateSessionId(id: unknown): string {\n return SessionIdSchema.parse(id);\n}\n\nexport function validatePlatform(platform: unknown): 'claude' | 'codex' | 'cursor' {\n return PlatformSchema.parse(platform);\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo, SessionLoaderOptions } from './base.js';\nimport type { Session, Message } from '../types/session.js';\n\ninterface TranscriptEntry {\n type: 'user' | 'assistant' | 'tool_use' | 'tool_result';\n timestamp: string;\n content?: string;\n tool_name?: string;\n tool_input?: Record<string, unknown>;\n tool_output?: { preview?: string; truncated?: boolean };\n}\n\ninterface ProjectEntry {\n type: 'user' | 'assistant' | 'file-history-snapshot';\n timestamp: string;\n sessionId?: string;\n cwd?: string;\n message?: {\n role: 'user' | 'assistant';\n content: string | Array<{ type: string; text?: string }>;\n };\n toolUseResult?: {\n name: string;\n result: string;\n error?: boolean;\n };\n}\n\ninterface SessionSource {\n id: string;\n filePath: string;\n projectPath: string;\n source: 'transcripts' | 'projects';\n}\n\nexport class ClaudeSessionLoader extends SessionLoader {\n private transcriptsPath: string;\n private projectsPath: string;\n\n constructor(options: SessionLoaderOptions = {}) {\n super(options);\n const claudeDir = join(homedir(), '.claude');\n this.transcriptsPath = join(claudeDir, 'transcripts');\n this.projectsPath = join(claudeDir, 'projects');\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.claude');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n const sessions: SessionInfo[] = [];\n\n const transcriptSessions = await this.listTranscriptSessions();\n const projectSessions = await this.listProjectSessions();\n\n sessions.push(...transcriptSessions, ...projectSessions);\n\n return sessions.sort(\n (a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime()\n );\n }\n\n private async listTranscriptSessions(): Promise<SessionInfo[]> {\n const sessions: SessionInfo[] = [];\n\n try {\n const files = await fs.readdir(this.transcriptsPath);\n\n for (const file of files) {\n if (!file.endsWith('.jsonl') || !file.startsWith('ses_')) continue;\n\n const filePath = join(this.transcriptsPath, file);\n const sessionId = file.replace('.jsonl', '');\n\n try {\n const entries = await this.readTranscriptFile(filePath);\n if (entries.length === 0) continue;\n\n const userMessages = entries.filter((e) => e.type === 'user');\n const firstEntry = entries[0];\n const lastEntry = entries[entries.length - 1];\n\n sessions.push({\n id: sessionId,\n projectPath: '[transcripts]',\n startTime: firstEntry.timestamp,\n endTime: lastEntry.timestamp,\n messageCount: userMessages.length,\n summary: this.extractTranscriptSummary(entries),\n });\n } catch {\n continue;\n }\n }\n } catch {\n // transcripts folder doesn't exist\n }\n\n return sessions;\n }\n\n private async listProjectSessions(): Promise<SessionInfo[]> {\n const sessions: SessionInfo[] = [];\n const sessionMap = new Map<string, SessionSource>();\n\n try {\n const projectDirs = await fs.readdir(this.projectsPath);\n\n for (const projectDir of projectDirs) {\n if (projectDir.startsWith('.')) continue;\n\n const projectPath = join(this.projectsPath, projectDir);\n const stat = await fs.stat(projectPath);\n if (!stat.isDirectory()) continue;\n\n const files = await fs.readdir(projectPath);\n\n for (const file of files) {\n if (!file.endsWith('.jsonl')) continue;\n if (file.startsWith('agent-')) continue;\n\n const filePath = join(projectPath, file);\n const sessionId = file.replace('.jsonl', '');\n\n sessionMap.set(sessionId, {\n id: sessionId,\n filePath,\n projectPath: this.decodeProjectPath(projectDir),\n source: 'projects',\n });\n }\n }\n\n for (const [sessionId, source] of sessionMap) {\n try {\n const entries = await this.readProjectFile(source.filePath);\n if (entries.length === 0) continue;\n\n const userMessages = entries.filter(\n (e) => e.type === 'user' && e.message?.role === 'user'\n );\n const timestamps = entries.filter((e) => e.timestamp).map((e) => e.timestamp);\n\n if (timestamps.length === 0) continue;\n\n sessions.push({\n id: sessionId,\n projectPath: source.projectPath,\n startTime: timestamps[0],\n endTime: timestamps[timestamps.length - 1],\n messageCount: userMessages.length,\n summary: this.extractProjectSummary(entries),\n });\n } catch {\n continue;\n }\n }\n } catch {\n // projects folder doesn't exist\n }\n\n return sessions;\n }\n\n async getSession(id: string): Promise<Session> {\n const transcriptPath = join(this.transcriptsPath, `${id}.jsonl`);\n try {\n await fs.access(transcriptPath);\n const entries = await this.readTranscriptFile(transcriptPath);\n if (entries.length > 0) {\n return this.transformTranscriptSession(id, entries);\n }\n } catch {\n // not in transcripts\n }\n\n const projectFile = await this.findProjectSessionFile(id);\n if (projectFile) {\n const entries = await this.readProjectFile(projectFile.filePath);\n return this.transformProjectSession(id, entries, projectFile.projectPath);\n }\n\n throw new Error(`Session not found: ${id}`);\n }\n\n private async findProjectSessionFile(\n sessionId: string\n ): Promise<{ filePath: string; projectPath: string } | null> {\n try {\n const projectDirs = await fs.readdir(this.projectsPath);\n\n for (const projectDir of projectDirs) {\n if (projectDir.startsWith('.')) continue;\n\n const projectPath = join(this.projectsPath, projectDir);\n const stat = await fs.stat(projectPath);\n if (!stat.isDirectory()) continue;\n\n const sessionFile = join(projectPath, `${sessionId}.jsonl`);\n try {\n await fs.access(sessionFile);\n return {\n filePath: sessionFile,\n projectPath: this.decodeProjectPath(projectDir),\n };\n } catch {\n continue;\n }\n }\n } catch {\n // projects folder doesn't exist\n }\n\n return null;\n }\n\n private async readTranscriptFile(path: string): Promise<TranscriptEntry[]> {\n try {\n const content = await fs.readFile(path, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n return lines.map((line) => JSON.parse(line) as TranscriptEntry);\n } catch {\n return [];\n }\n }\n\n private async readProjectFile(path: string): Promise<ProjectEntry[]> {\n try {\n const content = await fs.readFile(path, 'utf-8');\n const lines = content.trim().split('\\n').filter(Boolean);\n return lines.map((line) => JSON.parse(line) as ProjectEntry);\n } catch {\n return [];\n }\n }\n\n private transformTranscriptSession(id: string, entries: TranscriptEntry[]): Session {\n const messages: Message[] = [];\n let currentAssistantContent = '';\n let currentToolCalls: Message['toolCalls'] = [];\n let currentToolResults: Message['toolResults'] = [];\n let lastTimestamp = '';\n\n for (const entry of entries) {\n if (entry.type === 'user') {\n if (currentAssistantContent || currentToolCalls?.length) {\n messages.push({\n role: 'assistant',\n content: currentAssistantContent.trim(),\n timestamp: lastTimestamp,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n toolResults: currentToolResults.length > 0 ? currentToolResults : undefined,\n });\n currentAssistantContent = '';\n currentToolCalls = [];\n currentToolResults = [];\n }\n\n messages.push({\n role: 'user',\n content: entry.content ?? '',\n timestamp: entry.timestamp,\n });\n } else if (entry.type === 'assistant') {\n currentAssistantContent += (entry.content ?? '') + '\\n';\n lastTimestamp = entry.timestamp;\n } else if (entry.type === 'tool_use') {\n currentToolCalls.push({\n name: entry.tool_name ?? 'unknown',\n input: entry.tool_input ?? {},\n });\n lastTimestamp = entry.timestamp;\n } else if (entry.type === 'tool_result') {\n currentToolResults.push({\n name: entry.tool_name ?? 'unknown',\n output: entry.tool_output?.preview ?? '',\n success: true,\n });\n lastTimestamp = entry.timestamp;\n }\n }\n\n if (currentAssistantContent || currentToolCalls?.length) {\n messages.push({\n role: 'assistant',\n content: currentAssistantContent.trim(),\n timestamp: lastTimestamp,\n toolCalls: currentToolCalls.length > 0 ? currentToolCalls : undefined,\n toolResults: currentToolResults.length > 0 ? currentToolResults : undefined,\n });\n }\n\n const firstEntry = entries[0];\n const lastEntry = entries[entries.length - 1];\n\n return {\n id,\n projectPath: '[transcripts]',\n startTime: firstEntry.timestamp,\n endTime: lastEntry.timestamp,\n messages,\n };\n }\n\n private transformProjectSession(\n id: string,\n entries: ProjectEntry[],\n projectPath: string\n ): Session {\n const messages: Message[] = [];\n\n for (const entry of entries) {\n if (entry.type === 'file-history-snapshot') continue;\n\n if (entry.message) {\n const content = this.extractMessageContent(entry.message.content);\n if (content) {\n messages.push({\n role: entry.message.role === 'user' ? 'user' : 'assistant',\n content,\n timestamp: entry.timestamp,\n });\n }\n }\n }\n\n const timestamps = entries.filter((e) => e.timestamp).map((e) => e.timestamp);\n\n return {\n id,\n projectPath,\n startTime: timestamps[0] ?? '',\n endTime: timestamps[timestamps.length - 1] ?? '',\n messages,\n };\n }\n\n private extractMessageContent(\n content: string | Array<{ type: string; text?: string }>\n ): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (Array.isArray(content)) {\n return content\n .filter((c) => c.type === 'text' && c.text)\n .map((c) => c.text)\n .join('\\n');\n }\n\n return '';\n }\n\n private decodeProjectPath(encoded: string): string {\n return encoded.replace(/-/g, '/').replace(/^\\//, '');\n }\n\n private extractTranscriptSummary(entries: TranscriptEntry[]): string {\n const firstUserEntry = entries.find((e) => e.type === 'user');\n if (!firstUserEntry?.content) return '';\n\n const content = firstUserEntry.content;\n const firstLine = content.split('\\n')[0];\n return firstLine.length > 80 ? firstLine.slice(0, 80) + '...' : firstLine;\n }\n\n private extractProjectSummary(entries: ProjectEntry[]): string {\n const firstUserEntry = entries.find(\n (e) => e.type === 'user' && e.message?.role === 'user'\n );\n if (!firstUserEntry?.message) return '';\n\n const content = this.extractMessageContent(firstUserEntry.message.content);\n const firstLine = content.split('\\n')[0];\n return firstLine.length > 80 ? firstLine.slice(0, 80) + '...' : firstLine;\n }\n}\n","import type { Session } from '../types/session.js';\n\nexport interface SessionInfo {\n id: string;\n projectPath: string;\n startTime: string;\n endTime?: string;\n messageCount: number;\n summary?: string;\n}\n\nexport interface SessionLoaderOptions {\n basePath?: string;\n projectPath?: string;\n}\n\nexport abstract class SessionLoader {\n protected basePath: string;\n protected projectPath?: string;\n\n constructor(options: SessionLoaderOptions = {}) {\n this.basePath = options.basePath ?? this.getDefaultBasePath();\n this.projectPath = options.projectPath;\n }\n\n abstract getDefaultBasePath(): string;\n abstract listSessions(): Promise<SessionInfo[]>;\n abstract getSession(id: string): Promise<Session>;\n\n async getLatestSession(): Promise<Session> {\n const sessions = await this.listSessions();\n if (sessions.length === 0) {\n throw new Error('No sessions found');\n }\n const sorted = sessions.sort(\n (a, b) => new Date(b.startTime).getTime() - new Date(a.startTime).getTime()\n );\n return this.getSession(sorted[0].id);\n }\n\n async searchSessions(query: string): Promise<SessionInfo[]> {\n const sessions = await this.listSessions();\n const lowerQuery = query.toLowerCase();\n return sessions.filter(\n (s) =>\n s.summary?.toLowerCase().includes(lowerQuery) ||\n s.projectPath.toLowerCase().includes(lowerQuery)\n );\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo } from './base.js';\nimport type { Session } from '../types/session.js';\n\nexport class CodexSessionLoader extends SessionLoader {\n getDefaultBasePath(): string {\n return join(homedir(), '.codex', 'history');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n return [];\n }\n\n async getSession(_id: string): Promise<Session> {\n throw new Error('Codex session loading not yet implemented');\n }\n}\n","import { join } from 'path';\nimport { homedir } from 'os';\nimport { SessionLoader, SessionInfo } from './base.js';\nimport type { Session } from '../types/session.js';\n\nexport class CursorSessionLoader extends SessionLoader {\n getDefaultBasePath(): string {\n return join(homedir(), '.cursor', 'workspaceStorage');\n }\n\n async listSessions(): Promise<SessionInfo[]> {\n return [];\n }\n\n async getSession(_id: string): Promise<Session> {\n throw new Error('Cursor session loading not yet implemented');\n }\n}\n","import { SessionLoader, SessionLoaderOptions } from './base.js';\nimport { ClaudeSessionLoader } from './claude.js';\nimport { CodexSessionLoader } from './codex.js';\nimport { CursorSessionLoader } from './cursor.js';\n\nexport type Platform = 'claude' | 'codex' | 'cursor';\n\nexport function createSessionLoader(\n platform: Platform,\n options?: SessionLoaderOptions\n): SessionLoader {\n switch (platform) {\n case 'claude':\n return new ClaudeSessionLoader(options);\n case 'codex':\n return new CodexSessionLoader(options);\n case 'cursor':\n return new CursorSessionLoader(options);\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport { SessionLoader, SessionInfo, SessionLoaderOptions } from './base.js';\nexport { ClaudeSessionLoader } from './claude.js';\nexport { CodexSessionLoader } from './codex.js';\nexport { CursorSessionLoader } from './cursor.js';\n","import Anthropic from '@anthropic-ai/sdk';\nimport { z } from 'zod';\nimport type { Session, Message } from '../types/session.js';\nimport type { Skill } from '../types/skill.js';\nimport * as prompts from '../prompts/index.js';\n\nconst IntentSchema = z.object({\n goal: z.string().describe('The user core objective'),\n problem: z.string().describe('The problem to solve'),\n outcome: z.string().describe('The final result'),\n triggers: z.array(z.string()).describe('Trigger phrases list'),\n category: z.string().describe('Task category'),\n});\n\nconst StepSchema = z.object({\n title: z.string(),\n description: z.string(),\n substeps: z.array(z.string()).optional(),\n isKeyStep: z.boolean(),\n toolsUsed: z.array(z.string()).optional(),\n});\n\nconst StepsResultSchema = z.object({\n steps: z.array(StepSchema),\n parameters: z.array(\n z.object({\n name: z.string(),\n type: z.enum(['string', 'boolean', 'number']),\n description: z.string(),\n defaultValue: z.unknown().optional(),\n })\n ),\n prerequisites: z.array(z.string()),\n errorHandling: z.record(z.string()),\n});\n\nexport type Intent = z.infer<typeof IntentSchema>;\nexport type DistilledStep = z.infer<typeof StepSchema>;\nexport type StepsResult = z.infer<typeof StepsResultSchema>;\n\ninterface LLMEngineOptions {\n apiKey?: string;\n model?: string;\n maxTokens?: number;\n}\n\ninterface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n}\n\nexport class LLMEngine {\n private client: Anthropic;\n private model: string;\n private maxTokens: number;\n private totalUsage: TokenUsage = { inputTokens: 0, outputTokens: 0 };\n\n constructor(options: LLMEngineOptions = {}) {\n this.client = new Anthropic({\n apiKey: options.apiKey ?? process.env.ANTHROPIC_API_KEY,\n });\n this.model = options.model ?? 'claude-sonnet-4-20250514';\n this.maxTokens = options.maxTokens ?? 4096;\n }\n\n async extractIntent(session: Session): Promise<Intent> {\n const conversationText = this.formatConversation(session.messages);\n\n const response = await this.chat(\n prompts.intentExtraction(conversationText),\n prompts.SYSTEM_ANALYST\n );\n\n return this.parseJson(response, IntentSchema);\n }\n\n async distillSteps(\n session: Session,\n intent: Intent,\n userPrompts?: string[]\n ): Promise<StepsResult> {\n const conversationText = this.formatConversation(session.messages);\n\n const promptAdditions = userPrompts?.length\n ? `\\n\\nUser additional instructions:\\n${userPrompts.map((p) => `- ${p}`).join('\\n')}`\n : '';\n\n const response = await this.chat(\n prompts.stepDistillation(conversationText, intent, promptAdditions),\n prompts.SYSTEM_ANALYST\n );\n\n return this.parseJson(response, StepsResultSchema);\n }\n\n async enhanceQuality(skill: Partial<Skill>): Promise<Skill> {\n const response = await this.chat(\n prompts.qualityEnhancement(JSON.stringify(skill, null, 2)),\n prompts.SYSTEM_SKILL_WRITER\n );\n\n return this.parseJson(response, z.any()) as Skill;\n }\n\n async generateDescription(intent: Intent): Promise<string> {\n const response = await this.chat(\n prompts.descriptionGeneration(intent),\n prompts.SYSTEM_SKILL_WRITER\n );\n\n return response.trim();\n }\n\n async chat(prompt: string, system?: string): Promise<string> {\n const response = await this.withRetry(async () => {\n return this.client.messages.create({\n model: this.model,\n max_tokens: this.maxTokens,\n system: system ?? prompts.SYSTEM_DEFAULT,\n messages: [{ role: 'user', content: prompt }],\n });\n });\n\n this.totalUsage.inputTokens += response.usage.input_tokens;\n this.totalUsage.outputTokens += response.usage.output_tokens;\n\n const textBlock = response.content.find((b) => b.type === 'text');\n if (!textBlock || textBlock.type !== 'text') {\n throw new Error('No text response from LLM');\n }\n\n return textBlock.text;\n }\n\n getTokenUsage(): TokenUsage {\n return { ...this.totalUsage };\n }\n\n private formatConversation(messages: Message[]): string {\n return messages\n .map((m) => {\n const role = m.role === 'user' ? 'User' : 'Assistant';\n let content = `[${role}]: ${m.content}`;\n\n if (m.toolCalls?.length) {\n content += `\\n [Tools Used]: ${m.toolCalls.map((t) => t.name).join(', ')}`;\n }\n\n return content;\n })\n .join('\\n\\n');\n }\n\n private parseJson<T>(text: string, schema: z.ZodSchema<T>): T {\n const jsonMatch = text.match(/```json\\n?([\\s\\S]*?)\\n?```/) || text.match(/\\{[\\s\\S]*\\}/);\n\n if (!jsonMatch) {\n throw new Error('No JSON found in response');\n }\n\n const jsonStr = jsonMatch[1] || jsonMatch[0];\n const parsed = JSON.parse(jsonStr);\n\n return schema.parse(parsed);\n }\n\n private async withRetry<T>(fn: () => Promise<T>, maxRetries = 3, delay = 1000): Promise<T> {\n let lastError: Error | undefined;\n\n for (let i = 0; i < maxRetries; i++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (error instanceof Anthropic.RateLimitError) {\n await this.sleep(delay * (i + 1) * 2);\n } else if (error instanceof Anthropic.APIError) {\n await this.sleep(delay * (i + 1));\n } else {\n throw error;\n }\n }\n }\n\n throw lastError;\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","export const SYSTEM_DEFAULT = `You are Skill Distill, an expert at analyzing AI agent conversations and extracting reusable patterns.`;\n\nexport const SYSTEM_ANALYST = `You are an expert conversation analyst. Your task is to:\n1. Understand the user's original intent\n2. Identify key steps and patterns\n3. Filter out failed attempts and trial-and-error\n4. Extract reusable knowledge\n\nAlways respond in valid JSON format.`;\n\nexport const SYSTEM_SKILL_WRITER = `You are an expert at writing Claude Code Skills. You follow these rules:\n1. Use third-person in descriptions (\"This skill should be used when...\")\n2. Use imperative/infinitive form in steps (\"Parse the file...\", not \"You should parse...\")\n3. Include specific trigger phrases\n4. Keep content focused and lean\n5. Follow Claude Code Skill format exactly`;\n\nexport function intentExtraction(conversation: string): string {\n return `Analyze the following conversation between a user and an AI assistant.\n\n<conversation>\n${conversation}\n</conversation>\n\nExtract the user's intent and provide a structured analysis.\n\nRespond with a JSON object containing:\n- goal: The user's core objective (what they wanted to achieve)\n- problem: The problem they were trying to solve\n- outcome: What was ultimately accomplished\n- triggers: An array of 3-5 specific phrases that would trigger this type of task (e.g., \"migrate to RSC\", \"add server components\")\n- category: The category of this task (e.g., \"refactoring\", \"feature-development\", \"debugging\", \"configuration\")\n\n\\`\\`\\`json\n{\n \"goal\": \"...\",\n \"problem\": \"...\",\n \"outcome\": \"...\",\n \"triggers\": [\"...\", \"...\"],\n \"category\": \"...\"\n}\n\\`\\`\\``;\n}\n\nexport function stepDistillation(\n conversation: string,\n intent: { goal: string; problem: string },\n userPromptAdditions: string\n): string {\n return `Based on the following conversation, extract the key steps that were taken to achieve the goal.\n\n<goal>\n${intent.goal}\n</goal>\n\n<problem>\n${intent.problem}\n</problem>\n\n<conversation>\n${conversation}\n</conversation>\n${userPromptAdditions}\n\nInstructions:\n1. Identify the SUCCESSFUL steps that led to the outcome (filter out failed attempts)\n2. Generalize specific values into parameters where appropriate\n3. Identify prerequisites needed before starting\n4. Note any error handling patterns discovered\n\nRespond with a JSON object:\n\n\\`\\`\\`json\n{\n \"steps\": [\n {\n \"title\": \"Step title\",\n \"description\": \"What to do in this step (use imperative form)\",\n \"substeps\": [\"optional substep 1\", \"optional substep 2\"],\n \"isKeyStep\": true,\n \"toolsUsed\": [\"tool1\", \"tool2\"]\n }\n ],\n \"parameters\": [\n {\n \"name\": \"parameter_name\",\n \"type\": \"string\",\n \"description\": \"What this parameter controls\",\n \"defaultValue\": \"optional default\"\n }\n ],\n \"prerequisites\": [\n \"Prerequisite 1\",\n \"Prerequisite 2\"\n ],\n \"errorHandling\": {\n \"Error scenario 1\": \"How to handle it\",\n \"Error scenario 2\": \"How to handle it\"\n }\n}\n\\`\\`\\``;\n}\n\nexport function qualityEnhancement(skillJson: string): string {\n return `Review and enhance the following Skill definition for quality and completeness.\n\n<skill>\n${skillJson}\n</skill>\n\nImprovements to make:\n1. Ensure all steps use imperative form (\"Do X\" not \"You should do X\")\n2. Add any missing error handling scenarios\n3. Improve trigger phrases to be more specific\n4. Add example usage phrases\n5. Ensure prerequisites are complete\n6. Add any missing notes or warnings\n\nReturn the enhanced Skill as a complete JSON object with the same structure but improved content.`;\n}\n\nexport function descriptionGeneration(intent: { goal: string; triggers: string[] }): string {\n return `Generate a Claude Code Skill description based on the following:\n\nGoal: ${intent.goal}\nTrigger phrases: ${intent.triggers.join(', ')}\n\nRequirements:\n1. Use third-person format: \"This skill should be used when...\"\n2. Include the specific trigger phrases in quotes\n3. Be concise but descriptive (1-2 sentences)\n\nExample format:\n\"This skill should be used when the user asks to \\\\\"migrate to RSC\\\\\", \\\\\"convert to Server Components\\\\\", or mentions React Server Components migration. Provides step-by-step guidance for the migration process.\"\n\nGenerate only the description text, no additional formatting.`;\n}\n","import type { Message } from '../types/session.js';\n\nexport interface ProcessedMessage extends Message {\n turnIndex: number;\n hasToolCalls: boolean;\n hasCodeBlocks: boolean;\n codeBlocks: string[];\n sentiment: 'positive' | 'negative' | 'neutral';\n}\n\nexport interface PreprocessResult {\n messages: ProcessedMessage[];\n totalTurns: number;\n toolCallCount: number;\n}\n\nexport class ConversationPreprocessor {\n private positiveSignals = [\n 'perfect',\n 'great',\n 'thanks',\n 'good',\n 'works',\n 'done',\n '好的',\n '可以',\n '完成',\n '成功',\n '对的',\n ];\n\n private negativeSignals = [\n 'wrong',\n 'error',\n 'fail',\n \"doesn't work\",\n 'not working',\n 'not right',\n 'undo',\n '不对',\n '错误',\n '失败',\n '撤销',\n '回滚',\n ];\n\n process(messages: Message[]): PreprocessResult {\n let turnIndex = 0;\n let toolCallCount = 0;\n\n const processed = messages.map((msg) => {\n if (msg.role === 'user') {\n turnIndex++;\n }\n\n const hasToolCalls = (msg.toolCalls?.length ?? 0) > 0;\n if (hasToolCalls) {\n toolCallCount += msg.toolCalls!.length;\n }\n\n const codeBlocks = this.extractCodeBlocks(msg.content);\n\n return {\n ...msg,\n turnIndex,\n hasToolCalls,\n hasCodeBlocks: codeBlocks.length > 0,\n codeBlocks,\n sentiment: this.analyzeSentiment(msg.content),\n };\n });\n\n return {\n messages: processed,\n totalTurns: turnIndex,\n toolCallCount,\n };\n }\n\n private extractCodeBlocks(content: string): string[] {\n const regex = /```[\\w]*\\n([\\s\\S]*?)```/g;\n const blocks: string[] = [];\n let match;\n\n while ((match = regex.exec(content)) !== null) {\n blocks.push(match[1].trim());\n }\n\n return blocks;\n }\n\n private analyzeSentiment(content: string): 'positive' | 'negative' | 'neutral' {\n const lower = content.toLowerCase();\n\n const hasPositive = this.positiveSignals.some((s) => lower.includes(s));\n const hasNegative = this.negativeSignals.some((s) => lower.includes(s));\n\n if (hasPositive && !hasNegative) return 'positive';\n if (hasNegative) return 'negative';\n return 'neutral';\n }\n}\n","import type { ProcessedMessage } from './preprocessor.js';\n\nexport interface FilterResult {\n messages: ProcessedMessage[];\n removedCount: number;\n removedTurns: number[];\n}\n\nexport class FailedAttemptFilter {\n private failureIndicators = {\n userSignals: [\n 'not working',\n \"doesn't work\",\n 'wrong',\n 'undo',\n 'revert',\n 'go back',\n 'try again',\n \"that's not right\",\n 'actually',\n '不对',\n '撤销',\n '回滚',\n '重试',\n '换个方法',\n ],\n assistantSignals: [\n 'sorry',\n 'apologize',\n 'my mistake',\n 'let me try again',\n 'I made an error',\n 'that was incorrect',\n '抱歉',\n '对不起',\n '我的错误',\n '让我重试',\n ],\n toolFailures: ['error', 'failed', 'exception', 'not found', 'permission denied'],\n };\n\n filter(messages: ProcessedMessage[]): FilterResult {\n const failedTurns = this.identifyFailedTurns(messages);\n\n const filtered = messages.filter((msg) => !failedTurns.has(msg.turnIndex));\n\n return {\n messages: filtered,\n removedCount: messages.length - filtered.length,\n removedTurns: Array.from(failedTurns),\n };\n }\n\n private identifyFailedTurns(messages: ProcessedMessage[]): Set<number> {\n const failedTurns = new Set<number>();\n\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n const nextMsg = messages[i + 1];\n\n if (msg.role === 'user' && this.hasFailureSignal(msg.content, 'userSignals')) {\n if (msg.turnIndex > 1) {\n failedTurns.add(msg.turnIndex - 1);\n }\n }\n\n if (msg.role === 'assistant' && this.hasFailureSignal(msg.content, 'assistantSignals')) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.toolResults?.some((r) => !r.success)) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.toolResults?.some((r) => this.hasFailureSignal(r.output, 'toolFailures'))) {\n failedTurns.add(msg.turnIndex);\n }\n\n if (msg.role === 'user' && nextMsg?.role === 'user') {\n failedTurns.add(msg.turnIndex);\n }\n }\n\n return failedTurns;\n }\n\n private hasFailureSignal(\n content: string,\n signalType: keyof typeof this.failureIndicators\n ): boolean {\n const lower = content.toLowerCase();\n return this.failureIndicators[signalType].some((signal) => lower.includes(signal.toLowerCase()));\n }\n}\n","import type { SkillStep, SkillParameter } from '../types/skill.js';\nimport type { DistilledStep } from './llm-engine.js';\n\ninterface ExtractResult {\n steps: SkillStep[];\n parameters: SkillParameter[];\n}\n\nexport class ParameterExtractor {\n private patterns = [\n { regex: /(?:src|lib|app|components|pages)\\/[\\w\\-/]+\\.\\w+/g, type: 'path' as const },\n { regex: /(?:src|lib|app|components|pages)\\/[\\w\\-/]+/g, type: 'directory' as const },\n {\n regex: /\\b[a-z][a-zA-Z0-9]*(?:Component|Hook|Service|Controller|Module)\\b/g,\n type: 'name' as const,\n },\n { regex: /:\\d{4,5}\\b/g, type: 'port' as const },\n { regex: /https?:\\/\\/[^\\s]+/g, type: 'url' as const },\n ];\n\n extract(steps: DistilledStep[], existingParams: SkillParameter[]): ExtractResult {\n const extractedParams = new Map<string, SkillParameter>();\n\n existingParams.forEach((p) => {\n extractedParams.set(p.name, {\n ...p,\n required: p.default === undefined,\n });\n });\n\n const processedSteps: SkillStep[] = steps\n .filter((s) => s.isKeyStep)\n .map((step) => {\n let description = step.description;\n\n for (const pattern of this.patterns) {\n const matches = description.match(pattern.regex);\n if (matches) {\n for (const match of matches) {\n const paramName = this.generateParamName(match, pattern.type);\n\n if (!extractedParams.has(paramName)) {\n extractedParams.set(paramName, {\n name: paramName,\n type: 'string',\n description: `${pattern.type} parameter extracted from step`,\n default: match,\n required: false,\n });\n }\n\n description = description.replace(match, `{${paramName}}`);\n }\n }\n }\n\n return {\n title: step.title,\n description,\n substeps: step.substeps,\n };\n });\n\n return {\n steps: processedSteps,\n parameters: Array.from(extractedParams.values()),\n };\n }\n\n private generateParamName(value: string, type: string): string {\n switch (type) {\n case 'path': {\n const fileName = value.split('/').pop() ?? 'file';\n return `${fileName.replace(/\\.\\w+$/, '')}_path`;\n }\n case 'directory': {\n const dirName = value.split('/').pop() ?? 'dir';\n return `${dirName}_dir`;\n }\n case 'name':\n return value.toLowerCase().replace(/component|hook|service/gi, '') + '_name';\n case 'port':\n return 'port';\n case 'url':\n return 'api_url';\n default:\n return `param_${type}`;\n }\n }\n}\n","import type { Session } from '../types/session.js';\nimport type { Skill, SkillStep, SkillParameter } from '../types/skill.js';\nimport { LLMEngine, Intent, StepsResult } from './llm-engine.js';\nimport { ConversationPreprocessor } from './preprocessor.js';\nimport { FailedAttemptFilter } from './failed-filter.js';\nimport { ParameterExtractor } from './parameter-extractor.js';\n\nexport interface DistillerOptions {\n userPrompts?: string[];\n skipFailedFilter?: boolean;\n verbose?: boolean;\n}\n\nexport interface DistillResult {\n skill: Skill;\n metadata: {\n sessionId: string;\n distilledAt: string;\n tokenUsage: { input: number; output: number };\n stepsFiltered: number;\n };\n}\n\nexport class Distiller {\n private llmEngine: LLMEngine;\n private preprocessor: ConversationPreprocessor;\n private failedFilter: FailedAttemptFilter;\n private parameterExtractor: ParameterExtractor;\n\n constructor(llmEngine?: LLMEngine) {\n this.llmEngine = llmEngine ?? new LLMEngine();\n this.preprocessor = new ConversationPreprocessor();\n this.failedFilter = new FailedAttemptFilter();\n this.parameterExtractor = new ParameterExtractor();\n }\n\n async distill(session: Session, options: DistillerOptions = {}): Promise<DistillResult> {\n const { userPrompts, skipFailedFilter, verbose } = options;\n\n if (verbose) console.log('Preprocessing conversation...');\n const preprocessed = this.preprocessor.process(session.messages);\n\n let filteredMessages = preprocessed.messages;\n let stepsFiltered = 0;\n\n if (!skipFailedFilter) {\n if (verbose) console.log('Filtering failed attempts...');\n const filterResult = this.failedFilter.filter(preprocessed.messages);\n filteredMessages = filterResult.messages;\n stepsFiltered = filterResult.removedCount;\n }\n\n const filteredSession: Session = {\n ...session,\n messages: filteredMessages,\n };\n\n if (verbose) console.log('Extracting intent...');\n const intent = await this.llmEngine.extractIntent(filteredSession);\n\n if (verbose) console.log('Distilling steps...');\n const stepsResult = await this.llmEngine.distillSteps(filteredSession, intent, userPrompts);\n\n if (verbose) console.log('Extracting parameters...');\n const { steps: parameterizedSteps, parameters } = this.parameterExtractor.extract(\n stepsResult.steps,\n this.convertParameters(stepsResult.parameters)\n );\n\n if (verbose) console.log('Generating description...');\n const description = await this.llmEngine.generateDescription(intent);\n\n const skill = this.assembleSkill(\n intent,\n description,\n parameterizedSteps,\n parameters,\n stepsResult\n );\n\n if (verbose) console.log('Enhancing quality...');\n const enhancedSkill = await this.llmEngine.enhanceQuality(skill);\n\n const tokenUsage = this.llmEngine.getTokenUsage();\n\n return {\n skill: enhancedSkill,\n metadata: {\n sessionId: session.id,\n distilledAt: new Date().toISOString(),\n tokenUsage: {\n input: tokenUsage.inputTokens,\n output: tokenUsage.outputTokens,\n },\n stepsFiltered,\n },\n };\n }\n\n private convertParameters(\n params: { name: string; type: 'string' | 'boolean' | 'number'; description: string; defaultValue?: unknown }[]\n ): SkillParameter[] {\n return params.map((p) => ({\n name: p.name,\n type: p.type,\n description: p.description,\n default: p.defaultValue,\n required: p.defaultValue === undefined,\n }));\n }\n\n private assembleSkill(\n intent: Intent,\n description: string,\n steps: SkillStep[],\n parameters: SkillParameter[],\n stepsResult: StepsResult\n ): Skill {\n return {\n metadata: {\n name: this.generateName(intent),\n description,\n version: '1.0.0',\n },\n overview: intent.goal,\n triggers: intent.triggers,\n prerequisites: stepsResult.prerequisites,\n steps,\n parameters,\n errorHandling: stepsResult.errorHandling,\n examples: this.generateExamples(intent.triggers),\n notes: [],\n };\n }\n\n private generateName(intent: Intent): string {\n const words = intent.goal\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 2)\n .slice(0, 4);\n\n return words.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n }\n\n private generateExamples(triggers: string[]): string[] {\n return triggers.slice(0, 3).map((trigger) => `Help me ${trigger.toLowerCase()}`);\n }\n}\n","import type { ClassifiedPrompt, PromptType } from './types.js';\n\ninterface KeywordPattern {\n keywords: string[];\n type: PromptType;\n}\n\nexport class PromptClassifier {\n private patterns: {\n zh: KeywordPattern[];\n en: KeywordPattern[];\n };\n\n constructor(private language: 'en' | 'zh' = 'zh') {\n this.patterns = {\n zh: [\n // Order matters: more specific patterns (exclude with negation) must come before generic ones\n { keywords: ['不要', '排除', '跳过', '忽略', '不包含', '去掉'], type: 'exclude' },\n { keywords: ['重点', '关注', '强调', '着重', '特别注意'], type: 'focus' },\n { keywords: ['需要', '必须', '兼容', '要求', '确保', '支持'], type: 'constraint' },\n { keywords: ['添加', '补充', '包含', '加入', '增加'], type: 'supplement' },\n { keywords: ['详细', '简洁', '适合', '风格', '形式'], type: 'style' },\n ],\n en: [\n // Order matters: \"don't include\" must be checked before \"include\"\n { keywords: [\"don't include\", 'exclude', 'skip', 'ignore', 'without', 'do not include'], type: 'exclude' },\n { keywords: ['focus', 'emphasize', 'highlight', 'prioritize'], type: 'focus' },\n { keywords: ['must', 'require', 'compatible', 'ensure', 'support'], type: 'constraint' },\n { keywords: ['add', 'include', 'supplement', 'incorporate'], type: 'supplement' },\n { keywords: ['detailed', 'concise', 'style', 'format', 'suitable'], type: 'style' },\n ],\n };\n }\n\n classify(prompt: string): ClassifiedPrompt {\n const lower = prompt.toLowerCase();\n const patterns = this.patterns[this.language];\n\n let matchedType: PromptType = 'supplement';\n let matchedKeywords: string[] = [];\n\n for (const pattern of patterns) {\n const foundKeywords = pattern.keywords.filter((k) => lower.includes(k.toLowerCase()));\n if (foundKeywords.length > 0) {\n matchedType = pattern.type;\n matchedKeywords = foundKeywords;\n break;\n }\n }\n\n const target = this.extractTarget(prompt, matchedKeywords);\n\n return {\n original: prompt,\n type: matchedType,\n keywords: matchedKeywords,\n target,\n };\n }\n\n private extractTarget(prompt: string, keywords: string[]): string | undefined {\n if (!keywords.length) return undefined;\n\n for (const keyword of keywords) {\n const index = prompt.toLowerCase().indexOf(keyword.toLowerCase());\n if (index !== -1) {\n const after = prompt.slice(index + keyword.length).trim();\n const match = after.match(/^[^,。,.!!??]+/);\n if (match) {\n return match[0].trim();\n }\n }\n }\n\n return undefined;\n }\n}\n","import type { ClassifiedPrompt, PromptEffect } from './types.js';\n\nexport class PromptFuser {\n fuse(prompts: ClassifiedPrompt[]): PromptEffect {\n const effect: PromptEffect = {};\n\n for (const prompt of prompts) {\n switch (prompt.type) {\n case 'focus':\n this.applyFocus(prompt, effect);\n break;\n case 'constraint':\n this.applyConstraint(prompt, effect);\n break;\n case 'supplement':\n this.applySupplement(prompt, effect);\n break;\n case 'style':\n this.applyStyle(prompt, effect);\n break;\n case 'exclude':\n this.applyExclude(prompt, effect);\n break;\n }\n }\n\n return effect;\n }\n\n private applyFocus(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.stepWeights) {\n effect.stepWeights = new Map();\n }\n\n if (prompt.target) {\n effect.stepWeights.set(prompt.target.toLowerCase(), 2.0);\n }\n }\n\n private applyConstraint(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.additionalPrerequisites) {\n effect.additionalPrerequisites = [];\n }\n\n effect.additionalPrerequisites.push(prompt.original);\n }\n\n private applySupplement(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.stepEnrichments) {\n effect.stepEnrichments = new Map();\n }\n\n const existing = effect.stepEnrichments.get('additional') ?? [];\n existing.push(prompt.original);\n effect.stepEnrichments.set('additional', existing);\n }\n\n private applyStyle(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n const lower = prompt.original.toLowerCase();\n\n if (lower.includes('详细') || lower.includes('detailed')) {\n effect.verbosityLevel = 'detailed';\n } else if (lower.includes('简洁') || lower.includes('concise')) {\n effect.verbosityLevel = 'minimal';\n } else {\n effect.verbosityLevel = 'standard';\n }\n }\n\n private applyExclude(prompt: ClassifiedPrompt, effect: PromptEffect): void {\n if (!effect.excludePatterns) {\n effect.excludePatterns = [];\n }\n\n if (prompt.target) {\n effect.excludePatterns.push(prompt.target.toLowerCase());\n }\n }\n}\n","import type { ClassifiedPrompt, PromptEffect } from './types.js';\nimport { PromptClassifier } from './classifier.js';\nimport { PromptFuser } from './fuser.js';\n\nexport interface PromptHandlerOptions {\n language?: 'en' | 'zh';\n}\n\nexport class PromptHandler {\n private classifier: PromptClassifier;\n private fuser: PromptFuser;\n\n constructor(options: PromptHandlerOptions = {}) {\n this.classifier = new PromptClassifier(options.language ?? 'zh');\n this.fuser = new PromptFuser();\n }\n\n process(prompts: string[]): PromptEffect {\n const classified = prompts.map((p) => this.classifier.classify(p));\n return this.fuser.fuse(classified);\n }\n\n classify(prompt: string): ClassifiedPrompt {\n return this.classifier.classify(prompt);\n }\n\n toPromptText(prompts: string[]): string {\n if (!prompts.length) return '';\n\n const classified = prompts.map((p) => this.classifier.classify(p));\n\n const sections = {\n focus: classified.filter((c) => c.type === 'focus'),\n constraint: classified.filter((c) => c.type === 'constraint'),\n supplement: classified.filter((c) => c.type === 'supplement'),\n style: classified.filter((c) => c.type === 'style'),\n exclude: classified.filter((c) => c.type === 'exclude'),\n };\n\n const parts: string[] = ['## User Instructions'];\n\n if (sections.focus.length) {\n parts.push('\\n### Focus Areas');\n sections.focus.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.constraint.length) {\n parts.push('\\n### Constraints');\n sections.constraint.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.supplement.length) {\n parts.push('\\n### Additional Content');\n sections.supplement.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.style.length) {\n parts.push('\\n### Output Style');\n sections.style.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n if (sections.exclude.length) {\n parts.push('\\n### Exclusions');\n sections.exclude.forEach((p) => parts.push(`- ${p.original}`));\n }\n\n return parts.join('\\n');\n }\n}\n","import inquirer from 'inquirer';\nimport chalk from 'chalk';\n\nexport interface CollectedPrompts {\n prompts: string[];\n confirmed: boolean;\n}\n\nexport async function collectPromptsInteractively(): Promise<CollectedPrompts> {\n const prompts: string[] = [];\n\n console.log(chalk.cyan('\\n📝 添加附加指令 (可选)'));\n console.log(chalk.gray(' 输入空行完成收集\\n'));\n\n for (;;) {\n const { prompt } = await inquirer.prompt([\n {\n type: 'input',\n name: 'prompt',\n message: '指令:',\n prefix: chalk.yellow('→'),\n },\n ]);\n\n if (!prompt.trim()) {\n break;\n }\n\n prompts.push(prompt.trim());\n }\n\n if (prompts.length === 0) {\n return { prompts: [], confirmed: true };\n }\n\n console.log(chalk.cyan('\\n📋 已收集的指令:'));\n prompts.forEach((p, i) => {\n console.log(chalk.gray(` ${i + 1}. ${p}`));\n });\n\n const { confirm } = await inquirer.prompt([\n {\n type: 'confirm',\n name: 'confirm',\n message: '使用这些指令?',\n default: true,\n },\n ]);\n\n return { prompts, confirmed: confirm };\n}\n\nexport async function selectPromptsFromSuggestions(suggestions: string[]): Promise<string[]> {\n const { selected } = await inquirer.prompt([\n {\n type: 'checkbox',\n name: 'selected',\n message: '选择要应用的指令:',\n choices: suggestions.map((s) => ({ name: s, value: s })),\n },\n ]);\n\n return selected;\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport type { Skill } from '../types/skill.js';\nimport { FrontmatterBuilder } from './frontmatter-builder.js';\nimport { MarkdownRenderer } from './markdown-renderer.js';\nimport { DirectoryBuilder } from './directory-builder.js';\nimport { TemplateValidator, ValidationResult } from './template-validator.js';\nimport { ensureDir } from '../utils/fs.js';\n\nexport interface GenerateOptions {\n outputDir: string;\n overwrite?: boolean;\n includeReferences?: boolean;\n includeExamples?: boolean;\n}\n\nexport interface GenerateResult {\n skillPath: string;\n files: string[];\n validation: ValidationResult;\n}\n\nexport class SkillGenerator {\n private frontmatterBuilder: FrontmatterBuilder;\n private markdownRenderer: MarkdownRenderer;\n private directoryBuilder: DirectoryBuilder;\n private validator: TemplateValidator;\n\n constructor() {\n this.frontmatterBuilder = new FrontmatterBuilder();\n this.markdownRenderer = new MarkdownRenderer();\n this.directoryBuilder = new DirectoryBuilder();\n this.validator = new TemplateValidator();\n }\n\n async generate(skill: Skill, options: GenerateOptions): Promise<GenerateResult> {\n const { outputDir, overwrite = false, includeReferences = true } = options;\n\n const skillDirName = this.toKebabCase(skill.metadata.name);\n const skillDir = join(outputDir, skillDirName);\n\n if (!overwrite && (await this.exists(skillDir))) {\n throw new Error(`Skill directory already exists: ${skillDir}`);\n }\n\n await this.directoryBuilder.create(skillDir, {\n includeReferences,\n includeExamples: options.includeExamples ?? false,\n });\n\n const content = this.renderSkill(skill);\n const validation = this.validator.validate(content, skill);\n\n const skillPath = join(skillDir, 'SKILL.md');\n await fs.writeFile(skillPath, content, 'utf-8');\n\n const files = [skillPath];\n\n if (includeReferences && skill.references?.length) {\n const refPath = await this.generateReferences(skillDir, skill);\n files.push(refPath);\n }\n\n return {\n skillPath,\n files,\n validation,\n };\n }\n\n renderSkill(skill: Skill): string {\n const parts: string[] = [];\n\n parts.push(this.frontmatterBuilder.build(skill.metadata));\n parts.push(this.markdownRenderer.renderTitle(skill.metadata.name));\n parts.push(this.markdownRenderer.renderOverview(skill.overview));\n parts.push(this.markdownRenderer.renderTriggers(skill.triggers));\n\n if (skill.prerequisites.length) {\n parts.push(this.markdownRenderer.renderPrerequisites(skill.prerequisites));\n }\n\n parts.push(this.markdownRenderer.renderSteps(skill.steps));\n\n if (skill.parameters.length) {\n parts.push(this.markdownRenderer.renderParameters(skill.parameters));\n }\n\n if (Object.keys(skill.errorHandling).length) {\n parts.push(this.markdownRenderer.renderErrorHandling(skill.errorHandling));\n }\n\n if (skill.examples.length) {\n parts.push(this.markdownRenderer.renderExamples(skill.examples));\n }\n\n if (skill.references?.length) {\n parts.push(this.markdownRenderer.renderReferences(skill.references));\n }\n\n if (skill.notes?.length) {\n parts.push(this.markdownRenderer.renderNotes(skill.notes));\n }\n\n return parts.join('\\n\\n');\n }\n\n private async generateReferences(skillDir: string, skill: Skill): Promise<string> {\n const refDir = join(skillDir, 'references');\n await ensureDir(refDir);\n\n const patternsPath = join(refDir, 'patterns.md');\n const patternsContent = `# Patterns and Best Practices\n\nThis file contains detailed patterns extracted from the original conversation.\n\n## Common Patterns\n\n${skill.notes?.map((n) => `- ${n}`).join('\\n') || 'No additional patterns documented.'}\n`;\n\n await fs.writeFile(patternsPath, patternsContent, 'utf-8');\n return patternsPath;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n\n private async exists(path: string): Promise<boolean> {\n try {\n await fs.access(path);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import { stringify } from 'yaml';\nimport type { SkillMetadata } from '../types/skill.js';\n\nexport class FrontmatterBuilder {\n build(metadata: SkillMetadata): string {\n const frontmatter: Record<string, string> = {\n name: metadata.name,\n description: metadata.description,\n version: metadata.version,\n };\n\n if (metadata.license) {\n frontmatter.license = metadata.license;\n }\n\n const yaml = stringify(frontmatter, {\n lineWidth: 0,\n defaultStringType: 'PLAIN',\n });\n\n return `---\\n${yaml}---`;\n }\n\n validateDescription(description: string): boolean {\n const thirdPersonStart = description.toLowerCase().startsWith('this skill');\n const hasTriggerPhrases = description.includes('\"') || description.includes(\"'\");\n\n return thirdPersonStart && hasTriggerPhrases;\n }\n}\n","import type { SkillStep, SkillParameter } from '../types/skill.js';\n\nexport class MarkdownRenderer {\n renderTitle(name: string): string {\n return `# ${name}`;\n }\n\n renderOverview(overview: string): string {\n return `## Overview\\n\\n${overview}`;\n }\n\n renderTriggers(triggers: string[]): string {\n const lines = [\"## When This Skill Applies\", '', \"This skill activates when the user's request involves:\"];\n\n triggers.forEach((trigger) => {\n lines.push(`- ${trigger}`);\n });\n\n return lines.join('\\n');\n }\n\n renderPrerequisites(prerequisites: string[]): string {\n const lines = ['## Prerequisites', ''];\n\n prerequisites.forEach((prereq) => {\n lines.push(`- ${prereq}`);\n });\n\n return lines.join('\\n');\n }\n\n renderSteps(steps: SkillStep[]): string {\n const lines = ['## Core Workflow', ''];\n\n steps.forEach((step, index) => {\n lines.push(`### Step ${index + 1}: ${step.title}`);\n lines.push('');\n lines.push(step.description);\n\n if (step.substeps?.length) {\n lines.push('');\n step.substeps.forEach((substep, i) => {\n lines.push(`${i + 1}. ${substep}`);\n });\n }\n\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n renderParameters(parameters: SkillParameter[]): string {\n const lines = [\n '## Parameters',\n '',\n '| Parameter | Type | Default | Description |',\n '|-----------|------|---------|-------------|',\n ];\n\n parameters.forEach((param) => {\n const defaultVal = param.default !== undefined ? `\\`${param.default}\\`` : '-';\n const required = param.required ? ' (required)' : '';\n lines.push(`| \\`${param.name}\\` | ${param.type} | ${defaultVal} | ${param.description}${required} |`);\n });\n\n return lines.join('\\n');\n }\n\n renderErrorHandling(errorHandling: Record<string, string>): string {\n const lines = ['## Error Handling', ''];\n\n Object.entries(errorHandling).forEach(([error, solution]) => {\n lines.push(`- **${error}**: ${solution}`);\n });\n\n return lines.join('\\n');\n }\n\n renderExamples(examples: string[]): string {\n const lines = ['## Example Usage', ''];\n\n examples.forEach((example) => {\n lines.push('```');\n lines.push(example);\n lines.push('```');\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n renderReferences(references: string[]): string {\n const lines = ['## Additional Resources', '', '### Reference Files', ''];\n\n references.forEach((ref) => {\n lines.push(`- **\\`${ref}\\`**`);\n });\n\n return lines.join('\\n');\n }\n\n renderNotes(notes: string[]): string {\n const lines = ['## Notes', ''];\n\n notes.forEach((note) => {\n lines.push(`- ${note}`);\n });\n\n return lines.join('\\n');\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\n\nexport interface DirectoryOptions {\n includeReferences: boolean;\n includeExamples: boolean;\n includeScripts: boolean;\n}\n\nexport class DirectoryBuilder {\n async create(basePath: string, options: Partial<DirectoryOptions> = {}): Promise<void> {\n const { includeReferences = true, includeExamples = false, includeScripts = false } = options;\n\n await fs.mkdir(basePath, { recursive: true });\n\n if (includeReferences) {\n await fs.mkdir(join(basePath, 'references'), { recursive: true });\n }\n\n if (includeExamples) {\n await fs.mkdir(join(basePath, 'examples'), { recursive: true });\n }\n\n if (includeScripts) {\n await fs.mkdir(join(basePath, 'scripts'), { recursive: true });\n }\n }\n\n async listStructure(basePath: string): Promise<string[]> {\n const files: string[] = [];\n\n async function walk(dir: string, prefix: string = '') {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const relativePath = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n if (entry.isDirectory()) {\n files.push(`${relativePath}/`);\n await walk(join(dir, entry.name), relativePath);\n } else {\n files.push(relativePath);\n }\n }\n }\n\n await walk(basePath);\n return files;\n }\n}\n","import type { Skill } from '../types/skill.js';\n\nexport interface ValidationError {\n field: string;\n message: string;\n severity: 'error' | 'warning';\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nexport class TemplateValidator {\n validate(content: string, skill: Skill): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n this.validateFrontmatter(content, skill, errors, warnings);\n this.validateRequiredSections(content, errors);\n this.validateWritingStyle(content, warnings);\n this.validateLength(content, warnings);\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n }\n\n private validateFrontmatter(\n content: string,\n skill: Skill,\n errors: ValidationError[],\n warnings: ValidationError[]\n ): void {\n if (!content.startsWith('---')) {\n errors.push({\n field: 'frontmatter',\n message: 'Missing YAML frontmatter',\n severity: 'error',\n });\n return;\n }\n\n if (!skill.metadata.description.toLowerCase().includes('this skill')) {\n warnings.push({\n field: 'description',\n message: 'Description should start with \"This skill should be used when...\"',\n severity: 'warning',\n });\n }\n\n if (!skill.metadata.description.includes('\"')) {\n warnings.push({\n field: 'description',\n message: 'Description should include specific trigger phrases in quotes',\n severity: 'warning',\n });\n }\n }\n\n private validateRequiredSections(content: string, errors: ValidationError[]): void {\n const requiredSections = [\n { pattern: /^## Overview/m, name: 'Overview' },\n { pattern: /^## (When This Skill Applies|Triggers)/m, name: 'Triggers' },\n { pattern: /^## (Core Workflow|Steps)/m, name: 'Steps' },\n ];\n\n for (const section of requiredSections) {\n if (!section.pattern.test(content)) {\n errors.push({\n field: section.name,\n message: `Missing required section: ${section.name}`,\n severity: 'error',\n });\n }\n }\n }\n\n private validateWritingStyle(content: string, warnings: ValidationError[]): void {\n const secondPersonPatterns = [/\\bYou should\\b/gi, /\\bYou need to\\b/gi, /\\bYou can\\b/gi, /\\bYou must\\b/gi];\n\n for (const pattern of secondPersonPatterns) {\n if (pattern.test(content)) {\n warnings.push({\n field: 'style',\n message: `Avoid second person (\"${pattern.source}\"). Use imperative form instead.`,\n severity: 'warning',\n });\n }\n }\n }\n\n private validateLength(content: string, warnings: ValidationError[]): void {\n const wordCount = content.split(/\\s+/).length;\n\n if (wordCount > 5000) {\n warnings.push({\n field: 'length',\n message: `SKILL.md is too long (${wordCount} words). Consider moving content to references/`,\n severity: 'warning',\n });\n }\n\n if (wordCount < 200) {\n warnings.push({\n field: 'length',\n message: `SKILL.md is very short (${wordCount} words). Consider adding more detail.`,\n severity: 'warning',\n });\n }\n }\n}\n","import { stringify } from 'yaml';\nimport type { Skill, SkillStep, SkillParameter } from '../types/skill.js';\n\nexport interface ConvertOptions {\n includeMetadata?: boolean;\n includeExamples?: boolean;\n verbose?: boolean;\n}\n\nexport class ClaudeFormatter {\n format(skill: Skill, options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(this.formatFrontmatter(skill));\n parts.push(`# ${skill.metadata.name}`);\n parts.push(`## Overview\\n\\n${skill.overview}`);\n parts.push(this.formatTriggers(skill.triggers));\n\n if (skill.prerequisites.length > 0) {\n parts.push(this.formatPrerequisites(skill.prerequisites));\n }\n\n parts.push(this.formatSteps(skill.steps));\n\n if (skill.parameters.length > 0) {\n parts.push(this.formatParameters(skill.parameters));\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push(this.formatErrorHandling(skill.errorHandling));\n }\n\n if (options.includeExamples !== false && skill.examples.length > 0) {\n parts.push(this.formatExamples(skill.examples));\n }\n\n if (skill.notes && skill.notes.length > 0) {\n parts.push(this.formatNotes(skill.notes));\n }\n\n return parts.join('\\n\\n');\n }\n\n private formatFrontmatter(skill: Skill): string {\n const data: Record<string, string> = {\n name: skill.metadata.name,\n description: skill.metadata.description,\n version: skill.metadata.version,\n };\n\n if (skill.metadata.license) {\n data.license = skill.metadata.license;\n }\n\n return `---\\n${stringify(data)}---`;\n }\n\n private formatTriggers(triggers: string[]): string {\n const lines = ['## When This Skill Applies', '', 'This skill activates when:'];\n triggers.forEach((t) => lines.push(`- ${t}`));\n return lines.join('\\n');\n }\n\n private formatPrerequisites(prerequisites: string[]): string {\n const lines = ['## Prerequisites', ''];\n prerequisites.forEach((p) => lines.push(`- ${p}`));\n return lines.join('\\n');\n }\n\n private formatSteps(steps: SkillStep[]): string {\n const lines = ['## Core Workflow', ''];\n\n steps.forEach((step, i) => {\n lines.push(`### Step ${i + 1}: ${step.title}`);\n lines.push('');\n lines.push(step.description);\n\n if (step.substeps?.length) {\n lines.push('');\n step.substeps.forEach((sub, j) => {\n lines.push(`${j + 1}. ${sub}`);\n });\n }\n\n lines.push('');\n });\n\n return lines.join('\\n').trim();\n }\n\n private formatParameters(parameters: SkillParameter[]): string {\n const lines = [\n '## Parameters',\n '',\n '| Parameter | Type | Default | Description |',\n '|-----------|------|---------|-------------|',\n ];\n\n parameters.forEach((p) => {\n const def = p.default !== undefined ? `\\`${p.default}\\`` : '-';\n lines.push(`| \\`${p.name}\\` | ${p.type} | ${def} | ${p.description} |`);\n });\n\n return lines.join('\\n');\n }\n\n private formatErrorHandling(errorHandling: Record<string, string>): string {\n const lines = ['## Error Handling', ''];\n Object.entries(errorHandling).forEach(([error, solution]) => {\n lines.push(`- **${error}**: ${solution}`);\n });\n return lines.join('\\n');\n }\n\n private formatExamples(examples: string[]): string {\n const lines = ['## Example Usage', ''];\n examples.forEach((ex) => {\n lines.push('```');\n lines.push(ex);\n lines.push('```');\n lines.push('');\n });\n return lines.join('\\n').trim();\n }\n\n private formatNotes(notes: string[]): string {\n const lines = ['## Notes', ''];\n notes.forEach((n) => lines.push(`- ${n}`));\n return lines.join('\\n');\n }\n}\n","import { stringify } from 'yaml';\nimport type { Skill } from '../types/skill.js';\nimport type { ConvertOptions } from './claude-formatter.js';\n\nexport class CodexFormatter {\n format(skill: Skill, _options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(this.formatFrontmatter(skill));\n parts.push('# Agent Instructions');\n parts.push('');\n parts.push(skill.overview);\n parts.push('');\n parts.push('## Capabilities');\n parts.push('');\n skill.triggers.forEach((t) => parts.push(`- ${t}`));\n parts.push('');\n parts.push('## Workflow');\n parts.push('');\n skill.steps.forEach((step, i) => {\n parts.push(`${i + 1}. **${step.title}**: ${step.description}`);\n if (step.substeps?.length) {\n step.substeps.forEach((sub) => {\n parts.push(` - ${sub}`);\n });\n }\n });\n\n if (skill.prerequisites.length > 0) {\n parts.push('');\n parts.push('## Prerequisites');\n parts.push('');\n skill.prerequisites.forEach((p) => parts.push(`- ${p}`));\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push('');\n parts.push('## Error Handling');\n parts.push('');\n Object.entries(skill.errorHandling).forEach(([error, solution]) => {\n parts.push(`- ${error}: ${solution}`);\n });\n }\n\n return parts.join('\\n');\n }\n\n private formatFrontmatter(skill: Skill): string {\n const data = {\n name: this.toKebabCase(skill.metadata.name),\n description: skill.metadata.description,\n model: 'o4-mini',\n };\n\n return `---\\n${stringify(data)}---`;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import type { Skill } from '../types/skill.js';\nimport type { ConvertOptions } from './claude-formatter.js';\n\nexport class CursorFormatter {\n format(skill: Skill, _options: ConvertOptions = {}): string {\n const parts: string[] = [];\n\n parts.push(`# ${skill.metadata.name}`);\n parts.push(`# Generated by Skill Distill`);\n parts.push('');\n parts.push('## Overview');\n parts.push('');\n parts.push(skill.overview);\n parts.push('');\n parts.push('## Workflow Rules');\n parts.push('');\n\n skill.steps.forEach((step) => {\n parts.push(`### ${step.title}`);\n parts.push('');\n parts.push(step.description);\n\n if (step.substeps?.length) {\n parts.push('');\n step.substeps.forEach((sub) => {\n parts.push(`- ${sub}`);\n });\n }\n parts.push('');\n });\n\n if (skill.prerequisites.length > 0) {\n parts.push('## Constraints');\n parts.push('');\n skill.prerequisites.forEach((p) => {\n parts.push(`- ${p}`);\n });\n parts.push('');\n }\n\n if (Object.keys(skill.errorHandling).length > 0) {\n parts.push('## Error Handling');\n parts.push('');\n Object.entries(skill.errorHandling).forEach(([error, solution]) => {\n parts.push(`- When encountering \"${error}\": ${solution}`);\n });\n parts.push('');\n }\n\n if (skill.parameters.length > 0) {\n parts.push('## Parameters');\n parts.push('');\n parts.push('The following parameters can be customized:');\n parts.push('');\n skill.parameters.forEach((p) => {\n const def = p.default ? ` (default: ${p.default})` : '';\n parts.push(`- \\`${p.name}\\`: ${p.description}${def}`);\n });\n }\n\n return parts.join('\\n');\n }\n}\n","import type { Skill } from '../types/skill.js';\nimport { ClaudeFormatter, ConvertOptions } from './claude-formatter.js';\nimport { CodexFormatter } from './codex-formatter.js';\nimport { CursorFormatter } from './cursor-formatter.js';\n\nexport type OutputFormat = 'claude' | 'codex' | 'cursor';\n\nexport { ConvertOptions };\n\nexport class FormatConverter {\n private claudeFormatter: ClaudeFormatter;\n private codexFormatter: CodexFormatter;\n private cursorFormatter: CursorFormatter;\n\n constructor() {\n this.claudeFormatter = new ClaudeFormatter();\n this.codexFormatter = new CodexFormatter();\n this.cursorFormatter = new CursorFormatter();\n }\n\n convert(skill: Skill, format: OutputFormat, options?: ConvertOptions): string {\n switch (format) {\n case 'claude':\n return this.toClaudeFormat(skill, options);\n case 'codex':\n return this.toCodexFormat(skill, options);\n case 'cursor':\n return this.toCursorFormat(skill, options);\n default:\n throw new Error(`Unsupported format: ${format}`);\n }\n }\n\n convertAll(skill: Skill, options?: ConvertOptions): Map<OutputFormat, string> {\n const results = new Map<OutputFormat, string>();\n results.set('claude', this.toClaudeFormat(skill, options));\n results.set('codex', this.toCodexFormat(skill, options));\n results.set('cursor', this.toCursorFormat(skill, options));\n return results;\n }\n\n toClaudeFormat(skill: Skill, options?: ConvertOptions): string {\n return this.claudeFormatter.format(skill, options);\n }\n\n toCodexFormat(skill: Skill, options?: ConvertOptions): string {\n return this.codexFormatter.format(skill, options);\n }\n\n toCursorFormat(skill: Skill, options?: ConvertOptions): string {\n return this.cursorFormatter.format(skill, options);\n }\n}\n","export interface FormatValidation {\n valid: boolean;\n format: string;\n errors: string[];\n warnings: string[];\n}\n\nexport class FormatValidator {\n validateClaude(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!content.startsWith('---')) {\n errors.push('Missing YAML frontmatter');\n }\n\n if (!content.includes('name:')) {\n errors.push('Missing name in frontmatter');\n }\n if (!content.includes('description:')) {\n errors.push('Missing description in frontmatter');\n }\n\n if (!content.includes('## Overview')) {\n errors.push('Missing Overview section');\n }\n if (!content.includes('## Core Workflow') && !content.includes('## Steps')) {\n errors.push('Missing Core Workflow section');\n }\n\n if (/\\bYou should\\b/i.test(content)) {\n warnings.push('Avoid \"You should\" - use imperative form');\n }\n\n return {\n valid: errors.length === 0,\n format: 'claude',\n errors,\n warnings,\n };\n }\n\n validateCodex(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (!content.startsWith('---')) {\n errors.push('Missing YAML frontmatter');\n }\n\n if (!content.includes('model:')) {\n warnings.push('Missing model specification');\n }\n\n return {\n valid: errors.length === 0,\n format: 'codex',\n errors,\n warnings,\n };\n }\n\n validateCursor(content: string): FormatValidation {\n const errors: string[] = [];\n const warnings: string[] = [];\n\n if (content.trim().length < 100) {\n warnings.push('Content seems too short');\n }\n\n return {\n valid: errors.length === 0,\n format: 'cursor',\n errors,\n warnings,\n };\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport { SkillGenerator } from '../generators/skill-generator.js';\nimport type { Skill } from '../types/skill.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\n\nexport class ClaudeCodeInstaller extends AgentInstaller {\n private generator: SkillGenerator;\n\n constructor(basePath?: string) {\n super(basePath);\n this.generator = new SkillGenerator();\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.claude', 'plugins', 'local', 'skills');\n }\n\n getPlatformName(): string {\n return 'Claude Code';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false, backup = true, verify = true } = options;\n\n const skillDirName = this.toKebabCase(skill.metadata.name);\n const skillPath = join(this.basePath, skillDirName);\n\n if (await fileExists(skillPath)) {\n if (!overwrite) {\n return {\n success: false,\n path: skillPath,\n message: `Skill already exists: ${skillPath}. Use --overwrite to replace.`,\n };\n }\n\n if (backup) {\n const backupPath = `${skillPath}.backup.${Date.now()}`;\n await fs.rename(skillPath, backupPath);\n }\n }\n\n await ensureDir(this.basePath);\n\n const result = await this.generator.generate(skill, {\n outputDir: this.basePath,\n overwrite: true,\n });\n\n if (verify) {\n const verified = await this.verifyInstallation(skillPath);\n if (!verified) {\n return {\n success: false,\n path: skillPath,\n message: 'Installation verification failed',\n };\n }\n }\n\n return {\n success: true,\n path: result.skillPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(skillName: string): Promise<void> {\n const skillPath = join(this.basePath, this.toKebabCase(skillName));\n\n if (!(await fileExists(skillPath))) {\n throw new Error(`Skill not found: ${skillName}`);\n }\n\n await fs.rm(skillPath, { recursive: true });\n }\n\n async list(): Promise<InstalledSkill[]> {\n const skills: InstalledSkill[] = [];\n\n try {\n const entries = await fs.readdir(this.basePath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillMdPath = join(this.basePath, entry.name, 'SKILL.md');\n\n if (await fileExists(skillMdPath)) {\n const content = await fs.readFile(skillMdPath, 'utf-8');\n const metadata = this.parseMetadata(content);\n const stat = await fs.stat(skillMdPath);\n\n skills.push({\n name: metadata.name ?? entry.name,\n path: join(this.basePath, entry.name),\n version: metadata.version ?? '0.0.0',\n installedAt: stat.mtime.toISOString(),\n });\n }\n }\n } catch {\n // Directory doesn't exist or not readable - return empty list\n }\n\n return skills;\n }\n\n private async verifyInstallation(skillPath: string): Promise<boolean> {\n const skillMd = join(skillPath, 'SKILL.md');\n\n if (!(await fileExists(skillMd))) {\n return false;\n }\n\n const content = await fs.readFile(skillMd, 'utf-8');\n\n if (!content.startsWith('---')) {\n return false;\n }\n\n const metadata = this.parseMetadata(content);\n return !!(metadata.name && metadata.description);\n }\n\n private parseMetadata(content: string): Record<string, string> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n const yaml = match[1];\n const metadata: Record<string, string> = {};\n\n yaml.split('\\n').forEach((line) => {\n const colonIndex = line.indexOf(':');\n if (colonIndex > 0) {\n const key = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n metadata[key] = value;\n }\n });\n\n return metadata;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import type { Skill } from '../types/skill.js';\n\nexport interface InstallOptions {\n overwrite?: boolean;\n backup?: boolean;\n verify?: boolean;\n}\n\nexport interface InstallResult {\n success: boolean;\n path: string;\n message: string;\n backupPath?: string;\n}\n\nexport interface InstalledSkill {\n name: string;\n path: string;\n version: string;\n installedAt: string;\n}\n\nexport abstract class AgentInstaller {\n protected basePath: string;\n\n constructor(basePath?: string) {\n this.basePath = basePath ?? this.getDefaultBasePath();\n }\n\n abstract getDefaultBasePath(): string;\n abstract getPlatformName(): string;\n\n abstract install(skill: Skill, options?: InstallOptions): Promise<InstallResult>;\n abstract uninstall(skillName: string): Promise<void>;\n abstract list(): Promise<InstalledSkill[]>;\n\n async verify(skillName: string): Promise<boolean> {\n const installed = await this.list();\n return installed.some((s) => s.name === skillName);\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { homedir } from 'os';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport type { Skill } from '../types/skill.js';\nimport { ensureDir, fileExists } from '../utils/fs.js';\nimport { FormatConverter } from '../formatters/converter.js';\n\nexport class CodexInstaller extends AgentInstaller {\n private converter: FormatConverter;\n\n constructor(basePath?: string) {\n super(basePath);\n this.converter = new FormatConverter();\n }\n\n getDefaultBasePath(): string {\n return join(homedir(), '.codex', 'agents');\n }\n\n getPlatformName(): string {\n return 'Codex CLI';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false } = options;\n\n const agentName = this.toKebabCase(skill.metadata.name);\n const agentPath = join(this.basePath, `${agentName}.md`);\n\n if ((await fileExists(agentPath)) && !overwrite) {\n return {\n success: false,\n path: agentPath,\n message: `Agent already exists: ${agentPath}`,\n };\n }\n\n await ensureDir(this.basePath);\n\n const content = this.converter.toCodexFormat(skill);\n await fs.writeFile(agentPath, content, 'utf-8');\n\n return {\n success: true,\n path: agentPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(skillName: string): Promise<void> {\n const agentPath = join(this.basePath, `${this.toKebabCase(skillName)}.md`);\n\n if (!(await fileExists(agentPath))) {\n throw new Error(`Agent not found: ${skillName}`);\n }\n\n await fs.unlink(agentPath);\n }\n\n async list(): Promise<InstalledSkill[]> {\n const skills: InstalledSkill[] = [];\n\n try {\n const files = await fs.readdir(this.basePath);\n\n for (const file of files) {\n if (!file.endsWith('.md')) continue;\n\n const agentPath = join(this.basePath, file);\n const stat = await fs.stat(agentPath);\n\n skills.push({\n name: file.replace('.md', ''),\n path: agentPath,\n version: '0.0.0',\n installedAt: stat.mtime.toISOString(),\n });\n }\n } catch {\n // Directory doesn't exist or not readable - return empty list\n }\n\n return skills;\n }\n\n private toKebabCase(str: string): string {\n return str\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n}\n","import { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { AgentInstaller, InstallOptions, InstallResult, InstalledSkill } from './base.js';\nimport type { Skill } from '../types/skill.js';\nimport { fileExists } from '../utils/fs.js';\nimport { FormatConverter } from '../formatters/converter.js';\n\nexport class CursorInstaller extends AgentInstaller {\n private converter: FormatConverter;\n private projectPath: string;\n\n constructor(projectPath: string) {\n super(projectPath);\n this.projectPath = projectPath;\n this.converter = new FormatConverter();\n }\n\n getDefaultBasePath(): string {\n return this.projectPath;\n }\n\n getPlatformName(): string {\n return 'Cursor';\n }\n\n async install(skill: Skill, options: InstallOptions = {}): Promise<InstallResult> {\n const { overwrite = false, backup = true } = options;\n\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (await fileExists(rulesPath)) {\n if (!overwrite) {\n return {\n success: false,\n path: rulesPath,\n message: '.cursorrules already exists. Use --overwrite to replace.',\n };\n }\n\n if (backup) {\n const backupPath = `${rulesPath}.backup.${Date.now()}`;\n await fs.copyFile(rulesPath, backupPath);\n }\n }\n\n const content = this.converter.toCursorFormat(skill);\n await fs.writeFile(rulesPath, content, 'utf-8');\n\n return {\n success: true,\n path: rulesPath,\n message: `Successfully installed to ${this.getPlatformName()}`,\n };\n }\n\n async uninstall(_skillName: string): Promise<void> {\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (!(await fileExists(rulesPath))) {\n throw new Error('.cursorrules not found');\n }\n\n await fs.unlink(rulesPath);\n }\n\n async list(): Promise<InstalledSkill[]> {\n const rulesPath = join(this.basePath, '.cursorrules');\n\n if (!(await fileExists(rulesPath))) {\n return [];\n }\n\n const stat = await fs.stat(rulesPath);\n\n return [\n {\n name: 'cursorrules',\n path: rulesPath,\n version: '0.0.0',\n installedAt: stat.mtime.toISOString(),\n },\n ];\n }\n}\n","import { AgentInstaller } from './base.js';\nimport { ClaudeCodeInstaller } from './claude.js';\nimport { CodexInstaller } from './codex.js';\nimport { CursorInstaller } from './cursor.js';\n\nexport type InstallerPlatform = 'claude' | 'codex' | 'cursor';\n\nexport interface InstallerOptions {\n basePath?: string;\n projectPath?: string;\n}\n\nexport function createInstaller(\n platform: InstallerPlatform,\n options: InstallerOptions = {}\n): AgentInstaller {\n switch (platform) {\n case 'claude':\n return new ClaudeCodeInstaller(options.basePath);\n case 'codex':\n return new CodexInstaller(options.basePath);\n case 'cursor':\n if (!options.projectPath) {\n throw new Error('Cursor installer requires projectPath');\n }\n return new CursorInstaller(options.projectPath);\n default:\n throw new Error(`Unsupported platform: ${platform}`);\n }\n}\n\nexport { AgentInstaller, type InstallOptions, type InstallResult, type InstalledSkill } from './base.js';\nexport { ClaudeCodeInstaller } from './claude.js';\nexport { CodexInstaller } from './codex.js';\nexport { CursorInstaller } from './cursor.js';\n","export * from './types/index.js';\nexport * from './utils/index.js';\nexport * from './loaders/index.js';\nexport * from './core/index.js';\nexport * from './prompt-handler/index.js';\nexport * from './generators/index.js';\nexport * from './formatters/index.js';\nexport * from './installers/index.js';\n\nexport const VERSION = '0.1.0';\n"],"mappings":";AAAA,OAAO,WAAW;AAEX,IAAM,SAAS;AAAA,EACpB,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,KAAK,QAAG,GAAG,GAAG;AAAA,EACvD,SAAS,CAAC,QAAgB,QAAQ,IAAI,MAAM,MAAM,QAAG,GAAG,GAAG;AAAA,EAC3D,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,OAAO,QAAG,GAAG,GAAG;AAAA,EACzD,OAAO,CAAC,QAAgB,QAAQ,IAAI,MAAM,IAAI,QAAG,GAAG,GAAG;AAAA,EACvD,MAAM,CAAC,QAAgB,QAAQ,IAAI,MAAM,KAAK,QAAG,GAAG,GAAG;AACzD;;;ACRA,SAAS,YAAY,UAAU;AAC/B,SAAS,eAAe;AACxB,SAAS,YAAY;AAEd,SAAS,WAAW,MAAsB;AAC/C,MAAI,KAAK,WAAW,GAAG,GAAG;AACxB,WAAO,KAAK,QAAQ,GAAG,KAAK,MAAM,CAAC,CAAC;AAAA,EACtC;AACA,SAAO;AACT;AAEA,eAAsB,UAAU,MAA6B;AAC3D,QAAM,GAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AAC1C;AAEA,eAAsB,WAAW,MAAgC;AAC/D,MAAI;AACF,UAAM,GAAG,OAAO,IAAI;AACpB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,SAAY,MAA0B;AAC1D,QAAM,UAAU,MAAM,GAAG,SAAS,MAAM,OAAO;AAC/C,SAAO,KAAK,MAAM,OAAO;AAC3B;AAEA,eAAsB,UAAU,MAAc,MAA8B;AAC1E,QAAM,GAAG,UAAU,MAAM,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACxD;;;AC/BA,SAAS,SAAS;AAEX,IAAM,kBAAkB,EAAE,OAAO,EAAE,IAAI,GAAG,wBAAwB;AAElE,IAAM,iBAAiB,EAAE,KAAK,CAAC,UAAU,SAAS,QAAQ,CAAC;AAE3D,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,MAAM,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,KAAK,CAAC,UAAU,SAAS,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EAC9D,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,aAAa,EAAE,QAAQ,EAAE,SAAS;AACpC,CAAC;AAEM,SAAS,kBAAkB,IAAqB;AACrD,SAAO,gBAAgB,MAAM,EAAE;AACjC;AAEO,SAAS,iBAAiB,UAAkD;AACjF,SAAO,eAAe,MAAM,QAAQ;AACtC;;;ACtBA,SAAS,YAAYA,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;;;ACcjB,IAAe,gBAAf,MAA6B;AAAA,EACxB;AAAA,EACA;AAAA,EAEV,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,WAAW,QAAQ,YAAY,KAAK,mBAAmB;AAC5D,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA,EAMA,MAAM,mBAAqC;AACzC,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACrC;AACA,UAAM,SAAS,SAAS;AAAA,MACtB,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AACA,WAAO,KAAK,WAAW,OAAO,CAAC,EAAE,EAAE;AAAA,EACrC;AAAA,EAEA,MAAM,eAAe,OAAuC;AAC1D,UAAM,WAAW,MAAM,KAAK,aAAa;AACzC,UAAM,aAAa,MAAM,YAAY;AACrC,WAAO,SAAS;AAAA,MACd,CAAC,MACC,EAAE,SAAS,YAAY,EAAE,SAAS,UAAU,KAC5C,EAAE,YAAY,YAAY,EAAE,SAAS,UAAU;AAAA,IACnD;AAAA,EACF;AACF;;;ADXO,IAAM,sBAAN,cAAkC,cAAc;AAAA,EAC7C;AAAA,EACA;AAAA,EAER,YAAY,UAAgC,CAAC,GAAG;AAC9C,UAAM,OAAO;AACb,UAAM,YAAYC,MAAKC,SAAQ,GAAG,SAAS;AAC3C,SAAK,kBAAkBD,MAAK,WAAW,aAAa;AACpD,SAAK,eAAeA,MAAK,WAAW,UAAU;AAAA,EAChD;AAAA,EAEA,qBAA6B;AAC3B,WAAOA,MAAKC,SAAQ,GAAG,SAAS;AAAA,EAClC;AAAA,EAEA,MAAM,eAAuC;AAC3C,UAAM,WAA0B,CAAC;AAEjC,UAAM,qBAAqB,MAAM,KAAK,uBAAuB;AAC7D,UAAM,kBAAkB,MAAM,KAAK,oBAAoB;AAEvD,aAAS,KAAK,GAAG,oBAAoB,GAAG,eAAe;AAEvD,WAAO,SAAS;AAAA,MACd,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ;AAAA,IAC5E;AAAA,EACF;AAAA,EAEA,MAAc,yBAAiD;AAC7D,UAAM,WAA0B,CAAC;AAEjC,QAAI;AACF,YAAM,QAAQ,MAAMC,IAAG,QAAQ,KAAK,eAAe;AAEnD,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,SAAS,QAAQ,KAAK,CAAC,KAAK,WAAW,MAAM,EAAG;AAE1D,cAAM,WAAWF,MAAK,KAAK,iBAAiB,IAAI;AAChD,cAAM,YAAY,KAAK,QAAQ,UAAU,EAAE;AAE3C,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,mBAAmB,QAAQ;AACtD,cAAI,QAAQ,WAAW,EAAG;AAE1B,gBAAM,eAAe,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM;AAC5D,gBAAM,aAAa,QAAQ,CAAC;AAC5B,gBAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC;AAE5C,mBAAS,KAAK;AAAA,YACZ,IAAI;AAAA,YACJ,aAAa;AAAA,YACb,WAAW,WAAW;AAAA,YACtB,SAAS,UAAU;AAAA,YACnB,cAAc,aAAa;AAAA,YAC3B,SAAS,KAAK,yBAAyB,OAAO;AAAA,UAChD,CAAC;AAAA,QACH,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBAA8C;AAC1D,UAAM,WAA0B,CAAC;AACjC,UAAM,aAAa,oBAAI,IAA2B;AAElD,QAAI;AACF,YAAM,cAAc,MAAME,IAAG,QAAQ,KAAK,YAAY;AAEtD,iBAAW,cAAc,aAAa;AACpC,YAAI,WAAW,WAAW,GAAG,EAAG;AAEhC,cAAM,cAAcF,MAAK,KAAK,cAAc,UAAU;AACtD,cAAM,OAAO,MAAME,IAAG,KAAK,WAAW;AACtC,YAAI,CAAC,KAAK,YAAY,EAAG;AAEzB,cAAM,QAAQ,MAAMA,IAAG,QAAQ,WAAW;AAE1C,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,SAAS,QAAQ,EAAG;AAC9B,cAAI,KAAK,WAAW,QAAQ,EAAG;AAE/B,gBAAM,WAAWF,MAAK,aAAa,IAAI;AACvC,gBAAM,YAAY,KAAK,QAAQ,UAAU,EAAE;AAE3C,qBAAW,IAAI,WAAW;AAAA,YACxB,IAAI;AAAA,YACJ;AAAA,YACA,aAAa,KAAK,kBAAkB,UAAU;AAAA,YAC9C,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AAAA,MACF;AAEA,iBAAW,CAAC,WAAW,MAAM,KAAK,YAAY;AAC5C,YAAI;AACF,gBAAM,UAAU,MAAM,KAAK,gBAAgB,OAAO,QAAQ;AAC1D,cAAI,QAAQ,WAAW,EAAG;AAE1B,gBAAM,eAAe,QAAQ;AAAA,YAC3B,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,SAAS;AAAA,UAClD;AACA,gBAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS;AAE5E,cAAI,WAAW,WAAW,EAAG;AAE7B,mBAAS,KAAK;AAAA,YACZ,IAAI;AAAA,YACJ,aAAa,OAAO;AAAA,YACpB,WAAW,WAAW,CAAC;AAAA,YACvB,SAAS,WAAW,WAAW,SAAS,CAAC;AAAA,YACzC,cAAc,aAAa;AAAA,YAC3B,SAAS,KAAK,sBAAsB,OAAO;AAAA,UAC7C,CAAC;AAAA,QACH,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,IAA8B;AAC7C,UAAM,iBAAiBA,MAAK,KAAK,iBAAiB,GAAG,EAAE,QAAQ;AAC/D,QAAI;AACF,YAAME,IAAG,OAAO,cAAc;AAC9B,YAAM,UAAU,MAAM,KAAK,mBAAmB,cAAc;AAC5D,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,2BAA2B,IAAI,OAAO;AAAA,MACpD;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,cAAc,MAAM,KAAK,uBAAuB,EAAE;AACxD,QAAI,aAAa;AACf,YAAM,UAAU,MAAM,KAAK,gBAAgB,YAAY,QAAQ;AAC/D,aAAO,KAAK,wBAAwB,IAAI,SAAS,YAAY,WAAW;AAAA,IAC1E;AAEA,UAAM,IAAI,MAAM,sBAAsB,EAAE,EAAE;AAAA,EAC5C;AAAA,EAEA,MAAc,uBACZ,WAC2D;AAC3D,QAAI;AACF,YAAM,cAAc,MAAMA,IAAG,QAAQ,KAAK,YAAY;AAEtD,iBAAW,cAAc,aAAa;AACpC,YAAI,WAAW,WAAW,GAAG,EAAG;AAEhC,cAAM,cAAcF,MAAK,KAAK,cAAc,UAAU;AACtD,cAAM,OAAO,MAAME,IAAG,KAAK,WAAW;AACtC,YAAI,CAAC,KAAK,YAAY,EAAG;AAEzB,cAAM,cAAcF,MAAK,aAAa,GAAG,SAAS,QAAQ;AAC1D,YAAI;AACF,gBAAME,IAAG,OAAO,WAAW;AAC3B,iBAAO;AAAA,YACL,UAAU;AAAA,YACV,aAAa,KAAK,kBAAkB,UAAU;AAAA,UAChD;AAAA,QACF,QAAQ;AACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,MAA0C;AACzE,QAAI;AACF,YAAM,UAAU,MAAMA,IAAG,SAAS,MAAM,OAAO;AAC/C,YAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACvD,aAAO,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAoB;AAAA,IAChE,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,gBAAgB,MAAuC;AACnE,QAAI;AACF,YAAM,UAAU,MAAMA,IAAG,SAAS,MAAM,OAAO;AAC/C,YAAM,QAAQ,QAAQ,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACvD,aAAO,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAiB;AAAA,IAC7D,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,2BAA2B,IAAY,SAAqC;AAClF,UAAM,WAAsB,CAAC;AAC7B,QAAI,0BAA0B;AAC9B,QAAI,mBAAyC,CAAC;AAC9C,QAAI,qBAA6C,CAAC;AAClD,QAAI,gBAAgB;AAEpB,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,QAAQ;AACzB,YAAI,2BAA2B,kBAAkB,QAAQ;AACvD,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,SAAS,wBAAwB,KAAK;AAAA,YACtC,WAAW;AAAA,YACX,WAAW,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,YAC5D,aAAa,mBAAmB,SAAS,IAAI,qBAAqB;AAAA,UACpE,CAAC;AACD,oCAA0B;AAC1B,6BAAmB,CAAC;AACpB,+BAAqB,CAAC;AAAA,QACxB;AAEA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,MAAM,WAAW;AAAA,UAC1B,WAAW,MAAM;AAAA,QACnB,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,aAAa;AACrC,oCAA4B,MAAM,WAAW,MAAM;AACnD,wBAAgB,MAAM;AAAA,MACxB,WAAW,MAAM,SAAS,YAAY;AACpC,yBAAiB,KAAK;AAAA,UACpB,MAAM,MAAM,aAAa;AAAA,UACzB,OAAO,MAAM,cAAc,CAAC;AAAA,QAC9B,CAAC;AACD,wBAAgB,MAAM;AAAA,MACxB,WAAW,MAAM,SAAS,eAAe;AACvC,2BAAmB,KAAK;AAAA,UACtB,MAAM,MAAM,aAAa;AAAA,UACzB,QAAQ,MAAM,aAAa,WAAW;AAAA,UACtC,SAAS;AAAA,QACX,CAAC;AACD,wBAAgB,MAAM;AAAA,MACxB;AAAA,IACF;AAEA,QAAI,2BAA2B,kBAAkB,QAAQ;AACvD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,wBAAwB,KAAK;AAAA,QACtC,WAAW;AAAA,QACX,WAAW,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,QAC5D,aAAa,mBAAmB,SAAS,IAAI,qBAAqB;AAAA,MACpE,CAAC;AAAA,IACH;AAEA,UAAM,aAAa,QAAQ,CAAC;AAC5B,UAAM,YAAY,QAAQ,QAAQ,SAAS,CAAC;AAE5C,WAAO;AAAA,MACL;AAAA,MACA,aAAa;AAAA,MACb,WAAW,WAAW;AAAA,MACtB,SAAS,UAAU;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,wBACN,IACA,SACA,aACS;AACT,UAAM,WAAsB,CAAC;AAE7B,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,wBAAyB;AAE5C,UAAI,MAAM,SAAS;AACjB,cAAM,UAAU,KAAK,sBAAsB,MAAM,QAAQ,OAAO;AAChE,YAAI,SAAS;AACX,mBAAS,KAAK;AAAA,YACZ,MAAM,MAAM,QAAQ,SAAS,SAAS,SAAS;AAAA,YAC/C;AAAA,YACA,WAAW,MAAM;AAAA,UACnB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS;AAE5E,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,WAAW,WAAW,CAAC,KAAK;AAAA,MAC5B,SAAS,WAAW,WAAW,SAAS,CAAC,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,sBACN,SACQ;AACR,QAAI,OAAO,YAAY,UAAU;AAC/B,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,aAAO,QACJ,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,IAAI,EACzC,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,IAAI;AAAA,IACd;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,SAAyB;AACjD,WAAO,QAAQ,QAAQ,MAAM,GAAG,EAAE,QAAQ,OAAO,EAAE;AAAA,EACrD;AAAA,EAEQ,yBAAyB,SAAoC;AACnE,UAAM,iBAAiB,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAC5D,QAAI,CAAC,gBAAgB,QAAS,QAAO;AAErC,UAAM,UAAU,eAAe;AAC/B,UAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,CAAC;AACvC,WAAO,UAAU,SAAS,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,QAAQ;AAAA,EAClE;AAAA,EAEQ,sBAAsB,SAAiC;AAC7D,UAAM,iBAAiB,QAAQ;AAAA,MAC7B,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,SAAS;AAAA,IAClD;AACA,QAAI,CAAC,gBAAgB,QAAS,QAAO;AAErC,UAAM,UAAU,KAAK,sBAAsB,eAAe,QAAQ,OAAO;AACzE,UAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,CAAC;AACvC,WAAO,UAAU,SAAS,KAAK,UAAU,MAAM,GAAG,EAAE,IAAI,QAAQ;AAAA,EAClE;AACF;;;AE7XA,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAIjB,IAAM,qBAAN,cAAiC,cAAc;AAAA,EACpD,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,UAAU,SAAS;AAAA,EAC5C;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAAW,KAA+B;AAC9C,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACF;;;ACjBA,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAIjB,IAAM,sBAAN,cAAkC,cAAc;AAAA,EACrD,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,WAAW,kBAAkB;AAAA,EACtD;AAAA,EAEA,MAAM,eAAuC;AAC3C,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,WAAW,KAA+B;AAC9C,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACF;;;ACVO,SAAS,oBACd,UACA,SACe;AACf,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,oBAAoB,OAAO;AAAA,IACxC,KAAK;AACH,aAAO,IAAI,mBAAmB,OAAO;AAAA,IACvC,KAAK;AACH,aAAO,IAAI,oBAAoB,OAAO;AAAA,IACxC;AACE,YAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,EACvD;AACF;;;ACrBA,OAAO,eAAe;AACtB,SAAS,KAAAC,UAAS;;;ACDX,IAAM,iBAAiB;AAEvB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQvB,IAAM,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO5B,SAAS,iBAAiB,cAA8B;AAC7D,SAAO;AAAA;AAAA;AAAA,EAGP,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqBd;AAEO,SAAS,iBACd,cACA,QACA,qBACQ;AACR,SAAO;AAAA;AAAA;AAAA,EAGP,OAAO,IAAI;AAAA;AAAA;AAAA;AAAA,EAIX,OAAO,OAAO;AAAA;AAAA;AAAA;AAAA,EAId,YAAY;AAAA;AAAA,EAEZ,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuCrB;AAEO,SAAS,mBAAmB,WAA2B;AAC5D,SAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYX;AAEO,SAAS,sBAAsB,QAAsD;AAC1F,SAAO;AAAA;AAAA,QAED,OAAO,IAAI;AAAA,mBACA,OAAO,SAAS,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW7C;;;ADlIA,IAAM,eAAeC,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO,EAAE,SAAS,yBAAyB;AAAA,EACnD,SAASA,GAAE,OAAO,EAAE,SAAS,sBAAsB;AAAA,EACnD,SAASA,GAAE,OAAO,EAAE,SAAS,kBAAkB;AAAA,EAC/C,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS,sBAAsB;AAAA,EAC7D,UAAUA,GAAE,OAAO,EAAE,SAAS,eAAe;AAC/C,CAAC;AAED,IAAM,aAAaA,GAAE,OAAO;AAAA,EAC1B,OAAOA,GAAE,OAAO;AAAA,EAChB,aAAaA,GAAE,OAAO;AAAA,EACtB,UAAUA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,WAAWA,GAAE,QAAQ;AAAA,EACrB,WAAWA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,SAAS;AAC1C,CAAC;AAED,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACjC,OAAOA,GAAE,MAAM,UAAU;AAAA,EACzB,YAAYA,GAAE;AAAA,IACZA,GAAE,OAAO;AAAA,MACP,MAAMA,GAAE,OAAO;AAAA,MACf,MAAMA,GAAE,KAAK,CAAC,UAAU,WAAW,QAAQ,CAAC;AAAA,MAC5C,aAAaA,GAAE,OAAO;AAAA,MACtB,cAAcA,GAAE,QAAQ,EAAE,SAAS;AAAA,IACrC,CAAC;AAAA,EACH;AAAA,EACA,eAAeA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAAA,EACjC,eAAeA,GAAE,OAAOA,GAAE,OAAO,CAAC;AACpC,CAAC;AAiBM,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAyB,EAAE,aAAa,GAAG,cAAc,EAAE;AAAA,EAEnE,YAAY,UAA4B,CAAC,GAAG;AAC1C,SAAK,SAAS,IAAI,UAAU;AAAA,MAC1B,QAAQ,QAAQ,UAAU,QAAQ,IAAI;AAAA,IACxC,CAAC;AACD,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,YAAY,QAAQ,aAAa;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,SAAmC;AACrD,UAAM,mBAAmB,KAAK,mBAAmB,QAAQ,QAAQ;AAEjE,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,iBAAiB,gBAAgB;AAAA,MACjC;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAU,YAAY;AAAA,EAC9C;AAAA,EAEA,MAAM,aACJ,SACA,QACA,aACsB;AACtB,UAAM,mBAAmB,KAAK,mBAAmB,QAAQ,QAAQ;AAEjE,UAAM,kBAAkB,aAAa,SACjC;AAAA;AAAA;AAAA,EAAsC,YAAY,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC,KACjF;AAEJ,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,iBAAiB,kBAAkB,QAAQ,eAAe;AAAA,MAC1D;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAU,iBAAiB;AAAA,EACnD;AAAA,EAEA,MAAM,eAAe,OAAuC;AAC1D,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,mBAAmB,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,MACjD;AAAA,IACV;AAEA,WAAO,KAAK,UAAU,UAAUA,GAAE,IAAI,CAAC;AAAA,EACzC;AAAA,EAEA,MAAM,oBAAoB,QAAiC;AACzD,UAAM,WAAW,MAAM,KAAK;AAAA,MAClB,sBAAsB,MAAM;AAAA,MAC5B;AAAA,IACV;AAEA,WAAO,SAAS,KAAK;AAAA,EACvB;AAAA,EAEA,MAAM,KAAK,QAAgB,QAAkC;AAC3D,UAAM,WAAW,MAAM,KAAK,UAAU,YAAY;AAChD,aAAO,KAAK,OAAO,SAAS,OAAO;AAAA,QACjC,OAAO,KAAK;AAAA,QACZ,YAAY,KAAK;AAAA,QACjB,QAAQ,UAAkB;AAAA,QAC1B,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,SAAK,WAAW,eAAe,SAAS,MAAM;AAC9C,SAAK,WAAW,gBAAgB,SAAS,MAAM;AAE/C,UAAM,YAAY,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAChE,QAAI,CAAC,aAAa,UAAU,SAAS,QAAQ;AAC3C,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,WAAO,UAAU;AAAA,EACnB;AAAA,EAEA,gBAA4B;AAC1B,WAAO,EAAE,GAAG,KAAK,WAAW;AAAA,EAC9B;AAAA,EAEQ,mBAAmB,UAA6B;AACtD,WAAO,SACJ,IAAI,CAAC,MAAM;AACV,YAAM,OAAO,EAAE,SAAS,SAAS,SAAS;AAC1C,UAAI,UAAU,IAAI,IAAI,MAAM,EAAE,OAAO;AAErC,UAAI,EAAE,WAAW,QAAQ;AACvB,mBAAW;AAAA,kBAAqB,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3E;AAEA,aAAO;AAAA,IACT,CAAC,EACA,KAAK,MAAM;AAAA,EAChB;AAAA,EAEQ,UAAa,MAAc,QAA2B;AAC5D,UAAM,YAAY,KAAK,MAAM,4BAA4B,KAAK,KAAK,MAAM,aAAa;AAEtF,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAEA,UAAM,UAAU,UAAU,CAAC,KAAK,UAAU,CAAC;AAC3C,UAAM,SAAS,KAAK,MAAM,OAAO;AAEjC,WAAO,OAAO,MAAM,MAAM;AAAA,EAC5B;AAAA,EAEA,MAAc,UAAa,IAAsB,aAAa,GAAG,QAAQ,KAAkB;AACzF,QAAI;AAEJ,aAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAI;AACF,eAAO,MAAM,GAAG;AAAA,MAClB,SAAS,OAAO;AACd,oBAAY;AAEZ,YAAI,iBAAiB,UAAU,gBAAgB;AAC7C,gBAAM,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC;AAAA,QACtC,WAAW,iBAAiB,UAAU,UAAU;AAC9C,gBAAM,KAAK,MAAM,SAAS,IAAI,EAAE;AAAA,QAClC,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AAAA,EAEQ,MAAM,IAA2B;AACvC,WAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AAAA,EACzD;AACF;;;AE/KO,IAAM,2BAAN,MAA+B;AAAA,EAC5B,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEQ,kBAAkB;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,QAAQ,UAAuC;AAC7C,QAAI,YAAY;AAChB,QAAI,gBAAgB;AAEpB,UAAM,YAAY,SAAS,IAAI,CAAC,QAAQ;AACtC,UAAI,IAAI,SAAS,QAAQ;AACvB;AAAA,MACF;AAEA,YAAM,gBAAgB,IAAI,WAAW,UAAU,KAAK;AACpD,UAAI,cAAc;AAChB,yBAAiB,IAAI,UAAW;AAAA,MAClC;AAEA,YAAM,aAAa,KAAK,kBAAkB,IAAI,OAAO;AAErD,aAAO;AAAA,QACL,GAAG;AAAA,QACH;AAAA,QACA;AAAA,QACA,eAAe,WAAW,SAAS;AAAA,QACnC;AAAA,QACA,WAAW,KAAK,iBAAiB,IAAI,OAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,UAAU;AAAA,MACV,YAAY;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAA2B;AACnD,UAAM,QAAQ;AACd,UAAM,SAAmB,CAAC;AAC1B,QAAI;AAEJ,YAAQ,QAAQ,MAAM,KAAK,OAAO,OAAO,MAAM;AAC7C,aAAO,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC;AAAA,IAC7B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,SAAsD;AAC7E,UAAM,QAAQ,QAAQ,YAAY;AAElC,UAAM,cAAc,KAAK,gBAAgB,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AACtE,UAAM,cAAc,KAAK,gBAAgB,KAAK,CAAC,MAAM,MAAM,SAAS,CAAC,CAAC;AAEtE,QAAI,eAAe,CAAC,YAAa,QAAO;AACxC,QAAI,YAAa,QAAO;AACxB,WAAO;AAAA,EACT;AACF;;;AC7FO,IAAM,sBAAN,MAA0B;AAAA,EACvB,oBAAoB;AAAA,IAC1B,aAAa;AAAA,MACX;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,IACA,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,cAAc,CAAC,SAAS,UAAU,aAAa,aAAa,mBAAmB;AAAA,EACjF;AAAA,EAEA,OAAO,UAA4C;AACjD,UAAM,cAAc,KAAK,oBAAoB,QAAQ;AAErD,UAAM,WAAW,SAAS,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,IAAI,SAAS,CAAC;AAEzE,WAAO;AAAA,MACL,UAAU;AAAA,MACV,cAAc,SAAS,SAAS,SAAS;AAAA,MACzC,cAAc,MAAM,KAAK,WAAW;AAAA,IACtC;AAAA,EACF;AAAA,EAEQ,oBAAoB,UAA2C;AACrE,UAAM,cAAc,oBAAI,IAAY;AAEpC,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,YAAM,MAAM,SAAS,CAAC;AACtB,YAAM,UAAU,SAAS,IAAI,CAAC;AAE9B,UAAI,IAAI,SAAS,UAAU,KAAK,iBAAiB,IAAI,SAAS,aAAa,GAAG;AAC5E,YAAI,IAAI,YAAY,GAAG;AACrB,sBAAY,IAAI,IAAI,YAAY,CAAC;AAAA,QACnC;AAAA,MACF;AAEA,UAAI,IAAI,SAAS,eAAe,KAAK,iBAAiB,IAAI,SAAS,kBAAkB,GAAG;AACtF,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,aAAa,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG;AAC5C,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,aAAa,KAAK,CAAC,MAAM,KAAK,iBAAiB,EAAE,QAAQ,cAAc,CAAC,GAAG;AACjF,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAEA,UAAI,IAAI,SAAS,UAAU,SAAS,SAAS,QAAQ;AACnD,oBAAY,IAAI,IAAI,SAAS;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBACN,SACA,YACS;AACT,UAAM,QAAQ,QAAQ,YAAY;AAClC,WAAO,KAAK,kBAAkB,UAAU,EAAE,KAAK,CAAC,WAAW,MAAM,SAAS,OAAO,YAAY,CAAC,CAAC;AAAA,EACjG;AACF;;;ACrFO,IAAM,qBAAN,MAAyB;AAAA,EACtB,WAAW;AAAA,IACjB,EAAE,OAAO,oDAAoD,MAAM,OAAgB;AAAA,IACnF,EAAE,OAAO,+CAA+C,MAAM,YAAqB;AAAA,IACnF;AAAA,MACE,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,EAAE,OAAO,eAAe,MAAM,OAAgB;AAAA,IAC9C,EAAE,OAAO,sBAAsB,MAAM,MAAe;AAAA,EACtD;AAAA,EAEA,QAAQ,OAAwB,gBAAiD;AAC/E,UAAM,kBAAkB,oBAAI,IAA4B;AAExD,mBAAe,QAAQ,CAAC,MAAM;AAC5B,sBAAgB,IAAI,EAAE,MAAM;AAAA,QAC1B,GAAG;AAAA,QACH,UAAU,EAAE,YAAY;AAAA,MAC1B,CAAC;AAAA,IACH,CAAC;AAED,UAAM,iBAA8B,MACjC,OAAO,CAAC,MAAM,EAAE,SAAS,EACzB,IAAI,CAAC,SAAS;AACb,UAAI,cAAc,KAAK;AAEvB,iBAAW,WAAW,KAAK,UAAU;AACnC,cAAM,UAAU,YAAY,MAAM,QAAQ,KAAK;AAC/C,YAAI,SAAS;AACX,qBAAW,SAAS,SAAS;AAC3B,kBAAM,YAAY,KAAK,kBAAkB,OAAO,QAAQ,IAAI;AAE5D,gBAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACnC,8BAAgB,IAAI,WAAW;AAAA,gBAC7B,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,aAAa,GAAG,QAAQ,IAAI;AAAA,gBAC5B,SAAS;AAAA,gBACT,UAAU;AAAA,cACZ,CAAC;AAAA,YACH;AAEA,0BAAc,YAAY,QAAQ,OAAO,IAAI,SAAS,GAAG;AAAA,UAC3D;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,QACL,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,CAAC;AAEH,WAAO;AAAA,MACL,OAAO;AAAA,MACP,YAAY,MAAM,KAAK,gBAAgB,OAAO,CAAC;AAAA,IACjD;AAAA,EACF;AAAA,EAEQ,kBAAkB,OAAe,MAAsB;AAC7D,YAAQ,MAAM;AAAA,MACZ,KAAK,QAAQ;AACX,cAAM,WAAW,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AAC3C,eAAO,GAAG,SAAS,QAAQ,UAAU,EAAE,CAAC;AAAA,MAC1C;AAAA,MACA,KAAK,aAAa;AAChB,cAAM,UAAU,MAAM,MAAM,GAAG,EAAE,IAAI,KAAK;AAC1C,eAAO,GAAG,OAAO;AAAA,MACnB;AAAA,MACA,KAAK;AACH,eAAO,MAAM,YAAY,EAAE,QAAQ,4BAA4B,EAAE,IAAI;AAAA,MACvE,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO;AAAA,MACT;AACE,eAAO,SAAS,IAAI;AAAA,IACxB;AAAA,EACF;AACF;;;AClEO,IAAM,YAAN,MAAgB;AAAA,EACb;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,WAAuB;AACjC,SAAK,YAAY,aAAa,IAAI,UAAU;AAC5C,SAAK,eAAe,IAAI,yBAAyB;AACjD,SAAK,eAAe,IAAI,oBAAoB;AAC5C,SAAK,qBAAqB,IAAI,mBAAmB;AAAA,EACnD;AAAA,EAEA,MAAM,QAAQ,SAAkB,UAA4B,CAAC,GAA2B;AACtF,UAAM,EAAE,aAAa,kBAAkB,QAAQ,IAAI;AAEnD,QAAI,QAAS,SAAQ,IAAI,+BAA+B;AACxD,UAAM,eAAe,KAAK,aAAa,QAAQ,QAAQ,QAAQ;AAE/D,QAAI,mBAAmB,aAAa;AACpC,QAAI,gBAAgB;AAEpB,QAAI,CAAC,kBAAkB;AACrB,UAAI,QAAS,SAAQ,IAAI,8BAA8B;AACvD,YAAM,eAAe,KAAK,aAAa,OAAO,aAAa,QAAQ;AACnE,yBAAmB,aAAa;AAChC,sBAAgB,aAAa;AAAA,IAC/B;AAEA,UAAM,kBAA2B;AAAA,MAC/B,GAAG;AAAA,MACH,UAAU;AAAA,IACZ;AAEA,QAAI,QAAS,SAAQ,IAAI,sBAAsB;AAC/C,UAAM,SAAS,MAAM,KAAK,UAAU,cAAc,eAAe;AAEjE,QAAI,QAAS,SAAQ,IAAI,qBAAqB;AAC9C,UAAM,cAAc,MAAM,KAAK,UAAU,aAAa,iBAAiB,QAAQ,WAAW;AAE1F,QAAI,QAAS,SAAQ,IAAI,0BAA0B;AACnD,UAAM,EAAE,OAAO,oBAAoB,WAAW,IAAI,KAAK,mBAAmB;AAAA,MACxE,YAAY;AAAA,MACZ,KAAK,kBAAkB,YAAY,UAAU;AAAA,IAC/C;AAEA,QAAI,QAAS,SAAQ,IAAI,2BAA2B;AACpD,UAAM,cAAc,MAAM,KAAK,UAAU,oBAAoB,MAAM;AAEnE,UAAM,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAS,SAAQ,IAAI,sBAAsB;AAC/C,UAAM,gBAAgB,MAAM,KAAK,UAAU,eAAe,KAAK;AAE/D,UAAM,aAAa,KAAK,UAAU,cAAc;AAEhD,WAAO;AAAA,MACL,OAAO;AAAA,MACP,UAAU;AAAA,QACR,WAAW,QAAQ;AAAA,QACnB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,YAAY;AAAA,UACV,OAAO,WAAW;AAAA,UAClB,QAAQ,WAAW;AAAA,QACrB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBACN,QACkB;AAClB,WAAO,OAAO,IAAI,CAAC,OAAO;AAAA,MACxB,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,SAAS,EAAE;AAAA,MACX,UAAU,EAAE,iBAAiB;AAAA,IAC/B,EAAE;AAAA,EACJ;AAAA,EAEQ,cACN,QACA,aACA,OACA,YACA,aACO;AACP,WAAO;AAAA,MACL,UAAU;AAAA,QACR,MAAM,KAAK,aAAa,MAAM;AAAA,QAC9B;AAAA,QACA,SAAS;AAAA,MACX;AAAA,MACA,UAAU,OAAO;AAAA,MACjB,UAAU,OAAO;AAAA,MACjB,eAAe,YAAY;AAAA,MAC3B;AAAA,MACA;AAAA,MACA,eAAe,YAAY;AAAA,MAC3B,UAAU,KAAK,iBAAiB,OAAO,QAAQ;AAAA,MAC/C,OAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEQ,aAAa,QAAwB;AAC3C,UAAM,QAAQ,OAAO,KAClB,YAAY,EACZ,QAAQ,gBAAgB,EAAE,EAC1B,MAAM,KAAK,EACX,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,EAC1B,MAAM,GAAG,CAAC;AAEb,WAAO,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,EAC1E;AAAA,EAEQ,iBAAiB,UAA8B;AACrD,WAAO,SAAS,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,WAAW,QAAQ,YAAY,CAAC,EAAE;AAAA,EACjF;AACF;;;AC9IO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,YAAoB,WAAwB,MAAM;AAA9B;AAClB,SAAK,WAAW;AAAA,MACd,IAAI;AAAA;AAAA,QAEF,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,sBAAO,cAAI,GAAG,MAAM,UAAU;AAAA,QACnE,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,0BAAM,GAAG,MAAM,QAAQ;AAAA,QAC5D,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,aAAa;AAAA,QACrE,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,aAAa;AAAA,QAC/D,EAAE,UAAU,CAAC,gBAAM,gBAAM,gBAAM,gBAAM,cAAI,GAAG,MAAM,QAAQ;AAAA,MAC5D;AAAA,MACA,IAAI;AAAA;AAAA,QAEF,EAAE,UAAU,CAAC,iBAAiB,WAAW,QAAQ,UAAU,WAAW,gBAAgB,GAAG,MAAM,UAAU;AAAA,QACzG,EAAE,UAAU,CAAC,SAAS,aAAa,aAAa,YAAY,GAAG,MAAM,QAAQ;AAAA,QAC7E,EAAE,UAAU,CAAC,QAAQ,WAAW,cAAc,UAAU,SAAS,GAAG,MAAM,aAAa;AAAA,QACvF,EAAE,UAAU,CAAC,OAAO,WAAW,cAAc,aAAa,GAAG,MAAM,aAAa;AAAA,QAChF,EAAE,UAAU,CAAC,YAAY,WAAW,SAAS,UAAU,UAAU,GAAG,MAAM,QAAQ;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAAA,EAxBQ;AAAA,EA0BR,SAAS,QAAkC;AACzC,UAAM,QAAQ,OAAO,YAAY;AACjC,UAAM,WAAW,KAAK,SAAS,KAAK,QAAQ;AAE5C,QAAI,cAA0B;AAC9B,QAAI,kBAA4B,CAAC;AAEjC,eAAW,WAAW,UAAU;AAC9B,YAAM,gBAAgB,QAAQ,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS,EAAE,YAAY,CAAC,CAAC;AACpF,UAAI,cAAc,SAAS,GAAG;AAC5B,sBAAc,QAAQ;AACtB,0BAAkB;AAClB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,cAAc,QAAQ,eAAe;AAEzD,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,QAAgB,UAAwC;AAC5E,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,eAAW,WAAW,UAAU;AAC9B,YAAM,QAAQ,OAAO,YAAY,EAAE,QAAQ,QAAQ,YAAY,CAAC;AAChE,UAAI,UAAU,IAAI;AAChB,cAAM,QAAQ,OAAO,MAAM,QAAQ,QAAQ,MAAM,EAAE,KAAK;AACxD,cAAM,QAAQ,MAAM,MAAM,eAAe;AACzC,YAAI,OAAO;AACT,iBAAO,MAAM,CAAC,EAAE,KAAK;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC1EO,IAAM,cAAN,MAAkB;AAAA,EACvB,KAAK,SAA2C;AAC9C,UAAM,SAAuB,CAAC;AAE9B,eAAW,UAAU,SAAS;AAC5B,cAAQ,OAAO,MAAM;AAAA,QACnB,KAAK;AACH,eAAK,WAAW,QAAQ,MAAM;AAC9B;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,QAAQ,MAAM;AACnC;AAAA,QACF,KAAK;AACH,eAAK,gBAAgB,QAAQ,MAAM;AACnC;AAAA,QACF,KAAK;AACH,eAAK,WAAW,QAAQ,MAAM;AAC9B;AAAA,QACF,KAAK;AACH,eAAK,aAAa,QAAQ,MAAM;AAChC;AAAA,MACJ;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,QAA0B,QAA4B;AACvE,QAAI,CAAC,OAAO,aAAa;AACvB,aAAO,cAAc,oBAAI,IAAI;AAAA,IAC/B;AAEA,QAAI,OAAO,QAAQ;AACjB,aAAO,YAAY,IAAI,OAAO,OAAO,YAAY,GAAG,CAAG;AAAA,IACzD;AAAA,EACF;AAAA,EAEQ,gBAAgB,QAA0B,QAA4B;AAC5E,QAAI,CAAC,OAAO,yBAAyB;AACnC,aAAO,0BAA0B,CAAC;AAAA,IACpC;AAEA,WAAO,wBAAwB,KAAK,OAAO,QAAQ;AAAA,EACrD;AAAA,EAEQ,gBAAgB,QAA0B,QAA4B;AAC5E,QAAI,CAAC,OAAO,iBAAiB;AAC3B,aAAO,kBAAkB,oBAAI,IAAI;AAAA,IACnC;AAEA,UAAM,WAAW,OAAO,gBAAgB,IAAI,YAAY,KAAK,CAAC;AAC9D,aAAS,KAAK,OAAO,QAAQ;AAC7B,WAAO,gBAAgB,IAAI,cAAc,QAAQ;AAAA,EACnD;AAAA,EAEQ,WAAW,QAA0B,QAA4B;AACvE,UAAM,QAAQ,OAAO,SAAS,YAAY;AAE1C,QAAI,MAAM,SAAS,cAAI,KAAK,MAAM,SAAS,UAAU,GAAG;AACtD,aAAO,iBAAiB;AAAA,IAC1B,WAAW,MAAM,SAAS,cAAI,KAAK,MAAM,SAAS,SAAS,GAAG;AAC5D,aAAO,iBAAiB;AAAA,IAC1B,OAAO;AACL,aAAO,iBAAiB;AAAA,IAC1B;AAAA,EACF;AAAA,EAEQ,aAAa,QAA0B,QAA4B;AACzE,QAAI,CAAC,OAAO,iBAAiB;AAC3B,aAAO,kBAAkB,CAAC;AAAA,IAC5B;AAEA,QAAI,OAAO,QAAQ;AACjB,aAAO,gBAAgB,KAAK,OAAO,OAAO,YAAY,CAAC;AAAA,IACzD;AAAA,EACF;AACF;;;ACtEO,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA;AAAA,EAER,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,aAAa,IAAI,iBAAiB,QAAQ,YAAY,IAAI;AAC/D,SAAK,QAAQ,IAAI,YAAY;AAAA,EAC/B;AAAA,EAEA,QAAQ,SAAiC;AACvC,UAAM,aAAa,QAAQ,IAAI,CAAC,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AACjE,WAAO,KAAK,MAAM,KAAK,UAAU;AAAA,EACnC;AAAA,EAEA,SAAS,QAAkC;AACzC,WAAO,KAAK,WAAW,SAAS,MAAM;AAAA,EACxC;AAAA,EAEA,aAAa,SAA2B;AACtC,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,UAAM,aAAa,QAAQ,IAAI,CAAC,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC;AAEjE,UAAM,WAAW;AAAA,MACf,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,MAClD,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAC5D,YAAY,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,YAAY;AAAA,MAC5D,OAAO,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO;AAAA,MAClD,SAAS,WAAW,OAAO,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,IACxD;AAEA,UAAM,QAAkB,CAAC,sBAAsB;AAE/C,QAAI,SAAS,MAAM,QAAQ;AACzB,YAAM,KAAK,mBAAmB;AAC9B,eAAS,MAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7D;AAEA,QAAI,SAAS,WAAW,QAAQ;AAC9B,YAAM,KAAK,mBAAmB;AAC9B,eAAS,WAAW,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClE;AAEA,QAAI,SAAS,WAAW,QAAQ;AAC9B,YAAM,KAAK,0BAA0B;AACrC,eAAS,WAAW,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAClE;AAEA,QAAI,SAAS,MAAM,QAAQ;AACzB,YAAM,KAAK,oBAAoB;AAC/B,eAAS,MAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC7D;AAEA,QAAI,SAAS,QAAQ,QAAQ;AAC3B,YAAM,KAAK,kBAAkB;AAC7B,eAAS,QAAQ,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,EAAE,QAAQ,EAAE,CAAC;AAAA,IAC/D;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACpEA,OAAO,cAAc;AACrB,OAAOC,YAAW;AAOlB,eAAsB,8BAAyD;AAC7E,QAAM,UAAoB,CAAC;AAE3B,UAAQ,IAAIA,OAAM,KAAK,iEAAkB,CAAC;AAC1C,UAAQ,IAAIA,OAAM,KAAK,sDAAc,CAAC;AAEtC,aAAS;AACP,UAAM,EAAE,OAAO,IAAI,MAAM,SAAS,OAAO;AAAA,MACvC;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQA,OAAM,OAAO,QAAG;AAAA,MAC1B;AAAA,IACF,CAAC;AAED,QAAI,CAAC,OAAO,KAAK,GAAG;AAClB;AAAA,IACF;AAEA,YAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,EAC5B;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,SAAS,CAAC,GAAG,WAAW,KAAK;AAAA,EACxC;AAEA,UAAQ,IAAIA,OAAM,KAAK,mDAAc,CAAC;AACtC,UAAQ,QAAQ,CAAC,GAAG,MAAM;AACxB,YAAQ,IAAIA,OAAM,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAAA,EAC5C,CAAC;AAED,QAAM,EAAE,QAAQ,IAAI,MAAM,SAAS,OAAO;AAAA,IACxC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF,CAAC;AAED,SAAO,EAAE,SAAS,WAAW,QAAQ;AACvC;AAEA,eAAsB,6BAA6B,aAA0C;AAC3F,QAAM,EAAE,SAAS,IAAI,MAAM,SAAS,OAAO;AAAA,IACzC;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,MACT,SAAS,YAAY,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE;AAAA,IACzD;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AC/DA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;;;ACDrB,SAAS,iBAAiB;AAGnB,IAAM,qBAAN,MAAyB;AAAA,EAC9B,MAAM,UAAiC;AACrC,UAAM,cAAsC;AAAA,MAC1C,MAAM,SAAS;AAAA,MACf,aAAa,SAAS;AAAA,MACtB,SAAS,SAAS;AAAA,IACpB;AAEA,QAAI,SAAS,SAAS;AACpB,kBAAY,UAAU,SAAS;AAAA,IACjC;AAEA,UAAM,OAAO,UAAU,aAAa;AAAA,MAClC,WAAW;AAAA,MACX,mBAAmB;AAAA,IACrB,CAAC;AAED,WAAO;AAAA,EAAQ,IAAI;AAAA,EACrB;AAAA,EAEA,oBAAoB,aAA8B;AAChD,UAAM,mBAAmB,YAAY,YAAY,EAAE,WAAW,YAAY;AAC1E,UAAM,oBAAoB,YAAY,SAAS,GAAG,KAAK,YAAY,SAAS,GAAG;AAE/E,WAAO,oBAAoB;AAAA,EAC7B;AACF;;;AC3BO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAY,MAAsB;AAChC,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,eAAe,UAA0B;AACvC,WAAO;AAAA;AAAA,EAAkB,QAAQ;AAAA,EACnC;AAAA,EAEA,eAAe,UAA4B;AACzC,UAAM,QAAQ,CAAC,8BAA8B,IAAI,wDAAwD;AAEzG,aAAS,QAAQ,CAAC,YAAY;AAC5B,YAAM,KAAK,KAAK,OAAO,EAAE;AAAA,IAC3B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,oBAAoB,eAAiC;AACnD,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,kBAAc,QAAQ,CAAC,WAAW;AAChC,YAAM,KAAK,KAAK,MAAM,EAAE;AAAA,IAC1B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,YAAY,OAA4B;AACtC,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,UAAM,QAAQ,CAAC,MAAM,UAAU;AAC7B,YAAM,KAAK,YAAY,QAAQ,CAAC,KAAK,KAAK,KAAK,EAAE;AACjD,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,SAAS,MAAM;AACpC,gBAAM,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,EAAE;AAAA,QACnC,CAAC;AAAA,MACH;AAEA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,iBAAiB,YAAsC;AACrD,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,UAAU;AAC5B,YAAM,aAAa,MAAM,YAAY,SAAY,KAAK,MAAM,OAAO,OAAO;AAC1E,YAAM,WAAW,MAAM,WAAW,gBAAgB;AAClD,YAAM,KAAK,OAAO,MAAM,IAAI,QAAQ,MAAM,IAAI,MAAM,UAAU,MAAM,MAAM,WAAW,GAAG,QAAQ,IAAI;AAAA,IACtG,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,oBAAoB,eAA+C;AACjE,UAAM,QAAQ,CAAC,qBAAqB,EAAE;AAEtC,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AAC3D,YAAM,KAAK,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,IAC1C,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,eAAe,UAA4B;AACzC,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,aAAS,QAAQ,CAAC,YAAY;AAC5B,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,OAAO;AAClB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEA,iBAAiB,YAA8B;AAC7C,UAAM,QAAQ,CAAC,2BAA2B,IAAI,uBAAuB,EAAE;AAEvE,eAAW,QAAQ,CAAC,QAAQ;AAC1B,YAAM,KAAK,SAAS,GAAG,MAAM;AAAA,IAC/B,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEA,YAAY,OAAyB;AACnC,UAAM,QAAQ,CAAC,YAAY,EAAE;AAE7B,UAAM,QAAQ,CAAC,SAAS;AACtB,YAAM,KAAK,KAAK,IAAI,EAAE;AAAA,IACxB,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AC/GA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AAQd,IAAM,mBAAN,MAAuB;AAAA,EAC5B,MAAM,OAAO,UAAkB,UAAqC,CAAC,GAAkB;AACrF,UAAM,EAAE,oBAAoB,MAAM,kBAAkB,OAAO,iBAAiB,MAAM,IAAI;AAEtF,UAAMD,IAAG,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAE5C,QAAI,mBAAmB;AACrB,YAAMA,IAAG,MAAMC,MAAK,UAAU,YAAY,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAClE;AAEA,QAAI,iBAAiB;AACnB,YAAMD,IAAG,MAAMC,MAAK,UAAU,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAChE;AAEA,QAAI,gBAAgB;AAClB,YAAMD,IAAG,MAAMC,MAAK,UAAU,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,IAC/D;AAAA,EACF;AAAA,EAEA,MAAM,cAAc,UAAqC;AACvD,UAAM,QAAkB,CAAC;AAEzB,mBAAe,KAAK,KAAa,SAAiB,IAAI;AACpD,YAAM,UAAU,MAAMD,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,iBAAW,SAAS,SAAS;AAC3B,cAAM,eAAe,SAAS,GAAG,MAAM,IAAI,MAAM,IAAI,KAAK,MAAM;AAEhE,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,KAAK,GAAG,YAAY,GAAG;AAC7B,gBAAM,KAAKC,MAAK,KAAK,MAAM,IAAI,GAAG,YAAY;AAAA,QAChD,OAAO;AACL,gBAAM,KAAK,YAAY;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAEA,UAAM,KAAK,QAAQ;AACnB,WAAO;AAAA,EACT;AACF;;;ACnCO,IAAM,oBAAN,MAAwB;AAAA,EAC7B,SAAS,SAAiB,OAAgC;AACxD,UAAM,SAA4B,CAAC;AACnC,UAAM,WAA8B,CAAC;AAErC,SAAK,oBAAoB,SAAS,OAAO,QAAQ,QAAQ;AACzD,SAAK,yBAAyB,SAAS,MAAM;AAC7C,SAAK,qBAAqB,SAAS,QAAQ;AAC3C,SAAK,eAAe,SAAS,QAAQ;AAErC,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBACN,SACA,OACA,QACA,UACM;AACN,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AACD;AAAA,IACF;AAEA,QAAI,CAAC,MAAM,SAAS,YAAY,YAAY,EAAE,SAAS,YAAY,GAAG;AACpE,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,MAAM,SAAS,YAAY,SAAS,GAAG,GAAG;AAC7C,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,yBAAyB,SAAiB,QAAiC;AACjF,UAAM,mBAAmB;AAAA,MACvB,EAAE,SAAS,iBAAiB,MAAM,WAAW;AAAA,MAC7C,EAAE,SAAS,2CAA2C,MAAM,WAAW;AAAA,MACvE,EAAE,SAAS,8BAA8B,MAAM,QAAQ;AAAA,IACzD;AAEA,eAAW,WAAW,kBAAkB;AACtC,UAAI,CAAC,QAAQ,QAAQ,KAAK,OAAO,GAAG;AAClC,eAAO,KAAK;AAAA,UACV,OAAO,QAAQ;AAAA,UACf,SAAS,6BAA6B,QAAQ,IAAI;AAAA,UAClD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,SAAiB,UAAmC;AAC/E,UAAM,uBAAuB,CAAC,oBAAoB,qBAAqB,iBAAiB,gBAAgB;AAExG,eAAW,WAAW,sBAAsB;AAC1C,UAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,iBAAS,KAAK;AAAA,UACZ,OAAO;AAAA,UACP,SAAS,yBAAyB,QAAQ,MAAM;AAAA,UAChD,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,SAAiB,UAAmC;AACzE,UAAM,YAAY,QAAQ,MAAM,KAAK,EAAE;AAEvC,QAAI,YAAY,KAAM;AACpB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,yBAAyB,SAAS;AAAA,QAC3C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,YAAY,KAAK;AACnB,eAAS,KAAK;AAAA,QACZ,OAAO;AAAA,QACP,SAAS,2BAA2B,SAAS;AAAA,QAC7C,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;AJ5FO,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,qBAAqB,IAAI,mBAAmB;AACjD,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,YAAY,IAAI,kBAAkB;AAAA,EACzC;AAAA,EAEA,MAAM,SAAS,OAAc,SAAmD;AAC9E,UAAM,EAAE,WAAW,YAAY,OAAO,oBAAoB,KAAK,IAAI;AAEnE,UAAM,eAAe,KAAK,YAAY,MAAM,SAAS,IAAI;AACzD,UAAM,WAAWC,MAAK,WAAW,YAAY;AAE7C,QAAI,CAAC,aAAc,MAAM,KAAK,OAAO,QAAQ,GAAI;AAC/C,YAAM,IAAI,MAAM,mCAAmC,QAAQ,EAAE;AAAA,IAC/D;AAEA,UAAM,KAAK,iBAAiB,OAAO,UAAU;AAAA,MAC3C;AAAA,MACA,iBAAiB,QAAQ,mBAAmB;AAAA,IAC9C,CAAC;AAED,UAAM,UAAU,KAAK,YAAY,KAAK;AACtC,UAAM,aAAa,KAAK,UAAU,SAAS,SAAS,KAAK;AAEzD,UAAM,YAAYA,MAAK,UAAU,UAAU;AAC3C,UAAMC,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,UAAM,QAAQ,CAAC,SAAS;AAExB,QAAI,qBAAqB,MAAM,YAAY,QAAQ;AACjD,YAAM,UAAU,MAAM,KAAK,mBAAmB,UAAU,KAAK;AAC7D,YAAM,KAAK,OAAO;AAAA,IACpB;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAsB;AAChC,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,mBAAmB,MAAM,MAAM,QAAQ,CAAC;AACxD,UAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,SAAS,IAAI,CAAC;AACjE,UAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAC/D,UAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAE/D,QAAI,MAAM,cAAc,QAAQ;AAC9B,YAAM,KAAK,KAAK,iBAAiB,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC3E;AAEA,UAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,KAAK,CAAC;AAEzD,QAAI,MAAM,WAAW,QAAQ;AAC3B,YAAM,KAAK,KAAK,iBAAiB,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACrE;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,QAAQ;AAC3C,YAAM,KAAK,KAAK,iBAAiB,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC3E;AAEA,QAAI,MAAM,SAAS,QAAQ;AACzB,YAAM,KAAK,KAAK,iBAAiB,eAAe,MAAM,QAAQ,CAAC;AAAA,IACjE;AAEA,QAAI,MAAM,YAAY,QAAQ;AAC5B,YAAM,KAAK,KAAK,iBAAiB,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACrE;AAEA,QAAI,MAAM,OAAO,QAAQ;AACvB,YAAM,KAAK,KAAK,iBAAiB,YAAY,MAAM,KAAK,CAAC;AAAA,IAC3D;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEA,MAAc,mBAAmB,UAAkB,OAA+B;AAChF,UAAM,SAASD,MAAK,UAAU,YAAY;AAC1C,UAAM,UAAU,MAAM;AAEtB,UAAM,eAAeA,MAAK,QAAQ,aAAa;AAC/C,UAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,MAAM,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI,KAAK,oCAAoC;AAAA;AAGlF,UAAMC,IAAG,UAAU,cAAc,iBAAiB,OAAO;AACzD,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AAAA,EAEA,MAAc,OAAO,MAAgC;AACnD,QAAI;AACF,YAAMA,IAAG,OAAO,IAAI;AACpB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;AK5IA,SAAS,aAAAC,kBAAiB;AASnB,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,OAAc,UAA0B,CAAC,GAAW;AACzD,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACxC,UAAM,KAAK,KAAK,MAAM,SAAS,IAAI,EAAE;AACrC,UAAM,KAAK;AAAA;AAAA,EAAkB,MAAM,QAAQ,EAAE;AAC7C,UAAM,KAAK,KAAK,eAAe,MAAM,QAAQ,CAAC;AAE9C,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,KAAK,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC1D;AAEA,UAAM,KAAK,KAAK,YAAY,MAAM,KAAK,CAAC;AAExC,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,KAAK,KAAK,iBAAiB,MAAM,UAAU,CAAC;AAAA,IACpD;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,KAAK,oBAAoB,MAAM,aAAa,CAAC;AAAA,IAC1D;AAEA,QAAI,QAAQ,oBAAoB,SAAS,MAAM,SAAS,SAAS,GAAG;AAClE,YAAM,KAAK,KAAK,eAAe,MAAM,QAAQ,CAAC;AAAA,IAChD;AAEA,QAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,YAAM,KAAK,KAAK,YAAY,MAAM,KAAK,CAAC;AAAA,IAC1C;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,EAC1B;AAAA,EAEQ,kBAAkB,OAAsB;AAC9C,UAAM,OAA+B;AAAA,MACnC,MAAM,MAAM,SAAS;AAAA,MACrB,aAAa,MAAM,SAAS;AAAA,MAC5B,SAAS,MAAM,SAAS;AAAA,IAC1B;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,WAAK,UAAU,MAAM,SAAS;AAAA,IAChC;AAEA,WAAO;AAAA,EAAQA,WAAU,IAAI,CAAC;AAAA,EAChC;AAAA,EAEQ,eAAe,UAA4B;AACjD,UAAM,QAAQ,CAAC,8BAA8B,IAAI,4BAA4B;AAC7E,aAAS,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAC5C,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBAAoB,eAAiC;AAC3D,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AACrC,kBAAc,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AACjD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,YAAY,OAA4B;AAC9C,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AAErC,UAAM,QAAQ,CAAC,MAAM,MAAM;AACzB,YAAM,KAAK,YAAY,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE;AAC7C,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,KAAK,MAAM;AAChC,gBAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE;AAAA,QAC/B,CAAC;AAAA,MACH;AAEA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEQ,iBAAiB,YAAsC;AAC7D,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,CAAC,MAAM;AACxB,YAAM,MAAM,EAAE,YAAY,SAAY,KAAK,EAAE,OAAO,OAAO;AAC3D,YAAM,KAAK,OAAO,EAAE,IAAI,QAAQ,EAAE,IAAI,MAAM,GAAG,MAAM,EAAE,WAAW,IAAI;AAAA,IACxE,CAAC;AAED,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,oBAAoB,eAA+C;AACzE,UAAM,QAAQ,CAAC,qBAAqB,EAAE;AACtC,WAAO,QAAQ,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AAC3D,YAAM,KAAK,OAAO,KAAK,OAAO,QAAQ,EAAE;AAAA,IAC1C,CAAC;AACD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,eAAe,UAA4B;AACjD,UAAM,QAAQ,CAAC,oBAAoB,EAAE;AACrC,aAAS,QAAQ,CAAC,OAAO;AACvB,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK;AAChB,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AACD,WAAO,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,EAC/B;AAAA,EAEQ,YAAY,OAAyB;AAC3C,UAAM,QAAQ,CAAC,YAAY,EAAE;AAC7B,UAAM,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AACzC,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;AClIA,SAAS,aAAAC,kBAAiB;AAInB,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAO,OAAc,WAA2B,CAAC,GAAW;AAC1D,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,kBAAkB,KAAK,CAAC;AACxC,UAAM,KAAK,sBAAsB;AACjC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,QAAQ;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,iBAAiB;AAC5B,UAAM,KAAK,EAAE;AACb,UAAM,SAAS,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAClD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,MAAM,QAAQ,CAAC,MAAM,MAAM;AAC/B,YAAM,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,OAAO,KAAK,WAAW,EAAE;AAC7D,UAAI,KAAK,UAAU,QAAQ;AACzB,aAAK,SAAS,QAAQ,CAAC,QAAQ;AAC7B,gBAAM,KAAK,QAAQ,GAAG,EAAE;AAAA,QAC1B,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,kBAAkB;AAC7B,YAAM,KAAK,EAAE;AACb,YAAM,cAAc,QAAQ,CAAC,MAAM,MAAM,KAAK,KAAK,CAAC,EAAE,CAAC;AAAA,IACzD;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,mBAAmB;AAC9B,YAAM,KAAK,EAAE;AACb,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AACjE,cAAM,KAAK,KAAK,KAAK,KAAK,QAAQ,EAAE;AAAA,MACtC,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA,EAEQ,kBAAkB,OAAsB;AAC9C,UAAM,OAAO;AAAA,MACX,MAAM,KAAK,YAAY,MAAM,SAAS,IAAI;AAAA,MAC1C,aAAa,MAAM,SAAS;AAAA,MAC5B,OAAO;AAAA,IACT;AAEA,WAAO;AAAA,EAAQA,WAAU,IAAI,CAAC;AAAA,EAChC;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AC5DO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,OAAc,WAA2B,CAAC,GAAW;AAC1D,UAAM,QAAkB,CAAC;AAEzB,UAAM,KAAK,KAAK,MAAM,SAAS,IAAI,EAAE;AACrC,UAAM,KAAK,8BAA8B;AACzC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,MAAM,QAAQ;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,mBAAmB;AAC9B,UAAM,KAAK,EAAE;AAEb,UAAM,MAAM,QAAQ,CAAC,SAAS;AAC5B,YAAM,KAAK,OAAO,KAAK,KAAK,EAAE;AAC9B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,KAAK,WAAW;AAE3B,UAAI,KAAK,UAAU,QAAQ;AACzB,cAAM,KAAK,EAAE;AACb,aAAK,SAAS,QAAQ,CAAC,QAAQ;AAC7B,gBAAM,KAAK,KAAK,GAAG,EAAE;AAAA,QACvB,CAAC;AAAA,MACH;AACA,YAAM,KAAK,EAAE;AAAA,IACf,CAAC;AAED,QAAI,MAAM,cAAc,SAAS,GAAG;AAClC,YAAM,KAAK,gBAAgB;AAC3B,YAAM,KAAK,EAAE;AACb,YAAM,cAAc,QAAQ,CAAC,MAAM;AACjC,cAAM,KAAK,KAAK,CAAC,EAAE;AAAA,MACrB,CAAC;AACD,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,OAAO,KAAK,MAAM,aAAa,EAAE,SAAS,GAAG;AAC/C,YAAM,KAAK,mBAAmB;AAC9B,YAAM,KAAK,EAAE;AACb,aAAO,QAAQ,MAAM,aAAa,EAAE,QAAQ,CAAC,CAAC,OAAO,QAAQ,MAAM;AACjE,cAAM,KAAK,wBAAwB,KAAK,MAAM,QAAQ,EAAE;AAAA,MAC1D,CAAC;AACD,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,YAAM,KAAK,eAAe;AAC1B,YAAM,KAAK,EAAE;AACb,YAAM,KAAK,6CAA6C;AACxD,YAAM,KAAK,EAAE;AACb,YAAM,WAAW,QAAQ,CAAC,MAAM;AAC9B,cAAM,MAAM,EAAE,UAAU,cAAc,EAAE,OAAO,MAAM;AACrD,cAAM,KAAK,OAAO,EAAE,IAAI,OAAO,EAAE,WAAW,GAAG,GAAG,EAAE;AAAA,MACtD,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACF;;;ACrDO,IAAM,kBAAN,MAAsB;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,kBAAkB,IAAI,gBAAgB;AAC3C,SAAK,iBAAiB,IAAI,eAAe;AACzC,SAAK,kBAAkB,IAAI,gBAAgB;AAAA,EAC7C;AAAA,EAEA,QAAQ,OAAc,QAAsB,SAAkC;AAC5E,YAAQ,QAAQ;AAAA,MACd,KAAK;AACH,eAAO,KAAK,eAAe,OAAO,OAAO;AAAA,MAC3C,KAAK;AACH,eAAO,KAAK,cAAc,OAAO,OAAO;AAAA,MAC1C,KAAK;AACH,eAAO,KAAK,eAAe,OAAO,OAAO;AAAA,MAC3C;AACE,cAAM,IAAI,MAAM,uBAAuB,MAAM,EAAE;AAAA,IACnD;AAAA,EACF;AAAA,EAEA,WAAW,OAAc,SAAqD;AAC5E,UAAM,UAAU,oBAAI,IAA0B;AAC9C,YAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,CAAC;AACzD,YAAQ,IAAI,SAAS,KAAK,cAAc,OAAO,OAAO,CAAC;AACvD,YAAQ,IAAI,UAAU,KAAK,eAAe,OAAO,OAAO,CAAC;AACzD,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,OAAc,SAAkC;AAC7D,WAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AAAA,EACnD;AAAA,EAEA,cAAc,OAAc,SAAkC;AAC5D,WAAO,KAAK,eAAe,OAAO,OAAO,OAAO;AAAA,EAClD;AAAA,EAEA,eAAe,OAAc,SAAkC;AAC7D,WAAO,KAAK,gBAAgB,OAAO,OAAO,OAAO;AAAA,EACnD;AACF;;;AC7CO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,eAAe,SAAmC;AAChD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAEA,QAAI,CAAC,QAAQ,SAAS,OAAO,GAAG;AAC9B,aAAO,KAAK,6BAA6B;AAAA,IAC3C;AACA,QAAI,CAAC,QAAQ,SAAS,cAAc,GAAG;AACrC,aAAO,KAAK,oCAAoC;AAAA,IAClD;AAEA,QAAI,CAAC,QAAQ,SAAS,aAAa,GAAG;AACpC,aAAO,KAAK,0BAA0B;AAAA,IACxC;AACA,QAAI,CAAC,QAAQ,SAAS,kBAAkB,KAAK,CAAC,QAAQ,SAAS,UAAU,GAAG;AAC1E,aAAO,KAAK,+BAA+B;AAAA,IAC7C;AAEA,QAAI,kBAAkB,KAAK,OAAO,GAAG;AACnC,eAAS,KAAK,0CAA0C;AAAA,IAC1D;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,SAAmC;AAC/C,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO,KAAK,0BAA0B;AAAA,IACxC;AAEA,QAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG;AAC/B,eAAS,KAAK,6BAA6B;AAAA,IAC7C;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,SAAmC;AAChD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAqB,CAAC;AAE5B,QAAI,QAAQ,KAAK,EAAE,SAAS,KAAK;AAC/B,eAAS,KAAK,yBAAyB;AAAA,IACzC;AAEA,WAAO;AAAA,MACL,OAAO,OAAO,WAAW;AAAA,MACzB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AC7EA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;;;ACoBjB,IAAe,iBAAf,MAA8B;AAAA,EACzB;AAAA,EAEV,YAAY,UAAmB;AAC7B,SAAK,WAAW,YAAY,KAAK,mBAAmB;AAAA,EACtD;AAAA,EASA,MAAM,OAAO,WAAqC;AAChD,UAAM,YAAY,MAAM,KAAK,KAAK;AAClC,WAAO,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,SAAS;AAAA,EACnD;AACF;;;ADhCO,IAAM,sBAAN,cAAkC,eAAe;AAAA,EAC9C;AAAA,EAER,YAAY,UAAmB;AAC7B,UAAM,QAAQ;AACd,SAAK,YAAY,IAAI,eAAe;AAAA,EACtC;AAAA,EAEA,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,WAAW,WAAW,SAAS,QAAQ;AAAA,EAChE;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,OAAO,SAAS,MAAM,SAAS,KAAK,IAAI;AAE5D,UAAM,eAAe,KAAK,YAAY,MAAM,SAAS,IAAI;AACzD,UAAM,YAAYD,MAAK,KAAK,UAAU,YAAY;AAElD,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS,yBAAyB,SAAS;AAAA,QAC7C;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,cAAM,aAAa,GAAG,SAAS,WAAW,KAAK,IAAI,CAAC;AACpD,cAAME,IAAG,OAAO,WAAW,UAAU;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,SAAS,MAAM,KAAK,UAAU,SAAS,OAAO;AAAA,MAClD,WAAW,KAAK;AAAA,MAChB,WAAW;AAAA,IACb,CAAC;AAED,QAAI,QAAQ;AACV,YAAM,WAAW,MAAM,KAAK,mBAAmB,SAAS;AACxD,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,OAAO;AAAA,MACb,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAAkC;AAChD,UAAM,YAAYF,MAAK,KAAK,UAAU,KAAK,YAAY,SAAS,CAAC;AAEjE,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACjD;AAEA,UAAME,IAAG,GAAG,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,SAA2B,CAAC;AAElC,QAAI;AACF,YAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,UAAU,EAAE,eAAe,KAAK,CAAC;AAEvE,iBAAW,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,cAAM,cAAcF,MAAK,KAAK,UAAU,MAAM,MAAM,UAAU;AAE9D,YAAI,MAAM,WAAW,WAAW,GAAG;AACjC,gBAAM,UAAU,MAAME,IAAG,SAAS,aAAa,OAAO;AACtD,gBAAM,WAAW,KAAK,cAAc,OAAO;AAC3C,gBAAM,OAAO,MAAMA,IAAG,KAAK,WAAW;AAEtC,iBAAO,KAAK;AAAA,YACV,MAAM,SAAS,QAAQ,MAAM;AAAA,YAC7B,MAAMF,MAAK,KAAK,UAAU,MAAM,IAAI;AAAA,YACpC,SAAS,SAAS,WAAW;AAAA,YAC7B,aAAa,KAAK,MAAM,YAAY;AAAA,UACtC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,WAAqC;AACpE,UAAM,UAAUA,MAAK,WAAW,UAAU;AAE1C,QAAI,CAAE,MAAM,WAAW,OAAO,GAAI;AAChC,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAME,IAAG,SAAS,SAAS,OAAO;AAElD,QAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,aAAO;AAAA,IACT;AAEA,UAAM,WAAW,KAAK,cAAc,OAAO;AAC3C,WAAO,CAAC,EAAE,SAAS,QAAQ,SAAS;AAAA,EACtC;AAAA,EAEQ,cAAc,SAAyC;AAC7D,UAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,QAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,UAAM,OAAO,MAAM,CAAC;AACpB,UAAM,WAAmC,CAAC;AAE1C,SAAK,MAAM,IAAI,EAAE,QAAQ,CAAC,SAAS;AACjC,YAAM,aAAa,KAAK,QAAQ,GAAG;AACnC,UAAI,aAAa,GAAG;AAClB,cAAM,MAAM,KAAK,MAAM,GAAG,UAAU,EAAE,KAAK;AAC3C,cAAM,QAAQ,KAAK,MAAM,aAAa,CAAC,EAAE,KAAK;AAC9C,iBAAS,GAAG,IAAI;AAAA,MAClB;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AEzJA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AACrB,SAAS,WAAAC,gBAAe;AAMjB,IAAM,iBAAN,cAA6B,eAAe;AAAA,EACzC;AAAA,EAER,YAAY,UAAmB;AAC7B,UAAM,QAAQ;AACd,SAAK,YAAY,IAAI,gBAAgB;AAAA,EACvC;AAAA,EAEA,qBAA6B;AAC3B,WAAOC,MAAKC,SAAQ,GAAG,UAAU,QAAQ;AAAA,EAC3C;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,MAAM,IAAI;AAE9B,UAAM,YAAY,KAAK,YAAY,MAAM,SAAS,IAAI;AACtD,UAAM,YAAYD,MAAK,KAAK,UAAU,GAAG,SAAS,KAAK;AAEvD,QAAK,MAAM,WAAW,SAAS,KAAM,CAAC,WAAW;AAC/C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS,yBAAyB,SAAS;AAAA,MAC7C;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,QAAQ;AAE7B,UAAM,UAAU,KAAK,UAAU,cAAc,KAAK;AAClD,UAAME,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,WAAkC;AAChD,UAAM,YAAYF,MAAK,KAAK,UAAU,GAAG,KAAK,YAAY,SAAS,CAAC,KAAK;AAEzE,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACjD;AAEA,UAAME,IAAG,OAAO,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,SAA2B,CAAC;AAElC,QAAI;AACF,YAAM,QAAQ,MAAMA,IAAG,QAAQ,KAAK,QAAQ;AAE5C,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,SAAS,KAAK,EAAG;AAE3B,cAAM,YAAYF,MAAK,KAAK,UAAU,IAAI;AAC1C,cAAM,OAAO,MAAME,IAAG,KAAK,SAAS;AAEpC,eAAO,KAAK;AAAA,UACV,MAAM,KAAK,QAAQ,OAAO,EAAE;AAAA,UAC5B,MAAM;AAAA,UACN,SAAS;AAAA,UACT,aAAa,KAAK,MAAM,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IACJ,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAAA,EAC9B;AACF;;;AC5FA,SAAS,YAAYC,WAAU;AAC/B,SAAS,QAAAC,aAAY;AAMd,IAAM,kBAAN,cAA8B,eAAe;AAAA,EAC1C;AAAA,EACA;AAAA,EAER,YAAY,aAAqB;AAC/B,UAAM,WAAW;AACjB,SAAK,cAAc;AACnB,SAAK,YAAY,IAAI,gBAAgB;AAAA,EACvC;AAAA,EAEA,qBAA6B;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,kBAA0B;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAQ,OAAc,UAA0B,CAAC,GAA2B;AAChF,UAAM,EAAE,YAAY,OAAO,SAAS,KAAK,IAAI;AAE7C,UAAM,YAAYC,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,MAAM,WAAW,SAAS,GAAG;AAC/B,UAAI,CAAC,WAAW;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAEA,UAAI,QAAQ;AACV,cAAM,aAAa,GAAG,SAAS,WAAW,KAAK,IAAI,CAAC;AACpD,cAAMC,IAAG,SAAS,WAAW,UAAU;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,eAAe,KAAK;AACnD,UAAMA,IAAG,UAAU,WAAW,SAAS,OAAO;AAE9C,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,MACN,SAAS,6BAA6B,KAAK,gBAAgB,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,YAAmC;AACjD,UAAM,YAAYD,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,YAAM,IAAI,MAAM,wBAAwB;AAAA,IAC1C;AAEA,UAAMC,IAAG,OAAO,SAAS;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,YAAYD,MAAK,KAAK,UAAU,cAAc;AAEpD,QAAI,CAAE,MAAM,WAAW,SAAS,GAAI;AAClC,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,OAAO,MAAMC,IAAG,KAAK,SAAS;AAEpC,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa,KAAK,MAAM,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;;;ACvEO,SAAS,gBACd,UACA,UAA4B,CAAC,GACb;AAChB,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO,IAAI,oBAAoB,QAAQ,QAAQ;AAAA,IACjD,KAAK;AACH,aAAO,IAAI,eAAe,QAAQ,QAAQ;AAAA,IAC5C,KAAK;AACH,UAAI,CAAC,QAAQ,aAAa;AACxB,cAAM,IAAI,MAAM,uCAAuC;AAAA,MACzD;AACA,aAAO,IAAI,gBAAgB,QAAQ,WAAW;AAAA,IAChD;AACE,YAAM,IAAI,MAAM,yBAAyB,QAAQ,EAAE;AAAA,EACvD;AACF;;;ACpBO,IAAM,UAAU;","names":["fs","join","homedir","join","homedir","fs","join","homedir","join","homedir","join","homedir","join","homedir","z","z","chalk","fs","join","fs","join","join","fs","stringify","stringify","fs","join","homedir","join","homedir","fs","fs","join","homedir","join","homedir","fs","fs","join","join","fs"]}
|