codelantern-agent-cli 1.0.1 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +283 -163
- package/dist/{chunk-PELESOCI.js → chunk-45FEFNMM.js} +877 -154
- package/dist/chunk-45FEFNMM.js.map +1 -0
- package/dist/cli.js +351 -62
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +91 -5
- package/dist/index.js +19 -1
- package/package.json +2 -1
- package/dist/chunk-PELESOCI.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider/errors.ts","../src/provider/timeout.ts","../src/config/schema.ts","../src/config/config.ts","../src/security/credentials.ts","../src/provider/gemini.ts","../src/provider/openaiProvider.ts","../src/provider/anthropicProvider.ts","../src/provider/openrouterProvider.ts","../src/provider/registry.ts","../src/security/secrets.ts","../src/security/sandbox.ts","../src/approval/diffViewer.ts","../src/security/commandGuard.ts","../src/tools/fsTools.ts","../src/tools/searchTools.ts","../src/tools/bashTool.ts","../src/tools/gitTools.ts","../src/tools/webSearchTool.ts","../src/tools/registry.ts","../src/mcp/mcpConfig.ts","../src/mcp/mcpManager.ts","../src/approval/approver.ts","../src/config/projectInstructions.ts","../src/session/sessionManager.ts","../src/session/compactor.ts","../src/skills/skillManager.ts","../src/agent/lanternAgent.ts","../src/ui/spinner.ts","../src/provider/attachment.ts"],"sourcesContent":["import pc from 'picocolors';\n\nexport class TimeoutError extends Error {\n public timeoutMs: number;\n constructor(timeoutMs: number, operation = 'Request') {\n super(`${operation} timed out after ${(timeoutMs / 1000).toFixed(1)}s.`);\n this.name = 'TimeoutError';\n this.timeoutMs = timeoutMs;\n }\n}\n\nexport class FirstTokenTimeoutError extends Error {\n public timeoutMs: number;\n public provider: string;\n public model: string;\n constructor(timeoutMs: number, provider: string, model: string) {\n super(`No response tokens received from ${provider} (${model}) after ${(timeoutMs / 1000).toFixed(1)}s.`);\n this.name = 'FirstTokenTimeoutError';\n this.timeoutMs = timeoutMs;\n this.provider = provider;\n this.model = model;\n }\n}\n\nexport class CancelledError extends Error {\n constructor(message = 'Operation cancelled by user (Ctrl+C).') {\n super(message);\n this.name = 'CancelledError';\n }\n}\n\nexport class MissingApiKeyError extends Error {\n public provider: string;\n constructor(provider = 'gemini', envVar = 'GEMINI_API_KEY') {\n super(\n `API key for provider '${provider}' is not configured.\\n\\n` +\n `To resolve this:\\n` +\n ` 1. Set the environment variable:\\n` +\n ` export ${envVar}=\"your-api-key-here\"\\n` +\n ` 2. Or store it securely using Lantern:\\n` +\n ` lantern keys set ${provider}\\n`\n );\n this.name = 'MissingApiKeyError';\n this.provider = provider;\n }\n}\n\nexport class RateLimitError extends Error {\n constructor(message = 'API rate limit exceeded.') {\n super(`${message}\\nPlease wait a moment before trying again or check your account quota.`);\n this.name = 'RateLimitError';\n }\n}\n\nexport class AuthenticationError extends Error {\n constructor(message = 'Authentication failed.') {\n super(message);\n this.name = 'AuthenticationError';\n }\n}\n\nexport class ModelNotFoundError extends Error {\n constructor(model: string, provider: string) {\n super(`Model '${model}' not found or not available for provider '${provider}'.`);\n this.name = 'ModelNotFoundError';\n }\n}\n\nexport class LanternProviderError extends Error {\n public statusCode?: number;\n public provider?: string;\n\n constructor(message: string, statusCode?: number, provider?: string) {\n super(message);\n this.name = 'LanternProviderError';\n this.statusCode = statusCode;\n this.provider = provider;\n }\n}\n\nexport function formatErrorMessage(err: unknown): string {\n if (err instanceof CancelledError) {\n return pc.yellow(`\\n[Cancelled] ${err.message}`);\n }\n if (err instanceof FirstTokenTimeoutError) {\n return pc.red(`\\n⏱️ ${err.message}\\n` + pc.yellow(` Tip: Check your network connection or try lowering temperature or setting a faster model with 'lantern model set <id>'.`));\n }\n if (err instanceof TimeoutError) {\n return pc.red(`\\n⏱️ ${err.message}\\n` + pc.yellow(` Tip: You can increase the timeout limit using 'lantern config set timeoutMs 120000'.`));\n }\n if (err instanceof MissingApiKeyError) {\n return pc.red(`\\n${err.message}`);\n }\n if (err instanceof RateLimitError) {\n return pc.yellow(`\\n⚠️ ${err.message}`);\n }\n if (err instanceof AuthenticationError) {\n return pc.red(`\\n🔒 ${err.message}`);\n }\n if (err instanceof ModelNotFoundError) {\n return pc.red(`\\n🔍 ${err.message}\\n` + pc.dim(`Run 'lantern models list' to view available models for your account.`));\n }\n if (err instanceof Error) {\n const msg = err.message || '';\n if (msg.includes('API_KEY_INVALID') || msg.includes('401') || msg.includes('Incorrect API key')) {\n return pc.red(`Authentication failed: Invalid API key. Update it with 'lantern keys set <provider>'.`);\n }\n if (msg.includes('RESOURCE_EXHAUSTED') || msg.includes('429')) {\n return pc.yellow('Rate limit or quota reached. Please wait a few seconds before retrying.');\n }\n if (msg.includes('AbortError') || msg.includes('aborted') || msg.includes('canceled')) {\n return pc.yellow('[Request aborted]');\n }\n return pc.red(`Error: ${msg}`);\n }\n return pc.red(`An unexpected error occurred: ${String(err)}`);\n}\n","import { TimeoutError, FirstTokenTimeoutError, CancelledError } from './errors.js';\n\nexport function createLinkedAbortController(parentSignal?: AbortSignal, timeoutMs?: number): {\n controller: AbortController;\n cleanup: () => void;\n} {\n const controller = new AbortController();\n let timer: NodeJS.Timeout | null = null;\n\n if (timeoutMs && timeoutMs > 0) {\n timer = setTimeout(() => {\n controller.abort(new TimeoutError(timeoutMs));\n }, timeoutMs);\n }\n\n const onParentAbort = () => {\n controller.abort(parentSignal?.reason || new CancelledError());\n };\n\n if (parentSignal) {\n if (parentSignal.aborted) {\n onParentAbort();\n } else {\n parentSignal.addEventListener('abort', onParentAbort, { once: true });\n }\n }\n\n const cleanup = () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n if (parentSignal) {\n parentSignal.removeEventListener('abort', onParentAbort);\n }\n };\n\n return { controller, cleanup };\n}\n\nexport async function* wrapStreamWithFirstTokenTimeout<T>(\n stream: AsyncIterable<T>,\n firstTokenTimeoutMs: number,\n provider: string,\n model: string,\n signal?: AbortSignal,\n onFirstToken?: (latencyMs: number) => void\n): AsyncGenerator<T, void, unknown> {\n let firstTokenReceived = false;\n const startTime = Date.now();\n let timer: NodeJS.Timeout | null = null;\n let timedOut = false;\n\n const timerPromise = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n if (!firstTokenReceived) {\n timedOut = true;\n reject(new FirstTokenTimeoutError(firstTokenTimeoutMs, provider, model));\n }\n }, firstTokenTimeoutMs);\n });\n\n const abortPromise = new Promise<never>((_, reject) => {\n if (signal) {\n if (signal.aborted) {\n reject(signal.reason || new CancelledError());\n } else {\n signal.addEventListener('abort', () => reject(signal.reason || new CancelledError()), { once: true });\n }\n }\n });\n\n const iterator = stream[Symbol.asyncIterator]();\n\n try {\n while (true) {\n if (signal?.aborted) {\n throw signal.reason || new CancelledError();\n }\n\n if (!firstTokenReceived) {\n // Race the first chunk against the first-token timer and signal\n const nextPromise = iterator.next();\n const result = await Promise.race([nextPromise, timerPromise, abortPromise]);\n\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n if (result.done) {\n break;\n }\n\n firstTokenReceived = true;\n if (onFirstToken) {\n onFirstToken(Date.now() - startTime);\n }\n\n yield result.value;\n } else {\n // Subsequent chunks\n if (signal?.aborted) {\n throw signal.reason || new CancelledError();\n }\n\n const nextPromise = iterator.next();\n const result = signal ? await Promise.race([nextPromise, abortPromise]) : await nextPromise;\n\n if (result.done) {\n break;\n }\n\n yield result.value;\n }\n }\n } finally {\n if (timer) {\n clearTimeout(timer);\n }\n if (typeof iterator.return === 'function') {\n try {\n await iterator.return();\n } catch {\n // ignore return error\n }\n }\n }\n}\n","import type { OrbitConfig } from '../types.js';\n\nexport const DEFAULT_CONFIG: OrbitConfig = {\n activeProvider: 'gemini',\n defaultModel: 'gemini-3.8-flash',\n maxSteps: 25,\n temperature: 0.2,\n maxOutputTokens: 8192,\n yolo: false,\n theme: 'default',\n autoCompactThreshold: 30, // turns before auto-compacting\n timeoutMs: 60000,\n firstTokenTimeoutMs: 30000,\n showTiming: false,\n lowLatency: false,\n activeSkills: [],\n mcpServers: {},\n providers: {}\n};\n\nexport const ALLOWED_CONFIG_KEYS = [\n 'activeProvider',\n 'defaultModel',\n 'maxSteps',\n 'temperature',\n 'maxOutputTokens',\n 'yolo',\n 'theme',\n 'autoCompactThreshold',\n 'timeoutMs',\n 'firstTokenTimeoutMs',\n 'showTiming',\n 'lowLatency',\n 'activeSkills'\n] as const;\n\nexport type ConfigKey = (typeof ALLOWED_CONFIG_KEYS)[number];\n\nexport function validateConfigValue(key: string, value: unknown): { valid: boolean; error?: string; parsedValue?: unknown } {\n switch (key) {\n case 'activeProvider':\n if (typeof value !== 'string' || value.trim().length === 0) {\n return { valid: false, error: 'activeProvider must be a non-empty string' };\n }\n return { valid: true, parsedValue: value.trim().toLowerCase() };\n\n case 'defaultModel':\n if (typeof value !== 'string' || value.trim().length === 0) {\n return { valid: false, error: 'defaultModel must be a non-empty string' };\n }\n return { valid: true, parsedValue: value.trim() };\n\n case 'maxSteps': {\n const num = Number(value);\n if (isNaN(num) || num < 1 || num > 100) {\n return { valid: false, error: 'maxSteps must be a number between 1 and 100' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'temperature': {\n const num = Number(value);\n if (isNaN(num) || num < 0 || num > 2) {\n return { valid: false, error: 'temperature must be a number between 0.0 and 2.0' };\n }\n return { valid: true, parsedValue: num };\n }\n\n case 'maxOutputTokens': {\n const num = Number(value);\n if (isNaN(num) || num < 256 || num > 65536) {\n return { valid: false, error: 'maxOutputTokens must be between 256 and 65536' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'yolo': {\n if (typeof value === 'boolean') return { valid: true, parsedValue: value };\n if (value === 'true' || value === '1') return { valid: true, parsedValue: true };\n if (value === 'false' || value === '0') return { valid: true, parsedValue: false };\n return { valid: false, error: 'yolo must be a boolean (true/false)' };\n }\n\n case 'theme': {\n if (value === 'default' || value === 'ocean' || value === 'minimal') {\n return { valid: true, parsedValue: value };\n }\n return { valid: false, error: \"theme must be 'default', 'ocean', or 'minimal'\" };\n }\n\n case 'autoCompactThreshold': {\n const num = Number(value);\n if (isNaN(num) || num < 5 || num > 200) {\n return { valid: false, error: 'autoCompactThreshold must be a number between 5 and 200' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'timeoutMs': {\n const num = Number(value);\n if (isNaN(num) || num < 5000) {\n return { valid: false, error: 'timeoutMs must be at least 5000 (ms)' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'firstTokenTimeoutMs': {\n const num = Number(value);\n if (isNaN(num) || num < 3000) {\n return { valid: false, error: 'firstTokenTimeoutMs must be at least 3000 (ms)' };\n }\n return { valid: true, parsedValue: Math.round(num) };\n }\n\n case 'showTiming': {\n if (typeof value === 'boolean') return { valid: true, parsedValue: value };\n if (value === 'true' || value === '1') return { valid: true, parsedValue: true };\n if (value === 'false' || value === '0') return { valid: true, parsedValue: false };\n return { valid: false, error: 'showTiming must be a boolean (true/false)' };\n }\n\n case 'lowLatency': {\n if (typeof value === 'boolean') return { valid: true, parsedValue: value };\n if (value === 'true' || value === '1') return { valid: true, parsedValue: true };\n if (value === 'false' || value === '0') return { valid: true, parsedValue: false };\n return { valid: false, error: 'lowLatency must be a boolean (true/false)' };\n }\n\n case 'activeSkills': {\n if (Array.isArray(value)) {\n return { valid: true, parsedValue: value.map(String) };\n }\n if (typeof value === 'string') {\n return { valid: true, parsedValue: value.split(',').map(s => s.trim()).filter(Boolean) };\n }\n return { valid: false, error: 'activeSkills must be an array of strings or comma-separated string' };\n }\n\n default:\n return { valid: false, error: `Unknown configuration key: ${key}` };\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { DEFAULT_CONFIG, validateConfigValue, type ConfigKey } from './schema.js';\nimport type { OrbitConfig } from '../types.js';\n\nexport function getLanternHomeDir(): string {\n const customHome = process.env.CODELANTERN_HOME || process.env.LANTERN_HOME;\n if (customHome) {\n if (!fs.existsSync(customHome)) {\n try {\n fs.mkdirSync(customHome, { recursive: true });\n } catch {\n // ignore\n }\n }\n return customHome;\n }\n\n const defaultDir = path.join(os.homedir(), '.codelantern');\n if (!fs.existsSync(defaultDir)) {\n try {\n fs.mkdirSync(defaultDir, { recursive: true });\n } catch {\n // ignore\n }\n }\n return defaultDir;\n}\n\nexport function getConfigFilePath(): string {\n return path.join(getLanternHomeDir(), 'config.json');\n}\n\nexport function loadConfig(): OrbitConfig {\n const configPath = getConfigFilePath();\n if (!fs.existsSync(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n try {\n const raw = fs.readFileSync(configPath, 'utf8');\n const parsed = JSON.parse(raw);\n\n const merged: OrbitConfig = {\n ...DEFAULT_CONFIG,\n ...parsed\n };\n\n if (!merged.mcpServers || typeof merged.mcpServers !== 'object') {\n merged.mcpServers = {};\n }\n\n return merged;\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport function saveConfig(config: OrbitConfig): void {\n const configPath = getConfigFilePath();\n\n const safeConfig: OrbitConfig = {\n activeProvider: config.activeProvider || DEFAULT_CONFIG.activeProvider,\n defaultModel: config.defaultModel || DEFAULT_CONFIG.defaultModel,\n maxSteps: config.maxSteps || DEFAULT_CONFIG.maxSteps,\n temperature: config.temperature ?? DEFAULT_CONFIG.temperature,\n maxOutputTokens: config.maxOutputTokens || DEFAULT_CONFIG.maxOutputTokens,\n yolo: Boolean(config.yolo),\n theme: config.theme || DEFAULT_CONFIG.theme,\n autoCompactThreshold: config.autoCompactThreshold || DEFAULT_CONFIG.autoCompactThreshold,\n timeoutMs: config.timeoutMs || DEFAULT_CONFIG.timeoutMs,\n firstTokenTimeoutMs: config.firstTokenTimeoutMs || DEFAULT_CONFIG.firstTokenTimeoutMs,\n showTiming: Boolean(config.showTiming),\n lowLatency: Boolean(config.lowLatency),\n activeSkills: Array.isArray(config.activeSkills) ? config.activeSkills : [],\n mcpServers: config.mcpServers || {},\n providers: config.providers || {}\n };\n\n try {\n fs.writeFileSync(configPath, JSON.stringify(safeConfig, null, 2), {\n encoding: 'utf8'\n });\n } catch (err: any) {\n console.error(`Warning: Failed to save config to ${configPath}: ${err.message}`);\n }\n}\n\nexport function setConfigValue(key: string, value: unknown): { success: boolean; error?: string; updatedConfig?: OrbitConfig } {\n const validation = validateConfigValue(key, value);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n\n const current = loadConfig();\n (current as unknown as Record<string, unknown>)[key] = validation.parsedValue;\n saveConfig(current);\n\n return { success: true, updatedConfig: current };\n}\n\nexport function getConfigValue<K extends keyof OrbitConfig>(key: K): OrbitConfig[K] {\n const current = loadConfig();\n return current[key];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport crypto from 'node:crypto';\nimport { getLanternHomeDir } from '../config/config.js';\n\nconst PROVIDER_ENV_VARS: Record<string, string[]> = {\n gemini: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],\n openai: ['OPENAI_API_KEY'],\n anthropic: ['ANTHROPIC_API_KEY'],\n openrouter: ['OPENROUTER_API_KEY'],\n custom: ['CUSTOM_API_KEY', 'OPENAI_API_KEY']\n};\n\nfunction getCredentialsFilePath(): string {\n return path.join(getLanternHomeDir(), 'credentials.json');\n}\n\n/**\n * Derives a machine-unique 256-bit encryption key\n */\nfunction getMachineDerivedKey(): Buffer {\n const salt = `codelantern_${os.hostname()}_${os.userInfo().username}`;\n const secret = `${os.homedir()}_${process.platform}_${os.arch()}`;\n return crypto.scryptSync(secret, salt, 32);\n}\n\nexport function encryptSecret(plainText: string): string {\n const iv = crypto.randomBytes(12);\n const key = getMachineDerivedKey();\n const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);\n\n let encrypted = cipher.update(plainText, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n const authTag = cipher.getAuthTag().toString('hex');\n\n return `${iv.toString('hex')}:${authTag}:${encrypted}`;\n}\n\nexport function decryptSecret(encryptedPayload: string): string | null {\n try {\n const parts = encryptedPayload.split(':');\n if (parts.length !== 3) return null;\n\n const [ivHex, authTagHex, encryptedHex] = parts;\n const iv = Buffer.from(ivHex, 'hex');\n const authTag = Buffer.from(authTagHex, 'hex');\n const key = getMachineDerivedKey();\n\n const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv);\n decipher.setAuthTag(authTag);\n\n let decrypted = decipher.update(encryptedHex, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n } catch {\n return null;\n }\n}\n\nexport function maskApiKey(key: string): string {\n if (!key) return '(not configured)';\n const clean = key.trim();\n if (clean.length <= 8) return '********';\n return `${clean.slice(0, 4)}...${clean.slice(-4)}`;\n}\n\nexport function getApiKey(provider: string): { key: string | null; source?: 'env' | 'store' } {\n const norm = provider.toLowerCase();\n\n // 1. Check environment variables first\n const envVarNames = PROVIDER_ENV_VARS[norm] || [`${norm.toUpperCase()}_API_KEY`];\n for (const envVar of envVarNames) {\n const val = process.env[envVar];\n if (val && val.trim().length > 0) {\n return { key: val.trim(), source: 'env' };\n }\n }\n\n // 2. Check encrypted store\n const filePath = getCredentialsFilePath();\n if (fs.existsSync(filePath)) {\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const data = JSON.parse(raw);\n if (data[norm]) {\n const decrypted = decryptSecret(data[norm]);\n if (decrypted) {\n return { key: decrypted, source: 'store' };\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n\n return { key: null };\n}\n\nexport function setApiKey(provider: string, apiKey: string): void {\n const norm = provider.toLowerCase();\n const filePath = getCredentialsFilePath();\n let data: Record<string, string> = {};\n\n if (fs.existsSync(filePath)) {\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n data = JSON.parse(raw);\n } catch {\n data = {};\n }\n }\n\n data[norm] = encryptSecret(apiKey.trim());\n\n try {\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf8',\n mode: 0o600\n });\n } catch (err: any) {\n console.error(`Warning: Failed to save credentials: ${err.message}`);\n }\n}\n\nexport function removeApiKey(provider: string): boolean {\n const norm = provider.toLowerCase();\n const filePath = getCredentialsFilePath();\n if (!fs.existsSync(filePath)) return false;\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const data = JSON.parse(raw);\n if (data[norm]) {\n delete data[norm];\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), {\n encoding: 'utf8',\n mode: 0o600\n });\n return true;\n }\n } catch {\n // ignore\n }\n\n return false;\n}\n\nexport function listConfiguredKeys(): Record<string, { configured: boolean; source?: 'env' | 'store'; maskedKey: string }> {\n const providers = ['gemini', 'openai', 'anthropic', 'openrouter', 'custom'];\n const result: Record<string, { configured: boolean; source?: 'env' | 'store'; maskedKey: string }> = {};\n\n for (const p of providers) {\n const { key, source } = getApiKey(p);\n result[p] = {\n configured: Boolean(key),\n source,\n maskedKey: key ? maskApiKey(key) : '(not configured)'\n };\n }\n\n return result;\n}\n","import { GoogleGenAI, type Content, type Part, type FunctionDeclaration, Type } from '@google/genai';\nimport { MissingApiKeyError, RateLimitError, LanternProviderError, ModelNotFoundError } from './errors.js';\nimport { createLinkedAbortController, wrapStreamWithFirstTokenTimeout } from './timeout.js';\nimport { getApiKey, maskApiKey } from '../security/credentials.js';\nimport type {\n IProviderAdapter,\n ProviderStreamParams,\n ProviderStreamResult,\n ProviderTestResult\n} from './types.js';\nimport type {\n ConversationTurn,\n ToolDefinition,\n TokenUsage,\n ToolCallItem,\n ProviderModelInfo,\n ModelCapabilities,\n TimingDiagnostics\n} from '../types.js';\n\nexport class GeminiProvider implements IProviderAdapter {\n public id = 'gemini';\n public name = 'gemini';\n public displayName = 'Google Gemini';\n public defaultModel = 'gemini-3.8-flash';\n\n private cachedModels: ProviderModelInfo[] | null = null;\n\n public isConfigured(): boolean {\n const { key } = getApiKey(this.id);\n return Boolean(key && key.trim().length > 0);\n }\n\n public getApiKey(): string | null {\n return getApiKey(this.id).key;\n }\n\n public getMaskedKey(): string {\n const key = this.getApiKey();\n return key ? maskApiKey(key) : '(not configured)';\n }\n\n private getClient(): GoogleGenAI {\n const key = this.getApiKey();\n if (!key) {\n throw new MissingApiKeyError('gemini', 'GEMINI_API_KEY');\n }\n return new GoogleGenAI({ apiKey: key });\n }\n\n public getCapabilities(modelId: string): ModelCapabilities {\n const isPro = modelId.includes('pro');\n const isThinking = modelId.includes('thinking') || modelId.includes('2.0-flash-thinking');\n return {\n streaming: true,\n tools: true,\n images: true,\n reasoning: isThinking || isPro,\n contextWindow: isPro ? 2000000 : 1000000\n };\n }\n\n public async testConnection(): Promise<ProviderTestResult> {\n const startTime = Date.now();\n try {\n const client = this.getClient();\n const testModel = this.defaultModel;\n\n await client.models.countTokens({\n model: testModel,\n contents: 'test'\n });\n\n return {\n success: true,\n latencyMs: Date.now() - startTime,\n resolvedModel: testModel\n };\n } catch (err: any) {\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n error: err.message || String(err)\n };\n }\n }\n\n public async listModels(refresh = false): Promise<ProviderModelInfo[]> {\n if (!refresh && this.cachedModels && this.cachedModels.length > 0) {\n return this.cachedModels;\n }\n\n try {\n const client = this.getClient();\n const pagedList = await client.models.list();\n const models: ProviderModelInfo[] = [];\n\n for await (const m of pagedList) {\n const rawName = m.name || '';\n // Gemini model names are usually 'models/gemini-...'\n const modelId = rawName.startsWith('models/') ? rawName.slice(7) : rawName;\n\n // Filter to text/chat generative models\n if (!modelId.includes('gemini')) {\n continue;\n }\n\n const capabilities = this.getCapabilities(modelId);\n models.push({\n id: modelId,\n name: m.displayName || modelId,\n provider: this.id,\n description: m.description,\n contextWindow: capabilities.contextWindow,\n capabilities\n });\n }\n\n if (models.length > 0) {\n this.cachedModels = models;\n return models;\n }\n } catch {\n // If listing API is restricted or fails, fall back to known verified Gemini model catalog\n }\n\n // Fallback to verified catalog if discovery API call failed\n const verifiedModels = [\n 'gemini-3.8-flash',\n 'gemini-2.5-flash',\n 'gemini-2.5-pro',\n 'gemini-2.0-flash',\n 'gemini-2.0-flash-lite',\n 'gemini-1.5-flash',\n 'gemini-1.5-pro'\n ];\n\n return verifiedModels.map(id => ({\n id,\n name: id,\n provider: this.id,\n capabilities: this.getCapabilities(id),\n contextWindow: id.includes('pro') ? 2000000 : 1000000\n }));\n }\n\n public async streamGenerate(params: ProviderStreamParams): Promise<ProviderStreamResult> {\n const overallStartTime = Date.now();\n const timing: TimingDiagnostics = {\n totalMs: 0,\n toolExecutionMs: {}\n };\n\n const client = this.getClient();\n const contents = this.convertHistoryToContents(params.history);\n const functionDeclarations = this.convertToolsToDeclarations(params.tools);\n\n const config: Record<string, unknown> = {\n systemInstruction: params.systemInstruction,\n temperature: params.temperature ?? (params.lowLatency ? 0.1 : 0.2)\n };\n\n if (params.maxOutputTokens) {\n config.maxOutputTokens = params.maxOutputTokens;\n }\n\n const toolList: Array<Record<string, unknown>> = [];\n if (functionDeclarations.length > 0) {\n toolList.push({ functionDeclarations });\n }\n if (params.enableSearchGrounding) {\n toolList.push({ googleSearch: {} });\n }\n if (toolList.length > 0) {\n config.tools = toolList;\n }\n\n const timeoutMs = params.timeoutMs || 60000;\n const firstTokenTimeoutMs = params.firstTokenTimeoutMs || 30000;\n\n let attempts = 0;\n const maxAttempts = 3;\n let lastError: unknown = null;\n\n while (attempts < maxAttempts) {\n attempts++;\n const connectStart = Date.now();\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(attempts > 1 ? `retrying:${attempts}` : 'connecting');\n }\n\n const { controller, cleanup } = createLinkedAbortController(params.signal, timeoutMs);\n\n try {\n const responseStream = await client.models.generateContentStream({\n model: params.model,\n contents,\n config\n });\n\n timing.connectMs = Date.now() - connectStart;\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('waiting_first_token');\n }\n\n let fullText = '';\n const collectedToolCalls: ToolCallItem[] = [];\n const usage: TokenUsage = {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n };\n\n const wrappedStream = wrapStreamWithFirstTokenTimeout(\n responseStream,\n firstTokenTimeoutMs,\n this.displayName,\n params.model,\n controller.signal,\n latencyMs => {\n timing.ttftMs = latencyMs;\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('streaming');\n }\n }\n );\n\n const streamStart = Date.now();\n for await (const chunk of wrappedStream) {\n if (chunk.text) {\n fullText += chunk.text;\n if (params.callbacks.onChunk) {\n params.callbacks.onChunk(chunk.text);\n }\n }\n\n if (chunk.functionCalls && chunk.functionCalls.length > 0) {\n for (const fc of chunk.functionCalls) {\n collectedToolCalls.push({\n id: fc.id || `call_${Date.now()}_${Math.random().toString(36).slice(2, 7)}`,\n name: fc.name || '',\n args: (fc.args as Record<string, unknown>) || {}\n });\n }\n }\n\n if (chunk.usageMetadata) {\n usage.promptTokens = chunk.usageMetadata.promptTokenCount ?? usage.promptTokens;\n usage.candidatesTokens = chunk.usageMetadata.candidatesTokenCount ?? usage.candidatesTokens;\n usage.totalTokens = chunk.usageMetadata.totalTokenCount ?? usage.totalTokens;\n if (params.callbacks.onUsage) {\n params.callbacks.onUsage(usage);\n }\n }\n }\n\n timing.streamMs = Date.now() - streamStart;\n timing.totalMs = Date.now() - overallStartTime;\n\n if (params.callbacks.onToolCalls && collectedToolCalls.length > 0) {\n params.callbacks.onToolCalls(collectedToolCalls);\n }\n\n cleanup();\n\n return {\n text: fullText,\n toolCalls: collectedToolCalls,\n usage,\n timing\n };\n } catch (err: any) {\n cleanup();\n lastError = err;\n\n if (params.signal?.aborted) {\n throw err;\n }\n\n const msg = String(err?.message || err);\n if (msg.includes('API_KEY_INVALID') || msg.includes('401') || msg.includes('403')) {\n throw new LanternProviderError(`Authentication failed: ${msg}`, 401, this.id);\n }\n if (msg.includes('NOT_FOUND') || msg.includes('models/')) {\n throw new ModelNotFoundError(params.model, this.displayName);\n }\n\n const isRateLimit = msg.includes('429') || msg.includes('RESOURCE_EXHAUSTED');\n const isTransient = msg.includes('503') || msg.includes('overloaded') || msg.includes('ECONNRESET') || msg.includes('ETIMEDOUT') || msg.includes('socket hang up');\n\n if ((isRateLimit || isTransient) && attempts < maxAttempts) {\n const backoff = Math.min(1000 * Math.pow(1.5, attempts), 3000); // Capped small backoff (max 3s)\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(`retrying:${attempts}`);\n }\n await new Promise(r => setTimeout(r, backoff));\n continue;\n }\n\n if (isRateLimit) {\n throw new RateLimitError(msg);\n }\n\n throw new LanternProviderError(`Gemini request failed: ${msg}`, undefined, this.id);\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n private convertHistoryToContents(turns: ConversationTurn[]): Content[] {\n const contents: Content[] = [];\n\n for (const turn of turns) {\n const parts: Part[] = [];\n\n if (turn.role === 'user') {\n if (turn.text) {\n parts.push({ text: turn.text });\n }\n\n if (turn.attachments && turn.attachments.length > 0) {\n for (const att of turn.attachments) {\n if (att.base64Data && att.mimeType) {\n parts.push({\n inlineData: {\n mimeType: att.mimeType,\n data: att.base64Data\n }\n });\n } else if (att.textContent) {\n parts.push({\n text: `[Attached File: ${att.name}]\\n\\`\\`\\`\\n${att.textContent}\\n\\`\\`\\``\n });\n }\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'user', parts });\n }\n } else if (turn.role === 'model') {\n if (turn.text) {\n parts.push({ text: turn.text });\n }\n\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n for (const tc of turn.toolCalls) {\n parts.push({\n functionCall: {\n id: tc.id,\n name: tc.name,\n args: tc.args\n }\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'model', parts });\n }\n } else if (turn.role === 'tool') {\n if (turn.toolResults && turn.toolResults.length > 0) {\n for (const res of turn.toolResults) {\n parts.push({\n functionResponse: {\n id: res.callId,\n name: res.name,\n response: {\n result: res.error ? { error: res.error } : res.result\n }\n }\n });\n }\n }\n\n if (parts.length > 0) {\n contents.push({ role: 'tool', parts });\n }\n }\n }\n\n return contents;\n }\n\n private convertToolsToDeclarations(tools: ToolDefinition[]): FunctionDeclaration[] {\n return tools.map(tool => {\n const properties: Record<string, any> = {};\n\n for (const [propName, propDef] of Object.entries(tool.parameters.properties)) {\n let typeVal = Type.STRING;\n switch (propDef.type) {\n case 'number':\n case 'integer':\n typeVal = Type.NUMBER;\n break;\n case 'boolean':\n typeVal = Type.BOOLEAN;\n break;\n case 'array':\n typeVal = Type.ARRAY;\n break;\n case 'object':\n typeVal = Type.OBJECT;\n break;\n default:\n typeVal = Type.STRING;\n }\n\n properties[propName] = {\n type: typeVal,\n description: propDef.description,\n ...(propDef.enum ? { enum: propDef.enum } : {}),\n ...(propDef.items ? { items: { type: Type.STRING } } : {})\n };\n }\n\n return {\n name: tool.name,\n description: tool.description,\n parameters: {\n type: Type.OBJECT,\n properties,\n required: tool.parameters.required || []\n }\n };\n });\n }\n}\n","import { MissingApiKeyError, RateLimitError, LanternProviderError, ModelNotFoundError, AuthenticationError } from './errors.js';\nimport { createLinkedAbortController, wrapStreamWithFirstTokenTimeout } from './timeout.js';\nimport { getApiKey, maskApiKey } from '../security/credentials.js';\nimport type {\n IProviderAdapter,\n ProviderStreamParams,\n ProviderStreamResult,\n ProviderTestResult\n} from './types.js';\nimport type {\n ConversationTurn,\n ToolDefinition,\n TokenUsage,\n ToolCallItem,\n ProviderModelInfo,\n ModelCapabilities,\n TimingDiagnostics\n} from '../types.js';\n\nexport class OpenAIProvider implements IProviderAdapter {\n public id: string;\n public name: string;\n public displayName: string;\n public defaultModel: string;\n public baseUrl: string;\n public customHeaders: Record<string, string>;\n\n private cachedModels: ProviderModelInfo[] | null = null;\n\n constructor(options?: {\n id?: string;\n name?: string;\n displayName?: string;\n baseUrl?: string;\n defaultModel?: string;\n headers?: Record<string, string>;\n }) {\n this.id = options?.id || 'openai';\n this.name = options?.name || 'openai';\n this.displayName = options?.displayName || 'OpenAI';\n this.baseUrl = (options?.baseUrl || 'https://api.openai.com/v1').replace(/\\/+$/, '');\n this.defaultModel = options?.defaultModel || 'gpt-4o';\n this.customHeaders = options?.headers || {};\n }\n\n public isConfigured(): boolean {\n const { key } = getApiKey(this.id);\n return Boolean(key && key.trim().length > 0);\n }\n\n public getApiKey(): string | null {\n return getApiKey(this.id).key;\n }\n\n public getMaskedKey(): string {\n const key = this.getApiKey();\n return key ? maskApiKey(key) : '(not configured)';\n }\n\n public getCapabilities(modelId: string): ModelCapabilities {\n const lower = modelId.toLowerCase();\n const isReasoning = lower.includes('o1') || lower.includes('o3') || lower.includes('r1');\n const isMini = lower.includes('mini') || lower.includes('nano');\n return {\n streaming: true,\n tools: !isReasoning || lower.includes('o3-mini') || lower.includes('o1-mini'),\n images: !isMini && !lower.includes('embedding'),\n reasoning: isReasoning,\n contextWindow: lower.includes('gpt-4o') ? 128000 : 64000\n };\n }\n\n public async testConnection(): Promise<ProviderTestResult> {\n const key = this.getApiKey();\n if (!key) {\n return { success: false, latencyMs: 0, error: `Missing API key for ${this.displayName}` };\n }\n\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n const res = await fetch(`${this.baseUrl}/models`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${key}`,\n ...this.customHeaders\n },\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n const text = await res.text();\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n error: `HTTP ${res.status}: ${text.slice(0, 200)}`\n };\n }\n\n const data = await res.json() as any;\n const count = Array.isArray(data?.data) ? data.data.length : 0;\n\n return {\n success: true,\n latencyMs: Date.now() - startTime,\n modelsCount: count,\n resolvedModel: this.defaultModel\n };\n } catch (err: any) {\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n error: err.message || String(err)\n };\n }\n }\n\n public async listModels(refresh = false): Promise<ProviderModelInfo[]> {\n if (!refresh && this.cachedModels && this.cachedModels.length > 0) {\n return this.cachedModels;\n }\n\n const key = this.getApiKey();\n if (key) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n const res = await fetch(`${this.baseUrl}/models`, {\n method: 'GET',\n headers: {\n 'Authorization': `Bearer ${key}`,\n ...this.customHeaders\n },\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (res.ok) {\n const json = await res.json() as any;\n if (Array.isArray(json?.data)) {\n const models: ProviderModelInfo[] = [];\n for (const item of json.data) {\n const id = item.id;\n if (typeof id !== 'string') continue;\n\n // Filter out whisper, tts, dall-e, embedding models\n const lower = id.toLowerCase();\n if (\n lower.includes('whisper') ||\n lower.includes('tts') ||\n lower.includes('dall-e') ||\n lower.includes('text-embedding') ||\n lower.includes('moderation')\n ) {\n continue;\n }\n\n models.push({\n id,\n name: id,\n provider: this.id,\n capabilities: this.getCapabilities(id)\n });\n }\n\n if (models.length > 0) {\n this.cachedModels = models;\n return models;\n }\n }\n }\n } catch {\n // Fall back to verified catalog\n }\n }\n\n const verified = [\n 'gpt-4o',\n 'gpt-4o-mini',\n 'o3-mini',\n 'o1',\n 'o1-mini',\n 'gpt-4-turbo'\n ];\n\n return verified.map(id => ({\n id,\n name: id,\n provider: this.id,\n capabilities: this.getCapabilities(id)\n }));\n }\n\n public async streamGenerate(params: ProviderStreamParams): Promise<ProviderStreamResult> {\n const key = this.getApiKey();\n if (!key) {\n throw new MissingApiKeyError(this.id, `${this.id.toUpperCase()}_API_KEY`);\n }\n\n const overallStartTime = Date.now();\n const timing: TimingDiagnostics = {\n totalMs: 0,\n toolExecutionMs: {}\n };\n\n const messages = this.convertHistoryToMessages(params.systemInstruction, params.history);\n const tools = this.convertTools(params.tools);\n\n const payload: Record<string, unknown> = {\n model: params.model,\n messages,\n stream: true,\n stream_options: { include_usage: true }\n };\n\n if (tools.length > 0) {\n payload.tools = tools;\n }\n\n if (typeof params.temperature === 'number') {\n payload.temperature = params.temperature;\n }\n\n if (params.maxOutputTokens) {\n payload.max_tokens = params.maxOutputTokens;\n }\n\n const timeoutMs = params.timeoutMs || 60000;\n const firstTokenTimeoutMs = params.firstTokenTimeoutMs || 30000;\n\n let attempts = 0;\n const maxAttempts = 3;\n let lastError: unknown = null;\n\n while (attempts < maxAttempts) {\n attempts++;\n const connectStart = Date.now();\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(attempts > 1 ? `retrying:${attempts}` : 'connecting');\n }\n\n const { controller, cleanup } = createLinkedAbortController(params.signal, timeoutMs);\n\n try {\n const response = await fetch(`${this.baseUrl}/chat/completions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': `Bearer ${key}`,\n ...this.customHeaders\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n\n timing.connectMs = Date.now() - connectStart;\n\n if (!response.ok) {\n const errorBody = await response.text();\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(`OpenAI Auth Error (${response.status}): ${errorBody}`);\n }\n if (response.status === 429) {\n throw new RateLimitError(`OpenAI Rate Limit: ${errorBody}`);\n }\n if (response.status === 404) {\n throw new ModelNotFoundError(params.model, this.displayName);\n }\n throw new LanternProviderError(`OpenAI API Error (${response.status}): ${errorBody}`, response.status, this.id);\n }\n\n if (!response.body) {\n throw new LanternProviderError('OpenAI response body is null', undefined, this.id);\n }\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('waiting_first_token');\n }\n\n const rawStream = this.readSSEStream(response.body);\n\n let fullText = '';\n const toolCallsMap: Record<number, { id: string; name: string; argsText: string }> = {};\n const usage: TokenUsage = { promptTokens: 0, candidatesTokens: 0, totalTokens: 0 };\n\n const wrappedStream = wrapStreamWithFirstTokenTimeout(\n rawStream,\n firstTokenTimeoutMs,\n this.displayName,\n params.model,\n controller.signal,\n latencyMs => {\n timing.ttftMs = latencyMs;\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('streaming');\n }\n }\n );\n\n const streamStart = Date.now();\n\n for await (const chunk of wrappedStream) {\n const delta = chunk.choices?.[0]?.delta;\n\n if (delta?.content) {\n fullText += delta.content;\n if (params.callbacks.onChunk) {\n params.callbacks.onChunk(delta.content);\n }\n }\n\n if (Array.isArray(delta?.tool_calls)) {\n for (const tc of delta.tool_calls) {\n const index = tc.index ?? 0;\n if (!toolCallsMap[index]) {\n toolCallsMap[index] = {\n id: tc.id || `call_${Date.now()}_${index}`,\n name: tc.function?.name || '',\n argsText: tc.function?.arguments || ''\n };\n } else {\n if (tc.id) toolCallsMap[index].id = tc.id;\n if (tc.function?.name) toolCallsMap[index].name = tc.function.name;\n if (tc.function?.arguments) toolCallsMap[index].argsText += tc.function.arguments;\n }\n }\n }\n\n if (chunk.usage) {\n usage.promptTokens = chunk.usage.prompt_tokens ?? usage.promptTokens;\n usage.candidatesTokens = chunk.usage.completion_tokens ?? usage.candidatesTokens;\n usage.totalTokens = chunk.usage.total_tokens ?? usage.totalTokens;\n if (params.callbacks.onUsage) {\n params.callbacks.onUsage(usage);\n }\n }\n }\n\n timing.streamMs = Date.now() - streamStart;\n timing.totalMs = Date.now() - overallStartTime;\n\n const collectedToolCalls: ToolCallItem[] = Object.values(toolCallsMap).map(tc => {\n let parsedArgs = {};\n try {\n parsedArgs = JSON.parse(tc.argsText || '{}');\n } catch {\n parsedArgs = { raw: tc.argsText };\n }\n return {\n id: tc.id,\n name: tc.name,\n args: parsedArgs\n };\n });\n\n if (params.callbacks.onToolCalls && collectedToolCalls.length > 0) {\n params.callbacks.onToolCalls(collectedToolCalls);\n }\n\n cleanup();\n\n return {\n text: fullText,\n toolCalls: collectedToolCalls,\n usage,\n timing\n };\n } catch (err: any) {\n cleanup();\n lastError = err;\n\n if (params.signal?.aborted) {\n throw err;\n }\n\n const msg = String(err?.message || err);\n const isRateLimit = msg.includes('429') || err instanceof RateLimitError;\n const isTransient = msg.includes('503') || msg.includes('ECONNRESET') || msg.includes('ETIMEDOUT') || msg.includes('socket hang up');\n\n if ((isRateLimit || isTransient) && attempts < maxAttempts) {\n const backoff = Math.min(1000 * Math.pow(1.5, attempts), 3000);\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(`retrying:${attempts}`);\n }\n await new Promise(r => setTimeout(r, backoff));\n continue;\n }\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n private convertHistoryToMessages(systemInstruction: string, history: ConversationTurn[]): any[] {\n const messages: any[] = [];\n\n if (systemInstruction) {\n messages.push({ role: 'system', content: systemInstruction });\n }\n\n for (const turn of history) {\n if (turn.role === 'user') {\n const contentParts: any[] = [];\n if (turn.text) {\n contentParts.push({ type: 'text', text: turn.text });\n }\n if (turn.attachments) {\n for (const att of turn.attachments) {\n if (att.base64Data && att.mimeType.startsWith('image/')) {\n contentParts.push({\n type: 'image_url',\n image_url: { url: `data:${att.mimeType};base64,${att.base64Data}` }\n });\n } else if (att.textContent) {\n contentParts.push({\n type: 'text',\n text: `[Attached File: ${att.name}]\\n\\`\\`\\`\\n${att.textContent}\\n\\`\\`\\``\n });\n }\n }\n }\n messages.push({\n role: 'user',\n content: contentParts.length === 1 && contentParts[0].type === 'text' ? contentParts[0].text : contentParts\n });\n } else if (turn.role === 'model') {\n const msg: any = { role: 'assistant' };\n if (turn.text) msg.content = turn.text;\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n msg.tool_calls = turn.toolCalls.map(tc => ({\n id: tc.id,\n type: 'function',\n function: {\n name: tc.name,\n arguments: JSON.stringify(tc.args)\n }\n }));\n }\n messages.push(msg);\n } else if (turn.role === 'tool') {\n if (turn.toolResults) {\n for (const tr of turn.toolResults) {\n messages.push({\n role: 'tool',\n tool_call_id: tr.callId,\n content: typeof tr.result === 'string' ? tr.result : JSON.stringify(tr.result)\n });\n }\n }\n }\n }\n\n return messages;\n }\n\n private convertTools(tools: ToolDefinition[]): any[] {\n return tools.map(t => ({\n type: 'function',\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters\n }\n }));\n }\n\n private async *readSSEStream(stream: ReadableStream<Uint8Array>): AsyncGenerator<any, void, unknown> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('data: ')) {\n const dataStr = trimmed.slice(6).trim();\n if (dataStr === '[DONE]') return;\n\n try {\n yield JSON.parse(dataStr);\n } catch {\n // Ignore partial JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import { MissingApiKeyError, RateLimitError, LanternProviderError, ModelNotFoundError, AuthenticationError } from './errors.js';\nimport { createLinkedAbortController, wrapStreamWithFirstTokenTimeout } from './timeout.js';\nimport { getApiKey, maskApiKey } from '../security/credentials.js';\nimport type {\n IProviderAdapter,\n ProviderStreamParams,\n ProviderStreamResult,\n ProviderTestResult\n} from './types.js';\nimport type {\n ConversationTurn,\n ToolDefinition,\n TokenUsage,\n ToolCallItem,\n ProviderModelInfo,\n ModelCapabilities,\n TimingDiagnostics\n} from '../types.js';\n\nexport class AnthropicProvider implements IProviderAdapter {\n public id = 'anthropic';\n public name = 'anthropic';\n public displayName = 'Anthropic Claude';\n public defaultModel = 'claude-3-7-sonnet-20250219';\n public baseUrl = 'https://api.anthropic.com/v1';\n\n private cachedModels: ProviderModelInfo[] | null = null;\n\n public isConfigured(): boolean {\n const { key } = getApiKey(this.id);\n return Boolean(key && key.trim().length > 0);\n }\n\n public getApiKey(): string | null {\n return getApiKey(this.id).key;\n }\n\n public getMaskedKey(): string {\n const key = this.getApiKey();\n return key ? maskApiKey(key) : '(not configured)';\n }\n\n public getCapabilities(modelId: string): ModelCapabilities {\n const lower = modelId.toLowerCase();\n const isSonnet = lower.includes('sonnet');\n const isOpus = lower.includes('opus');\n return {\n streaming: true,\n tools: true,\n images: true,\n reasoning: isSonnet || isOpus,\n contextWindow: 200000\n };\n }\n\n public async testConnection(): Promise<ProviderTestResult> {\n const key = this.getApiKey();\n if (!key) {\n return { success: false, latencyMs: 0, error: 'Missing ANTHROPIC_API_KEY' };\n }\n\n const startTime = Date.now();\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n // Lightweight test request with max_tokens: 1\n const res = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01'\n },\n body: JSON.stringify({\n model: 'claude-3-5-haiku-20241022',\n max_tokens: 1,\n messages: [{ role: 'user', content: 'ping' }]\n }),\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n const text = await res.text();\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n error: `HTTP ${res.status}: ${text.slice(0, 200)}`\n };\n }\n\n return {\n success: true,\n latencyMs: Date.now() - startTime,\n resolvedModel: this.defaultModel\n };\n } catch (err: any) {\n return {\n success: false,\n latencyMs: Date.now() - startTime,\n error: err.message || String(err)\n };\n }\n }\n\n public async listModels(refresh = false): Promise<ProviderModelInfo[]> {\n if (!refresh && this.cachedModels && this.cachedModels.length > 0) {\n return this.cachedModels;\n }\n\n const key = this.getApiKey();\n if (key) {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n\n const res = await fetch(`${this.baseUrl}/models`, {\n method: 'GET',\n headers: {\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01'\n },\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (res.ok) {\n const json = await res.json() as any;\n if (Array.isArray(json?.data)) {\n const models: ProviderModelInfo[] = json.data.map((m: any) => ({\n id: m.id,\n name: m.display_name || m.id,\n provider: this.id,\n capabilities: this.getCapabilities(m.id),\n contextWindow: 200000\n }));\n if (models.length > 0) {\n this.cachedModels = models;\n return models;\n }\n }\n }\n } catch {\n // Fall back to verified catalog\n }\n }\n\n const verified = [\n 'claude-3-7-sonnet-20250219',\n 'claude-3-5-sonnet-20241022',\n 'claude-3-5-haiku-20241022',\n 'claude-3-opus-20240229'\n ];\n\n return verified.map(id => ({\n id,\n name: id,\n provider: this.id,\n capabilities: this.getCapabilities(id),\n contextWindow: 200000\n }));\n }\n\n public async streamGenerate(params: ProviderStreamParams): Promise<ProviderStreamResult> {\n const key = this.getApiKey();\n if (!key) {\n throw new MissingApiKeyError(this.id, 'ANTHROPIC_API_KEY');\n }\n\n const overallStartTime = Date.now();\n const timing: TimingDiagnostics = {\n totalMs: 0,\n toolExecutionMs: {}\n };\n\n const { messages, system } = this.convertHistoryToMessages(params.systemInstruction, params.history);\n const tools = this.convertTools(params.tools);\n\n const payload: Record<string, unknown> = {\n model: params.model,\n messages,\n max_tokens: params.maxOutputTokens || 4096,\n stream: true\n };\n\n if (system) {\n payload.system = system;\n }\n\n if (tools.length > 0) {\n payload.tools = tools;\n }\n\n if (typeof params.temperature === 'number') {\n payload.temperature = params.temperature;\n }\n\n const timeoutMs = params.timeoutMs || 60000;\n const firstTokenTimeoutMs = params.firstTokenTimeoutMs || 30000;\n\n let attempts = 0;\n const maxAttempts = 3;\n let lastError: unknown = null;\n\n while (attempts < maxAttempts) {\n attempts++;\n const connectStart = Date.now();\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(attempts > 1 ? `retrying:${attempts}` : 'connecting');\n }\n\n const { controller, cleanup } = createLinkedAbortController(params.signal, timeoutMs);\n\n try {\n const response = await fetch(`${this.baseUrl}/messages`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': key,\n 'anthropic-version': '2023-06-01'\n },\n body: JSON.stringify(payload),\n signal: controller.signal\n });\n\n timing.connectMs = Date.now() - connectStart;\n\n if (!response.ok) {\n const errorBody = await response.text();\n if (response.status === 401 || response.status === 403) {\n throw new AuthenticationError(`Anthropic Auth Error (${response.status}): ${errorBody}`);\n }\n if (response.status === 429) {\n throw new RateLimitError(`Anthropic Rate Limit: ${errorBody}`);\n }\n if (response.status === 404) {\n throw new ModelNotFoundError(params.model, this.displayName);\n }\n throw new LanternProviderError(`Anthropic API Error (${response.status}): ${errorBody}`, response.status, this.id);\n }\n\n if (!response.body) {\n throw new LanternProviderError('Anthropic response body is null', undefined, this.id);\n }\n\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('waiting_first_token');\n }\n\n const rawStream = this.readSSEStream(response.body);\n\n let fullText = '';\n const toolCallsMap: Record<number, { id: string; name: string; argsText: string }> = {};\n const usage: TokenUsage = { promptTokens: 0, candidatesTokens: 0, totalTokens: 0 };\n\n const wrappedStream = wrapStreamWithFirstTokenTimeout(\n rawStream,\n firstTokenTimeoutMs,\n this.displayName,\n params.model,\n controller.signal,\n latencyMs => {\n timing.ttftMs = latencyMs;\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange('streaming');\n }\n }\n );\n\n const streamStart = Date.now();\n\n for await (const event of wrappedStream) {\n const type = event.type;\n\n if (type === 'message_start' && event.message?.usage) {\n usage.promptTokens = event.message.usage.input_tokens || 0;\n }\n\n if (type === 'content_block_start') {\n const index = event.index ?? 0;\n if (event.content_block?.type === 'tool_use') {\n toolCallsMap[index] = {\n id: event.content_block.id || `call_${Date.now()}_${index}`,\n name: event.content_block.name || '',\n argsText: ''\n };\n }\n }\n\n if (type === 'content_block_delta') {\n const index = event.index ?? 0;\n const delta = event.delta;\n\n if (delta?.type === 'text_delta' && delta.text) {\n fullText += delta.text;\n if (params.callbacks.onChunk) {\n params.callbacks.onChunk(delta.text);\n }\n } else if (delta?.type === 'input_json_delta' && delta.partial_json) {\n if (toolCallsMap[index]) {\n toolCallsMap[index].argsText += delta.partial_json;\n }\n }\n }\n\n if (type === 'message_delta' && event.usage) {\n usage.candidatesTokens = event.usage.output_tokens || 0;\n usage.totalTokens = usage.promptTokens + usage.candidatesTokens;\n if (params.callbacks.onUsage) {\n params.callbacks.onUsage(usage);\n }\n }\n }\n\n timing.streamMs = Date.now() - streamStart;\n timing.totalMs = Date.now() - overallStartTime;\n\n const collectedToolCalls: ToolCallItem[] = Object.values(toolCallsMap).map(tc => {\n let parsedArgs = {};\n try {\n parsedArgs = JSON.parse(tc.argsText || '{}');\n } catch {\n parsedArgs = { raw: tc.argsText };\n }\n return {\n id: tc.id,\n name: tc.name,\n args: parsedArgs\n };\n });\n\n if (params.callbacks.onToolCalls && collectedToolCalls.length > 0) {\n params.callbacks.onToolCalls(collectedToolCalls);\n }\n\n cleanup();\n\n return {\n text: fullText,\n toolCalls: collectedToolCalls,\n usage,\n timing\n };\n } catch (err: any) {\n cleanup();\n lastError = err;\n\n if (params.signal?.aborted) {\n throw err;\n }\n\n const msg = String(err?.message || err);\n const isRateLimit = msg.includes('429') || err instanceof RateLimitError;\n const isTransient = msg.includes('503') || msg.includes('overloaded') || msg.includes('ECONNRESET') || msg.includes('ETIMEDOUT');\n\n if ((isRateLimit || isTransient) && attempts < maxAttempts) {\n const backoff = Math.min(1000 * Math.pow(1.5, attempts), 3000);\n if (params.callbacks.onStateChange) {\n params.callbacks.onStateChange(`retrying:${attempts}`);\n }\n await new Promise(r => setTimeout(r, backoff));\n continue;\n }\n\n throw err instanceof Error ? err : new Error(String(err));\n }\n }\n\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n private convertHistoryToMessages(systemInstruction: string, history: ConversationTurn[]): { messages: any[]; system?: string } {\n const messages: any[] = [];\n\n for (const turn of history) {\n if (turn.role === 'user') {\n const content: any[] = [];\n if (turn.text) {\n content.push({ type: 'text', text: turn.text });\n }\n if (turn.attachments) {\n for (const att of turn.attachments) {\n if (att.base64Data && att.mimeType.startsWith('image/')) {\n content.push({\n type: 'image',\n source: {\n type: 'base64',\n media_type: att.mimeType,\n data: att.base64Data\n }\n });\n } else if (att.textContent) {\n content.push({\n type: 'text',\n text: `[Attached File: ${att.name}]\\n\\`\\`\\`\\n${att.textContent}\\n\\`\\`\\``\n });\n }\n }\n }\n messages.push({ role: 'user', content });\n } else if (turn.role === 'model') {\n const content: any[] = [];\n if (turn.text) {\n content.push({ type: 'text', text: turn.text });\n }\n if (turn.toolCalls) {\n for (const tc of turn.toolCalls) {\n content.push({\n type: 'tool_use',\n id: tc.id,\n name: tc.name,\n input: tc.args\n });\n }\n }\n messages.push({ role: 'assistant', content });\n } else if (turn.role === 'tool') {\n if (turn.toolResults) {\n const content: any[] = [];\n for (const tr of turn.toolResults) {\n content.push({\n type: 'tool_result',\n tool_use_id: tr.callId,\n content: typeof tr.result === 'string' ? tr.result : JSON.stringify(tr.result)\n });\n }\n messages.push({ role: 'user', content });\n }\n }\n }\n\n return { messages, system: systemInstruction || undefined };\n }\n\n private convertTools(tools: ToolDefinition[]): any[] {\n return tools.map(t => ({\n name: t.name,\n description: t.description,\n input_schema: t.parameters\n }));\n }\n\n private async *readSSEStream(stream: ReadableStream<Uint8Array>): AsyncGenerator<any, void, unknown> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(':')) continue;\n\n if (trimmed.startsWith('data: ')) {\n const dataStr = trimmed.slice(6).trim();\n try {\n yield JSON.parse(dataStr);\n } catch {\n // Ignore partial JSON\n }\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n","import { OpenAIProvider } from './openaiProvider.js';\nimport type { ProviderModelInfo, ModelCapabilities } from '../types.js';\n\nexport class OpenRouterProvider extends OpenAIProvider {\n constructor() {\n super({\n id: 'openrouter',\n name: 'openrouter',\n displayName: 'OpenRouter',\n baseUrl: 'https://openrouter.ai/api/v1',\n defaultModel: 'anthropic/claude-3.7-sonnet',\n headers: {\n 'HTTP-Referer': 'https://github.com/codelantern/codelantern-agent-cli',\n 'X-Title': 'Code Lantern CLI'\n }\n });\n }\n\n public override getCapabilities(modelId: string): ModelCapabilities {\n const lower = modelId.toLowerCase();\n const isReasoning = lower.includes('r1') || lower.includes('o1') || lower.includes('o3') || lower.includes('reason');\n return {\n streaming: true,\n tools: !lower.includes(':free') && !lower.includes('deepseek-r1'), // Most OpenRouter models support tool calling\n images: lower.includes('vision') || lower.includes('gpt-4o') || lower.includes('claude-3') || lower.includes('gemini'),\n reasoning: isReasoning,\n contextWindow: 128000\n };\n }\n\n public override async listModels(refresh = false): Promise<ProviderModelInfo[]> {\n const key = this.getApiKey();\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 10000);\n\n const headers: Record<string, string> = { ...this.customHeaders };\n if (key) {\n headers['Authorization'] = `Bearer ${key}`;\n }\n\n const res = await fetch(`${this.baseUrl}/models`, {\n method: 'GET',\n headers,\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (res.ok) {\n const json = await res.json() as any;\n if (Array.isArray(json?.data)) {\n const models: ProviderModelInfo[] = json.data.slice(0, 100).map((m: any) => ({\n id: m.id,\n name: m.name || m.id,\n provider: this.id,\n description: m.description,\n contextWindow: m.context_length || 128000,\n capabilities: this.getCapabilities(m.id),\n pricing: m.pricing ? {\n promptPer1k: parseFloat(m.pricing.prompt) * 1000,\n completionPer1k: parseFloat(m.pricing.completion) * 1000\n } : undefined\n }));\n return models;\n }\n }\n } catch {\n // ignore discovery failure and fall back\n }\n\n const verified = [\n 'anthropic/claude-3.7-sonnet',\n 'anthropic/claude-3.5-sonnet',\n 'openai/gpt-4o',\n 'openai/o3-mini',\n 'google/gemini-2.5-flash',\n 'deepseek/deepseek-chat',\n 'meta-llama/llama-3.3-70b-instruct'\n ];\n\n return verified.map(id => ({\n id,\n name: id,\n provider: this.id,\n capabilities: this.getCapabilities(id)\n }));\n }\n}\n","import { GeminiProvider } from './gemini.js';\nimport { OpenAIProvider } from './openaiProvider.js';\nimport { AnthropicProvider } from './anthropicProvider.js';\nimport { OpenRouterProvider } from './openrouterProvider.js';\nimport { loadConfig, saveConfig } from '../config/config.js';\nimport type { IProviderAdapter, ProviderTestResult } from './types.js';\nimport type { ProviderConfig, ProviderModelInfo } from '../types.js';\n\nexport class ProviderRegistry {\n private providers: Map<string, IProviderAdapter> = new Map();\n\n constructor() {\n this.registerBuiltins();\n this.loadCustomProviders();\n }\n\n private registerBuiltins(): void {\n const gemini = new GeminiProvider();\n const openai = new OpenAIProvider();\n const anthropic = new AnthropicProvider();\n const openrouter = new OpenRouterProvider();\n\n this.providers.set(gemini.id, gemini);\n this.providers.set(openai.id, openai);\n this.providers.set(anthropic.id, anthropic);\n this.providers.set(openrouter.id, openrouter);\n }\n\n private loadCustomProviders(): void {\n const config = loadConfig();\n if (config.providers) {\n for (const [id, provConfig] of Object.entries(config.providers)) {\n if (!provConfig.disabled) {\n const adapter = new OpenAIProvider({\n id,\n name: provConfig.name || id,\n displayName: provConfig.name || id,\n baseUrl: provConfig.baseUrl,\n defaultModel: provConfig.defaultModel || 'default',\n headers: provConfig.headers\n });\n this.providers.set(id, adapter);\n }\n }\n }\n }\n\n public getProvider(id?: string): IProviderAdapter {\n const targetId = (id || loadConfig().activeProvider || 'gemini').toLowerCase();\n const provider = this.providers.get(targetId);\n\n if (provider) {\n return provider;\n }\n\n // Default to gemini if not found\n const gemini = this.providers.get('gemini');\n if (gemini) return gemini;\n\n // Return the first available provider\n const first = Array.from(this.providers.values())[0];\n if (first) return first;\n\n throw new Error(`No provider adapter registered for '${targetId}'.`);\n }\n\n public hasProvider(id: string): boolean {\n return this.providers.has(id.toLowerCase());\n }\n\n public listProviders(): Array<{\n id: string;\n name: string;\n displayName: string;\n isConfigured: boolean;\n maskedKey: string;\n defaultModel: string;\n isActive: boolean;\n }> {\n const activeId = (loadConfig().activeProvider || 'gemini').toLowerCase();\n return Array.from(this.providers.values()).map(p => ({\n id: p.id,\n name: p.name,\n displayName: p.displayName,\n isConfigured: p.isConfigured(),\n maskedKey: p.getMaskedKey(),\n defaultModel: p.defaultModel,\n isActive: p.id === activeId\n }));\n }\n\n public registerCustomProvider(cfg: ProviderConfig): void {\n const id = cfg.id.toLowerCase();\n const adapter = new OpenAIProvider({\n id,\n name: cfg.name || id,\n displayName: cfg.name || id,\n baseUrl: cfg.baseUrl,\n defaultModel: cfg.defaultModel || 'default',\n headers: cfg.headers\n });\n\n this.providers.set(id, adapter);\n\n // Save to persistent config\n const currentConfig = loadConfig();\n if (!currentConfig.providers) currentConfig.providers = {};\n currentConfig.providers[id] = cfg;\n saveConfig(currentConfig);\n }\n\n public removeCustomProvider(id: string): boolean {\n const norm = id.toLowerCase();\n const builtins = ['gemini', 'openai', 'anthropic', 'openrouter'];\n if (builtins.includes(norm)) {\n return false; // Cannot remove native builtins\n }\n\n const deleted = this.providers.delete(norm);\n const currentConfig = loadConfig();\n if (currentConfig.providers && currentConfig.providers[norm]) {\n delete currentConfig.providers[norm];\n saveConfig(currentConfig);\n }\n return deleted;\n }\n\n public async testProvider(id?: string): Promise<ProviderTestResult> {\n const p = this.getProvider(id);\n return await p.testConnection();\n }\n\n public async listModels(providerId?: string, refresh = false): Promise<ProviderModelInfo[]> {\n const p = this.getProvider(providerId);\n return await p.listModels(refresh);\n }\n}\n","import path from 'node:path';\n\n// Known secret file patterns to block from automatic reads or prompts\nconst SECRET_FILE_PATTERNS: RegExp[] = [\n /^\\.env(\\..+)?$/i,\n /\\.pem$/i,\n /\\.key$/i,\n /\\.pfx$/i,\n /\\.p12$/i,\n /^id_rsa/i,\n /^id_dsa/i,\n /^id_ecdsa/i,\n /^id_ed25519/i,\n /service[_-]?account.*\\.json$/i,\n /credentials.*\\.json$/i,\n /\\.keystore$/i,\n /\\.token$/i,\n /\\.secret/i\n];\n\n// Patterns for potential credentials in text\nconst SECRET_TEXT_PATTERNS = [\n // Google API keys\n /AIza[0-9A-Za-z-_]{35}/g,\n // Generic token / bearer strings\n /(?:api[_-]?key|secret|token|password|bearer)[ \\t]*[:=][ \\t]*['\"]?([a-zA-Z0-9_\\-.~+]{16,})['\"]?/gi,\n // GitHub Personal Access Tokens\n /ghp_[0-9a-zA-Z]{36}/g,\n /github_pat_[0-9a-zA-Z_]{82}/g,\n // AWS Access Key ID\n /AKIA[0-9A-Z]{16}/g\n];\n\nexport function isSecretFile(filePath: string): boolean {\n const base = path.basename(filePath);\n return SECRET_FILE_PATTERNS.some(pattern => pattern.test(base));\n}\n\nexport function sanitizeSecrets(text: string): string {\n if (!text) return text;\n let sanitized = text;\n\n // Mask Google API keys (AIza followed by 30 to 40 alphanumeric/dash/underscore chars)\n sanitized = sanitized.replace(/AIza[0-9A-Za-z\\-_]{30,40}/g, 'AIza***********************************');\n\n // Mask GitHub tokens\n sanitized = sanitized.replace(/ghp_[0-9a-zA-Z]{36}/g, 'ghp_************************************');\n sanitized = sanitized.replace(/github_pat_[0-9a-zA-Z_]{82}/g, 'github_pat_**********************************************************************************');\n\n // Mask GEMINI_API_KEY if present in environment\n const currentKey = process.env.GEMINI_API_KEY;\n if (currentKey && currentKey.length > 5) {\n sanitized = sanitized.split(currentKey).join('[REDACTED_GEMINI_API_KEY]');\n }\n\n return sanitized;\n}\n","import path from 'node:path';\nimport fs from 'node:fs';\nimport { isSecretFile } from './secrets.js';\n\nexport interface PathValidationResult {\n allowed: boolean;\n resolvedPath: string;\n relativePath: string;\n reason?: string;\n}\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Normalizes a path for consistent cross-platform comparison\n */\nfunction normalizeForComparison(p: string): string {\n const resolved = path.resolve(p);\n return isWindows ? resolved.toLowerCase() : resolved;\n}\n\n/**\n * Checks if target path is safely contained within parent directory\n */\nfunction isContainedWithin(parent: string, target: string): boolean {\n const normParent = normalizeForComparison(parent);\n const normTarget = normalizeForComparison(target);\n\n const rel = path.relative(normParent, normTarget);\n return !rel.startsWith('..') && !path.isAbsolute(rel);\n}\n\nexport function validateWorkspacePath(\n targetPath: string,\n workspaceDir: string,\n allowedExternalPaths: string[] = []\n): PathValidationResult {\n if (!targetPath || typeof targetPath !== 'string') {\n return {\n allowed: false,\n resolvedPath: '',\n relativePath: '',\n reason: 'Empty or invalid file path provided.'\n };\n }\n\n // Canonicalize workspace directory\n let normalizedWorkspace = path.resolve(workspaceDir);\n try {\n if (fs.existsSync(normalizedWorkspace)) {\n normalizedWorkspace = fs.realpathSync(normalizedWorkspace);\n }\n } catch {\n // Fall back to resolved path if realpath fails\n }\n\n const resolvedTarget = path.isAbsolute(targetPath)\n ? path.resolve(targetPath)\n : path.resolve(normalizedWorkspace, targetPath);\n\n // Check if explicitly allowed (e.g. user-attached files)\n const isExplicitlyAllowed = allowedExternalPaths.some(p => {\n const normAllowed = normalizeForComparison(p);\n const normTarget = normalizeForComparison(resolvedTarget);\n return normAllowed === normTarget;\n });\n\n if (isExplicitlyAllowed) {\n return {\n allowed: true,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget) || path.basename(resolvedTarget)\n };\n }\n\n // Prevent path traversal outside workspace\n if (!isContainedWithin(normalizedWorkspace, resolvedTarget)) {\n return {\n allowed: false,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget),\n reason: `Path '${targetPath}' is outside the authorized workspace: ${normalizedWorkspace}`\n };\n }\n\n // Check symlinks if path exists\n try {\n if (fs.existsSync(resolvedTarget)) {\n const realTarget = fs.realpathSync(resolvedTarget);\n if (!isContainedWithin(normalizedWorkspace, realTarget)) {\n return {\n allowed: false,\n resolvedPath: realTarget,\n relativePath: path.relative(normalizedWorkspace, realTarget),\n reason: `Symlink target points outside the workspace: ${realTarget}`\n };\n }\n }\n } catch {\n // If realpath check cannot be resolved, safe to continue if resolvedTarget was inside\n }\n\n // Secret file check\n if (isSecretFile(resolvedTarget)) {\n return {\n allowed: false,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget),\n reason: `Access to secret or credential file '${path.basename(resolvedTarget)}' is blocked for security.`\n };\n }\n\n return {\n allowed: true,\n resolvedPath: resolvedTarget,\n relativePath: path.relative(normalizedWorkspace, resolvedTarget) || '.'\n };\n}\n","import * as Diff from 'diff';\nimport pc from 'picocolors';\n\nexport function formatTerminalDiff(\n filePath: string,\n oldContent: string,\n newContent: string,\n contextLines = 3\n): string {\n // Normalize Windows CRLF line endings for reliable diffing\n const normalizedOld = oldContent.replace(/\\r\\n/g, '\\n');\n const normalizedNew = newContent.replace(/\\r\\n/g, '\\n');\n\n const patch = Diff.createPatch(filePath, normalizedOld, normalizedNew, 'Original', 'Modified', {\n context: contextLines\n });\n\n const lines = patch.split('\\n');\n const formatted: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (line.startsWith('---') || line.startsWith('+++')) {\n formatted.push(pc.bold(pc.cyan(line)));\n } else if (line.startsWith('@@')) {\n formatted.push(pc.magenta(line));\n } else if (line.startsWith('+')) {\n formatted.push(pc.green(line));\n } else if (line.startsWith('-')) {\n formatted.push(pc.red(line));\n } else {\n formatted.push(pc.dim(line));\n }\n }\n\n return formatted.join('\\n');\n}\n\nexport function formatNewFilePreview(filePath: string, content: string, maxPreviewLines = 30): string {\n const normalized = content.replace(/\\r\\n/g, '\\n');\n const lines = normalized.split('\\n');\n const preview = lines.slice(0, maxPreviewLines).map((line, idx) => {\n const lineNum = String(idx + 1).padStart(4, ' ');\n return `${pc.dim(lineNum)} ${pc.green('+')} ${pc.green(line)}`;\n });\n\n if (lines.length > maxPreviewLines) {\n preview.push(pc.dim(` ... and ${lines.length - maxPreviewLines} more lines`));\n }\n\n return [\n pc.bold(pc.cyan(`+++ Create new file: ${filePath} (${lines.length} lines)`)),\n ...preview\n ].join('\\n');\n}\n","export interface CommandValidationResult {\n allowed: boolean;\n reason?: string;\n isHighRisk?: boolean;\n}\n\n// Patterns that are unconditionally blocked to protect system integrity on macOS, Linux, and Windows\nconst DESTRUCTIVE_PATTERNS: Array<{ regex: RegExp; reason: string }> = [\n // Unix root/home deletion\n { regex: /\\brm\\s+-[rf]{1,2}\\s+([/~]|\\$HOME|\\.\\.\\/|\\.\\.\\\\)/i, reason: 'Attempt to delete root, home, or parent directories.' },\n { regex: /\\brm\\s+-[rf]{1,2}\\s+\\*\\s*$/i, reason: 'Attempt to recursively delete everything in directory.' },\n // Unix filesystem destruction\n { regex: /\\bmkfs(\\.\\w+)?\\b/i, reason: 'Filesystem format commands are forbidden.' },\n { regex: /\\bdd\\s+.*of=\\/dev\\/(r?[shv]d[a-z]|disk|nvme)/i, reason: 'Direct disk write commands are forbidden.' },\n { regex: /:\\(\\)\\s*\\{\\s*:\\s*\\|\\s*:\\s*&\\s*\\}\\s*;\\s*:/, reason: 'Fork bombs are strictly blocked.' },\n { regex: /\\b(shutdown|reboot|poweroff|init\\s+0)\\b/i, reason: 'System shutdown/reboot commands are forbidden.' },\n { regex: /\\bchmod\\s+-[rR]\\s+777\\s+([/~]|\\$HOME)/i, reason: 'Dangerous permissions modification at root/home.' },\n // Windows destructive commands\n { regex: /\\bformat\\s+[a-z]:/i, reason: 'Disk format command is forbidden.' },\n { regex: /\\b(del|erase)\\s+.*\\/s.*\\/q.*[a-z]:\\\\/i, reason: 'Recursive deletion of root Windows drive is forbidden.' },\n { regex: /\\b(rd|rmdir)\\s+.*\\/s.*\\/q.*[a-z]:\\\\/i, reason: 'Recursive removal of root Windows drive is forbidden.' },\n { regex: /\\bRemove-Item\\s+.*-Recurse\\s+.*[a-z]:\\\\/i, reason: 'Recursive PowerShell deletion of drive root is forbidden.' }\n];\n\nexport function validateCommand(command: string): CommandValidationResult {\n if (!command || command.trim().length === 0) {\n return { allowed: false, reason: 'Empty command string.' };\n }\n\n const trimmed = command.trim();\n\n // Check destructive command blocks\n for (const check of DESTRUCTIVE_PATTERNS) {\n if (check.regex.test(trimmed)) {\n return {\n allowed: false,\n reason: `Blocked dangerous command pattern: ${check.reason}`\n };\n }\n }\n\n // Check high-risk operations that require caution\n const isPublishOrPush = /\\b(npm\\s+publish|git\\s+push|docker\\s+push)\\b/i.test(trimmed);\n\n return {\n allowed: true,\n isHighRisk: isPublishOrPush\n };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { OrbitTool } from './types.js';\nimport { validateWorkspacePath } from '../security/sandbox.js';\nimport { formatTerminalDiff, formatNewFilePreview } from '../approval/diffViewer.js';\n\nexport const readFileTool: OrbitTool = {\n definition: {\n name: 'read_file',\n description: 'Read the contents of a text file inside the workspace. Optionally specify a line range.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to read within the workspace.'\n },\n start_line: {\n type: 'integer',\n description: 'Optional 1-indexed start line number to read from.'\n },\n end_line: {\n type: 'integer',\n description: 'Optional 1-indexed end line number to read until (inclusive).'\n }\n },\n required: ['path']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const validation = validateWorkspacePath(rawPath, context.workspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Error: File not found at '${validation.relativePath}'`,\n error: 'File not found'\n };\n }\n\n const stat = fs.statSync(validation.resolvedPath);\n if (!stat.isFile()) {\n return {\n success: false,\n output: `Error: Path is a directory, not a file: '${validation.relativePath}'`,\n error: 'Path is a directory'\n };\n }\n\n // Limit single file read to 1MB\n if (stat.size > 1024 * 1024) {\n return {\n success: false,\n output: `Error: File is too large to read entirely (${(stat.size / 1024).toFixed(0)}KB). Please specify start_line and end_line.`,\n error: 'File too large'\n };\n }\n\n try {\n const content = fs.readFileSync(validation.resolvedPath, 'utf8');\n const lines = content.split('\\n');\n const totalLines = lines.length;\n\n let start = 1;\n let end = totalLines;\n\n if (typeof args.start_line === 'number' && args.start_line > 0) {\n start = Math.max(1, Math.min(args.start_line, totalLines));\n }\n\n if (typeof args.end_line === 'number' && args.end_line >= start) {\n end = Math.min(args.end_line, totalLines);\n }\n\n const selectedLines = lines.slice(start - 1, end);\n const numberedLines = selectedLines.map((line, idx) => {\n const lineNum = String(start + idx).padStart(4, ' ');\n return `${lineNum} | ${line}`;\n });\n\n const output = [\n `File: ${validation.relativePath} (${start}-${end} of ${totalLines} lines)`,\n '```',\n ...numberedLines,\n '```'\n ].join('\\n');\n\n return {\n success: true,\n output,\n metadata: {\n path: validation.relativePath,\n startLine: start,\n endLine: end,\n totalLines\n }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error reading file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const writeFileTool: OrbitTool = {\n definition: {\n name: 'write_file',\n description: 'Create a new file or completely overwrite an existing file with the provided content.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to create or overwrite.'\n },\n content: {\n type: 'string',\n description: 'The complete text content to write to the file.'\n }\n },\n required: ['path', 'content']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const content = String(args.content ?? '');\n const validation = validateWorkspacePath(rawPath, context.workspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n const fileExists = fs.existsSync(validation.resolvedPath);\n let oldContent = '';\n if (fileExists) {\n try {\n oldContent = fs.readFileSync(validation.resolvedPath, 'utf8');\n } catch {\n oldContent = '';\n }\n }\n\n // Request approval\n const approved = await context.requestApproval({\n type: 'file_write',\n summary: fileExists ? `Overwrite existing file: ${validation.relativePath}` : `Create new file: ${validation.relativePath}`,\n details: {\n path: validation.relativePath,\n before: oldContent,\n after: content,\n diff: fileExists ? formatTerminalDiff(validation.relativePath, oldContent, content) : formatNewFilePreview(validation.relativePath, content)\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Write rejected: User declined approval to write '${validation.relativePath}'.`,\n error: 'Approval rejected'\n };\n }\n\n try {\n const parentDir = path.dirname(validation.resolvedPath);\n if (!fs.existsSync(parentDir)) {\n fs.mkdirSync(parentDir, { recursive: true });\n }\n\n fs.writeFileSync(validation.resolvedPath, content, 'utf8');\n const lines = content.split('\\n').length;\n\n return {\n success: true,\n output: `Successfully wrote ${lines} lines to ${validation.relativePath}`,\n metadata: { path: validation.relativePath, lines }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Failed to write file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const editFileTool: OrbitTool = {\n definition: {\n name: 'edit_file',\n description: 'Propose and apply a focused edit by replacing exact existing text with new replacement text.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of the file to edit.'\n },\n target: {\n type: 'string',\n description: 'The exact string in the file to be replaced. Must match character-for-character including indentation.'\n },\n replacement: {\n type: 'string',\n description: 'The replacement string to insert in place of target.'\n }\n },\n required: ['path', 'target', 'replacement']\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n const target = String(args.target ?? '');\n const replacement = String(args.replacement ?? '');\n\n const validation = validateWorkspacePath(rawPath, context.workspace);\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Error: File not found at '${validation.relativePath}'`,\n error: 'File not found'\n };\n }\n\n try {\n const original = fs.readFileSync(validation.resolvedPath, 'utf8');\n const hasCrlf = original.includes('\\r\\n');\n\n let matchedTarget = target;\n if (!original.includes(target)) {\n if (hasCrlf && !target.includes('\\r\\n')) {\n const crlfTarget = target.replace(/\\n/g, '\\r\\n');\n if (original.includes(crlfTarget)) {\n matchedTarget = crlfTarget;\n }\n } else if (!hasCrlf && target.includes('\\r\\n')) {\n const lfTarget = target.replace(/\\r\\n/g, '\\n');\n if (original.includes(lfTarget)) {\n matchedTarget = lfTarget;\n }\n }\n }\n\n if (!original.includes(matchedTarget)) {\n return {\n success: false,\n output: `Error: Target string not found in ${validation.relativePath}. Please verify whitespace, indentation, or read the file again to confirm line contents.`,\n error: 'Target string not found'\n };\n }\n\n const occurrences = original.split(matchedTarget).length - 1;\n if (occurrences > 1) {\n return {\n success: false,\n output: `Warning: Target string appears ${occurrences} times in ${validation.relativePath}. Please provide more surrounding context in 'target' to make the match unique.`,\n error: 'Target string ambiguous'\n };\n }\n\n const matchedReplacement = hasCrlf && !replacement.includes('\\r\\n')\n ? replacement.replace(/\\n/g, '\\r\\n')\n : replacement;\n\n const updated = original.replace(matchedTarget, matchedReplacement);\n\n // Request approval with diff preview\n const approved = await context.requestApproval({\n type: 'file_edit',\n summary: `Edit file: ${validation.relativePath}`,\n details: {\n path: validation.relativePath,\n before: original,\n after: updated,\n diff: formatTerminalDiff(validation.relativePath, original, updated)\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Edit rejected: User declined approval to edit '${validation.relativePath}'.`,\n error: 'Approval rejected'\n };\n }\n\n fs.writeFileSync(validation.resolvedPath, updated, 'utf8');\n return {\n success: true,\n output: `Successfully applied edit to ${validation.relativePath}`,\n metadata: { path: validation.relativePath }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Failed to edit file: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport fg from 'fast-glob';\nimport ignore from 'ignore';\nimport type { OrbitTool } from './types.js';\nimport { validateWorkspacePath } from '../security/sandbox.js';\n\nconst DEFAULT_IGNORED_DIRS = [\n 'node_modules',\n '.git',\n '.codelantern',\n '.lantern',\n '.orbit',\n 'dist',\n 'build',\n 'coverage',\n '.turbo',\n '.next',\n '.cache',\n '.gemini',\n '.vscode',\n '.idea'\n];\n\nfunction getWorkspaceIgnore(workspaceDir: string) {\n const ig = ignore();\n ig.add(DEFAULT_IGNORED_DIRS);\n\n const gitignorePath = path.join(workspaceDir, '.gitignore');\n if (fs.existsSync(gitignorePath)) {\n try {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n ig.add(gitignoreContent);\n } catch {\n // ignore read error\n }\n }\n\n return ig;\n}\n\nexport const listDirectoryTool: OrbitTool = {\n definition: {\n name: 'list_directory',\n description: 'List the contents of a directory in the workspace, respecting ignore rules.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n path: {\n type: 'string',\n description: 'Relative path of directory to inspect. Omit or pass empty for workspace root.'\n },\n depth: {\n type: 'integer',\n description: 'Maximum depth of recursion (default 1, max 4).'\n }\n }\n }\n },\n async execute(args, context) {\n const rawPath = String(args.path || '').trim();\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const validation = validateWorkspacePath(rawPath || '.', realWorkspace);\n\n if (!validation.allowed) {\n return {\n success: false,\n output: `Error: Access denied. ${validation.reason}`,\n error: validation.reason\n };\n }\n\n if (!fs.existsSync(validation.resolvedPath)) {\n return {\n success: false,\n output: `Directory not found: ${validation.relativePath || '.'}`,\n error: 'Not found'\n };\n }\n\n const maxDepth = Math.min(Math.max(1, Number(args.depth) || 1), 4);\n const ig = getWorkspaceIgnore(realWorkspace);\n\n try {\n const results: string[] = [];\n\n function walk(currentDir: string, currentDepth: number) {\n if (currentDepth > maxDepth) return;\n\n const entries = fs.readdirSync(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n const relToWorkspace = path.relative(realWorkspace, fullPath).replace(/\\\\/g, '/');\n\n // Check ignore\n if (ig.ignores(relToWorkspace) || DEFAULT_IGNORED_DIRS.includes(entry.name)) {\n continue;\n }\n\n const prefix = ' '.repeat(currentDepth - 1);\n if (entry.isDirectory()) {\n results.push(`${prefix}📁 ${entry.name}/`);\n walk(fullPath, currentDepth + 1);\n } else {\n results.push(`${prefix}📄 ${entry.name}`);\n }\n }\n }\n\n walk(validation.resolvedPath, 1);\n\n return {\n success: true,\n output: results.length > 0 ? results.join('\\n') : '(empty directory)',\n metadata: { count: results.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error listing directory: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const fileSearchTool: OrbitTool = {\n definition: {\n name: 'file_search',\n description: 'Find files matching a glob pattern or partial filename across the project workspace.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n pattern: {\n type: 'string',\n description: 'Glob pattern (e.g. \"**/*.ts\", \"src/**/*.json\", \"*config*\").'\n },\n directory: {\n type: 'string',\n description: 'Subdirectory to search inside. Defaults to workspace root.'\n }\n },\n required: ['pattern']\n }\n },\n async execute(args, context) {\n const rawPattern = String(args.pattern || '').trim();\n if (!rawPattern) {\n return { success: false, output: 'Pattern parameter is required.', error: 'Missing pattern' };\n }\n\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const subDir = String(args.directory || '').trim();\n const searchRoot = subDir ? path.resolve(realWorkspace, subDir) : realWorkspace;\n\n const validation = validateWorkspacePath(path.relative(realWorkspace, searchRoot) || '.', realWorkspace);\n if (!validation.allowed) {\n return { success: false, output: `Access denied: ${validation.reason}`, error: validation.reason };\n }\n\n try {\n // Fast-glob requires forward slashes on all platforms including Windows\n const normalizedSearchRoot = searchRoot.replace(/\\\\/g, '/');\n const normalizedPattern = rawPattern.replace(/\\\\/g, '/');\n const globPattern = normalizedPattern.includes('/') ? normalizedPattern : `**/*${normalizedPattern}*`;\n\n const matches = await fg(globPattern, {\n cwd: normalizedSearchRoot,\n dot: false,\n ignore: DEFAULT_IGNORED_DIRS.map(d => `**/${d}/**`),\n onlyFiles: true\n });\n\n const ig = getWorkspaceIgnore(realWorkspace);\n const filtered = matches.filter(m => {\n const full = path.join(searchRoot, m);\n const rel = path.relative(realWorkspace, full).replace(/\\\\/g, '/');\n return !ig.ignores(rel);\n });\n\n if (filtered.length === 0) {\n return {\n success: true,\n output: `No files found matching '${rawPattern}' in ${subDir || 'workspace'}.`\n };\n }\n\n return {\n success: true,\n output: filtered.slice(0, 100).join('\\n') + (filtered.length > 100 ? `\\n... and ${filtered.length - 100} more matches` : ''),\n metadata: { total: filtered.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error during file search: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const grepSearchTool: OrbitTool = {\n definition: {\n name: 'grep_search',\n description: 'Search for text or regex patterns within project files.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search string or regular expression to search for.'\n },\n path_pattern: {\n type: 'string',\n description: 'Optional glob pattern to restrict files searched (e.g. \"*.ts\", \"src/**/*.js\").'\n }\n },\n required: ['query']\n }\n },\n async execute(args, context) {\n const query = String(args.query || '').trim();\n if (!query) {\n return { success: false, output: 'Query parameter is required.', error: 'Missing query' };\n }\n\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const pathPattern = args.path_pattern\n ? String(args.path_pattern).replace(/\\\\/g, '/')\n : '**/*';\n\n try {\n const normalizedCwd = realWorkspace.replace(/\\\\/g, '/');\n const files = await fg(pathPattern, {\n cwd: normalizedCwd,\n dot: false,\n ignore: DEFAULT_IGNORED_DIRS.map(d => `**/${d}/**`),\n onlyFiles: true\n });\n\n const ig = getWorkspaceIgnore(realWorkspace);\n const matchingLines: string[] = [];\n const regex = new RegExp(query, 'i');\n\n for (const relFile of files) {\n const normalizedRel = relFile.replace(/\\\\/g, '/');\n if (ig.ignores(normalizedRel)) continue;\n if (relFile.endsWith('.map') || relFile.endsWith('.min.js') || relFile.endsWith('.lock')) continue;\n\n const fullPath = path.join(realWorkspace, relFile);\n try {\n const stat = fs.statSync(fullPath);\n if (stat.size > 500 * 1024) continue; // Skip files > 500KB\n\n const rawContent = fs.readFileSync(fullPath, 'utf8');\n // Handle Windows CRLF\n const lines = rawContent.replace(/\\r\\n/g, '\\n').split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n matchingLines.push(`${normalizedRel}:${i + 1}: ${lines[i].trim()}`);\n if (matchingLines.length >= 100) break;\n }\n }\n } catch {\n // ignore binary / read error\n }\n\n if (matchingLines.length >= 100) break;\n }\n\n if (matchingLines.length === 0) {\n return {\n success: true,\n output: `No occurrences found for \"${query}\".`\n };\n }\n\n return {\n success: true,\n output: matchingLines.join('\\n') + (matchingLines.length >= 100 ? '\\n(Search truncated to first 100 matches)' : ''),\n metadata: { matchCount: matchingLines.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error executing grep search: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n\nexport const projectTreeTool: OrbitTool = {\n definition: {\n name: 'project_tree',\n description: 'Display an ASCII tree visualization of the project structure.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n directory: {\n type: 'string',\n description: 'Optional subfolder to show tree for. Defaults to workspace root.'\n },\n max_depth: {\n type: 'integer',\n description: 'Maximum depth (default 3, max 5).'\n }\n }\n }\n },\n async execute(args, context) {\n const rawDir = String(args.directory || '').trim();\n let realWorkspace = path.resolve(context.workspace);\n try {\n if (fs.existsSync(realWorkspace)) realWorkspace = fs.realpathSync(realWorkspace);\n } catch {\n // ignore\n }\n\n const validation = validateWorkspacePath(rawDir || '.', realWorkspace);\n\n if (!validation.allowed) {\n return { success: false, output: `Access denied: ${validation.reason}`, error: validation.reason };\n }\n\n const maxDepth = Math.min(Math.max(1, Number(args.max_depth) || 3), 5);\n const ig = getWorkspaceIgnore(realWorkspace);\n\n try {\n const lines: string[] = [path.basename(validation.resolvedPath) || '.'];\n\n function buildTree(currentDir: string, prefix: string, depth: number) {\n if (depth > maxDepth) return;\n\n let entries: fs.Dirent[] = [];\n try {\n entries = fs.readdirSync(currentDir, { withFileTypes: true });\n } catch {\n return;\n }\n\n const validEntries = entries.filter(e => {\n if (DEFAULT_IGNORED_DIRS.includes(e.name)) return false;\n const full = path.join(currentDir, e.name);\n const rel = path.relative(realWorkspace, full).replace(/\\\\/g, '/');\n return !ig.ignores(rel);\n });\n\n validEntries.sort((a, b) => {\n if (a.isDirectory() && !b.isDirectory()) return -1;\n if (!a.isDirectory() && b.isDirectory()) return 1;\n return a.name.localeCompare(b.name);\n });\n\n validEntries.forEach((entry, idx) => {\n const isLast = idx === validEntries.length - 1;\n const pointer = isLast ? '└── ' : '├── ';\n const fullPath = path.join(currentDir, entry.name);\n\n lines.push(`${prefix}${pointer}${entry.name}${entry.isDirectory() ? '/' : ''}`);\n\n if (entry.isDirectory()) {\n buildTree(fullPath, prefix + (isLast ? ' ' : '│ '), depth + 1);\n }\n });\n }\n\n buildTree(validation.resolvedPath, '', 1);\n\n return {\n success: true,\n output: lines.join('\\n')\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Error building tree: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import { exec } from 'node:child_process';\nimport type { OrbitTool } from './types.js';\nimport { validateCommand } from '../security/commandGuard.js';\nimport { sanitizeSecrets } from '../security/secrets.js';\n\nexport const runCommandTool: OrbitTool = {\n definition: {\n name: 'run_command',\n description: 'Execute a terminal shell command inside the project workspace directory.',\n readOnly: false,\n parameters: {\n type: 'object',\n properties: {\n command: {\n type: 'string',\n description: 'The shell command to execute (e.g. \"npm test\", \"git status\", \"dir\").'\n },\n timeout_ms: {\n type: 'integer',\n description: 'Optional execution timeout in milliseconds (default 30000).'\n }\n },\n required: ['command']\n }\n },\n async execute(args, context) {\n const command = String(args.command || '').trim();\n if (!command) {\n return { success: false, output: 'Command argument is required.', error: 'Missing command' };\n }\n\n // Safety validation\n const guard = validateCommand(command);\n if (!guard.allowed) {\n return {\n success: false,\n output: `Command blocked by security guard: ${guard.reason}`,\n error: guard.reason\n };\n }\n\n // Request approval unless YOLO mode\n const approved = await context.requestApproval({\n type: 'command',\n summary: `Execute command: ${command}`,\n details: {\n command\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Command execution cancelled: User declined approval for '${command}'.`,\n error: 'Approval rejected'\n };\n }\n\n const timeout = Math.min(Math.max(1000, Number(args.timeout_ms) || 30000), 120000);\n const startTime = Date.now();\n\n return new Promise(resolve => {\n exec(\n command,\n {\n cwd: context.workspace,\n timeout,\n maxBuffer: 5 * 1024 * 1024,\n windowsHide: true,\n env: {\n ...process.env,\n CI: 'true'\n }\n },\n (error, stdout, stderr) => {\n const duration = Date.now() - startTime;\n const exitCode = error && typeof error.code === 'number' ? error.code : error ? 1 : 0;\n\n let rawOutput = '';\n if (stdout) rawOutput += stdout;\n if (stderr) {\n if (rawOutput) rawOutput += '\\n--- stderr ---\\n';\n rawOutput += stderr;\n }\n\n if (!rawOutput) {\n rawOutput = '(no output)';\n }\n\n // Normalize Windows CRLF line endings\n const normalized = rawOutput.replace(/\\r\\n/g, '\\n');\n\n // Sanitize secrets from output\n const cleanOutput = sanitizeSecrets(normalized.trim());\n\n const formattedOutput = [\n `Command: ${command}`,\n `Exit code: ${exitCode}`,\n `Duration: ${duration}ms`,\n 'Output:',\n cleanOutput\n ].join('\\n');\n\n resolve({\n success: exitCode === 0,\n output: formattedOutput,\n error: error ? error.message : undefined,\n metadata: { exitCode, duration }\n });\n }\n );\n });\n }\n};\n","import { exec } from 'node:child_process';\nimport type { OrbitTool } from './types.js';\n\nexport const gitStatusTool: OrbitTool = {\n definition: {\n name: 'git_status',\n description: 'Get current Git working tree status (branch, modified, untracked files).',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {}\n }\n },\n async execute(_args, context) {\n return new Promise(resolve => {\n exec('git status --short --branch', { cwd: context.workspace, timeout: 10000 }, (error, stdout, stderr) => {\n if (error) {\n return resolve({\n success: false,\n output: stderr.includes('not a git repository')\n ? 'Workspace is not a Git repository.'\n : `Git status error: ${error.message}`,\n error: error.message\n });\n }\n\n const out = stdout.trim() || 'Working tree clean. Nothing to commit.';\n resolve({\n success: true,\n output: out\n });\n });\n });\n }\n};\n\nexport const gitDiffTool: OrbitTool = {\n definition: {\n name: 'git_diff',\n description: 'Inspect git diff of unstaged or staged changes in the workspace repository.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n staged: {\n type: 'boolean',\n description: 'If true, shows diff of staged changes (--staged). Defaults to false.'\n }\n }\n }\n },\n async execute(args, context) {\n const cmd = args.staged ? 'git diff --staged' : 'git diff';\n\n return new Promise(resolve => {\n exec(cmd, { cwd: context.workspace, timeout: 15000, maxBuffer: 5 * 1024 * 1024 }, (error, stdout, stderr) => {\n if (error) {\n return resolve({\n success: false,\n output: `Git diff error: ${error.message}`,\n error: error.message\n });\n }\n\n const out = stdout.trim();\n if (!out) {\n return resolve({\n success: true,\n output: args.staged ? 'No staged changes.' : 'No unstaged working tree changes.'\n });\n }\n\n // Limit diff output size to 50KB to preserve model context\n const truncated = out.length > 50000 ? out.slice(0, 50000) + '\\n\\n[Diff truncated: exceeded 50KB]' : out;\n\n resolve({\n success: true,\n output: truncated\n });\n });\n });\n }\n};\n","import type { OrbitTool } from './types.js';\n\nexport const webSearchTool: OrbitTool = {\n definition: {\n name: 'web_search',\n description: 'Search the web for up-to-date documentation, libraries, or error troubleshooting solutions.',\n readOnly: true,\n parameters: {\n type: 'object',\n properties: {\n query: {\n type: 'string',\n description: 'Search terms or question to look up.'\n }\n },\n required: ['query']\n }\n },\n async execute(args) {\n const query = String(args.query || '').trim();\n if (!query) {\n return { success: false, output: 'Missing query argument.', error: 'Missing query' };\n }\n\n try {\n // Use DuckDuckGo HTML / instant API or fetch fallback for lightweight terminal searches\n const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 8000);\n\n const res = await fetch(url, {\n headers: {\n 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)'\n },\n signal: controller.signal\n });\n\n clearTimeout(timer);\n\n if (!res.ok) {\n return {\n success: true,\n output: `Search for \"${query}\" completed with status ${res.status}. No immediate text parsed.`\n };\n }\n\n const html = await res.text();\n // Extract snippet links\n const snippets: string[] = [];\n const regex = /<a class=\"result__snippet[^>]*>([\\s\\S]*?)<\\/a>/gi;\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(html)) !== null && snippets.length < 5) {\n const text = match[1].replace(/<[^>]+>/g, '').replace(/\\s+/g, ' ').trim();\n if (text) {\n snippets.push(`- ${text}`);\n }\n }\n\n if (snippets.length === 0) {\n return {\n success: true,\n output: `Web search executed for \"${query}\". Found related topics, but snippets were condensed.`\n };\n }\n\n return {\n success: true,\n output: `Search results for \"${query}\":\\n\\n${snippets.join('\\n\\n')}`,\n metadata: { resultCount: snippets.length }\n };\n } catch (err: any) {\n return {\n success: false,\n output: `Web search could not reach external network: ${err.message}`,\n error: err.message\n };\n }\n }\n};\n","import type { OrbitTool } from './types.js';\nimport type { ToolDefinition, ToolExecutionContext, ToolExecutionResult } from '../types.js';\nimport { readFileTool, writeFileTool, editFileTool } from './fsTools.js';\nimport { listDirectoryTool, fileSearchTool, grepSearchTool, projectTreeTool } from './searchTools.js';\nimport { runCommandTool } from './bashTool.js';\nimport { gitStatusTool, gitDiffTool } from './gitTools.js';\nimport { webSearchTool } from './webSearchTool.js';\n\nexport class ToolRegistry {\n private tools: Map<string, OrbitTool> = new Map();\n\n constructor() {\n this.registerBuiltins();\n }\n\n private registerBuiltins(): void {\n const builtins: OrbitTool[] = [\n readFileTool,\n writeFileTool,\n editFileTool,\n listDirectoryTool,\n fileSearchTool,\n grepSearchTool,\n projectTreeTool,\n runCommandTool,\n gitStatusTool,\n gitDiffTool,\n webSearchTool\n ];\n\n for (const tool of builtins) {\n this.tools.set(tool.definition.name, tool);\n }\n }\n\n public registerTool(tool: OrbitTool): void {\n this.tools.set(tool.definition.name, tool);\n }\n\n public registerTools(tools: OrbitTool[]): void {\n for (const tool of tools) {\n this.tools.set(tool.definition.name, tool);\n }\n }\n\n public getTool(name: string): OrbitTool | undefined {\n return this.tools.get(name);\n }\n\n public getDefinitions(planMode = false): ToolDefinition[] {\n const defs: ToolDefinition[] = [];\n\n for (const tool of this.tools.values()) {\n if (planMode && !tool.definition.readOnly) {\n // In plan mode, exclude modification tools to prevent the model from even hallucinating edits\n continue;\n }\n defs.push(tool.definition);\n }\n\n return defs;\n }\n\n public async executeTool(\n name: string,\n args: Record<string, unknown>,\n context: ToolExecutionContext\n ): Promise<ToolExecutionResult> {\n const tool = this.tools.get(name);\n\n if (!tool) {\n return {\n success: false,\n output: `Error: Unknown tool \"${name}\". Available tools: ${Array.from(this.tools.keys()).join(', ')}`,\n error: 'Tool not found'\n };\n }\n\n if (context.planMode && !tool.definition.readOnly) {\n return {\n success: false,\n output: `Plan mode is active (read-only). Action \"${name}\" was blocked.`,\n error: 'Plan mode read-only restriction'\n };\n }\n\n try {\n return await tool.execute(args, context);\n } catch (err: any) {\n return {\n success: false,\n output: `Error executing tool \"${name}\": ${err.message}`,\n error: err.message\n };\n }\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { getLanternHomeDir } from '../config/config.js';\nimport type { McpServerConfig } from '../types.js';\n\nexport function getMcpConfigPath(): string {\n return path.join(getLanternHomeDir(), 'mcp.json');\n}\n\nexport function loadMcpConfig(): Record<string, McpServerConfig> {\n const filePath = getMcpConfigPath();\n if (!fs.existsSync(filePath)) {\n return {};\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === 'object') {\n return (parsed.mcpServers || parsed) as Record<string, McpServerConfig>;\n }\n return {};\n } catch {\n return {};\n }\n}\n\nexport function saveMcpConfig(servers: Record<string, McpServerConfig>): void {\n const filePath = getMcpConfigPath();\n const data = { mcpServers: servers };\n try {\n fs.writeFileSync(filePath, JSON.stringify(data, null, 2), { encoding: 'utf8' });\n } catch (err: any) {\n console.error(`Warning: Failed to save MCP config: ${err.message}`);\n }\n}\n\nexport function addMcpServer(name: string, config: McpServerConfig): void {\n const current = loadMcpConfig();\n current[name] = config;\n saveMcpConfig(current);\n}\n\nexport function removeMcpServer(name: string): boolean {\n const current = loadMcpConfig();\n if (current[name]) {\n delete current[name];\n saveMcpConfig(current);\n return true;\n }\n return false;\n}\n\nexport function toggleMcpServer(name: string, disabled: boolean): boolean {\n const current = loadMcpConfig();\n if (current[name]) {\n current[name].disabled = disabled;\n saveMcpConfig(current);\n return true;\n }\n return false;\n}\n","import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { loadMcpConfig } from './mcpConfig.js';\nimport type { OrbitTool } from '../tools/types.js';\nimport type { McpServerConfig, ToolDefinition } from '../types.js';\n\ninterface ActiveMcpConnection {\n name: string;\n client: Client;\n transport: StdioClientTransport;\n tools: OrbitTool[];\n}\n\nexport class McpManager {\n private connections: Map<string, ActiveMcpConnection> = new Map();\n\n public async initialize(): Promise<OrbitTool[]> {\n const servers = loadMcpConfig();\n const allTools: OrbitTool[] = [];\n\n for (const [serverName, config] of Object.entries(servers)) {\n if (config.disabled) {\n continue;\n }\n\n try {\n const tools = await this.connectServer(serverName, config);\n allTools.push(...tools);\n } catch (err: any) {\n console.error(`Warning: Failed to connect MCP server '${serverName}': ${err.message}`);\n }\n }\n\n return allTools;\n }\n\n public async connectServer(serverName: string, config: McpServerConfig): Promise<OrbitTool[]> {\n if (this.connections.has(serverName)) {\n await this.disconnectServer(serverName);\n }\n\n const safeEnv: Record<string, string> = {};\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') safeEnv[k] = v;\n }\n if (config.env) {\n Object.assign(safeEnv, config.env);\n }\n\n const transport = new StdioClientTransport({\n command: config.command,\n args: config.args || [],\n env: safeEnv\n });\n\n const client = new Client(\n {\n name: `orbit-client-${serverName}`,\n version: '1.0.0'\n },\n {\n capabilities: {}\n }\n );\n\n await client.connect(transport);\n\n const toolsResponse = await client.listTools();\n const serverTools: OrbitTool[] = [];\n\n for (const mcpTool of toolsResponse.tools) {\n const toolName = `mcp__${serverName}__${mcpTool.name}`.replace(/[^a-zA-Z0-9_]/g, '_');\n\n // Convert MCP tool inputSchema into ToolDefinition parameters\n const properties: Record<string, any> = {};\n const required: string[] = [];\n\n if (mcpTool.inputSchema && typeof mcpTool.inputSchema === 'object') {\n const schema = mcpTool.inputSchema as any;\n if (schema.properties && typeof schema.properties === 'object') {\n for (const [k, v] of Object.entries<any>(schema.properties)) {\n properties[k] = {\n type: v.type || 'string',\n description: v.description || ''\n };\n }\n }\n if (Array.isArray(schema.required)) {\n required.push(...schema.required);\n }\n }\n\n const definition: ToolDefinition = {\n name: toolName,\n description: `[MCP Server: ${serverName}] ${mcpTool.description || mcpTool.name}`,\n readOnly: false,\n parameters: {\n type: 'object',\n properties,\n required\n }\n };\n\n const orbitTool: OrbitTool = {\n definition,\n async execute(args, context) {\n // Check approval\n const approved = await context.requestApproval({\n type: 'command',\n summary: `Run MCP tool ${serverName}:${mcpTool.name}`,\n details: {\n command: `mcp ${serverName} ${mcpTool.name} ${JSON.stringify(args)}`\n }\n });\n\n if (!approved) {\n return {\n success: false,\n output: `Execution denied by user for MCP tool ${serverName}:${mcpTool.name}`,\n error: 'Approval rejected'\n };\n }\n\n try {\n const result = await client.callTool({\n name: mcpTool.name,\n arguments: args\n });\n\n let textOutput = '';\n if (Array.isArray(result.content)) {\n for (const item of result.content) {\n if (item.type === 'text') {\n textOutput += item.text + '\\n';\n } else {\n textOutput += JSON.stringify(item) + '\\n';\n }\n }\n } else {\n textOutput = JSON.stringify(result.content);\n }\n\n return {\n success: !result.isError,\n output: textOutput.trim(),\n error: result.isError ? textOutput : undefined\n };\n } catch (err: any) {\n return {\n success: false,\n output: `MCP execution error: ${err.message}`,\n error: err.message\n };\n }\n }\n };\n\n serverTools.push(orbitTool);\n }\n\n this.connections.set(serverName, {\n name: serverName,\n client,\n transport,\n tools: serverTools\n });\n\n return serverTools;\n }\n\n public async disconnectServer(serverName: string): Promise<void> {\n const conn = this.connections.get(serverName);\n if (conn) {\n try {\n await conn.client.close();\n } catch {\n // ignore close error\n }\n this.connections.delete(serverName);\n }\n }\n\n public async closeAll(): Promise<void> {\n for (const [serverName] of this.connections) {\n await this.disconnectServer(serverName);\n }\n }\n}\n","import readline from 'node:readline';\nimport pc from 'picocolors';\nimport type { ApprovalRequest } from '../types.js';\nimport { formatTerminalDiff, formatNewFilePreview } from './diffViewer.js';\n\nexport class ApprovalEngine {\n private yolo: boolean;\n private planMode: boolean;\n\n constructor(options: { yolo?: boolean; planMode?: boolean }) {\n this.yolo = Boolean(options.yolo);\n this.planMode = Boolean(options.planMode);\n }\n\n public isYolo(): boolean {\n return this.yolo;\n }\n\n public setYolo(val: boolean): void {\n this.yolo = val;\n }\n\n public isPlanMode(): boolean {\n return this.planMode;\n }\n\n public async requestApproval(req: ApprovalRequest): Promise<boolean> {\n // In plan mode, all write/edit/command operations are strictly rejected\n if (this.planMode) {\n console.log(pc.yellow(`\\n[Plan Mode] Tool action skipped (read-only): ${req.summary}`));\n return false;\n }\n\n // In YOLO mode, auto-approve\n if (this.yolo) {\n console.log(pc.dim(`⚡ [YOLO] Auto-approved: ${req.summary}`));\n return true;\n }\n\n // Present details to the user\n console.log('\\n' + pc.bold(pc.yellow('━━━━━━━━━━━━━━━━ Action Approval Required ━━━━━━━━━━━━━━━━')));\n console.log(pc.bold('Action: ') + req.summary);\n\n if (req.type === 'file_edit' && req.details?.before !== undefined && req.details?.after !== undefined) {\n const diffOutput = req.details.diff || formatTerminalDiff(\n req.details.path || 'file',\n req.details.before,\n req.details.after\n );\n console.log('\\n' + diffOutput + '\\n');\n } else if (req.type === 'file_write' && req.details?.after !== undefined) {\n const preview = formatNewFilePreview(req.details.path || 'file', req.details.after);\n console.log('\\n' + preview + '\\n');\n } else if (req.type === 'command' && req.details?.command) {\n console.log(pc.cyan(`$ ${pc.bold(req.details.command)}\\n`));\n }\n\n // Prompt user\n const answer = await this.promptUser(\n pc.bold(pc.yellow('Approve this action?')) + ' [y/N / (a)ll-yolo]: '\n );\n\n const clean = answer.trim().toLowerCase();\n\n if (clean === 'a' || clean === 'all' || clean === 'yolo') {\n this.yolo = true;\n console.log(pc.yellow('⚡ YOLO mode enabled for remainder of session.\\n'));\n return true;\n }\n\n if (clean === 'y' || clean === 'yes') {\n console.log(pc.green('✓ Approved.\\n'));\n return true;\n }\n\n console.log(pc.red('✗ Denied by user.\\n'));\n return false;\n }\n\n private promptUser(question: string): Promise<string> {\n if (!process.stdin.isTTY) {\n // In non-interactive mode without YOLO, default to deny\n return Promise.resolve('no');\n }\n\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n return new Promise(resolve => {\n rl.question(question, answer => {\n rl.close();\n resolve(answer);\n });\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nconst INSTRUCTION_FILES = [\n 'LANTERN.md',\n 'CODELANTERN.md',\n '.codelantern/instructions.md',\n '.lantern.md',\n 'GEMINI.md',\n 'ORBIT.md'\n];\n\nexport interface ProjectInstructions {\n found: boolean;\n filePath?: string;\n content?: string;\n}\n\nexport function loadProjectInstructions(workspaceDir: string): ProjectInstructions {\n for (const filename of INSTRUCTION_FILES) {\n const filePath = path.join(workspaceDir, filename);\n if (fs.existsSync(filePath)) {\n try {\n const stat = fs.statSync(filePath);\n if (stat.isFile() && stat.size <= 200 * 1024) { // Limit to 200KB max\n const content = fs.readFileSync(filePath, 'utf8').trim();\n if (content.length > 0) {\n return {\n found: true,\n filePath,\n content\n };\n }\n }\n } catch {\n // Ignore read errors\n }\n }\n }\n\n return { found: false };\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport { getLanternHomeDir } from '../config/config.js';\nimport { sanitizeSecrets } from '../security/secrets.js';\nimport type { OrbitSession, ConversationTurn, TokenUsage } from '../types.js';\n\nexport function getSessionsDir(): string {\n const dir = path.join(getLanternHomeDir(), 'sessions');\n if (!fs.existsSync(dir)) {\n try {\n fs.mkdirSync(dir, { recursive: true });\n } catch {\n // ignore\n }\n }\n return dir;\n}\n\nexport function generateSessionId(): string {\n const timestamp = new Date().toISOString().replace(/[-:T]/g, '').slice(0, 14);\n const rand = crypto.randomBytes(3).toString('hex');\n return `session_${timestamp}_${rand}`;\n}\n\nexport function createNewSession(workspace: string, model: string, initialTitle?: string): OrbitSession {\n const now = new Date().toISOString();\n return {\n id: generateSessionId(),\n title: initialTitle || `Session in ${path.basename(workspace) || 'workspace'}`,\n createdAt: now,\n updatedAt: now,\n workspace: path.resolve(workspace),\n model,\n turns: [],\n totalUsage: {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n }\n };\n}\n\nexport function saveSession(session: OrbitSession): void {\n const sessionsDir = getSessionsDir();\n const filePath = path.join(sessionsDir, `${session.id}.json`);\n\n session.updatedAt = new Date().toISOString();\n\n // Deep sanitize secrets in all text fields\n const serialized = JSON.stringify(session, (_key, val) => {\n if (typeof val === 'string') {\n return sanitizeSecrets(val);\n }\n return val;\n }, 2);\n\n try {\n fs.writeFileSync(filePath, serialized, { encoding: 'utf8' });\n } catch (err: any) {\n console.error(`Warning: Failed to save session to ${filePath}: ${err.message}`);\n }\n}\n\nexport function loadSession(sessionId: string): OrbitSession | null {\n const sessionsDir = getSessionsDir();\n const normalizedId = sessionId.endsWith('.json') ? sessionId : `${sessionId}.json`;\n const filePath = path.join(sessionsDir, normalizedId);\n\n if (!fs.existsSync(filePath)) {\n // Try finding by prefix\n if (!fs.existsSync(sessionsDir)) return null;\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const match = files.find(f => f.startsWith(sessionId));\n if (match) {\n try {\n const raw = fs.readFileSync(path.join(sessionsDir, match), 'utf8');\n return JSON.parse(raw) as OrbitSession;\n } catch {\n return null;\n }\n }\n return null;\n }\n\n try {\n const raw = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(raw) as OrbitSession;\n } catch {\n return null;\n }\n}\n\nexport function listSessions(): Array<{\n id: string;\n title: string;\n updatedAt: string;\n turnCount: number;\n workspace: string;\n model: string;\n}> {\n const sessionsDir = getSessionsDir();\n if (!fs.existsSync(sessionsDir)) return [];\n\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const sessions: Array<{\n id: string;\n title: string;\n updatedAt: string;\n turnCount: number;\n workspace: string;\n model: string;\n }> = [];\n\n for (const file of files) {\n try {\n const raw = fs.readFileSync(path.join(sessionsDir, file), 'utf8');\n const data = JSON.parse(raw) as OrbitSession;\n sessions.push({\n id: data.id,\n title: data.title || 'Untitled Session',\n updatedAt: data.updatedAt || data.createdAt,\n turnCount: data.turns?.length || 0,\n workspace: data.workspace || '',\n model: data.model || ''\n });\n } catch {\n // Ignore corrupt session files\n }\n }\n\n return sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n}\n\nexport function deleteSession(sessionId: string): boolean {\n const sessionsDir = getSessionsDir();\n const normalizedId = sessionId.endsWith('.json') ? sessionId : `${sessionId}.json`;\n const filePath = path.join(sessionsDir, normalizedId);\n\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n return true;\n }\n\n // Try matching by prefix\n if (!fs.existsSync(sessionsDir)) return false;\n const files = fs.readdirSync(sessionsDir).filter(f => f.endsWith('.json'));\n const match = files.find(f => f.startsWith(sessionId));\n if (match) {\n fs.unlinkSync(path.join(sessionsDir, match));\n return true;\n }\n\n return false;\n}\n\nexport function exportSessionMarkdown(session: OrbitSession): string {\n const lines: string[] = [\n `# Code Lantern Session: ${session.title}`,\n `**Session ID:** \\`${session.id}\\` `,\n `**Model:** \\`${session.model}\\` `,\n `**Workspace:** \\`${session.workspace}\\` `,\n `**Created:** ${session.createdAt} `,\n `**Updated:** ${session.updatedAt} `,\n `**Total Tokens:** ${session.totalUsage.totalTokens} `,\n '',\n '---',\n ''\n ];\n\n for (const turn of session.turns) {\n const roleHeading = turn.role === 'user' ? '### 👤 User' : turn.role === 'model' ? '### 🏮 Code Lantern' : '### 🛠️ Tool';\n lines.push(roleHeading);\n lines.push(`*${turn.timestamp}*`);\n lines.push('');\n\n if (turn.text) {\n lines.push(turn.text);\n lines.push('');\n }\n\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n lines.push('**Tool Calls:**');\n for (const call of turn.toolCalls) {\n lines.push(`- \\`${call.name}\\`: \\`${JSON.stringify(call.args)}\\``);\n }\n lines.push('');\n }\n\n if (turn.toolResults && turn.toolResults.length > 0) {\n lines.push('**Tool Results:**');\n for (const res of turn.toolResults) {\n const preview = typeof res.result === 'string' ? res.result.slice(0, 200) : JSON.stringify(res.result).slice(0, 200);\n lines.push(`- \\`${res.name}\\`: ${preview}...`);\n }\n lines.push('');\n }\n\n lines.push('---');\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import type { ConversationTurn } from '../types.js';\n\nexport function shouldCompact(turns: ConversationTurn[], threshold = 30): boolean {\n return turns.length > threshold;\n}\n\nexport function compactTurns(\n turns: ConversationTurn[],\n retainRecentCount = 10\n): ConversationTurn[] {\n if (turns.length <= retainRecentCount + 2) {\n return turns;\n }\n\n const toCompact = turns.slice(0, turns.length - retainRecentCount);\n const toKeep = turns.slice(turns.length - retainRecentCount);\n\n // Generate structured summary from toCompact\n const summaryPoints: string[] = [];\n\n for (const turn of toCompact) {\n if (turn.role === 'user' && turn.text) {\n summaryPoints.push(`- User asked: \"${turn.text.slice(0, 150).replace(/\\n/g, ' ')}\"`);\n } else if (turn.role === 'model') {\n if (turn.toolCalls && turn.toolCalls.length > 0) {\n const toolNames = turn.toolCalls.map(t => t.name).join(', ');\n summaryPoints.push(`- Orbit executed tools: ${toolNames}`);\n }\n if (turn.text) {\n summaryPoints.push(`- Orbit responded: \"${turn.text.slice(0, 120).replace(/\\n/g, ' ')}...\"`);\n }\n }\n }\n\n const compactedTurn: ConversationTurn = {\n role: 'user',\n text: `[SYSTEM: Earlier conversation context compacted (${toCompact.length} turns)]:\\n${summaryPoints.join('\\n')}`,\n timestamp: new Date().toISOString()\n };\n\n const ackTurn: ConversationTurn = {\n role: 'model',\n text: 'Understood. I retain full awareness of these previous tasks and will continue from here.',\n timestamp: new Date().toISOString()\n };\n\n return [compactedTurn, ackTurn, ...toKeep];\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { getLanternHomeDir, loadConfig, saveConfig } from '../config/config.js';\nimport type { Skill } from '../types.js';\n\nexport class SkillManager {\n private userSkillsDir: string;\n\n constructor() {\n this.userSkillsDir = path.join(getLanternHomeDir(), 'skills');\n if (!fs.existsSync(this.userSkillsDir)) {\n try {\n fs.mkdirSync(this.userSkillsDir, { recursive: true });\n } catch {\n // ignore\n }\n }\n }\n\n public getUserSkillsDir(): string {\n return this.userSkillsDir;\n }\n\n public getProjectSkillsDirs(workspace: string): string[] {\n return [\n path.join(workspace, '.codelantern', 'skills'),\n path.join(workspace, '.lantern', 'skills')\n ];\n }\n\n /**\n * Discovers all available skills from user-level and project-level directories\n */\n public listSkills(workspace = process.cwd()): Skill[] {\n const skillsMap: Map<string, Skill> = new Map();\n const config = loadConfig();\n const activeSkillsList = new Set(config.activeSkills || []);\n\n // 1. Load User-level skills\n this.scanDirectoryForSkills(this.userSkillsDir, 'user', skillsMap, activeSkillsList);\n\n // 2. Load Project-level skills (project-level overrides user-level of same name)\n const projectDirs = this.getProjectSkillsDirs(workspace);\n for (const pDir of projectDirs) {\n if (fs.existsSync(pDir)) {\n this.scanDirectoryForSkills(pDir, 'project', skillsMap, activeSkillsList);\n }\n }\n\n return Array.from(skillsMap.values()).sort((a, b) => a.name.localeCompare(b.name));\n }\n\n private scanDirectoryForSkills(\n rootDir: string,\n source: 'project' | 'user',\n map: Map<string, Skill>,\n activeSkillsList: Set<string>\n ): void {\n if (!fs.existsSync(rootDir)) return;\n\n try {\n const entries = fs.readdirSync(rootDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillFolder = path.join(rootDir, entry.name);\n const skillMdPath = path.join(skillFolder, 'SKILL.md');\n\n if (fs.existsSync(skillMdPath)) {\n try {\n const raw = fs.readFileSync(skillMdPath, 'utf8');\n const { name, description, content } = this.parseSkillMd(raw, entry.name);\n\n // Discover optional references in references/ or resources/\n const references: string[] = [];\n const refsDir = path.join(skillFolder, 'references');\n if (fs.existsSync(refsDir)) {\n try {\n const refFiles = fs.readdirSync(refsDir).filter(f => f.endsWith('.md') || f.endsWith('.txt'));\n for (const rf of refFiles) {\n references.push(path.join(refsDir, rf));\n }\n } catch {\n // ignore\n }\n }\n\n const isExplicitlyActive = activeSkillsList.has(name);\n\n map.set(name, {\n name,\n description,\n path: skillFolder,\n source,\n enabled: isExplicitlyActive,\n content,\n references\n });\n } catch {\n // ignore corrupt skill file\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n public parseSkillMd(rawContent: string, defaultName: string): { name: string; description: string; content: string } {\n let name = defaultName;\n let description = '';\n let content = rawContent.trim();\n\n // Parse YAML frontmatter if present\n if (rawContent.startsWith('---')) {\n const endIdx = rawContent.indexOf('---', 3);\n if (endIdx !== -1) {\n const frontmatter = rawContent.slice(3, endIdx).trim();\n content = rawContent.slice(endIdx + 3).trim();\n\n const lines = frontmatter.split('\\n');\n for (const line of lines) {\n const colonIdx = line.indexOf(':');\n if (colonIdx !== -1) {\n const key = line.slice(0, colonIdx).trim().toLowerCase();\n const val = line.slice(colonIdx + 1).trim().replace(/^['\"]|['\"]$/g, '');\n if (key === 'name' && val) name = val;\n if (key === 'description' && val) description = val;\n }\n }\n }\n }\n\n if (!description) {\n // Derive short description from first paragraph\n const firstLine = content.split('\\n').find(l => l.trim() && !l.startsWith('#'));\n description = firstLine ? firstLine.slice(0, 100) : 'Custom skill instructions';\n }\n\n return { name, description, content };\n }\n\n public getSkill(name: string, workspace = process.cwd()): Skill | null {\n const all = this.listSkills(workspace);\n return all.find(s => s.name.toLowerCase() === name.toLowerCase()) || null;\n }\n\n public enableSkill(name: string): boolean {\n const config = loadConfig();\n const skills = new Set(config.activeSkills || []);\n skills.add(name);\n config.activeSkills = Array.from(skills);\n saveConfig(config);\n return true;\n }\n\n public disableSkill(name: string): boolean {\n const config = loadConfig();\n const skills = new Set(config.activeSkills || []);\n const removed = skills.delete(name);\n config.activeSkills = Array.from(skills);\n saveConfig(config);\n return removed;\n }\n\n public addSkillFromPath(sourcePath: string): { success: boolean; skillName?: string; error?: string } {\n const resolved = path.resolve(sourcePath);\n if (!fs.existsSync(resolved)) {\n return { success: false, error: `Path does not exist: ${sourcePath}` };\n }\n\n const stat = fs.statSync(resolved);\n let targetSkillDir = '';\n let skillName = '';\n\n if (stat.isDirectory()) {\n const skillMd = path.join(resolved, 'SKILL.md');\n if (!fs.existsSync(skillMd)) {\n return { success: false, error: `No SKILL.md found in directory: ${sourcePath}` };\n }\n const raw = fs.readFileSync(skillMd, 'utf8');\n const parsed = this.parseSkillMd(raw, path.basename(resolved));\n skillName = parsed.name;\n targetSkillDir = path.join(this.userSkillsDir, skillName);\n\n // Copy directory safely (never executing scripts)\n fs.cpSync(resolved, targetSkillDir, { recursive: true });\n } else if (stat.isFile() && path.basename(resolved).toLowerCase().endsWith('.md')) {\n const raw = fs.readFileSync(resolved, 'utf8');\n skillName = path.basename(resolved, path.extname(resolved));\n const parsed = this.parseSkillMd(raw, skillName);\n skillName = parsed.name;\n targetSkillDir = path.join(this.userSkillsDir, skillName);\n\n if (!fs.existsSync(targetSkillDir)) {\n fs.mkdirSync(targetSkillDir, { recursive: true });\n }\n fs.writeFileSync(path.join(targetSkillDir, 'SKILL.md'), raw, 'utf8');\n } else {\n return { success: false, error: 'Source must be a skill folder with SKILL.md or a markdown file.' };\n }\n\n // Auto-enable newly added skill\n this.enableSkill(skillName);\n\n return { success: true, skillName };\n }\n\n public addSkillFromGit(repoUrl: string): { success: boolean; skillName?: string; error?: string } {\n try {\n const tempCloneDir = path.join(this.userSkillsDir, `_temp_${Date.now()}`);\n execSync(`git clone --depth 1 \"${repoUrl}\" \"${tempCloneDir}\"`, { stdio: 'pipe' });\n\n const res = this.addSkillFromPath(tempCloneDir);\n try {\n fs.rmSync(tempCloneDir, { recursive: true, force: true });\n } catch {\n // ignore\n }\n\n return res;\n } catch (err: any) {\n return { success: false, error: `Git clone failed: ${err.message}` };\n }\n }\n\n public removeSkill(name: string): boolean {\n this.disableSkill(name);\n const targetDir = path.join(this.userSkillsDir, name);\n if (fs.existsSync(targetDir)) {\n try {\n fs.rmSync(targetDir, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n }\n return false;\n }\n\n /**\n * Matches prompt against available skills by keyword and intent.\n * Transparent and non-intrusive.\n */\n public matchSkillsForPrompt(userPrompt: string, workspace = process.cwd()): Skill[] {\n const allSkills = this.listSkills(workspace);\n const matched: Skill[] = [];\n const promptLower = userPrompt.toLowerCase();\n\n for (const skill of allSkills) {\n // 1. If explicitly enabled in config, it's always included\n if (skill.enabled) {\n matched.push(skill);\n continue;\n }\n\n // 2. Keyword check against skill name and description\n const skillName = skill.name.toLowerCase();\n const descWords = skill.description.toLowerCase().split(/\\W+/).filter(w => w.length > 3);\n\n if (promptLower.includes(skillName)) {\n matched.push(skill);\n continue;\n }\n\n let matchCount = 0;\n for (const word of descWords) {\n if (promptLower.includes(word)) {\n matchCount++;\n }\n }\n\n if (matchCount >= 2) {\n matched.push(skill);\n }\n }\n\n return matched;\n }\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { ProviderRegistry } from '../provider/registry.js';\nimport { ToolRegistry } from '../tools/registry.js';\nimport { McpManager } from '../mcp/mcpManager.js';\nimport { ApprovalEngine } from '../approval/approver.js';\nimport { loadProjectInstructions } from '../config/projectInstructions.js';\nimport { saveSession } from '../session/sessionManager.js';\nimport { shouldCompact, compactTurns } from '../session/compactor.js';\nimport { SkillManager } from '../skills/skillManager.js';\nimport { TerminalSpinner } from '../ui/spinner.js';\nimport { sanitizeSecrets } from '../security/secrets.js';\nimport type {\n OrbitSession,\n AgentContext,\n ConversationTurn,\n ToolCallItem,\n ToolResultItem,\n TokenUsage,\n FileAttachment,\n TimingDiagnostics,\n Skill\n} from '../types.js';\n\nexport class LanternAgent {\n private providerRegistry: ProviderRegistry;\n private tools: ToolRegistry;\n private mcpManager: McpManager;\n private skillManager: SkillManager;\n private approvalEngine: ApprovalEngine;\n private spinner: TerminalSpinner;\n\n constructor() {\n this.providerRegistry = new ProviderRegistry();\n this.tools = new ToolRegistry();\n this.mcpManager = new McpManager();\n this.skillManager = new SkillManager();\n this.approvalEngine = new ApprovalEngine({});\n this.spinner = new TerminalSpinner();\n }\n\n public getProviderRegistry(): ProviderRegistry {\n return this.providerRegistry;\n }\n\n public getSkillManager(): SkillManager {\n return this.skillManager;\n }\n\n public async initMcp(): Promise<void> {\n try {\n const mcpTools = await this.mcpManager.initialize();\n this.tools.registerTools(mcpTools);\n } catch {\n // MCP failure should not crash agent\n }\n }\n\n public async shutdown(): Promise<void> {\n await this.mcpManager.closeAll();\n }\n\n public buildSystemPrompt(workspace: string, planMode = false, activeSkills: Skill[] = []): string {\n const projectInstructions = loadProjectInstructions(workspace);\n\n const basePrompt = [\n 'You are Code Lantern, an elite AI coding assistant operating directly in the terminal.',\n `Current Workspace: ${path.resolve(workspace)}`,\n `Environment OS: ${process.platform} (${process.arch})`,\n '',\n 'CORE OPERATING PRINCIPLES:',\n '1. Be direct, pragmatic, and helpful. Prioritize working, robust code over verbosity.',\n '2. Inspect files before proposing edits to understand real project conventions and existing code.',\n '3. Always use the provided tools to read, search, edit, create files, or run commands.',\n '4. When editing files with edit_file, ensure the target string matches exactly, including indentation.',\n '5. Safety boundaries: Never attempt to read secret files (.env, keys) or escape the workspace.',\n '6. Never run destructive commands that wipe unrelated data, partitions, or system drives.',\n '7. Never push code, make commits, or publish artifacts unless explicitly instructed by the user.'\n ];\n\n if (planMode) {\n basePrompt.push(\n '',\n 'PLAN MODE IS ACTIVE (READ-ONLY):',\n '- Your objective is to thoroughly inspect the codebase and produce a detailed, actionable implementation plan.',\n '- You may inspect files and search code using read_file, file_search, grep_search, and project_tree.',\n '- Do NOT attempt to write files, edit files, or run mutating commands.',\n '- Structure your plan clearly: Overview, Architecture & Files Impacted, Step-by-Step Implementation, and Verification Strategy.'\n );\n }\n\n if (projectInstructions.found && projectInstructions.content) {\n basePrompt.push(\n '',\n `PROJECT INSTRUCTIONS (${path.basename(projectInstructions.filePath || 'instructions')}):`,\n '---',\n projectInstructions.content,\n '---'\n );\n }\n\n // Inject active skills as reference instructions\n if (activeSkills.length > 0) {\n basePrompt.push('', 'ACTIVE SKILLS & GUIDELINES:');\n for (const skill of activeSkills) {\n basePrompt.push(\n `### Skill: ${skill.name}`,\n `Description: ${skill.description}`,\n 'Instructions:',\n skill.content,\n '---'\n );\n }\n }\n\n return basePrompt.join('\\n');\n }\n\n public async runTurn(\n session: OrbitSession,\n userPrompt: string,\n context: AgentContext,\n attachments: FileAttachment[] = []\n ): Promise<{\n reply: string;\n toolCount: number;\n usage: TokenUsage;\n timing: TimingDiagnostics;\n }> {\n const turnStartTime = Date.now();\n this.approvalEngine = new ApprovalEngine({\n yolo: context.yolo,\n planMode: context.planMode\n });\n\n // 1. Resolve active skills\n const candidateSkills = this.skillManager.matchSkillsForPrompt(userPrompt, context.workspace);\n const explicitlyRequested = (context.activeSkills || []).map(name =>\n this.skillManager.getSkill(name, context.workspace)\n ).filter((s): s is Skill => Boolean(s));\n\n const combinedSkillsMap = new Map<string, Skill>();\n for (const s of [...explicitlyRequested, ...candidateSkills]) {\n combinedSkillsMap.set(s.name, s);\n }\n const activeSkills = Array.from(combinedSkillsMap.values());\n\n if (activeSkills.length > 0 && !context.jsonOutput) {\n const names = activeSkills.map(s => pc.yellow(s.name)).join(', ');\n console.log(pc.dim(`💡 Active Skills: ${names}`));\n }\n\n session.activeSkills = activeSkills.map(s => s.name);\n\n // 2. Select Provider\n const provider = this.providerRegistry.getProvider(context.provider);\n session.provider = provider.id;\n session.model = context.model;\n\n const systemPrompt = this.buildSystemPrompt(context.workspace, context.planMode, activeSkills);\n const activeTools = this.tools.getDefinitions(context.planMode);\n\n // Append user turn\n const userTurn: ConversationTurn = {\n role: 'user',\n text: userPrompt,\n attachments: attachments.length > 0 ? attachments : undefined,\n timestamp: new Date().toISOString()\n };\n session.turns.push(userTurn);\n\n let step = 0;\n const maxSteps = context.maxSteps || 25;\n let totalToolsExecuted = 0;\n let finalAssistantText = '';\n\n const sessionUsage: TokenUsage = {\n promptTokens: 0,\n candidatesTokens: 0,\n totalTokens: 0\n };\n\n const aggregatedTiming: TimingDiagnostics = {\n totalMs: 0,\n toolExecutionMs: {}\n };\n\n while (step < maxSteps) {\n step++;\n\n // Check for user cancellation (Ctrl+C)\n if (context.signal?.aborted) {\n this.spinner.stop();\n throw context.signal.reason || new Error('Operation cancelled by user.');\n }\n\n this.spinner.start(`Connecting to ${provider.displayName} (${context.model})...`);\n\n let currentStepText = '';\n let currentToolCalls: ToolCallItem[] = [];\n\n try {\n const streamResult = await provider.streamGenerate({\n model: context.model,\n systemInstruction: systemPrompt,\n history: session.turns,\n tools: activeTools,\n signal: context.signal,\n temperature: 0.2,\n timeoutMs: context.timeoutMs,\n firstTokenTimeoutMs: context.firstTokenTimeoutMs,\n lowLatency: context.lowLatency,\n callbacks: {\n onStateChange: (state: string) => {\n if (state === 'connecting') {\n this.spinner.connecting(provider.displayName, context.model);\n } else if (state === 'waiting_first_token') {\n this.spinner.waitingFirstToken(provider.displayName, context.model);\n } else if (state.startsWith('retrying:')) {\n const attempt = state.split(':')[1];\n this.spinner.retrying(parseInt(attempt, 10), 3, 1500);\n } else if (state === 'streaming') {\n this.spinner.stop();\n }\n },\n onChunk: (chunk: string) => {\n if (currentStepText === '') {\n this.spinner.stop();\n }\n currentStepText += chunk;\n if (!context.jsonOutput) {\n process.stdout.write(chunk);\n }\n },\n onToolCalls: (calls: ToolCallItem[]) => {\n currentToolCalls = calls;\n },\n onUsage: (usage: TokenUsage) => {\n sessionUsage.promptTokens = usage.promptTokens;\n sessionUsage.candidatesTokens = usage.candidatesTokens;\n sessionUsage.totalTokens = usage.totalTokens;\n }\n }\n });\n\n this.spinner.stop();\n\n // Update timing metrics\n if (streamResult.timing) {\n aggregatedTiming.providerInitMs = streamResult.timing.providerInitMs;\n aggregatedTiming.connectMs = streamResult.timing.connectMs;\n aggregatedTiming.ttftMs = streamResult.timing.ttftMs;\n aggregatedTiming.streamMs = streamResult.timing.streamMs;\n }\n\n if (currentStepText) {\n if (!currentStepText.endsWith('\\n')) {\n console.log('');\n }\n finalAssistantText = currentStepText;\n }\n\n // If no tool calls requested, model turn complete\n if (!streamResult.toolCalls || streamResult.toolCalls.length === 0) {\n session.turns.push({\n role: 'model',\n text: currentStepText,\n timestamp: new Date().toISOString()\n });\n break;\n }\n\n // Record model turn containing tool calls\n session.turns.push({\n role: 'model',\n text: currentStepText || undefined,\n toolCalls: streamResult.toolCalls,\n timestamp: new Date().toISOString()\n });\n\n // Execute each tool call with real-time feedback\n const toolResults: ToolResultItem[] = [];\n\n for (const call of streamResult.toolCalls) {\n // Check cancellation between tool calls\n if (context.signal?.aborted) {\n throw context.signal.reason || new Error('Cancelled by user.');\n }\n\n totalToolsExecuted++;\n const callSummary = `${call.name}(${Object.keys(call.args).map(k => `${k}: ${JSON.stringify(call.args[k])}`).join(', ')})`;\n\n if (!context.jsonOutput) {\n console.log(pc.cyan(`\\n🛠️ Tool: ${pc.bold(call.name)}`) + pc.dim(` ${callSummary.slice(0, 90)}`));\n }\n\n this.spinner.toolExecuting(call.name);\n\n const toolContext = {\n workspace: context.workspace,\n yolo: this.approvalEngine.isYolo(),\n planMode: context.planMode,\n signal: context.signal,\n requestApproval: (req: any) => {\n this.spinner.stop();\n return this.approvalEngine.requestApproval(req);\n }\n };\n\n const toolStart = Date.now();\n const executionResult = await this.tools.executeTool(call.name, call.args, toolContext);\n const toolDuration = Date.now() - toolStart;\n aggregatedTiming.toolExecutionMs[call.name] = (aggregatedTiming.toolExecutionMs[call.name] || 0) + toolDuration;\n\n this.spinner.stop();\n\n // Context Efficiency: Cap huge outputs (e.g. > 15KB) before storing into conversation history\n let trimmedOutput = executionResult.output;\n if (trimmedOutput.length > 15000) {\n trimmedOutput = trimmedOutput.slice(0, 15000) + '\\n\\n... [Output truncated to 15KB for context efficiency]';\n }\n\n if (executionResult.success) {\n if (!context.jsonOutput) {\n const preview = executionResult.output.length > 180\n ? executionResult.output.slice(0, 180) + '...'\n : executionResult.output;\n console.log(pc.green(`✓ Result:`) + pc.dim(` ${preview.replace(/\\n/g, ' ')} (${toolDuration}ms)`));\n }\n toolResults.push({\n callId: call.id,\n name: call.name,\n result: sanitizeSecrets(trimmedOutput)\n });\n } else {\n if (!context.jsonOutput) {\n console.log(pc.red(`✗ Error: ${executionResult.error || executionResult.output}`));\n }\n toolResults.push({\n callId: call.id,\n name: call.name,\n result: { error: executionResult.error || executionResult.output },\n error: executionResult.error\n });\n }\n }\n\n // Append tool results turn\n session.turns.push({\n role: 'tool',\n toolResults,\n timestamp: new Date().toISOString()\n });\n\n // Step limit check\n if (step >= maxSteps) {\n const limitMsg = `\\n[Reached maximum configured tool steps (${maxSteps}). Code Lantern paused to avoid infinite loops.]`;\n console.log(pc.yellow(limitMsg));\n finalAssistantText += limitMsg;\n break;\n }\n } catch (err: any) {\n this.spinner.stop();\n throw err;\n }\n }\n\n // Auto-compact if session turns exceed threshold\n if (shouldCompact(session.turns)) {\n session.turns = compactTurns(session.turns);\n }\n\n aggregatedTiming.totalMs = Date.now() - turnStartTime;\n\n // Update session metrics\n session.totalUsage.promptTokens += sessionUsage.promptTokens;\n session.totalUsage.candidatesTokens += sessionUsage.candidatesTokens;\n session.totalUsage.totalTokens += sessionUsage.totalTokens;\n saveSession(session);\n\n return {\n reply: finalAssistantText,\n toolCount: totalToolsExecuted,\n usage: sessionUsage,\n timing: aggregatedTiming\n };\n }\n}\n\n// Backwards-compatibility alias\nexport { LanternAgent as OrbitAgent };\n","import pc from 'picocolors';\n\nconst SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n\nexport class TerminalSpinner {\n private timer: NodeJS.Timeout | null = null;\n private frameIdx = 0;\n private message = '';\n private isTTY = Boolean(process.stdout.isTTY);\n private isRunning = false;\n\n public start(message: string): this {\n this.message = message;\n this.isRunning = true;\n\n if (!this.isTTY) {\n console.log(`[Lantern] ${message}`);\n return this;\n }\n\n if (this.timer) {\n clearInterval(this.timer);\n }\n\n process.stdout.write('\\x1B[?25l'); // Hide cursor\n this.timer = setInterval(() => {\n this.render();\n }, 80);\n\n this.render();\n return this;\n }\n\n public update(message: string): this {\n this.message = message;\n if (!this.isTTY) {\n console.log(`[Lantern] ${message}`);\n } else if (this.isRunning) {\n this.render();\n }\n return this;\n }\n\n public connecting(provider: string, model: string): this {\n return this.update(`Connecting to ${pc.cyan(provider)} (${pc.bold(model)})...`);\n }\n\n public waitingFirstToken(provider: string, model: string): this {\n return this.update(`Waiting for first token from ${pc.cyan(provider)}...`);\n }\n\n public receiving(tokensCount?: number): this {\n const suffix = tokensCount ? ` (${tokensCount} tokens)` : '...';\n return this.update(`Receiving streaming response${suffix}`);\n }\n\n public retrying(attempt: number, maxAttempts: number, waitMs: number): this {\n return this.update(`Transient error encountered. Retrying (${attempt}/${maxAttempts}) in ${(waitMs / 1000).toFixed(1)}s...`);\n }\n\n public toolExecuting(toolName: string, preview?: string): this {\n const detail = preview ? `: ${preview}` : '';\n return this.update(`Executing tool ${pc.bold(toolName)}${detail}...`);\n }\n\n private render(): void {\n if (!this.isTTY || !this.isRunning) return;\n const frame = pc.yellow(SPINNER_FRAMES[this.frameIdx % SPINNER_FRAMES.length]);\n this.frameIdx++;\n\n // Clear line and write frame + message\n process.stdout.write(`\\r\\x1B[2K${frame} ${pc.dim(this.message)}`);\n }\n\n public stop(): this {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n this.isRunning = false;\n\n if (this.isTTY) {\n process.stdout.write('\\r\\x1B[2K'); // Clear line\n process.stdout.write('\\x1B[?25h'); // Restore cursor\n }\n return this;\n }\n\n public succeed(message: string): this {\n this.stop();\n console.log(`${pc.green('✓')} ${message}`);\n return this;\n }\n\n public fail(message: string): this {\n this.stop();\n console.log(`${pc.red('✗')} ${message}`);\n return this;\n }\n\n public info(message: string): this {\n this.stop();\n console.log(`${pc.cyan('ℹ')} ${message}`);\n return this;\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { FileAttachment } from '../types.js';\n\nconst MIME_MAP: Record<string, string> = {\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.webp': 'image/webp',\n '.gif': 'image/gif',\n '.pdf': 'application/pdf',\n '.txt': 'text/plain',\n '.md': 'text/markdown',\n '.json': 'application/json',\n '.ts': 'text/plain',\n '.js': 'text/plain',\n '.py': 'text/plain',\n '.sh': 'text/plain',\n '.html': 'text/html',\n '.css': 'text/css'\n};\n\nconst BINARY_IMAGE_EXTS = new Set(['.png', '.jpg', '.jpeg', '.webp', '.gif', '.pdf']);\nconst MAX_ATTACHMENT_SIZE = 15 * 1024 * 1024; // 15MB\n\nexport function loadAttachment(filePath: string): FileAttachment {\n const resolved = path.resolve(filePath);\n\n if (!fs.existsSync(resolved)) {\n throw new Error(`Attached file does not exist: ${filePath}`);\n }\n\n const stat = fs.statSync(resolved);\n if (!stat.isFile()) {\n throw new Error(`Attachment target is not a file: ${filePath}`);\n }\n\n if (stat.size > MAX_ATTACHMENT_SIZE) {\n throw new Error(`Attachment file too large: ${filePath} (${(stat.size / (1024 * 1024)).toFixed(1)}MB, max 15MB)`);\n }\n\n const ext = path.extname(resolved).toLowerCase();\n const mimeType = MIME_MAP[ext] || 'application/octet-stream';\n const name = path.basename(resolved);\n\n if (BINARY_IMAGE_EXTS.has(ext)) {\n const buffer = fs.readFileSync(resolved);\n return {\n path: resolved,\n name,\n mimeType,\n size: stat.size,\n base64Data: buffer.toString('base64')\n };\n }\n\n // Treat as text\n const textContent = fs.readFileSync(resolved, 'utf8');\n return {\n path: resolved,\n name,\n mimeType: mimeType.startsWith('text/') ? mimeType : 'text/plain',\n size: stat.size,\n textContent\n };\n}\n\nexport function loadAttachments(filePaths?: string[]): FileAttachment[] {\n if (!filePaths || filePaths.length === 0) return [];\n return filePaths.map(p => loadAttachment(p));\n}\n"],"mappings":";;;AAAA,OAAO,QAAQ;AAER,IAAM,eAAN,cAA2B,MAAM;AAAA,EAC/B;AAAA,EACP,YAAY,WAAmB,YAAY,WAAW;AACpD,UAAM,GAAG,SAAS,qBAAqB,YAAY,KAAM,QAAQ,CAAC,CAAC,IAAI;AACvE,SAAK,OAAO;AACZ,SAAK,YAAY;AAAA,EACnB;AACF;AAEO,IAAM,yBAAN,cAAqC,MAAM;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACP,YAAY,WAAmB,UAAkB,OAAe;AAC9D,UAAM,oCAAoC,QAAQ,KAAK,KAAK,YAAY,YAAY,KAAM,QAAQ,CAAC,CAAC,IAAI;AACxG,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,WAAW;AAChB,SAAK,QAAQ;AAAA,EACf;AACF;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,UAAU,yCAAyC;AAC7D,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EACrC;AAAA,EACP,YAAY,WAAW,UAAU,SAAS,kBAAkB;AAC1D;AAAA,MACE,yBAAyB,QAAQ;AAAA;AAAA;AAAA;AAAA,cAGlB,MAAM;AAAA;AAAA,wBAEI,QAAQ;AAAA;AAAA,IACnC;AACA,SAAK,OAAO;AACZ,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAY,UAAU,4BAA4B;AAChD,UAAM,GAAG,OAAO;AAAA,sEAAyE;AACzF,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,sBAAN,cAAkC,MAAM;AAAA,EAC7C,YAAY,UAAU,0BAA0B;AAC9C,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,qBAAN,cAAiC,MAAM;AAAA,EAC5C,YAAY,OAAe,UAAkB;AAC3C,UAAM,UAAU,KAAK,8CAA8C,QAAQ,IAAI;AAC/E,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,uBAAN,cAAmC,MAAM;AAAA,EACvC;AAAA,EACA;AAAA,EAEP,YAAY,SAAiB,YAAqB,UAAmB;AACnE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,SAAS,mBAAmB,KAAsB;AACvD,MAAI,eAAe,gBAAgB;AACjC,WAAO,GAAG,OAAO;AAAA,cAAiB,IAAI,OAAO,EAAE;AAAA,EACjD;AACA,MAAI,eAAe,wBAAwB;AACzC,WAAO,GAAG,IAAI;AAAA,eAAQ,IAAI,OAAO;AAAA,IAAO,GAAG,OAAO,2HAA2H,CAAC;AAAA,EAChL;AACA,MAAI,eAAe,cAAc;AAC/B,WAAO,GAAG,IAAI;AAAA,eAAQ,IAAI,OAAO;AAAA,IAAO,GAAG,OAAO,wFAAwF,CAAC;AAAA,EAC7I;AACA,MAAI,eAAe,oBAAoB;AACrC,WAAO,GAAG,IAAI;AAAA,EAAK,IAAI,OAAO,EAAE;AAAA,EAClC;AACA,MAAI,eAAe,gBAAgB;AACjC,WAAO,GAAG,OAAO;AAAA,eAAQ,IAAI,OAAO,EAAE;AAAA,EACxC;AACA,MAAI,eAAe,qBAAqB;AACtC,WAAO,GAAG,IAAI;AAAA,YAAQ,IAAI,OAAO,EAAE;AAAA,EACrC;AACA,MAAI,eAAe,oBAAoB;AACrC,WAAO,GAAG,IAAI;AAAA,YAAQ,IAAI,OAAO;AAAA,IAAO,GAAG,IAAI,sEAAsE,CAAC;AAAA,EACxH;AACA,MAAI,eAAe,OAAO;AACxB,UAAM,MAAM,IAAI,WAAW;AAC3B,QAAI,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,mBAAmB,GAAG;AAC/F,aAAO,GAAG,IAAI,uFAAuF;AAAA,IACvG;AACA,QAAI,IAAI,SAAS,oBAAoB,KAAK,IAAI,SAAS,KAAK,GAAG;AAC7D,aAAO,GAAG,OAAO,yEAAyE;AAAA,IAC5F;AACA,QAAI,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,SAAS,KAAK,IAAI,SAAS,UAAU,GAAG;AACrF,aAAO,GAAG,OAAO,mBAAmB;AAAA,IACtC;AACA,WAAO,GAAG,IAAI,UAAU,GAAG,EAAE;AAAA,EAC/B;AACA,SAAO,GAAG,IAAI,iCAAiC,OAAO,GAAG,CAAC,EAAE;AAC9D;;;AClHO,SAAS,4BAA4B,cAA4B,WAGtE;AACA,QAAM,aAAa,IAAI,gBAAgB;AACvC,MAAI,QAA+B;AAEnC,MAAI,aAAa,YAAY,GAAG;AAC9B,YAAQ,WAAW,MAAM;AACvB,iBAAW,MAAM,IAAI,aAAa,SAAS,CAAC;AAAA,IAC9C,GAAG,SAAS;AAAA,EACd;AAEA,QAAM,gBAAgB,MAAM;AAC1B,eAAW,MAAM,cAAc,UAAU,IAAI,eAAe,CAAC;AAAA,EAC/D;AAEA,MAAI,cAAc;AAChB,QAAI,aAAa,SAAS;AACxB,oBAAc;AAAA,IAChB,OAAO;AACL,mBAAa,iBAAiB,SAAS,eAAe,EAAE,MAAM,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACpB,QAAI,OAAO;AACT,mBAAa,KAAK;AAClB,cAAQ;AAAA,IACV;AACA,QAAI,cAAc;AAChB,mBAAa,oBAAoB,SAAS,aAAa;AAAA,IACzD;AAAA,EACF;AAEA,SAAO,EAAE,YAAY,QAAQ;AAC/B;AAEA,gBAAuB,gCACrB,QACA,qBACA,UACA,OACA,QACA,cACkC;AAClC,MAAI,qBAAqB;AACzB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,QAA+B;AACnC,MAAI,WAAW;AAEf,QAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,YAAQ,WAAW,MAAM;AACvB,UAAI,CAAC,oBAAoB;AACvB,mBAAW;AACX,eAAO,IAAI,uBAAuB,qBAAqB,UAAU,KAAK,CAAC;AAAA,MACzE;AAAA,IACF,GAAG,mBAAmB;AAAA,EACxB,CAAC;AAED,QAAM,eAAe,IAAI,QAAe,CAAC,GAAG,WAAW;AACrD,QAAI,QAAQ;AACV,UAAI,OAAO,SAAS;AAClB,eAAO,OAAO,UAAU,IAAI,eAAe,CAAC;AAAA,MAC9C,OAAO;AACL,eAAO,iBAAiB,SAAS,MAAM,OAAO,OAAO,UAAU,IAAI,eAAe,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC;AAAA,MACtG;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,WAAW,OAAO,OAAO,aAAa,EAAE;AAE9C,MAAI;AACF,WAAO,MAAM;AACX,UAAI,QAAQ,SAAS;AACnB,cAAM,OAAO,UAAU,IAAI,eAAe;AAAA,MAC5C;AAEA,UAAI,CAAC,oBAAoB;AAEvB,cAAM,cAAc,SAAS,KAAK;AAClC,cAAM,SAAS,MAAM,QAAQ,KAAK,CAAC,aAAa,cAAc,YAAY,CAAC;AAE3E,YAAI,OAAO;AACT,uBAAa,KAAK;AAClB,kBAAQ;AAAA,QACV;AAEA,YAAI,OAAO,MAAM;AACf;AAAA,QACF;AAEA,6BAAqB;AACrB,YAAI,cAAc;AAChB,uBAAa,KAAK,IAAI,IAAI,SAAS;AAAA,QACrC;AAEA,cAAM,OAAO;AAAA,MACf,OAAO;AAEL,YAAI,QAAQ,SAAS;AACnB,gBAAM,OAAO,UAAU,IAAI,eAAe;AAAA,QAC5C;AAEA,cAAM,cAAc,SAAS,KAAK;AAClC,cAAM,SAAS,SAAS,MAAM,QAAQ,KAAK,CAAC,aAAa,YAAY,CAAC,IAAI,MAAM;AAEhF,YAAI,OAAO,MAAM;AACf;AAAA,QACF;AAEA,cAAM,OAAO;AAAA,MACf;AAAA,IACF;AAAA,EACF,UAAE;AACA,QAAI,OAAO;AACT,mBAAa,KAAK;AAAA,IACpB;AACA,QAAI,OAAO,SAAS,WAAW,YAAY;AACzC,UAAI;AACF,cAAM,SAAS,OAAO;AAAA,MACxB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;AC9HO,IAAM,iBAA8B;AAAA,EACzC,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,MAAM;AAAA,EACN,OAAO;AAAA,EACP,sBAAsB;AAAA;AAAA,EACtB,WAAW;AAAA,EACX,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,cAAc,CAAC;AAAA,EACf,YAAY,CAAC;AAAA,EACb,WAAW,CAAC;AACd;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIO,SAAS,oBAAoB,KAAa,OAA2E;AAC1H,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,eAAO,EAAE,OAAO,OAAO,OAAO,4CAA4C;AAAA,MAC5E;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,MAAM,KAAK,EAAE,YAAY,EAAE;AAAA,IAEhE,KAAK;AACH,UAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,eAAO,EAAE,OAAO,OAAO,OAAO,0CAA0C;AAAA,MAC1E;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,MAAM,KAAK,EAAE;AAAA,IAElD,KAAK,YAAY;AACf,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,KAAK;AACtC,eAAO,EAAE,OAAO,OAAO,OAAO,8CAA8C;AAAA,MAC9E;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,IAEA,KAAK,eAAe;AAClB,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,GAAG;AACpC,eAAO,EAAE,OAAO,OAAO,OAAO,mDAAmD;AAAA,MACnF;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,IAAI;AAAA,IACzC;AAAA,IAEA,KAAK,mBAAmB;AACtB,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,OAAO,MAAM,OAAO;AAC1C,eAAO,EAAE,OAAO,OAAO,OAAO,gDAAgD;AAAA,MAChF;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,OAAO,UAAU,UAAW,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACzE,UAAI,UAAU,UAAU,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,KAAK;AAC/E,UAAI,UAAU,WAAW,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACjF,aAAO,EAAE,OAAO,OAAO,OAAO,sCAAsC;AAAA,IACtE;AAAA,IAEA,KAAK,SAAS;AACZ,UAAI,UAAU,aAAa,UAAU,WAAW,UAAU,WAAW;AACnE,eAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AAAA,MAC3C;AACA,aAAO,EAAE,OAAO,OAAO,OAAO,iDAAiD;AAAA,IACjF;AAAA,IAEA,KAAK,wBAAwB;AAC3B,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,KAAK,MAAM,KAAK;AACtC,eAAO,EAAE,OAAO,OAAO,OAAO,0DAA0D;AAAA,MAC1F;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,KAAM;AAC5B,eAAO,EAAE,OAAO,OAAO,OAAO,uCAAuC;AAAA,MACvE;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,IAEA,KAAK,uBAAuB;AAC1B,YAAM,MAAM,OAAO,KAAK;AACxB,UAAI,MAAM,GAAG,KAAK,MAAM,KAAM;AAC5B,eAAO,EAAE,OAAO,OAAO,OAAO,iDAAiD;AAAA,MACjF;AACA,aAAO,EAAE,OAAO,MAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AAAA,IACrD;AAAA,IAEA,KAAK,cAAc;AACjB,UAAI,OAAO,UAAU,UAAW,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACzE,UAAI,UAAU,UAAU,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,KAAK;AAC/E,UAAI,UAAU,WAAW,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACjF,aAAO,EAAE,OAAO,OAAO,OAAO,4CAA4C;AAAA,IAC5E;AAAA,IAEA,KAAK,cAAc;AACjB,UAAI,OAAO,UAAU,UAAW,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACzE,UAAI,UAAU,UAAU,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,KAAK;AAC/E,UAAI,UAAU,WAAW,UAAU,IAAK,QAAO,EAAE,OAAO,MAAM,aAAa,MAAM;AACjF,aAAO,EAAE,OAAO,OAAO,OAAO,4CAA4C;AAAA,IAC5E;AAAA,IAEA,KAAK,gBAAgB;AACnB,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAO,EAAE,OAAO,MAAM,aAAa,MAAM,IAAI,MAAM,EAAE;AAAA,MACvD;AACA,UAAI,OAAO,UAAU,UAAU;AAC7B,eAAO,EAAE,OAAO,MAAM,aAAa,MAAM,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO,EAAE;AAAA,MACzF;AACA,aAAO,EAAE,OAAO,OAAO,OAAO,qEAAqE;AAAA,IACrG;AAAA,IAEA;AACE,aAAO,EAAE,OAAO,OAAO,OAAO,8BAA8B,GAAG,GAAG;AAAA,EACtE;AACF;;;AC7IA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,QAAQ;AAIR,SAAS,oBAA4B;AAC1C,QAAM,aAAa,QAAQ,IAAI,oBAAoB,QAAQ,IAAI;AAC/D,MAAI,YAAY;AACd,QAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,UAAI;AACF,WAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,MAC9C,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,KAAK,KAAK,GAAG,QAAQ,GAAG,cAAc;AACzD,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,QAAI;AACF,SAAG,UAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,IAC9C,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBAA4B;AAC1C,SAAO,KAAK,KAAK,kBAAkB,GAAG,aAAa;AACrD;AAEO,SAAS,aAA0B;AACxC,QAAM,aAAa,kBAAkB;AACrC,MAAI,CAAC,GAAG,WAAW,UAAU,GAAG;AAC9B,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AAEA,MAAI;AACF,UAAM,MAAM,GAAG,aAAa,YAAY,MAAM;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,UAAM,SAAsB;AAAA,MAC1B,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,QAAI,CAAC,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU;AAC/D,aAAO,aAAa,CAAC;AAAA,IACvB;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,EAAE,GAAG,eAAe;AAAA,EAC7B;AACF;AAEO,SAAS,WAAW,QAA2B;AACpD,QAAM,aAAa,kBAAkB;AAErC,QAAM,aAA0B;AAAA,IAC9B,gBAAgB,OAAO,kBAAkB,eAAe;AAAA,IACxD,cAAc,OAAO,gBAAgB,eAAe;AAAA,IACpD,UAAU,OAAO,YAAY,eAAe;AAAA,IAC5C,aAAa,OAAO,eAAe,eAAe;AAAA,IAClD,iBAAiB,OAAO,mBAAmB,eAAe;AAAA,IAC1D,MAAM,QAAQ,OAAO,IAAI;AAAA,IACzB,OAAO,OAAO,SAAS,eAAe;AAAA,IACtC,sBAAsB,OAAO,wBAAwB,eAAe;AAAA,IACpE,WAAW,OAAO,aAAa,eAAe;AAAA,IAC9C,qBAAqB,OAAO,uBAAuB,eAAe;AAAA,IAClE,YAAY,QAAQ,OAAO,UAAU;AAAA,IACrC,YAAY,QAAQ,OAAO,UAAU;AAAA,IACrC,cAAc,MAAM,QAAQ,OAAO,YAAY,IAAI,OAAO,eAAe,CAAC;AAAA,IAC1E,YAAY,OAAO,cAAc,CAAC;AAAA,IAClC,WAAW,OAAO,aAAa,CAAC;AAAA,EAClC;AAEA,MAAI;AACF,OAAG,cAAc,YAAY,KAAK,UAAU,YAAY,MAAM,CAAC,GAAG;AAAA,MAChE,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,YAAQ,MAAM,qCAAqC,UAAU,KAAK,IAAI,OAAO,EAAE;AAAA,EACjF;AACF;AAEO,SAAS,eAAe,KAAa,OAAmF;AAC7H,QAAM,aAAa,oBAAoB,KAAK,KAAK;AACjD,MAAI,CAAC,WAAW,OAAO;AACrB,WAAO,EAAE,SAAS,OAAO,OAAO,WAAW,MAAM;AAAA,EACnD;AAEA,QAAM,UAAU,WAAW;AAC3B,EAAC,QAA+C,GAAG,IAAI,WAAW;AAClE,aAAW,OAAO;AAElB,SAAO,EAAE,SAAS,MAAM,eAAe,QAAQ;AACjD;AAEO,SAAS,eAA4C,KAAwB;AAClF,QAAM,UAAU,WAAW;AAC3B,SAAO,QAAQ,GAAG;AACpB;;;ACzGA,OAAOA,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AACf,OAAO,YAAY;AAGnB,IAAM,oBAA8C;AAAA,EAClD,QAAQ,CAAC,kBAAkB,gBAAgB;AAAA,EAC3C,QAAQ,CAAC,gBAAgB;AAAA,EACzB,WAAW,CAAC,mBAAmB;AAAA,EAC/B,YAAY,CAAC,oBAAoB;AAAA,EACjC,QAAQ,CAAC,kBAAkB,gBAAgB;AAC7C;AAEA,SAAS,yBAAiC;AACxC,SAAOC,MAAK,KAAK,kBAAkB,GAAG,kBAAkB;AAC1D;AAKA,SAAS,uBAA+B;AACtC,QAAM,OAAO,eAAeC,IAAG,SAAS,CAAC,IAAIA,IAAG,SAAS,EAAE,QAAQ;AACnE,QAAM,SAAS,GAAGA,IAAG,QAAQ,CAAC,IAAI,QAAQ,QAAQ,IAAIA,IAAG,KAAK,CAAC;AAC/D,SAAO,OAAO,WAAW,QAAQ,MAAM,EAAE;AAC3C;AAEO,SAAS,cAAc,WAA2B;AACvD,QAAM,KAAK,OAAO,YAAY,EAAE;AAChC,QAAM,MAAM,qBAAqB;AACjC,QAAM,SAAS,OAAO,eAAe,eAAe,KAAK,EAAE;AAE3D,MAAI,YAAY,OAAO,OAAO,WAAW,QAAQ,KAAK;AACtD,eAAa,OAAO,MAAM,KAAK;AAC/B,QAAM,UAAU,OAAO,WAAW,EAAE,SAAS,KAAK;AAElD,SAAO,GAAG,GAAG,SAAS,KAAK,CAAC,IAAI,OAAO,IAAI,SAAS;AACtD;AAEO,SAAS,cAAc,kBAAyC;AACrE,MAAI;AACF,UAAM,QAAQ,iBAAiB,MAAM,GAAG;AACxC,QAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,UAAM,CAAC,OAAO,YAAY,YAAY,IAAI;AAC1C,UAAM,KAAK,OAAO,KAAK,OAAO,KAAK;AACnC,UAAM,UAAU,OAAO,KAAK,YAAY,KAAK;AAC7C,UAAM,MAAM,qBAAqB;AAEjC,UAAM,WAAW,OAAO,iBAAiB,eAAe,KAAK,EAAE;AAC/D,aAAS,WAAW,OAAO;AAE3B,QAAI,YAAY,SAAS,OAAO,cAAc,OAAO,MAAM;AAC3D,iBAAa,SAAS,MAAM,MAAM;AAClC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,KAAqB;AAC9C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,IAAI,KAAK;AACvB,MAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,SAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,MAAM,MAAM,EAAE,CAAC;AAClD;AAEO,SAAS,UAAU,UAAoE;AAC5F,QAAM,OAAO,SAAS,YAAY;AAGlC,QAAM,cAAc,kBAAkB,IAAI,KAAK,CAAC,GAAG,KAAK,YAAY,CAAC,UAAU;AAC/E,aAAW,UAAU,aAAa;AAChC,UAAM,MAAM,QAAQ,IAAI,MAAM;AAC9B,QAAI,OAAO,IAAI,KAAK,EAAE,SAAS,GAAG;AAChC,aAAO,EAAE,KAAK,IAAI,KAAK,GAAG,QAAQ,MAAM;AAAA,IAC1C;AAAA,EACF;AAGA,QAAM,WAAW,uBAAuB;AACxC,MAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,QAAI;AACF,YAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,UAAI,KAAK,IAAI,GAAG;AACd,cAAM,YAAY,cAAc,KAAK,IAAI,CAAC;AAC1C,YAAI,WAAW;AACb,iBAAO,EAAE,KAAK,WAAW,QAAQ,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,EAAE,KAAK,KAAK;AACrB;AAEO,SAAS,UAAU,UAAkB,QAAsB;AAChE,QAAM,OAAO,SAAS,YAAY;AAClC,QAAM,WAAW,uBAAuB;AACxC,MAAI,OAA+B,CAAC;AAEpC,MAAIA,IAAG,WAAW,QAAQ,GAAG;AAC3B,QAAI;AACF,YAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,aAAO,KAAK,MAAM,GAAG;AAAA,IACvB,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,OAAK,IAAI,IAAI,cAAc,OAAO,KAAK,CAAC;AAExC,MAAI;AACF,IAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG;AAAA,MACxD,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,YAAQ,MAAM,wCAAwC,IAAI,OAAO,EAAE;AAAA,EACrE;AACF;AAEO,SAAS,aAAa,UAA2B;AACtD,QAAM,OAAO,SAAS,YAAY;AAClC,QAAM,WAAW,uBAAuB;AACxC,MAAI,CAACA,IAAG,WAAW,QAAQ,EAAG,QAAO;AAErC,MAAI;AACF,UAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,UAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,QAAI,KAAK,IAAI,GAAG;AACd,aAAO,KAAK,IAAI;AAChB,MAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG;AAAA,QACxD,UAAU;AAAA,QACV,MAAM;AAAA,MACR,CAAC;AACD,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEO,SAAS,qBAA2G;AACzH,QAAM,YAAY,CAAC,UAAU,UAAU,aAAa,cAAc,QAAQ;AAC1E,QAAM,SAA+F,CAAC;AAEtG,aAAW,KAAK,WAAW;AACzB,UAAM,EAAE,KAAK,OAAO,IAAI,UAAU,CAAC;AACnC,WAAO,CAAC,IAAI;AAAA,MACV,YAAY,QAAQ,GAAG;AAAA,MACvB;AAAA,MACA,WAAW,MAAM,WAAW,GAAG,IAAI;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;;;AClKA,SAAS,aAAgE,YAAY;AAoB9E,IAAM,iBAAN,MAAiD;AAAA,EAC/C,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EAEd,eAA2C;AAAA,EAE5C,eAAwB;AAC7B,UAAM,EAAE,IAAI,IAAI,UAAU,KAAK,EAAE;AACjC,WAAO,QAAQ,OAAO,IAAI,KAAK,EAAE,SAAS,CAAC;AAAA,EAC7C;AAAA,EAEO,YAA2B;AAChC,WAAO,UAAU,KAAK,EAAE,EAAE;AAAA,EAC5B;AAAA,EAEO,eAAuB;AAC5B,UAAM,MAAM,KAAK,UAAU;AAC3B,WAAO,MAAM,WAAW,GAAG,IAAI;AAAA,EACjC;AAAA,EAEQ,YAAyB;AAC/B,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,mBAAmB,UAAU,gBAAgB;AAAA,IACzD;AACA,WAAO,IAAI,YAAY,EAAE,QAAQ,IAAI,CAAC;AAAA,EACxC;AAAA,EAEO,gBAAgB,SAAoC;AACzD,UAAM,QAAQ,QAAQ,SAAS,KAAK;AACpC,UAAM,aAAa,QAAQ,SAAS,UAAU,KAAK,QAAQ,SAAS,oBAAoB;AACxF,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,cAAc;AAAA,MACzB,eAAe,QAAQ,MAAU;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,MAAa,iBAA8C;AACzD,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,YAAY,KAAK;AAEvB,YAAM,OAAO,OAAO,YAAY;AAAA,QAC9B,OAAO;AAAA,QACP,UAAU;AAAA,MACZ,CAAC;AAED,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,eAAe;AAAA,MACjB;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,IAAI,WAAW,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,WAAW,UAAU,OAAqC;AACrE,QAAI,CAAC,WAAW,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACjE,aAAO,KAAK;AAAA,IACd;AAEA,QAAI;AACF,YAAM,SAAS,KAAK,UAAU;AAC9B,YAAM,YAAY,MAAM,OAAO,OAAO,KAAK;AAC3C,YAAM,SAA8B,CAAC;AAErC,uBAAiB,KAAK,WAAW;AAC/B,cAAM,UAAU,EAAE,QAAQ;AAE1B,cAAM,UAAU,QAAQ,WAAW,SAAS,IAAI,QAAQ,MAAM,CAAC,IAAI;AAGnE,YAAI,CAAC,QAAQ,SAAS,QAAQ,GAAG;AAC/B;AAAA,QACF;AAEA,cAAM,eAAe,KAAK,gBAAgB,OAAO;AACjD,eAAO,KAAK;AAAA,UACV,IAAI;AAAA,UACJ,MAAM,EAAE,eAAe;AAAA,UACvB,UAAU,KAAK;AAAA,UACf,aAAa,EAAE;AAAA,UACf,eAAe,aAAa;AAAA,UAC5B;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,OAAO,SAAS,GAAG;AACrB,aAAK,eAAe;AACpB,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAGA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,eAAe,IAAI,SAAO;AAAA,MAC/B;AAAA,MACA,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf,cAAc,KAAK,gBAAgB,EAAE;AAAA,MACrC,eAAe,GAAG,SAAS,KAAK,IAAI,MAAU;AAAA,IAChD,EAAE;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe,QAA6D;AACvF,UAAM,mBAAmB,KAAK,IAAI;AAClC,UAAM,SAA4B;AAAA,MAChC,SAAS;AAAA,MACT,iBAAiB,CAAC;AAAA,IACpB;AAEA,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,WAAW,KAAK,yBAAyB,OAAO,OAAO;AAC7D,UAAM,uBAAuB,KAAK,2BAA2B,OAAO,KAAK;AAEzE,UAAM,SAAkC;AAAA,MACtC,mBAAmB,OAAO;AAAA,MAC1B,aAAa,OAAO,gBAAgB,OAAO,aAAa,MAAM;AAAA,IAChE;AAEA,QAAI,OAAO,iBAAiB;AAC1B,aAAO,kBAAkB,OAAO;AAAA,IAClC;AAEA,UAAM,WAA2C,CAAC;AAClD,QAAI,qBAAqB,SAAS,GAAG;AACnC,eAAS,KAAK,EAAE,qBAAqB,CAAC;AAAA,IACxC;AACA,QAAI,OAAO,uBAAuB;AAChC,eAAS,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC;AAAA,IACpC;AACA,QAAI,SAAS,SAAS,GAAG;AACvB,aAAO,QAAQ;AAAA,IACjB;AAEA,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,sBAAsB,OAAO,uBAAuB;AAE1D,QAAI,WAAW;AACf,UAAM,cAAc;AACpB,QAAI,YAAqB;AAEzB,WAAO,WAAW,aAAa;AAC7B;AACA,YAAM,eAAe,KAAK,IAAI;AAE9B,UAAI,OAAO,UAAU,eAAe;AAClC,eAAO,UAAU,cAAc,WAAW,IAAI,YAAY,QAAQ,KAAK,YAAY;AAAA,MACrF;AAEA,YAAM,EAAE,YAAY,QAAQ,IAAI,4BAA4B,OAAO,QAAQ,SAAS;AAEpF,UAAI;AACF,cAAM,iBAAiB,MAAM,OAAO,OAAO,sBAAsB;AAAA,UAC/D,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,QACF,CAAC;AAED,eAAO,YAAY,KAAK,IAAI,IAAI;AAEhC,YAAI,OAAO,UAAU,eAAe;AAClC,iBAAO,UAAU,cAAc,qBAAqB;AAAA,QACtD;AAEA,YAAI,WAAW;AACf,cAAM,qBAAqC,CAAC;AAC5C,cAAM,QAAoB;AAAA,UACxB,cAAc;AAAA,UACd,kBAAkB;AAAA,UAClB,aAAa;AAAA,QACf;AAEA,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,eAAa;AACX,mBAAO,SAAS;AAChB,gBAAI,OAAO,UAAU,eAAe;AAClC,qBAAO,UAAU,cAAc,WAAW;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI;AAC7B,yBAAiB,SAAS,eAAe;AACvC,cAAI,MAAM,MAAM;AACd,wBAAY,MAAM;AAClB,gBAAI,OAAO,UAAU,SAAS;AAC5B,qBAAO,UAAU,QAAQ,MAAM,IAAI;AAAA,YACrC;AAAA,UACF;AAEA,cAAI,MAAM,iBAAiB,MAAM,cAAc,SAAS,GAAG;AACzD,uBAAW,MAAM,MAAM,eAAe;AACpC,iCAAmB,KAAK;AAAA,gBACtB,IAAI,GAAG,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,gBACzE,MAAM,GAAG,QAAQ;AAAA,gBACjB,MAAO,GAAG,QAAoC,CAAC;AAAA,cACjD,CAAC;AAAA,YACH;AAAA,UACF;AAEA,cAAI,MAAM,eAAe;AACvB,kBAAM,eAAe,MAAM,cAAc,oBAAoB,MAAM;AACnE,kBAAM,mBAAmB,MAAM,cAAc,wBAAwB,MAAM;AAC3E,kBAAM,cAAc,MAAM,cAAc,mBAAmB,MAAM;AACjE,gBAAI,OAAO,UAAU,SAAS;AAC5B,qBAAO,UAAU,QAAQ,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAEA,eAAO,WAAW,KAAK,IAAI,IAAI;AAC/B,eAAO,UAAU,KAAK,IAAI,IAAI;AAE9B,YAAI,OAAO,UAAU,eAAe,mBAAmB,SAAS,GAAG;AACjE,iBAAO,UAAU,YAAY,kBAAkB;AAAA,QACjD;AAEA,gBAAQ;AAER,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ;AACR,oBAAY;AAEZ,YAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAM;AAAA,QACR;AAEA,cAAM,MAAM,OAAO,KAAK,WAAW,GAAG;AACtC,YAAI,IAAI,SAAS,iBAAiB,KAAK,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,KAAK,GAAG;AACjF,gBAAM,IAAI,qBAAqB,0BAA0B,GAAG,IAAI,KAAK,KAAK,EAAE;AAAA,QAC9E;AACA,YAAI,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,SAAS,GAAG;AACxD,gBAAM,IAAI,mBAAmB,OAAO,OAAO,KAAK,WAAW;AAAA,QAC7D;AAEA,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,oBAAoB;AAC5E,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,gBAAgB;AAEjK,aAAK,eAAe,gBAAgB,WAAW,aAAa;AAC1D,gBAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAI;AAC7D,cAAI,OAAO,UAAU,eAAe;AAClC,mBAAO,UAAU,cAAc,YAAY,QAAQ,EAAE;AAAA,UACvD;AACA,gBAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAC7C;AAAA,QACF;AAEA,YAAI,aAAa;AACf,gBAAM,IAAI,eAAe,GAAG;AAAA,QAC9B;AAEA,cAAM,IAAI,qBAAqB,0BAA0B,GAAG,IAAI,QAAW,KAAK,EAAE;AAAA,MACpF;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,EAC5E;AAAA,EAEQ,yBAAyB,OAAsC;AACrE,UAAM,WAAsB,CAAC;AAE7B,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAgB,CAAC;AAEvB,UAAI,KAAK,SAAS,QAAQ;AACxB,YAAI,KAAK,MAAM;AACb,gBAAM,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,QAChC;AAEA,YAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,qBAAW,OAAO,KAAK,aAAa;AAClC,gBAAI,IAAI,cAAc,IAAI,UAAU;AAClC,oBAAM,KAAK;AAAA,gBACT,YAAY;AAAA,kBACV,UAAU,IAAI;AAAA,kBACd,MAAM,IAAI;AAAA,gBACZ;AAAA,cACF,CAAC;AAAA,YACH,WAAW,IAAI,aAAa;AAC1B,oBAAM,KAAK;AAAA,gBACT,MAAM,mBAAmB,IAAI,IAAI;AAAA;AAAA,EAAc,IAAI,WAAW;AAAA;AAAA,cAChE,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM,SAAS,GAAG;AACpB,mBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA,QACvC;AAAA,MACF,WAAW,KAAK,SAAS,SAAS;AAChC,YAAI,KAAK,MAAM;AACb,gBAAM,KAAK,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,QAChC;AAEA,YAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,qBAAW,MAAM,KAAK,WAAW;AAC/B,kBAAM,KAAK;AAAA,cACT,cAAc;AAAA,gBACZ,IAAI,GAAG;AAAA,gBACP,MAAM,GAAG;AAAA,gBACT,MAAM,GAAG;AAAA,cACX;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,MAAM,SAAS,GAAG;AACpB,mBAAS,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA,QACxC;AAAA,MACF,WAAW,KAAK,SAAS,QAAQ;AAC/B,YAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,qBAAW,OAAO,KAAK,aAAa;AAClC,kBAAM,KAAK;AAAA,cACT,kBAAkB;AAAA,gBAChB,IAAI,IAAI;AAAA,gBACR,MAAM,IAAI;AAAA,gBACV,UAAU;AAAA,kBACR,QAAQ,IAAI,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI,IAAI;AAAA,gBACjD;AAAA,cACF;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAEA,YAAI,MAAM,SAAS,GAAG;AACpB,mBAAS,KAAK,EAAE,MAAM,QAAQ,MAAM,CAAC;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,2BAA2B,OAAgD;AACjF,WAAO,MAAM,IAAI,UAAQ;AACvB,YAAM,aAAkC,CAAC;AAEzC,iBAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,KAAK,WAAW,UAAU,GAAG;AAC5E,YAAI,UAAU,KAAK;AACnB,gBAAQ,QAAQ,MAAM;AAAA,UACpB,KAAK;AAAA,UACL,KAAK;AACH,sBAAU,KAAK;AACf;AAAA,UACF,KAAK;AACH,sBAAU,KAAK;AACf;AAAA,UACF,KAAK;AACH,sBAAU,KAAK;AACf;AAAA,UACF,KAAK;AACH,sBAAU,KAAK;AACf;AAAA,UACF;AACE,sBAAU,KAAK;AAAA,QACnB;AAEA,mBAAW,QAAQ,IAAI;AAAA,UACrB,MAAM;AAAA,UACN,aAAa,QAAQ;AAAA,UACrB,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,UAC7C,GAAI,QAAQ,QAAQ,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,EAAE,IAAI,CAAC;AAAA,QAC1D;AAAA,MACF;AAEA,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,YAAY;AAAA,UACV,MAAM,KAAK;AAAA,UACX;AAAA,UACA,UAAU,KAAK,WAAW,YAAY,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AC3ZO,IAAM,iBAAN,MAAiD;AAAA,EAC/C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEC,eAA2C;AAAA,EAEnD,YAAY,SAOT;AACD,SAAK,KAAK,SAAS,MAAM;AACzB,SAAK,OAAO,SAAS,QAAQ;AAC7B,SAAK,cAAc,SAAS,eAAe;AAC3C,SAAK,WAAW,SAAS,WAAW,6BAA6B,QAAQ,QAAQ,EAAE;AACnF,SAAK,eAAe,SAAS,gBAAgB;AAC7C,SAAK,gBAAgB,SAAS,WAAW,CAAC;AAAA,EAC5C;AAAA,EAEO,eAAwB;AAC7B,UAAM,EAAE,IAAI,IAAI,UAAU,KAAK,EAAE;AACjC,WAAO,QAAQ,OAAO,IAAI,KAAK,EAAE,SAAS,CAAC;AAAA,EAC7C;AAAA,EAEO,YAA2B;AAChC,WAAO,UAAU,KAAK,EAAE,EAAE;AAAA,EAC5B;AAAA,EAEO,eAAuB;AAC5B,UAAM,MAAM,KAAK,UAAU;AAC3B,WAAO,MAAM,WAAW,GAAG,IAAI;AAAA,EACjC;AAAA,EAEO,gBAAgB,SAAoC;AACzD,UAAM,QAAQ,QAAQ,YAAY;AAClC,UAAM,cAAc,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI;AACvF,UAAM,SAAS,MAAM,SAAS,MAAM,KAAK,MAAM,SAAS,MAAM;AAC9D,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO,CAAC,eAAe,MAAM,SAAS,SAAS,KAAK,MAAM,SAAS,SAAS;AAAA,MAC5E,QAAQ,CAAC,UAAU,CAAC,MAAM,SAAS,WAAW;AAAA,MAC9C,WAAW;AAAA,MACX,eAAe,MAAM,SAAS,QAAQ,IAAI,QAAS;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAa,iBAA8C;AACzD,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO,uBAAuB,KAAK,WAAW,GAAG;AAAA,IAC1F;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAK;AAExD,YAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW;AAAA,QAChD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,iBAAiB,UAAU,GAAG;AAAA,UAC9B,GAAG,KAAK;AAAA,QACV;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,KAAK;AAElB,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,KAAK,IAAI,IAAI;AAAA,UACxB,OAAO,QAAQ,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,KAAK,SAAS;AAE7D,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,aAAa;AAAA,QACb,eAAe,KAAK;AAAA,MACtB;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,IAAI,WAAW,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,WAAW,UAAU,OAAqC;AACrE,QAAI,CAAC,WAAW,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACjE,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,KAAK;AACP,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAK;AAExD,cAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,iBAAiB,UAAU,GAAG;AAAA,YAC9B,GAAG,KAAK;AAAA,UACV;AAAA,UACA,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,KAAK;AAElB,YAAI,IAAI,IAAI;AACV,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,kBAAM,SAA8B,CAAC;AACrC,uBAAW,QAAQ,KAAK,MAAM;AAC5B,oBAAM,KAAK,KAAK;AAChB,kBAAI,OAAO,OAAO,SAAU;AAG5B,oBAAM,QAAQ,GAAG,YAAY;AAC7B,kBACE,MAAM,SAAS,SAAS,KACxB,MAAM,SAAS,KAAK,KACpB,MAAM,SAAS,QAAQ,KACvB,MAAM,SAAS,gBAAgB,KAC/B,MAAM,SAAS,YAAY,GAC3B;AACA;AAAA,cACF;AAEA,qBAAO,KAAK;AAAA,gBACV;AAAA,gBACA,MAAM;AAAA,gBACN,UAAU,KAAK;AAAA,gBACf,cAAc,KAAK,gBAAgB,EAAE;AAAA,cACvC,CAAC;AAAA,YACH;AAEA,gBAAI,OAAO,SAAS,GAAG;AACrB,mBAAK,eAAe;AACpB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,SAAS,IAAI,SAAO;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf,cAAc,KAAK,gBAAgB,EAAE;AAAA,IACvC,EAAE;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe,QAA6D;AACvF,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,mBAAmB,KAAK,IAAI,GAAG,KAAK,GAAG,YAAY,CAAC,UAAU;AAAA,IAC1E;AAEA,UAAM,mBAAmB,KAAK,IAAI;AAClC,UAAM,SAA4B;AAAA,MAChC,SAAS;AAAA,MACT,iBAAiB,CAAC;AAAA,IACpB;AAEA,UAAM,WAAW,KAAK,yBAAyB,OAAO,mBAAmB,OAAO,OAAO;AACvF,UAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAE5C,UAAM,UAAmC;AAAA,MACvC,OAAO,OAAO;AAAA,MACd;AAAA,MACA,QAAQ;AAAA,MACR,gBAAgB,EAAE,eAAe,KAAK;AAAA,IACxC;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,QAAQ;AAAA,IAClB;AAEA,QAAI,OAAO,OAAO,gBAAgB,UAAU;AAC1C,cAAQ,cAAc,OAAO;AAAA,IAC/B;AAEA,QAAI,OAAO,iBAAiB;AAC1B,cAAQ,aAAa,OAAO;AAAA,IAC9B;AAEA,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,sBAAsB,OAAO,uBAAuB;AAE1D,QAAI,WAAW;AACf,UAAM,cAAc;AACpB,QAAI,YAAqB;AAEzB,WAAO,WAAW,aAAa;AAC7B;AACA,YAAM,eAAe,KAAK,IAAI;AAE9B,UAAI,OAAO,UAAU,eAAe;AAClC,eAAO,UAAU,cAAc,WAAW,IAAI,YAAY,QAAQ,KAAK,YAAY;AAAA,MACrF;AAEA,YAAM,EAAE,YAAY,QAAQ,IAAI,4BAA4B,OAAO,QAAQ,SAAS;AAEpF,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,qBAAqB;AAAA,UAC/D,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,iBAAiB,UAAU,GAAG;AAAA,YAC9B,GAAG,KAAK;AAAA,UACV;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,eAAO,YAAY,KAAK,IAAI,IAAI;AAEhC,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,kBAAM,IAAI,oBAAoB,sBAAsB,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,UACtF;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,kBAAM,IAAI,eAAe,sBAAsB,SAAS,EAAE;AAAA,UAC5D;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,kBAAM,IAAI,mBAAmB,OAAO,OAAO,KAAK,WAAW;AAAA,UAC7D;AACA,gBAAM,IAAI,qBAAqB,qBAAqB,SAAS,MAAM,MAAM,SAAS,IAAI,SAAS,QAAQ,KAAK,EAAE;AAAA,QAChH;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,qBAAqB,gCAAgC,QAAW,KAAK,EAAE;AAAA,QACnF;AAEA,YAAI,OAAO,UAAU,eAAe;AAClC,iBAAO,UAAU,cAAc,qBAAqB;AAAA,QACtD;AAEA,cAAM,YAAY,KAAK,cAAc,SAAS,IAAI;AAElD,YAAI,WAAW;AACf,cAAM,eAA+E,CAAC;AACtF,cAAM,QAAoB,EAAE,cAAc,GAAG,kBAAkB,GAAG,aAAa,EAAE;AAEjF,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,eAAa;AACX,mBAAO,SAAS;AAChB,gBAAI,OAAO,UAAU,eAAe;AAClC,qBAAO,UAAU,cAAc,WAAW;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI;AAE7B,yBAAiB,SAAS,eAAe;AACvC,gBAAM,QAAQ,MAAM,UAAU,CAAC,GAAG;AAElC,cAAI,OAAO,SAAS;AAClB,wBAAY,MAAM;AAClB,gBAAI,OAAO,UAAU,SAAS;AAC5B,qBAAO,UAAU,QAAQ,MAAM,OAAO;AAAA,YACxC;AAAA,UACF;AAEA,cAAI,MAAM,QAAQ,OAAO,UAAU,GAAG;AACpC,uBAAW,MAAM,MAAM,YAAY;AACjC,oBAAM,QAAQ,GAAG,SAAS;AAC1B,kBAAI,CAAC,aAAa,KAAK,GAAG;AACxB,6BAAa,KAAK,IAAI;AAAA,kBACpB,IAAI,GAAG,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,kBACxC,MAAM,GAAG,UAAU,QAAQ;AAAA,kBAC3B,UAAU,GAAG,UAAU,aAAa;AAAA,gBACtC;AAAA,cACF,OAAO;AACL,oBAAI,GAAG,GAAI,cAAa,KAAK,EAAE,KAAK,GAAG;AACvC,oBAAI,GAAG,UAAU,KAAM,cAAa,KAAK,EAAE,OAAO,GAAG,SAAS;AAC9D,oBAAI,GAAG,UAAU,UAAW,cAAa,KAAK,EAAE,YAAY,GAAG,SAAS;AAAA,cAC1E;AAAA,YACF;AAAA,UACF;AAEA,cAAI,MAAM,OAAO;AACf,kBAAM,eAAe,MAAM,MAAM,iBAAiB,MAAM;AACxD,kBAAM,mBAAmB,MAAM,MAAM,qBAAqB,MAAM;AAChE,kBAAM,cAAc,MAAM,MAAM,gBAAgB,MAAM;AACtD,gBAAI,OAAO,UAAU,SAAS;AAC5B,qBAAO,UAAU,QAAQ,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAEA,eAAO,WAAW,KAAK,IAAI,IAAI;AAC/B,eAAO,UAAU,KAAK,IAAI,IAAI;AAE9B,cAAM,qBAAqC,OAAO,OAAO,YAAY,EAAE,IAAI,QAAM;AAC/E,cAAI,aAAa,CAAC;AAClB,cAAI;AACF,yBAAa,KAAK,MAAM,GAAG,YAAY,IAAI;AAAA,UAC7C,QAAQ;AACN,yBAAa,EAAE,KAAK,GAAG,SAAS;AAAA,UAClC;AACA,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,OAAO,UAAU,eAAe,mBAAmB,SAAS,GAAG;AACjE,iBAAO,UAAU,YAAY,kBAAkB;AAAA,QACjD;AAEA,gBAAQ;AAER,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ;AACR,oBAAY;AAEZ,YAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAM;AAAA,QACR;AAEA,cAAM,MAAM,OAAO,KAAK,WAAW,GAAG;AACtC,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,eAAe;AAC1D,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,WAAW,KAAK,IAAI,SAAS,gBAAgB;AAEnI,aAAK,eAAe,gBAAgB,WAAW,aAAa;AAC1D,gBAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAI;AAC7D,cAAI,OAAO,UAAU,eAAe;AAClC,mBAAO,UAAU,cAAc,YAAY,QAAQ,EAAE;AAAA,UACvD;AACA,gBAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAC7C;AAAA,QACF;AAEA,cAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,EAC5E;AAAA,EAEQ,yBAAyB,mBAA2B,SAAoC;AAC9F,UAAM,WAAkB,CAAC;AAEzB,QAAI,mBAAmB;AACrB,eAAS,KAAK,EAAE,MAAM,UAAU,SAAS,kBAAkB,CAAC;AAAA,IAC9D;AAEA,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,eAAsB,CAAC;AAC7B,YAAI,KAAK,MAAM;AACb,uBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,QACrD;AACA,YAAI,KAAK,aAAa;AACpB,qBAAW,OAAO,KAAK,aAAa;AAClC,gBAAI,IAAI,cAAc,IAAI,SAAS,WAAW,QAAQ,GAAG;AACvD,2BAAa,KAAK;AAAA,gBAChB,MAAM;AAAA,gBACN,WAAW,EAAE,KAAK,QAAQ,IAAI,QAAQ,WAAW,IAAI,UAAU,GAAG;AAAA,cACpE,CAAC;AAAA,YACH,WAAW,IAAI,aAAa;AAC1B,2BAAa,KAAK;AAAA,gBAChB,MAAM;AAAA,gBACN,MAAM,mBAAmB,IAAI,IAAI;AAAA;AAAA,EAAc,IAAI,WAAW;AAAA;AAAA,cAChE,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,aAAa,WAAW,KAAK,aAAa,CAAC,EAAE,SAAS,SAAS,aAAa,CAAC,EAAE,OAAO;AAAA,QACjG,CAAC;AAAA,MACH,WAAW,KAAK,SAAS,SAAS;AAChC,cAAM,MAAW,EAAE,MAAM,YAAY;AACrC,YAAI,KAAK,KAAM,KAAI,UAAU,KAAK;AAClC,YAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,cAAI,aAAa,KAAK,UAAU,IAAI,SAAO;AAAA,YACzC,IAAI,GAAG;AAAA,YACP,MAAM;AAAA,YACN,UAAU;AAAA,cACR,MAAM,GAAG;AAAA,cACT,WAAW,KAAK,UAAU,GAAG,IAAI;AAAA,YACnC;AAAA,UACF,EAAE;AAAA,QACJ;AACA,iBAAS,KAAK,GAAG;AAAA,MACnB,WAAW,KAAK,SAAS,QAAQ;AAC/B,YAAI,KAAK,aAAa;AACpB,qBAAW,MAAM,KAAK,aAAa;AACjC,qBAAS,KAAK;AAAA,cACZ,MAAM;AAAA,cACN,cAAc,GAAG;AAAA,cACjB,SAAS,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS,KAAK,UAAU,GAAG,MAAM;AAAA,YAC/E,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,OAAgC;AACnD,WAAO,MAAM,IAAI,QAAM;AAAA,MACrB,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM,EAAE;AAAA,QACR,aAAa,EAAE;AAAA,QACf,YAAY,EAAE;AAAA,MAChB;AAAA,IACF,EAAE;AAAA,EACJ;AAAA,EAEA,OAAe,cAAc,QAAwE;AACnG,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAEzC,cAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,kBAAM,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AACtC,gBAAI,YAAY,SAAU;AAE1B,gBAAI;AACF,oBAAM,KAAK,MAAM,OAAO;AAAA,YAC1B,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AACF;;;AC1eO,IAAM,oBAAN,MAAoD;AAAA,EAClD,KAAK;AAAA,EACL,OAAO;AAAA,EACP,cAAc;AAAA,EACd,eAAe;AAAA,EACf,UAAU;AAAA,EAET,eAA2C;AAAA,EAE5C,eAAwB;AAC7B,UAAM,EAAE,IAAI,IAAI,UAAU,KAAK,EAAE;AACjC,WAAO,QAAQ,OAAO,IAAI,KAAK,EAAE,SAAS,CAAC;AAAA,EAC7C;AAAA,EAEO,YAA2B;AAChC,WAAO,UAAU,KAAK,EAAE,EAAE;AAAA,EAC5B;AAAA,EAEO,eAAuB;AAC5B,UAAM,MAAM,KAAK,UAAU;AAC3B,WAAO,MAAM,WAAW,GAAG,IAAI;AAAA,EACjC;AAAA,EAEO,gBAAgB,SAAoC;AACzD,UAAM,QAAQ,QAAQ,YAAY;AAClC,UAAM,WAAW,MAAM,SAAS,QAAQ;AACxC,UAAM,SAAS,MAAM,SAAS,MAAM;AACpC,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW,YAAY;AAAA,MACvB,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAa,iBAA8C;AACzD,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,SAAS,OAAO,WAAW,GAAG,OAAO,4BAA4B;AAAA,IAC5E;AAEA,UAAM,YAAY,KAAK,IAAI;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAK;AAGxD,YAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,aAAa;AAAA,QAClD,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,gBAAgB;AAAA,UAChB,aAAa;AAAA,UACb,qBAAqB;AAAA,QACvB;AAAA,QACA,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,UAAU,CAAC,EAAE,MAAM,QAAQ,SAAS,OAAO,CAAC;AAAA,QAC9C,CAAC;AAAA,QACD,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,KAAK;AAElB,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,WAAW,KAAK,IAAI,IAAI;AAAA,UACxB,OAAO,QAAQ,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,QAClD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,eAAe,KAAK;AAAA,MACtB;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,WAAW,KAAK,IAAI,IAAI;AAAA,QACxB,OAAO,IAAI,WAAW,OAAO,GAAG;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAa,WAAW,UAAU,OAAqC;AACrE,QAAI,CAAC,WAAW,KAAK,gBAAgB,KAAK,aAAa,SAAS,GAAG;AACjE,aAAO,KAAK;AAAA,IACd;AAEA,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,KAAK;AACP,UAAI;AACF,cAAM,aAAa,IAAI,gBAAgB;AACvC,cAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEvD,cAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW;AAAA,UAChD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,aAAa;AAAA,YACb,qBAAqB;AAAA,UACvB;AAAA,UACA,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,qBAAa,KAAK;AAElB,YAAI,IAAI,IAAI;AACV,gBAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,kBAAM,SAA8B,KAAK,KAAK,IAAI,CAAC,OAAY;AAAA,cAC7D,IAAI,EAAE;AAAA,cACN,MAAM,EAAE,gBAAgB,EAAE;AAAA,cAC1B,UAAU,KAAK;AAAA,cACf,cAAc,KAAK,gBAAgB,EAAE,EAAE;AAAA,cACvC,eAAe;AAAA,YACjB,EAAE;AACF,gBAAI,OAAO,SAAS,GAAG;AACrB,mBAAK,eAAe;AACpB,qBAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,SAAS,IAAI,SAAO;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf,cAAc,KAAK,gBAAgB,EAAE;AAAA,MACrC,eAAe;AAAA,IACjB,EAAE;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe,QAA6D;AACvF,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI,CAAC,KAAK;AACR,YAAM,IAAI,mBAAmB,KAAK,IAAI,mBAAmB;AAAA,IAC3D;AAEA,UAAM,mBAAmB,KAAK,IAAI;AAClC,UAAM,SAA4B;AAAA,MAChC,SAAS;AAAA,MACT,iBAAiB,CAAC;AAAA,IACpB;AAEA,UAAM,EAAE,UAAU,OAAO,IAAI,KAAK,yBAAyB,OAAO,mBAAmB,OAAO,OAAO;AACnG,UAAM,QAAQ,KAAK,aAAa,OAAO,KAAK;AAE5C,UAAM,UAAmC;AAAA,MACvC,OAAO,OAAO;AAAA,MACd;AAAA,MACA,YAAY,OAAO,mBAAmB;AAAA,MACtC,QAAQ;AAAA,IACV;AAEA,QAAI,QAAQ;AACV,cAAQ,SAAS;AAAA,IACnB;AAEA,QAAI,MAAM,SAAS,GAAG;AACpB,cAAQ,QAAQ;AAAA,IAClB;AAEA,QAAI,OAAO,OAAO,gBAAgB,UAAU;AAC1C,cAAQ,cAAc,OAAO;AAAA,IAC/B;AAEA,UAAM,YAAY,OAAO,aAAa;AACtC,UAAM,sBAAsB,OAAO,uBAAuB;AAE1D,QAAI,WAAW;AACf,UAAM,cAAc;AACpB,QAAI,YAAqB;AAEzB,WAAO,WAAW,aAAa;AAC7B;AACA,YAAM,eAAe,KAAK,IAAI;AAE9B,UAAI,OAAO,UAAU,eAAe;AAClC,eAAO,UAAU,cAAc,WAAW,IAAI,YAAY,QAAQ,KAAK,YAAY;AAAA,MACrF;AAEA,YAAM,EAAE,YAAY,QAAQ,IAAI,4BAA4B,OAAO,QAAQ,SAAS;AAEpF,UAAI;AACF,cAAM,WAAW,MAAM,MAAM,GAAG,KAAK,OAAO,aAAa;AAAA,UACvD,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,qBAAqB;AAAA,UACvB;AAAA,UACA,MAAM,KAAK,UAAU,OAAO;AAAA,UAC5B,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,eAAO,YAAY,KAAK,IAAI,IAAI;AAEhC,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,YAAY,MAAM,SAAS,KAAK;AACtC,cAAI,SAAS,WAAW,OAAO,SAAS,WAAW,KAAK;AACtD,kBAAM,IAAI,oBAAoB,yBAAyB,SAAS,MAAM,MAAM,SAAS,EAAE;AAAA,UACzF;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,kBAAM,IAAI,eAAe,yBAAyB,SAAS,EAAE;AAAA,UAC/D;AACA,cAAI,SAAS,WAAW,KAAK;AAC3B,kBAAM,IAAI,mBAAmB,OAAO,OAAO,KAAK,WAAW;AAAA,UAC7D;AACA,gBAAM,IAAI,qBAAqB,wBAAwB,SAAS,MAAM,MAAM,SAAS,IAAI,SAAS,QAAQ,KAAK,EAAE;AAAA,QACnH;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,qBAAqB,mCAAmC,QAAW,KAAK,EAAE;AAAA,QACtF;AAEA,YAAI,OAAO,UAAU,eAAe;AAClC,iBAAO,UAAU,cAAc,qBAAqB;AAAA,QACtD;AAEA,cAAM,YAAY,KAAK,cAAc,SAAS,IAAI;AAElD,YAAI,WAAW;AACf,cAAM,eAA+E,CAAC;AACtF,cAAM,QAAoB,EAAE,cAAc,GAAG,kBAAkB,GAAG,aAAa,EAAE;AAEjF,cAAM,gBAAgB;AAAA,UACpB;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,OAAO;AAAA,UACP,WAAW;AAAA,UACX,eAAa;AACX,mBAAO,SAAS;AAChB,gBAAI,OAAO,UAAU,eAAe;AAClC,qBAAO,UAAU,cAAc,WAAW;AAAA,YAC5C;AAAA,UACF;AAAA,QACF;AAEA,cAAM,cAAc,KAAK,IAAI;AAE7B,yBAAiB,SAAS,eAAe;AACvC,gBAAM,OAAO,MAAM;AAEnB,cAAI,SAAS,mBAAmB,MAAM,SAAS,OAAO;AACpD,kBAAM,eAAe,MAAM,QAAQ,MAAM,gBAAgB;AAAA,UAC3D;AAEA,cAAI,SAAS,uBAAuB;AAClC,kBAAM,QAAQ,MAAM,SAAS;AAC7B,gBAAI,MAAM,eAAe,SAAS,YAAY;AAC5C,2BAAa,KAAK,IAAI;AAAA,gBACpB,IAAI,MAAM,cAAc,MAAM,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,gBACzD,MAAM,MAAM,cAAc,QAAQ;AAAA,gBAClC,UAAU;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAEA,cAAI,SAAS,uBAAuB;AAClC,kBAAM,QAAQ,MAAM,SAAS;AAC7B,kBAAM,QAAQ,MAAM;AAEpB,gBAAI,OAAO,SAAS,gBAAgB,MAAM,MAAM;AAC9C,0BAAY,MAAM;AAClB,kBAAI,OAAO,UAAU,SAAS;AAC5B,uBAAO,UAAU,QAAQ,MAAM,IAAI;AAAA,cACrC;AAAA,YACF,WAAW,OAAO,SAAS,sBAAsB,MAAM,cAAc;AACnE,kBAAI,aAAa,KAAK,GAAG;AACvB,6BAAa,KAAK,EAAE,YAAY,MAAM;AAAA,cACxC;AAAA,YACF;AAAA,UACF;AAEA,cAAI,SAAS,mBAAmB,MAAM,OAAO;AAC3C,kBAAM,mBAAmB,MAAM,MAAM,iBAAiB;AACtD,kBAAM,cAAc,MAAM,eAAe,MAAM;AAC/C,gBAAI,OAAO,UAAU,SAAS;AAC5B,qBAAO,UAAU,QAAQ,KAAK;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AAEA,eAAO,WAAW,KAAK,IAAI,IAAI;AAC/B,eAAO,UAAU,KAAK,IAAI,IAAI;AAE9B,cAAM,qBAAqC,OAAO,OAAO,YAAY,EAAE,IAAI,QAAM;AAC/E,cAAI,aAAa,CAAC;AAClB,cAAI;AACF,yBAAa,KAAK,MAAM,GAAG,YAAY,IAAI;AAAA,UAC7C,QAAQ;AACN,yBAAa,EAAE,KAAK,GAAG,SAAS;AAAA,UAClC;AACA,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,OAAO,UAAU,eAAe,mBAAmB,SAAS,GAAG;AACjE,iBAAO,UAAU,YAAY,kBAAkB;AAAA,QACjD;AAEA,gBAAQ;AAER,eAAO;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ;AACR,oBAAY;AAEZ,YAAI,OAAO,QAAQ,SAAS;AAC1B,gBAAM;AAAA,QACR;AAEA,cAAM,MAAM,OAAO,KAAK,WAAW,GAAG;AACtC,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,eAAe;AAC1D,cAAM,cAAc,IAAI,SAAS,KAAK,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,YAAY,KAAK,IAAI,SAAS,WAAW;AAE/H,aAAK,eAAe,gBAAgB,WAAW,aAAa;AAC1D,gBAAM,UAAU,KAAK,IAAI,MAAO,KAAK,IAAI,KAAK,QAAQ,GAAG,GAAI;AAC7D,cAAI,OAAO,UAAU,eAAe;AAClC,mBAAO,UAAU,cAAc,YAAY,QAAQ,EAAE;AAAA,UACvD;AACA,gBAAM,IAAI,QAAQ,OAAK,WAAW,GAAG,OAAO,CAAC;AAC7C;AAAA,QACF;AAEA,cAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA,MAC1D;AAAA,IACF;AAEA,UAAM,qBAAqB,QAAQ,YAAY,IAAI,MAAM,OAAO,SAAS,CAAC;AAAA,EAC5E;AAAA,EAEQ,yBAAyB,mBAA2B,SAAmE;AAC7H,UAAM,WAAkB,CAAC;AAEzB,eAAW,QAAQ,SAAS;AAC1B,UAAI,KAAK,SAAS,QAAQ;AACxB,cAAM,UAAiB,CAAC;AACxB,YAAI,KAAK,MAAM;AACb,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,QAChD;AACA,YAAI,KAAK,aAAa;AACpB,qBAAW,OAAO,KAAK,aAAa;AAClC,gBAAI,IAAI,cAAc,IAAI,SAAS,WAAW,QAAQ,GAAG;AACvD,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,YAAY,IAAI;AAAA,kBAChB,MAAM,IAAI;AAAA,gBACZ;AAAA,cACF,CAAC;AAAA,YACH,WAAW,IAAI,aAAa;AAC1B,sBAAQ,KAAK;AAAA,gBACX,MAAM;AAAA,gBACN,MAAM,mBAAmB,IAAI,IAAI;AAAA;AAAA,EAAc,IAAI,WAAW;AAAA;AAAA,cAChE,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,MACzC,WAAW,KAAK,SAAS,SAAS;AAChC,cAAM,UAAiB,CAAC;AACxB,YAAI,KAAK,MAAM;AACb,kBAAQ,KAAK,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK,CAAC;AAAA,QAChD;AACA,YAAI,KAAK,WAAW;AAClB,qBAAW,MAAM,KAAK,WAAW;AAC/B,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,IAAI,GAAG;AAAA,cACP,MAAM,GAAG;AAAA,cACT,OAAO,GAAG;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AACA,iBAAS,KAAK,EAAE,MAAM,aAAa,QAAQ,CAAC;AAAA,MAC9C,WAAW,KAAK,SAAS,QAAQ;AAC/B,YAAI,KAAK,aAAa;AACpB,gBAAM,UAAiB,CAAC;AACxB,qBAAW,MAAM,KAAK,aAAa;AACjC,oBAAQ,KAAK;AAAA,cACX,MAAM;AAAA,cACN,aAAa,GAAG;AAAA,cAChB,SAAS,OAAO,GAAG,WAAW,WAAW,GAAG,SAAS,KAAK,UAAU,GAAG,MAAM;AAAA,YAC/E,CAAC;AAAA,UACH;AACA,mBAAS,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,UAAU,QAAQ,qBAAqB,OAAU;AAAA,EAC5D;AAAA,EAEQ,aAAa,OAAgC;AACnD,WAAO,MAAM,IAAI,QAAM;AAAA,MACrB,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,cAAc,EAAE;AAAA,IAClB,EAAE;AAAA,EACJ;AAAA,EAEA,OAAe,cAAc,QAAwE;AACnG,UAAM,SAAS,OAAO,UAAU;AAChC,UAAM,UAAU,IAAI,YAAY;AAChC,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,IAAI,KAAK;AAExB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,UAAU,KAAK,KAAK;AAC1B,cAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,EAAG;AAEzC,cAAI,QAAQ,WAAW,QAAQ,GAAG;AAChC,kBAAM,UAAU,QAAQ,MAAM,CAAC,EAAE,KAAK;AACtC,gBAAI;AACF,oBAAM,KAAK,MAAM,OAAO;AAAA,YAC1B,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAE;AACA,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AACF;;;AC3dO,IAAM,qBAAN,cAAiC,eAAe;AAAA,EACrD,cAAc;AACZ,UAAM;AAAA,MACJ,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS;AAAA,MACT,cAAc;AAAA,MACd,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,WAAW;AAAA,MACb;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEgB,gBAAgB,SAAoC;AAClE,UAAM,QAAQ,QAAQ,YAAY;AAClC,UAAM,cAAc,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,QAAQ;AACnH,WAAO;AAAA,MACL,WAAW;AAAA,MACX,OAAO,CAAC,MAAM,SAAS,OAAO,KAAK,CAAC,MAAM,SAAS,aAAa;AAAA;AAAA,MAChE,QAAQ,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,QAAQ;AAAA,MACrH,WAAW;AAAA,MACX,eAAe;AAAA,IACjB;AAAA,EACF;AAAA,EAEA,MAAsB,WAAW,UAAU,OAAqC;AAC9E,UAAM,MAAM,KAAK,UAAU;AAC3B,QAAI;AACF,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAK;AAExD,YAAM,UAAkC,EAAE,GAAG,KAAK,cAAc;AAChE,UAAI,KAAK;AACP,gBAAQ,eAAe,IAAI,UAAU,GAAG;AAAA,MAC1C;AAEA,YAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,WAAW;AAAA,QAChD,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,KAAK;AAElB,UAAI,IAAI,IAAI;AACV,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAI,MAAM,QAAQ,MAAM,IAAI,GAAG;AAC7B,gBAAM,SAA8B,KAAK,KAAK,MAAM,GAAG,GAAG,EAAE,IAAI,CAAC,OAAY;AAAA,YAC3E,IAAI,EAAE;AAAA,YACN,MAAM,EAAE,QAAQ,EAAE;AAAA,YAClB,UAAU,KAAK;AAAA,YACf,aAAa,EAAE;AAAA,YACf,eAAe,EAAE,kBAAkB;AAAA,YACnC,cAAc,KAAK,gBAAgB,EAAE,EAAE;AAAA,YACvC,SAAS,EAAE,UAAU;AAAA,cACnB,aAAa,WAAW,EAAE,QAAQ,MAAM,IAAI;AAAA,cAC5C,iBAAiB,WAAW,EAAE,QAAQ,UAAU,IAAI;AAAA,YACtD,IAAI;AAAA,UACN,EAAE;AACF,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,SAAS,IAAI,SAAO;AAAA,MACzB;AAAA,MACA,MAAM;AAAA,MACN,UAAU,KAAK;AAAA,MACf,cAAc,KAAK,gBAAgB,EAAE;AAAA,IACvC,EAAE;AAAA,EACJ;AACF;;;AChFO,IAAM,mBAAN,MAAuB;AAAA,EACpB,YAA2C,oBAAI,IAAI;AAAA,EAE3D,cAAc;AACZ,SAAK,iBAAiB;AACtB,SAAK,oBAAoB;AAAA,EAC3B;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,SAAS,IAAI,eAAe;AAClC,UAAM,YAAY,IAAI,kBAAkB;AACxC,UAAM,aAAa,IAAI,mBAAmB;AAE1C,SAAK,UAAU,IAAI,OAAO,IAAI,MAAM;AACpC,SAAK,UAAU,IAAI,OAAO,IAAI,MAAM;AACpC,SAAK,UAAU,IAAI,UAAU,IAAI,SAAS;AAC1C,SAAK,UAAU,IAAI,WAAW,IAAI,UAAU;AAAA,EAC9C;AAAA,EAEQ,sBAA4B;AAClC,UAAM,SAAS,WAAW;AAC1B,QAAI,OAAO,WAAW;AACpB,iBAAW,CAAC,IAAI,UAAU,KAAK,OAAO,QAAQ,OAAO,SAAS,GAAG;AAC/D,YAAI,CAAC,WAAW,UAAU;AACxB,gBAAM,UAAU,IAAI,eAAe;AAAA,YACjC;AAAA,YACA,MAAM,WAAW,QAAQ;AAAA,YACzB,aAAa,WAAW,QAAQ;AAAA,YAChC,SAAS,WAAW;AAAA,YACpB,cAAc,WAAW,gBAAgB;AAAA,YACzC,SAAS,WAAW;AAAA,UACtB,CAAC;AACD,eAAK,UAAU,IAAI,IAAI,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEO,YAAY,IAA+B;AAChD,UAAM,YAAY,MAAM,WAAW,EAAE,kBAAkB,UAAU,YAAY;AAC7E,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAE5C,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAGA,UAAM,SAAS,KAAK,UAAU,IAAI,QAAQ;AAC1C,QAAI,OAAQ,QAAO;AAGnB,UAAM,QAAQ,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,CAAC;AACnD,QAAI,MAAO,QAAO;AAElB,UAAM,IAAI,MAAM,uCAAuC,QAAQ,IAAI;AAAA,EACrE;AAAA,EAEO,YAAY,IAAqB;AACtC,WAAO,KAAK,UAAU,IAAI,GAAG,YAAY,CAAC;AAAA,EAC5C;AAAA,EAEO,gBAQJ;AACD,UAAM,YAAY,WAAW,EAAE,kBAAkB,UAAU,YAAY;AACvE,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,QAAM;AAAA,MACnD,IAAI,EAAE;AAAA,MACN,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,cAAc,EAAE,aAAa;AAAA,MAC7B,WAAW,EAAE,aAAa;AAAA,MAC1B,cAAc,EAAE;AAAA,MAChB,UAAU,EAAE,OAAO;AAAA,IACrB,EAAE;AAAA,EACJ;AAAA,EAEO,uBAAuB,KAA2B;AACvD,UAAM,KAAK,IAAI,GAAG,YAAY;AAC9B,UAAM,UAAU,IAAI,eAAe;AAAA,MACjC;AAAA,MACA,MAAM,IAAI,QAAQ;AAAA,MAClB,aAAa,IAAI,QAAQ;AAAA,MACzB,SAAS,IAAI;AAAA,MACb,cAAc,IAAI,gBAAgB;AAAA,MAClC,SAAS,IAAI;AAAA,IACf,CAAC;AAED,SAAK,UAAU,IAAI,IAAI,OAAO;AAG9B,UAAM,gBAAgB,WAAW;AACjC,QAAI,CAAC,cAAc,UAAW,eAAc,YAAY,CAAC;AACzD,kBAAc,UAAU,EAAE,IAAI;AAC9B,eAAW,aAAa;AAAA,EAC1B;AAAA,EAEO,qBAAqB,IAAqB;AAC/C,UAAM,OAAO,GAAG,YAAY;AAC5B,UAAM,WAAW,CAAC,UAAU,UAAU,aAAa,YAAY;AAC/D,QAAI,SAAS,SAAS,IAAI,GAAG;AAC3B,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,KAAK,UAAU,OAAO,IAAI;AAC1C,UAAM,gBAAgB,WAAW;AACjC,QAAI,cAAc,aAAa,cAAc,UAAU,IAAI,GAAG;AAC5D,aAAO,cAAc,UAAU,IAAI;AACnC,iBAAW,aAAa;AAAA,IAC1B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aAAa,IAA0C;AAClE,UAAM,IAAI,KAAK,YAAY,EAAE;AAC7B,WAAO,MAAM,EAAE,eAAe;AAAA,EAChC;AAAA,EAEA,MAAa,WAAW,YAAqB,UAAU,OAAqC;AAC1F,UAAM,IAAI,KAAK,YAAY,UAAU;AACrC,WAAO,MAAM,EAAE,WAAW,OAAO;AAAA,EACnC;AACF;;;ACxIA,OAAOC,WAAU;AAGjB,IAAM,uBAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAeO,SAAS,aAAa,UAA2B;AACtD,QAAM,OAAOC,MAAK,SAAS,QAAQ;AACnC,SAAO,qBAAqB,KAAK,aAAW,QAAQ,KAAK,IAAI,CAAC;AAChE;AAEO,SAAS,gBAAgB,MAAsB;AACpD,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,YAAY;AAGhB,cAAY,UAAU,QAAQ,8BAA8B,yCAAyC;AAGrG,cAAY,UAAU,QAAQ,wBAAwB,0CAA0C;AAChG,cAAY,UAAU,QAAQ,gCAAgC,+FAA+F;AAG7J,QAAM,aAAa,QAAQ,IAAI;AAC/B,MAAI,cAAc,WAAW,SAAS,GAAG;AACvC,gBAAY,UAAU,MAAM,UAAU,EAAE,KAAK,2BAA2B;AAAA,EAC1E;AAEA,SAAO;AACT;;;ACxDA,OAAOC,WAAU;AACjB,OAAOC,SAAQ;AAUf,IAAM,YAAY,QAAQ,aAAa;AAKvC,SAAS,uBAAuB,GAAmB;AACjD,QAAM,WAAWC,MAAK,QAAQ,CAAC;AAC/B,SAAO,YAAY,SAAS,YAAY,IAAI;AAC9C;AAKA,SAAS,kBAAkB,QAAgB,QAAyB;AAClE,QAAM,aAAa,uBAAuB,MAAM;AAChD,QAAM,aAAa,uBAAuB,MAAM;AAEhD,QAAM,MAAMA,MAAK,SAAS,YAAY,UAAU;AAChD,SAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,GAAG;AACtD;AAEO,SAAS,sBACd,YACA,cACA,uBAAiC,CAAC,GACZ;AACtB,MAAI,CAAC,cAAc,OAAO,eAAe,UAAU;AACjD,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,MAAI,sBAAsBA,MAAK,QAAQ,YAAY;AACnD,MAAI;AACF,QAAIC,IAAG,WAAW,mBAAmB,GAAG;AACtC,4BAAsBA,IAAG,aAAa,mBAAmB;AAAA,IAC3D;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,QAAM,iBAAiBD,MAAK,WAAW,UAAU,IAC7CA,MAAK,QAAQ,UAAU,IACvBA,MAAK,QAAQ,qBAAqB,UAAU;AAGhD,QAAM,sBAAsB,qBAAqB,KAAK,OAAK;AACzD,UAAM,cAAc,uBAAuB,CAAC;AAC5C,UAAM,aAAa,uBAAuB,cAAc;AACxD,WAAO,gBAAgB;AAAA,EACzB,CAAC;AAED,MAAI,qBAAqB;AACvB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAcA,MAAK,SAAS,qBAAqB,cAAc,KAAKA,MAAK,SAAS,cAAc;AAAA,IAClG;AAAA,EACF;AAGA,MAAI,CAAC,kBAAkB,qBAAqB,cAAc,GAAG;AAC3D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAcA,MAAK,SAAS,qBAAqB,cAAc;AAAA,MAC/D,QAAQ,SAAS,UAAU,0CAA0C,mBAAmB;AAAA,IAC1F;AAAA,EACF;AAGA,MAAI;AACF,QAAIC,IAAG,WAAW,cAAc,GAAG;AACjC,YAAM,aAAaA,IAAG,aAAa,cAAc;AACjD,UAAI,CAAC,kBAAkB,qBAAqB,UAAU,GAAG;AACvD,eAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc;AAAA,UACd,cAAcD,MAAK,SAAS,qBAAqB,UAAU;AAAA,UAC3D,QAAQ,gDAAgD,UAAU;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,MAAI,aAAa,cAAc,GAAG;AAChC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,cAAcA,MAAK,SAAS,qBAAqB,cAAc;AAAA,MAC/D,QAAQ,wCAAwCA,MAAK,SAAS,cAAc,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc;AAAA,IACd,cAAcA,MAAK,SAAS,qBAAqB,cAAc,KAAK;AAAA,EACtE;AACF;;;ACrHA,YAAY,UAAU;AACtB,OAAOE,SAAQ;AAER,SAAS,mBACd,UACA,YACA,YACA,eAAe,GACP;AAER,QAAM,gBAAgB,WAAW,QAAQ,SAAS,IAAI;AACtD,QAAM,gBAAgB,WAAW,QAAQ,SAAS,IAAI;AAEtD,QAAM,QAAa,iBAAY,UAAU,eAAe,eAAe,YAAY,YAAY;AAAA,IAC7F,SAAS;AAAA,EACX,CAAC;AAED,QAAM,QAAQ,MAAM,MAAM,IAAI;AAC9B,QAAM,YAAsB,CAAC;AAE7B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AAEpB,QAAI,KAAK,WAAW,KAAK,KAAK,KAAK,WAAW,KAAK,GAAG;AACpD,gBAAU,KAAKA,IAAG,KAAKA,IAAG,KAAK,IAAI,CAAC,CAAC;AAAA,IACvC,WAAW,KAAK,WAAW,IAAI,GAAG;AAChC,gBAAU,KAAKA,IAAG,QAAQ,IAAI,CAAC;AAAA,IACjC,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,gBAAU,KAAKA,IAAG,MAAM,IAAI,CAAC;AAAA,IAC/B,WAAW,KAAK,WAAW,GAAG,GAAG;AAC/B,gBAAU,KAAKA,IAAG,IAAI,IAAI,CAAC;AAAA,IAC7B,OAAO;AACL,gBAAU,KAAKA,IAAG,IAAI,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,IAAI;AAC5B;AAEO,SAAS,qBAAqB,UAAkB,SAAiB,kBAAkB,IAAY;AACpG,QAAM,aAAa,QAAQ,QAAQ,SAAS,IAAI;AAChD,QAAM,QAAQ,WAAW,MAAM,IAAI;AACnC,QAAM,UAAU,MAAM,MAAM,GAAG,eAAe,EAAE,IAAI,CAAC,MAAM,QAAQ;AACjE,UAAM,UAAU,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,WAAO,GAAGA,IAAG,IAAI,OAAO,CAAC,IAAIA,IAAG,MAAM,GAAG,CAAC,IAAIA,IAAG,MAAM,IAAI,CAAC;AAAA,EAC9D,CAAC;AAED,MAAI,MAAM,SAAS,iBAAiB;AAClC,YAAQ,KAAKA,IAAG,IAAI,eAAe,MAAM,SAAS,eAAe,aAAa,CAAC;AAAA,EACjF;AAEA,SAAO;AAAA,IACLA,IAAG,KAAKA,IAAG,KAAK,wBAAwB,QAAQ,KAAK,MAAM,MAAM,SAAS,CAAC;AAAA,IAC3E,GAAG;AAAA,EACL,EAAE,KAAK,IAAI;AACb;;;AChDA,IAAM,uBAAiE;AAAA;AAAA,EAErE,EAAE,OAAO,oDAAoD,QAAQ,uDAAuD;AAAA,EAC5H,EAAE,OAAO,+BAA+B,QAAQ,yDAAyD;AAAA;AAAA,EAEzG,EAAE,OAAO,qBAAqB,QAAQ,4CAA4C;AAAA,EAClF,EAAE,OAAO,iDAAiD,QAAQ,4CAA4C;AAAA,EAC9G,EAAE,OAAO,4CAA4C,QAAQ,mCAAmC;AAAA,EAChG,EAAE,OAAO,4CAA4C,QAAQ,iDAAiD;AAAA,EAC9G,EAAE,OAAO,0CAA0C,QAAQ,mDAAmD;AAAA;AAAA,EAE9G,EAAE,OAAO,sBAAsB,QAAQ,oCAAoC;AAAA,EAC3E,EAAE,OAAO,yCAAyC,QAAQ,yDAAyD;AAAA,EACnH,EAAE,OAAO,wCAAwC,QAAQ,wDAAwD;AAAA,EACjH,EAAE,OAAO,4CAA4C,QAAQ,4DAA4D;AAC3H;AAEO,SAAS,gBAAgB,SAA0C;AACxE,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,WAAW,GAAG;AAC3C,WAAO,EAAE,SAAS,OAAO,QAAQ,wBAAwB;AAAA,EAC3D;AAEA,QAAM,UAAU,QAAQ,KAAK;AAG7B,aAAW,SAAS,sBAAsB;AACxC,QAAI,MAAM,MAAM,KAAK,OAAO,GAAG;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,sCAAsC,MAAM,MAAM;AAAA,MAC5D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,kBAAkB,gDAAgD,KAAK,OAAO;AAEpF,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,EACd;AACF;;;AChDA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAKV,IAAM,eAA0B;AAAA,EACrC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,MAAM;AAAA,IACnB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC7C,UAAM,aAAa,sBAAsB,SAAS,QAAQ,SAAS;AAEnE,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,WAAW,MAAM;AAAA,QAClD,OAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAACC,IAAG,WAAW,WAAW,YAAY,GAAG;AAC3C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,6BAA6B,WAAW,YAAY;AAAA,QAC5D,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,OAAOA,IAAG,SAAS,WAAW,YAAY;AAChD,QAAI,CAAC,KAAK,OAAO,GAAG;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,4CAA4C,WAAW,YAAY;AAAA,QAC3E,OAAO;AAAA,MACT;AAAA,IACF;AAGA,QAAI,KAAK,OAAO,OAAO,MAAM;AAC3B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,+CAA+C,KAAK,OAAO,MAAM,QAAQ,CAAC,CAAC;AAAA,QACnF,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAUA,IAAG,aAAa,WAAW,cAAc,MAAM;AAC/D,YAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,YAAM,aAAa,MAAM;AAEzB,UAAI,QAAQ;AACZ,UAAI,MAAM;AAEV,UAAI,OAAO,KAAK,eAAe,YAAY,KAAK,aAAa,GAAG;AAC9D,gBAAQ,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,YAAY,UAAU,CAAC;AAAA,MAC3D;AAEA,UAAI,OAAO,KAAK,aAAa,YAAY,KAAK,YAAY,OAAO;AAC/D,cAAM,KAAK,IAAI,KAAK,UAAU,UAAU;AAAA,MAC1C;AAEA,YAAM,gBAAgB,MAAM,MAAM,QAAQ,GAAG,GAAG;AAChD,YAAM,gBAAgB,cAAc,IAAI,CAAC,MAAM,QAAQ;AACrD,cAAM,UAAU,OAAO,QAAQ,GAAG,EAAE,SAAS,GAAG,GAAG;AACnD,eAAO,GAAG,OAAO,MAAM,IAAI;AAAA,MAC7B,CAAC;AAED,YAAM,SAAS;AAAA,QACb,SAAS,WAAW,YAAY,KAAK,KAAK,IAAI,GAAG,OAAO,UAAU;AAAA,QAClE;AAAA,QACA,GAAG;AAAA,QACH;AAAA,MACF,EAAE,KAAK,IAAI;AAEX,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA,UAAU;AAAA,UACR,MAAM,WAAW;AAAA,UACjB,WAAW;AAAA,UACX,SAAS;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,uBAAuB,IAAI,OAAO;AAAA,QAC1C,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAA2B;AAAA,EACtC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,QAAQ,SAAS;AAAA,IAC9B;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC7C,UAAM,UAAU,OAAO,KAAK,WAAW,EAAE;AACzC,UAAM,aAAa,sBAAsB,SAAS,QAAQ,SAAS;AAEnE,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,WAAW,MAAM;AAAA,QAClD,OAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,aAAaA,IAAG,WAAW,WAAW,YAAY;AACxD,QAAI,aAAa;AACjB,QAAI,YAAY;AACd,UAAI;AACF,qBAAaA,IAAG,aAAa,WAAW,cAAc,MAAM;AAAA,MAC9D,QAAQ;AACN,qBAAa;AAAA,MACf;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,QAAQ,gBAAgB;AAAA,MAC7C,MAAM;AAAA,MACN,SAAS,aAAa,4BAA4B,WAAW,YAAY,KAAK,oBAAoB,WAAW,YAAY;AAAA,MACzH,SAAS;AAAA,QACP,MAAM,WAAW;AAAA,QACjB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,MAAM,aAAa,mBAAmB,WAAW,cAAc,YAAY,OAAO,IAAI,qBAAqB,WAAW,cAAc,OAAO;AAAA,MAC7I;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,oDAAoD,WAAW,YAAY;AAAA,QACnF,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAYC,MAAK,QAAQ,WAAW,YAAY;AACtD,UAAI,CAACD,IAAG,WAAW,SAAS,GAAG;AAC7B,QAAAA,IAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,MAC7C;AAEA,MAAAA,IAAG,cAAc,WAAW,cAAc,SAAS,MAAM;AACzD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE;AAElC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,sBAAsB,KAAK,aAAa,WAAW,YAAY;AAAA,QACvE,UAAU,EAAE,MAAM,WAAW,cAAc,MAAM;AAAA,MACnD;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,IAAI,OAAO;AAAA,QAC5C,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,eAA0B;AAAA,EACrC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,aAAa;AAAA,UACX,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,QAAQ,UAAU,aAAa;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC7C,UAAM,SAAS,OAAO,KAAK,UAAU,EAAE;AACvC,UAAM,cAAc,OAAO,KAAK,eAAe,EAAE;AAEjD,UAAM,aAAa,sBAAsB,SAAS,QAAQ,SAAS;AACnE,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,WAAW,MAAM;AAAA,QAClD,OAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAACA,IAAG,WAAW,WAAW,YAAY,GAAG;AAC3C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,6BAA6B,WAAW,YAAY;AAAA,QAC5D,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,YAAM,WAAWA,IAAG,aAAa,WAAW,cAAc,MAAM;AAChE,YAAM,UAAU,SAAS,SAAS,MAAM;AAExC,UAAI,gBAAgB;AACpB,UAAI,CAAC,SAAS,SAAS,MAAM,GAAG;AAC9B,YAAI,WAAW,CAAC,OAAO,SAAS,MAAM,GAAG;AACvC,gBAAM,aAAa,OAAO,QAAQ,OAAO,MAAM;AAC/C,cAAI,SAAS,SAAS,UAAU,GAAG;AACjC,4BAAgB;AAAA,UAClB;AAAA,QACF,WAAW,CAAC,WAAW,OAAO,SAAS,MAAM,GAAG;AAC9C,gBAAM,WAAW,OAAO,QAAQ,SAAS,IAAI;AAC7C,cAAI,SAAS,SAAS,QAAQ,GAAG;AAC/B,4BAAgB;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,SAAS,aAAa,GAAG;AACrC,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,qCAAqC,WAAW,YAAY;AAAA,UACpE,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,cAAc,SAAS,MAAM,aAAa,EAAE,SAAS;AAC3D,UAAI,cAAc,GAAG;AACnB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,kCAAkC,WAAW,aAAa,WAAW,YAAY;AAAA,UACzF,OAAO;AAAA,QACT;AAAA,MACF;AAEA,YAAM,qBAAqB,WAAW,CAAC,YAAY,SAAS,MAAM,IAC9D,YAAY,QAAQ,OAAO,MAAM,IACjC;AAEJ,YAAM,UAAU,SAAS,QAAQ,eAAe,kBAAkB;AAGlE,YAAM,WAAW,MAAM,QAAQ,gBAAgB;AAAA,QAC7C,MAAM;AAAA,QACN,SAAS,cAAc,WAAW,YAAY;AAAA,QAC9C,SAAS;AAAA,UACP,MAAM,WAAW;AAAA,UACjB,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,MAAM,mBAAmB,WAAW,cAAc,UAAU,OAAO;AAAA,QACrE;AAAA,MACF,CAAC;AAED,UAAI,CAAC,UAAU;AACb,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,kDAAkD,WAAW,YAAY;AAAA,UACjF,OAAO;AAAA,QACT;AAAA,MACF;AAEA,MAAAA,IAAG,cAAc,WAAW,cAAc,SAAS,MAAM;AACzD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,gCAAgC,WAAW,YAAY;AAAA,QAC/D,UAAU,EAAE,MAAM,WAAW,aAAa;AAAA,MAC5C;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,wBAAwB,IAAI,OAAO;AAAA,QAC3C,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ACtUA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,QAAQ;AACf,OAAO,YAAY;AAInB,IAAM,uBAAuB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,mBAAmB,cAAsB;AAChD,QAAM,KAAK,OAAO;AAClB,KAAG,IAAI,oBAAoB;AAE3B,QAAM,gBAAgBC,MAAK,KAAK,cAAc,YAAY;AAC1D,MAAIC,IAAG,WAAW,aAAa,GAAG;AAChC,QAAI;AACF,YAAM,mBAAmBA,IAAG,aAAa,eAAe,MAAM;AAC9D,SAAG,IAAI,gBAAgB;AAAA,IACzB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,oBAA+B;AAAA,EAC1C,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,UAAU,OAAO,KAAK,QAAQ,EAAE,EAAE,KAAK;AAC7C,QAAI,gBAAgBD,MAAK,QAAQ,QAAQ,SAAS;AAClD,QAAI;AACF,UAAIC,IAAG,WAAW,aAAa,EAAG,iBAAgBA,IAAG,aAAa,aAAa;AAAA,IACjF,QAAQ;AAAA,IAER;AAEA,UAAM,aAAa,sBAAsB,WAAW,KAAK,aAAa;AAEtE,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,WAAW,MAAM;AAAA,QAClD,OAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,CAACA,IAAG,WAAW,WAAW,YAAY,GAAG;AAC3C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,wBAAwB,WAAW,gBAAgB,GAAG;AAAA,QAC9D,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC;AACjE,UAAM,KAAK,mBAAmB,aAAa;AAE3C,QAAI;AAGF,UAASC,QAAT,SAAc,YAAoB,cAAsB;AACtD,YAAI,eAAe,SAAU;AAE7B,cAAM,UAAUD,IAAG,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAClE,mBAAW,SAAS,SAAS;AAC3B,gBAAM,WAAWD,MAAK,KAAK,YAAY,MAAM,IAAI;AACjD,gBAAM,iBAAiBA,MAAK,SAAS,eAAe,QAAQ,EAAE,QAAQ,OAAO,GAAG;AAGhF,cAAI,GAAG,QAAQ,cAAc,KAAK,qBAAqB,SAAS,MAAM,IAAI,GAAG;AAC3E;AAAA,UACF;AAEA,gBAAM,SAAS,KAAK,OAAO,eAAe,CAAC;AAC3C,cAAI,MAAM,YAAY,GAAG;AACvB,oBAAQ,KAAK,GAAG,MAAM,aAAM,MAAM,IAAI,GAAG;AACzC,YAAAE,MAAK,UAAU,eAAe,CAAC;AAAA,UACjC,OAAO;AACL,oBAAQ,KAAK,GAAG,MAAM,aAAM,MAAM,IAAI,EAAE;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AArBS,iBAAAA;AAFT,YAAM,UAAoB,CAAC;AAyB3B,MAAAA,MAAK,WAAW,cAAc,CAAC;AAE/B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,QAAQ,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI;AAAA,QAClD,UAAU,EAAE,OAAO,QAAQ,OAAO;AAAA,MACpC;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,4BAA4B,IAAI,OAAO;AAAA,QAC/C,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,iBAA4B;AAAA,EACvC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,aAAa,OAAO,KAAK,WAAW,EAAE,EAAE,KAAK;AACnD,QAAI,CAAC,YAAY;AACf,aAAO,EAAE,SAAS,OAAO,QAAQ,kCAAkC,OAAO,kBAAkB;AAAA,IAC9F;AAEA,QAAI,gBAAgBF,MAAK,QAAQ,QAAQ,SAAS;AAClD,QAAI;AACF,UAAIC,IAAG,WAAW,aAAa,EAAG,iBAAgBA,IAAG,aAAa,aAAa;AAAA,IACjF,QAAQ;AAAA,IAER;AAEA,UAAM,SAAS,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACjD,UAAM,aAAa,SAASD,MAAK,QAAQ,eAAe,MAAM,IAAI;AAElE,UAAM,aAAa,sBAAsBA,MAAK,SAAS,eAAe,UAAU,KAAK,KAAK,aAAa;AACvG,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO,EAAE,SAAS,OAAO,QAAQ,kBAAkB,WAAW,MAAM,IAAI,OAAO,WAAW,OAAO;AAAA,IACnG;AAEA,QAAI;AAEF,YAAM,uBAAuB,WAAW,QAAQ,OAAO,GAAG;AAC1D,YAAM,oBAAoB,WAAW,QAAQ,OAAO,GAAG;AACvD,YAAM,cAAc,kBAAkB,SAAS,GAAG,IAAI,oBAAoB,OAAO,iBAAiB;AAElG,YAAM,UAAU,MAAM,GAAG,aAAa;AAAA,QACpC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,QAAQ,qBAAqB,IAAI,OAAK,MAAM,CAAC,KAAK;AAAA,QAClD,WAAW;AAAA,MACb,CAAC;AAED,YAAM,KAAK,mBAAmB,aAAa;AAC3C,YAAM,WAAW,QAAQ,OAAO,OAAK;AACnC,cAAM,OAAOA,MAAK,KAAK,YAAY,CAAC;AACpC,cAAM,MAAMA,MAAK,SAAS,eAAe,IAAI,EAAE,QAAQ,OAAO,GAAG;AACjE,eAAO,CAAC,GAAG,QAAQ,GAAG;AAAA,MACxB,CAAC;AAED,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,4BAA4B,UAAU,QAAQ,UAAU,WAAW;AAAA,QAC7E;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,SAAS,MAAM,GAAG,GAAG,EAAE,KAAK,IAAI,KAAK,SAAS,SAAS,MAAM;AAAA,UAAa,SAAS,SAAS,GAAG,kBAAkB;AAAA,QACzH,UAAU,EAAE,OAAO,SAAS,OAAO;AAAA,MACrC;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,6BAA6B,IAAI,OAAO;AAAA,QAChD,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,iBAA4B;AAAA,EACvC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,cAAc;AAAA,UACZ,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,QAAQ,OAAO,KAAK,SAAS,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,SAAS,OAAO,QAAQ,gCAAgC,OAAO,gBAAgB;AAAA,IAC1F;AAEA,QAAI,gBAAgBA,MAAK,QAAQ,QAAQ,SAAS;AAClD,QAAI;AACF,UAAIC,IAAG,WAAW,aAAa,EAAG,iBAAgBA,IAAG,aAAa,aAAa;AAAA,IACjF,QAAQ;AAAA,IAER;AAEA,UAAM,cAAc,KAAK,eACrB,OAAO,KAAK,YAAY,EAAE,QAAQ,OAAO,GAAG,IAC5C;AAEJ,QAAI;AACF,YAAM,gBAAgB,cAAc,QAAQ,OAAO,GAAG;AACtD,YAAM,QAAQ,MAAM,GAAG,aAAa;AAAA,QAClC,KAAK;AAAA,QACL,KAAK;AAAA,QACL,QAAQ,qBAAqB,IAAI,OAAK,MAAM,CAAC,KAAK;AAAA,QAClD,WAAW;AAAA,MACb,CAAC;AAED,YAAM,KAAK,mBAAmB,aAAa;AAC3C,YAAM,gBAA0B,CAAC;AACjC,YAAM,QAAQ,IAAI,OAAO,OAAO,GAAG;AAEnC,iBAAW,WAAW,OAAO;AAC3B,cAAM,gBAAgB,QAAQ,QAAQ,OAAO,GAAG;AAChD,YAAI,GAAG,QAAQ,aAAa,EAAG;AAC/B,YAAI,QAAQ,SAAS,MAAM,KAAK,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,OAAO,EAAG;AAE1F,cAAM,WAAWD,MAAK,KAAK,eAAe,OAAO;AACjD,YAAI;AACF,gBAAM,OAAOC,IAAG,SAAS,QAAQ;AACjC,cAAI,KAAK,OAAO,MAAM,KAAM;AAE5B,gBAAM,aAAaA,IAAG,aAAa,UAAU,MAAM;AAEnD,gBAAM,QAAQ,WAAW,QAAQ,SAAS,IAAI,EAAE,MAAM,IAAI;AAE1D,mBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,gBAAI,MAAM,KAAK,MAAM,CAAC,CAAC,GAAG;AACxB,4BAAc,KAAK,GAAG,aAAa,IAAI,IAAI,CAAC,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE;AAClE,kBAAI,cAAc,UAAU,IAAK;AAAA,YACnC;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAEA,YAAI,cAAc,UAAU,IAAK;AAAA,MACnC;AAEA,UAAI,cAAc,WAAW,GAAG;AAC9B,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,6BAA6B,KAAK;AAAA,QAC5C;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,cAAc,KAAK,IAAI,KAAK,cAAc,UAAU,MAAM,8CAA8C;AAAA,QAChH,UAAU,EAAE,YAAY,cAAc,OAAO;AAAA,MAC/C;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,gCAAgC,IAAI,OAAO;AAAA,QACnD,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,kBAA6B;AAAA,EACxC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,SAAS,OAAO,KAAK,aAAa,EAAE,EAAE,KAAK;AACjD,QAAI,gBAAgBD,MAAK,QAAQ,QAAQ,SAAS;AAClD,QAAI;AACF,UAAIC,IAAG,WAAW,aAAa,EAAG,iBAAgBA,IAAG,aAAa,aAAa;AAAA,IACjF,QAAQ;AAAA,IAER;AAEA,UAAM,aAAa,sBAAsB,UAAU,KAAK,aAAa;AAErE,QAAI,CAAC,WAAW,SAAS;AACvB,aAAO,EAAE,SAAS,OAAO,QAAQ,kBAAkB,WAAW,MAAM,IAAI,OAAO,WAAW,OAAO;AAAA,IACnG;AAEA,UAAM,WAAW,KAAK,IAAI,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS,KAAK,CAAC,GAAG,CAAC;AACrE,UAAM,KAAK,mBAAmB,aAAa;AAE3C,QAAI;AAGF,UAASE,aAAT,SAAmB,YAAoB,QAAgB,OAAe;AACpE,YAAI,QAAQ,SAAU;AAEtB,YAAI,UAAuB,CAAC;AAC5B,YAAI;AACF,oBAAUF,IAAG,YAAY,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,QAC9D,QAAQ;AACN;AAAA,QACF;AAEA,cAAM,eAAe,QAAQ,OAAO,OAAK;AACvC,cAAI,qBAAqB,SAAS,EAAE,IAAI,EAAG,QAAO;AAClD,gBAAM,OAAOD,MAAK,KAAK,YAAY,EAAE,IAAI;AACzC,gBAAM,MAAMA,MAAK,SAAS,eAAe,IAAI,EAAE,QAAQ,OAAO,GAAG;AACjE,iBAAO,CAAC,GAAG,QAAQ,GAAG;AAAA,QACxB,CAAC;AAED,qBAAa,KAAK,CAAC,GAAG,MAAM;AAC1B,cAAI,EAAE,YAAY,KAAK,CAAC,EAAE,YAAY,EAAG,QAAO;AAChD,cAAI,CAAC,EAAE,YAAY,KAAK,EAAE,YAAY,EAAG,QAAO;AAChD,iBAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,QACpC,CAAC;AAED,qBAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,gBAAM,SAAS,QAAQ,aAAa,SAAS;AAC7C,gBAAM,UAAU,SAAS,wBAAS;AAClC,gBAAM,WAAWA,MAAK,KAAK,YAAY,MAAM,IAAI;AAEjD,gBAAM,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,IAAI,GAAG,MAAM,YAAY,IAAI,MAAM,EAAE,EAAE;AAE9E,cAAI,MAAM,YAAY,GAAG;AACvB,YAAAG,WAAU,UAAU,UAAU,SAAS,SAAS,cAAS,QAAQ,CAAC;AAAA,UACpE;AAAA,QACF,CAAC;AAAA,MACH;AAlCS,sBAAAA;AAFT,YAAM,QAAkB,CAACH,MAAK,SAAS,WAAW,YAAY,KAAK,GAAG;AAsCtE,MAAAG,WAAU,WAAW,cAAc,IAAI,CAAC;AAExC,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,MAAM,KAAK,IAAI;AAAA,MACzB;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,wBAAwB,IAAI,OAAO;AAAA,QAC3C,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ACrZA,SAAS,YAAY;AAKd,IAAM,iBAA4B;AAAA,EACvC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS;AAAA,UACP,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,UAAU,OAAO,KAAK,WAAW,EAAE,EAAE,KAAK;AAChD,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,SAAS,OAAO,QAAQ,iCAAiC,OAAO,kBAAkB;AAAA,IAC7F;AAGA,UAAM,QAAQ,gBAAgB,OAAO;AACrC,QAAI,CAAC,MAAM,SAAS;AAClB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,sCAAsC,MAAM,MAAM;AAAA,QAC1D,OAAO,MAAM;AAAA,MACf;AAAA,IACF;AAGA,UAAM,WAAW,MAAM,QAAQ,gBAAgB;AAAA,MAC7C,MAAM;AAAA,MACN,SAAS,oBAAoB,OAAO;AAAA,MACpC,SAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAED,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,4DAA4D,OAAO;AAAA,QAC3E,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,IAAI,KAAK,IAAI,KAAM,OAAO,KAAK,UAAU,KAAK,GAAK,GAAG,IAAM;AACjF,UAAM,YAAY,KAAK,IAAI;AAE3B,WAAO,IAAI,QAAQ,aAAW;AAC5B;AAAA,QACE;AAAA,QACA;AAAA,UACE,KAAK,QAAQ;AAAA,UACb;AAAA,UACA,WAAW,IAAI,OAAO;AAAA,UACtB,aAAa;AAAA,UACb,KAAK;AAAA,YACH,GAAG,QAAQ;AAAA,YACX,IAAI;AAAA,UACN;AAAA,QACF;AAAA,QACA,CAAC,OAAO,QAAQ,WAAW;AACzB,gBAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,gBAAM,WAAW,SAAS,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,QAAQ,IAAI;AAEpF,cAAI,YAAY;AAChB,cAAI,OAAQ,cAAa;AACzB,cAAI,QAAQ;AACV,gBAAI,UAAW,cAAa;AAC5B,yBAAa;AAAA,UACf;AAEA,cAAI,CAAC,WAAW;AACd,wBAAY;AAAA,UACd;AAGA,gBAAM,aAAa,UAAU,QAAQ,SAAS,IAAI;AAGlD,gBAAM,cAAc,gBAAgB,WAAW,KAAK,CAAC;AAErD,gBAAM,kBAAkB;AAAA,YACtB,YAAY,OAAO;AAAA,YACnB,cAAc,QAAQ;AAAA,YACtB,aAAa,QAAQ;AAAA,YACrB;AAAA,YACA;AAAA,UACF,EAAE,KAAK,IAAI;AAEX,kBAAQ;AAAA,YACN,SAAS,aAAa;AAAA,YACtB,QAAQ;AAAA,YACR,OAAO,QAAQ,MAAM,UAAU;AAAA,YAC/B,UAAU,EAAE,UAAU,SAAS;AAAA,UACjC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACjHA,SAAS,QAAAC,aAAY;AAGd,IAAM,gBAA2B;AAAA,EACtC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,OAAO,SAAS;AAC5B,WAAO,IAAI,QAAQ,aAAW;AAC5B,MAAAA,MAAK,+BAA+B,EAAE,KAAK,QAAQ,WAAW,SAAS,IAAM,GAAG,CAAC,OAAO,QAAQ,WAAW;AACzG,YAAI,OAAO;AACT,iBAAO,QAAQ;AAAA,YACb,SAAS;AAAA,YACT,QAAQ,OAAO,SAAS,sBAAsB,IAC1C,uCACA,qBAAqB,MAAM,OAAO;AAAA,YACtC,OAAO,MAAM;AAAA,UACf,CAAC;AAAA,QACH;AAEA,cAAM,MAAM,OAAO,KAAK,KAAK;AAC7B,gBAAQ;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;AAEO,IAAM,cAAyB;AAAA,EACpC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM,SAAS;AAC3B,UAAM,MAAM,KAAK,SAAS,sBAAsB;AAEhD,WAAO,IAAI,QAAQ,aAAW;AAC5B,MAAAA,MAAK,KAAK,EAAE,KAAK,QAAQ,WAAW,SAAS,MAAO,WAAW,IAAI,OAAO,KAAK,GAAG,CAAC,OAAO,QAAQ,WAAW;AAC3G,YAAI,OAAO;AACT,iBAAO,QAAQ;AAAA,YACb,SAAS;AAAA,YACT,QAAQ,mBAAmB,MAAM,OAAO;AAAA,YACxC,OAAO,MAAM;AAAA,UACf,CAAC;AAAA,QACH;AAEA,cAAM,MAAM,OAAO,KAAK;AACxB,YAAI,CAAC,KAAK;AACR,iBAAO,QAAQ;AAAA,YACb,SAAS;AAAA,YACT,QAAQ,KAAK,SAAS,uBAAuB;AAAA,UAC/C,CAAC;AAAA,QACH;AAGA,cAAM,YAAY,IAAI,SAAS,MAAQ,IAAI,MAAM,GAAG,GAAK,IAAI,wCAAwC;AAErG,gBAAQ;AAAA,UACN,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AChFO,IAAM,gBAA2B;AAAA,EACtC,YAAY;AAAA,IACV,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO;AAAA,UACL,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,OAAO;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,MAAM;AAClB,UAAM,QAAQ,OAAO,KAAK,SAAS,EAAE,EAAE,KAAK;AAC5C,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,SAAS,OAAO,QAAQ,2BAA2B,OAAO,gBAAgB;AAAA,IACrF;AAEA,QAAI;AAEF,YAAM,MAAM,uCAAuC,mBAAmB,KAAK,CAAC;AAC5E,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,GAAI;AAEvD,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,SAAS;AAAA,UACP,cAAc;AAAA,QAChB;AAAA,QACA,QAAQ,WAAW;AAAA,MACrB,CAAC;AAED,mBAAa,KAAK;AAElB,UAAI,CAAC,IAAI,IAAI;AACX,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,eAAe,KAAK,2BAA2B,IAAI,MAAM;AAAA,QACnE;AAAA,MACF;AAEA,YAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,YAAM,WAAqB,CAAC;AAC5B,YAAM,QAAQ;AACd,UAAI;AAEJ,cAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,QAAQ,SAAS,SAAS,GAAG;AACjE,cAAM,OAAO,MAAM,CAAC,EAAE,QAAQ,YAAY,EAAE,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACxE,YAAI,MAAM;AACR,mBAAS,KAAK,KAAK,IAAI,EAAE;AAAA,QAC3B;AAAA,MACF;AAEA,UAAI,SAAS,WAAW,GAAG;AACzB,eAAO;AAAA,UACL,SAAS;AAAA,UACT,QAAQ,4BAA4B,KAAK;AAAA,QAC3C;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,uBAAuB,KAAK;AAAA;AAAA,EAAS,SAAS,KAAK,MAAM,CAAC;AAAA,QAClE,UAAU,EAAE,aAAa,SAAS,OAAO;AAAA,MAC3C;AAAA,IACF,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,gDAAgD,IAAI,OAAO;AAAA,QACnE,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;ACvEO,IAAM,eAAN,MAAmB;AAAA,EAChB,QAAgC,oBAAI,IAAI;AAAA,EAEhD,cAAc;AACZ,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEQ,mBAAyB;AAC/B,UAAM,WAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,QAAQ,UAAU;AAC3B,WAAK,MAAM,IAAI,KAAK,WAAW,MAAM,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAEO,aAAa,MAAuB;AACzC,SAAK,MAAM,IAAI,KAAK,WAAW,MAAM,IAAI;AAAA,EAC3C;AAAA,EAEO,cAAc,OAA0B;AAC7C,eAAW,QAAQ,OAAO;AACxB,WAAK,MAAM,IAAI,KAAK,WAAW,MAAM,IAAI;AAAA,IAC3C;AAAA,EACF;AAAA,EAEO,QAAQ,MAAqC;AAClD,WAAO,KAAK,MAAM,IAAI,IAAI;AAAA,EAC5B;AAAA,EAEO,eAAe,WAAW,OAAyB;AACxD,UAAM,OAAyB,CAAC;AAEhC,eAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,UAAI,YAAY,CAAC,KAAK,WAAW,UAAU;AAEzC;AAAA,MACF;AACA,WAAK,KAAK,KAAK,UAAU;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,YACX,MACA,MACA,SAC8B;AAC9B,UAAM,OAAO,KAAK,MAAM,IAAI,IAAI;AAEhC,QAAI,CAAC,MAAM;AACT,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,wBAAwB,IAAI,uBAAuB,MAAM,KAAK,KAAK,MAAM,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACnG,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,QAAQ,YAAY,CAAC,KAAK,WAAW,UAAU;AACjD,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,4CAA4C,IAAI;AAAA,QACxD,OAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI;AACF,aAAO,MAAM,KAAK,QAAQ,MAAM,OAAO;AAAA,IACzC,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,yBAAyB,IAAI,MAAM,IAAI,OAAO;AAAA,QACtD,OAAO,IAAI;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;AChGA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAIV,SAAS,mBAA2B;AACzC,SAAOC,MAAK,KAAK,kBAAkB,GAAG,UAAU;AAClD;AAEO,SAAS,gBAAiD;AAC/D,QAAM,WAAW,iBAAiB;AAClC,MAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,MAAMA,IAAG,aAAa,UAAU,MAAM;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,UAAU,OAAO,WAAW,UAAU;AACxC,aAAQ,OAAO,cAAc;AAAA,IAC/B;AACA,WAAO,CAAC;AAAA,EACV,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,cAAc,SAAgD;AAC5E,QAAM,WAAW,iBAAiB;AAClC,QAAM,OAAO,EAAE,YAAY,QAAQ;AACnC,MAAI;AACF,IAAAA,IAAG,cAAc,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,EAAE,UAAU,OAAO,CAAC;AAAA,EAChF,SAAS,KAAU;AACjB,YAAQ,MAAM,uCAAuC,IAAI,OAAO,EAAE;AAAA,EACpE;AACF;AAEO,SAAS,aAAa,MAAc,QAA+B;AACxE,QAAM,UAAU,cAAc;AAC9B,UAAQ,IAAI,IAAI;AAChB,gBAAc,OAAO;AACvB;AAEO,SAAS,gBAAgB,MAAuB;AACrD,QAAM,UAAU,cAAc;AAC9B,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO,QAAQ,IAAI;AACnB,kBAAc,OAAO;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAc,UAA4B;AACxE,QAAM,UAAU,cAAc;AAC9B,MAAI,QAAQ,IAAI,GAAG;AACjB,YAAQ,IAAI,EAAE,WAAW;AACzB,kBAAc,OAAO;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC7DA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AAY9B,IAAM,aAAN,MAAiB;AAAA,EACd,cAAgD,oBAAI,IAAI;AAAA,EAEhE,MAAa,aAAmC;AAC9C,UAAM,UAAU,cAAc;AAC9B,UAAM,WAAwB,CAAC;AAE/B,eAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC1D,UAAI,OAAO,UAAU;AACnB;AAAA,MACF;AAEA,UAAI;AACF,cAAM,QAAQ,MAAM,KAAK,cAAc,YAAY,MAAM;AACzD,iBAAS,KAAK,GAAG,KAAK;AAAA,MACxB,SAAS,KAAU;AACjB,gBAAQ,MAAM,0CAA0C,UAAU,MAAM,IAAI,OAAO,EAAE;AAAA,MACvF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,cAAc,YAAoB,QAA+C;AAC5F,QAAI,KAAK,YAAY,IAAI,UAAU,GAAG;AACpC,YAAM,KAAK,iBAAiB,UAAU;AAAA,IACxC;AAEA,UAAM,UAAkC,CAAC;AACzC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,QAAQ,GAAG,GAAG;AAChD,UAAI,OAAO,MAAM,SAAU,SAAQ,CAAC,IAAI;AAAA,IAC1C;AACA,QAAI,OAAO,KAAK;AACd,aAAO,OAAO,SAAS,OAAO,GAAG;AAAA,IACnC;AAEA,UAAM,YAAY,IAAI,qBAAqB;AAAA,MACzC,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO,QAAQ,CAAC;AAAA,MACtB,KAAK;AAAA,IACP,CAAC;AAED,UAAM,SAAS,IAAI;AAAA,MACjB;AAAA,QACE,MAAM,gBAAgB,UAAU;AAAA,QAChC,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,cAAc,CAAC;AAAA,MACjB;AAAA,IACF;AAEA,UAAM,OAAO,QAAQ,SAAS;AAE9B,UAAM,gBAAgB,MAAM,OAAO,UAAU;AAC7C,UAAM,cAA2B,CAAC;AAElC,eAAW,WAAW,cAAc,OAAO;AACzC,YAAM,WAAW,QAAQ,UAAU,KAAK,QAAQ,IAAI,GAAG,QAAQ,kBAAkB,GAAG;AAGpF,YAAM,aAAkC,CAAC;AACzC,YAAM,WAAqB,CAAC;AAE5B,UAAI,QAAQ,eAAe,OAAO,QAAQ,gBAAgB,UAAU;AAClE,cAAM,SAAS,QAAQ;AACvB,YAAI,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU;AAC9D,qBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAa,OAAO,UAAU,GAAG;AAC3D,uBAAW,CAAC,IAAI;AAAA,cACd,MAAM,EAAE,QAAQ;AAAA,cAChB,aAAa,EAAE,eAAe;AAAA,YAChC;AAAA,UACF;AAAA,QACF;AACA,YAAI,MAAM,QAAQ,OAAO,QAAQ,GAAG;AAClC,mBAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,aAA6B;AAAA,QACjC,MAAM;AAAA,QACN,aAAa,gBAAgB,UAAU,KAAK,QAAQ,eAAe,QAAQ,IAAI;AAAA,QAC/E,UAAU;AAAA,QACV,YAAY;AAAA,UACV,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YAAuB;AAAA,QAC3B;AAAA,QACA,MAAM,QAAQ,MAAM,SAAS;AAE3B,gBAAM,WAAW,MAAM,QAAQ,gBAAgB;AAAA,YAC7C,MAAM;AAAA,YACN,SAAS,gBAAgB,UAAU,IAAI,QAAQ,IAAI;AAAA,YACnD,SAAS;AAAA,cACP,SAAS,OAAO,UAAU,IAAI,QAAQ,IAAI,IAAI,KAAK,UAAU,IAAI,CAAC;AAAA,YACpE;AAAA,UACF,CAAC;AAED,cAAI,CAAC,UAAU;AACb,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ,yCAAyC,UAAU,IAAI,QAAQ,IAAI;AAAA,cAC3E,OAAO;AAAA,YACT;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,SAAS,MAAM,OAAO,SAAS;AAAA,cACnC,MAAM,QAAQ;AAAA,cACd,WAAW;AAAA,YACb,CAAC;AAED,gBAAI,aAAa;AACjB,gBAAI,MAAM,QAAQ,OAAO,OAAO,GAAG;AACjC,yBAAW,QAAQ,OAAO,SAAS;AACjC,oBAAI,KAAK,SAAS,QAAQ;AACxB,gCAAc,KAAK,OAAO;AAAA,gBAC5B,OAAO;AACL,gCAAc,KAAK,UAAU,IAAI,IAAI;AAAA,gBACvC;AAAA,cACF;AAAA,YACF,OAAO;AACL,2BAAa,KAAK,UAAU,OAAO,OAAO;AAAA,YAC5C;AAEA,mBAAO;AAAA,cACL,SAAS,CAAC,OAAO;AAAA,cACjB,QAAQ,WAAW,KAAK;AAAA,cACxB,OAAO,OAAO,UAAU,aAAa;AAAA,YACvC;AAAA,UACF,SAAS,KAAU;AACjB,mBAAO;AAAA,cACL,SAAS;AAAA,cACT,QAAQ,wBAAwB,IAAI,OAAO;AAAA,cAC3C,OAAO,IAAI;AAAA,YACb;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,kBAAY,KAAK,SAAS;AAAA,IAC5B;AAEA,SAAK,YAAY,IAAI,YAAY;AAAA,MAC/B,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,iBAAiB,YAAmC;AAC/D,UAAM,OAAO,KAAK,YAAY,IAAI,UAAU;AAC5C,QAAI,MAAM;AACR,UAAI;AACF,cAAM,KAAK,OAAO,MAAM;AAAA,MAC1B,QAAQ;AAAA,MAER;AACA,WAAK,YAAY,OAAO,UAAU;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,MAAa,WAA0B;AACrC,eAAW,CAAC,UAAU,KAAK,KAAK,aAAa;AAC3C,YAAM,KAAK,iBAAiB,UAAU;AAAA,IACxC;AAAA,EACF;AACF;;;AC3LA,OAAO,cAAc;AACrB,OAAOC,SAAQ;AAIR,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EACA;AAAA,EAER,YAAY,SAAiD;AAC3D,SAAK,OAAO,QAAQ,QAAQ,IAAI;AAChC,SAAK,WAAW,QAAQ,QAAQ,QAAQ;AAAA,EAC1C;AAAA,EAEO,SAAkB;AACvB,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,QAAQ,KAAoB;AACjC,SAAK,OAAO;AAAA,EACd;AAAA,EAEO,aAAsB;AAC3B,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,gBAAgB,KAAwC;AAEnE,QAAI,KAAK,UAAU;AACjB,cAAQ,IAAIC,IAAG,OAAO;AAAA,+CAAkD,IAAI,OAAO,EAAE,CAAC;AACtF,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,MAAM;AACb,cAAQ,IAAIA,IAAG,IAAI,gCAA2B,IAAI,OAAO,EAAE,CAAC;AAC5D,aAAO;AAAA,IACT;AAGA,YAAQ,IAAI,OAAOA,IAAG,KAAKA,IAAG,OAAO,4NAA4D,CAAC,CAAC;AACnG,YAAQ,IAAIA,IAAG,KAAK,UAAU,IAAI,IAAI,OAAO;AAE7C,QAAI,IAAI,SAAS,eAAe,IAAI,SAAS,WAAW,UAAa,IAAI,SAAS,UAAU,QAAW;AACrG,YAAM,aAAa,IAAI,QAAQ,QAAQ;AAAA,QACrC,IAAI,QAAQ,QAAQ;AAAA,QACpB,IAAI,QAAQ;AAAA,QACZ,IAAI,QAAQ;AAAA,MACd;AACA,cAAQ,IAAI,OAAO,aAAa,IAAI;AAAA,IACtC,WAAW,IAAI,SAAS,gBAAgB,IAAI,SAAS,UAAU,QAAW;AACxE,YAAM,UAAU,qBAAqB,IAAI,QAAQ,QAAQ,QAAQ,IAAI,QAAQ,KAAK;AAClF,cAAQ,IAAI,OAAO,UAAU,IAAI;AAAA,IACnC,WAAW,IAAI,SAAS,aAAa,IAAI,SAAS,SAAS;AACzD,cAAQ,IAAIA,IAAG,KAAK,KAAKA,IAAG,KAAK,IAAI,QAAQ,OAAO,CAAC;AAAA,CAAI,CAAC;AAAA,IAC5D;AAGA,UAAM,SAAS,MAAM,KAAK;AAAA,MACxBA,IAAG,KAAKA,IAAG,OAAO,sBAAsB,CAAC,IAAI;AAAA,IAC/C;AAEA,UAAM,QAAQ,OAAO,KAAK,EAAE,YAAY;AAExC,QAAI,UAAU,OAAO,UAAU,SAAS,UAAU,QAAQ;AACxD,WAAK,OAAO;AACZ,cAAQ,IAAIA,IAAG,OAAO,sDAAiD,CAAC;AACxE,aAAO;AAAA,IACT;AAEA,QAAI,UAAU,OAAO,UAAU,OAAO;AACpC,cAAQ,IAAIA,IAAG,MAAM,oBAAe,CAAC;AACrC,aAAO;AAAA,IACT;AAEA,YAAQ,IAAIA,IAAG,IAAI,0BAAqB,CAAC;AACzC,WAAO;AAAA,EACT;AAAA,EAEQ,WAAW,UAAmC;AACpD,QAAI,CAAC,QAAQ,MAAM,OAAO;AAExB,aAAO,QAAQ,QAAQ,IAAI;AAAA,IAC7B;AAEA,UAAM,KAAK,SAAS,gBAAgB;AAAA,MAClC,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAED,WAAO,IAAI,QAAQ,aAAW;AAC5B,SAAG,SAAS,UAAU,YAAU;AAC9B,WAAG,MAAM;AACT,gBAAQ,MAAM;AAAA,MAChB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;ACjGA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAEjB,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAQO,SAAS,wBAAwB,cAA2C;AACjF,aAAW,YAAY,mBAAmB;AACxC,UAAM,WAAWA,MAAK,KAAK,cAAc,QAAQ;AACjD,QAAID,IAAG,WAAW,QAAQ,GAAG;AAC3B,UAAI;AACF,cAAM,OAAOA,IAAG,SAAS,QAAQ;AACjC,YAAI,KAAK,OAAO,KAAK,KAAK,QAAQ,MAAM,MAAM;AAC5C,gBAAM,UAAUA,IAAG,aAAa,UAAU,MAAM,EAAE,KAAK;AACvD,cAAI,QAAQ,SAAS,GAAG;AACtB,mBAAO;AAAA,cACL,OAAO;AAAA,cACP;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM;AACxB;;;ACzCA,OAAOE,SAAQ;AACf,OAAOC,WAAU;AACjB,OAAOC,aAAY;AAKZ,SAAS,iBAAyB;AACvC,QAAM,MAAMC,MAAK,KAAK,kBAAkB,GAAG,UAAU;AACrD,MAAI,CAACC,IAAG,WAAW,GAAG,GAAG;AACvB,QAAI;AACF,MAAAA,IAAG,UAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACvC,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,oBAA4B;AAC1C,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,UAAU,EAAE,EAAE,MAAM,GAAG,EAAE;AAC5E,QAAM,OAAOC,QAAO,YAAY,CAAC,EAAE,SAAS,KAAK;AACjD,SAAO,WAAW,SAAS,IAAI,IAAI;AACrC;AAEO,SAAS,iBAAiB,WAAmB,OAAe,cAAqC;AACtG,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,SAAO;AAAA,IACL,IAAI,kBAAkB;AAAA,IACtB,OAAO,gBAAgB,cAAcF,MAAK,SAAS,SAAS,KAAK,WAAW;AAAA,IAC5E,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAWA,MAAK,QAAQ,SAAS;AAAA,IACjC;AAAA,IACA,OAAO,CAAC;AAAA,IACR,YAAY;AAAA,MACV,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,YAAY,SAA6B;AACvD,QAAM,cAAc,eAAe;AACnC,QAAM,WAAWA,MAAK,KAAK,aAAa,GAAG,QAAQ,EAAE,OAAO;AAE5D,UAAQ,aAAY,oBAAI,KAAK,GAAE,YAAY;AAG3C,QAAM,aAAa,KAAK,UAAU,SAAS,CAAC,MAAM,QAAQ;AACxD,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO,gBAAgB,GAAG;AAAA,IAC5B;AACA,WAAO;AAAA,EACT,GAAG,CAAC;AAEJ,MAAI;AACF,IAAAC,IAAG,cAAc,UAAU,YAAY,EAAE,UAAU,OAAO,CAAC;AAAA,EAC7D,SAAS,KAAU;AACjB,YAAQ,MAAM,sCAAsC,QAAQ,KAAK,IAAI,OAAO,EAAE;AAAA,EAChF;AACF;AAEO,SAAS,YAAY,WAAwC;AAClE,QAAM,cAAc,eAAe;AACnC,QAAM,eAAe,UAAU,SAAS,OAAO,IAAI,YAAY,GAAG,SAAS;AAC3E,QAAM,WAAWD,MAAK,KAAK,aAAa,YAAY;AAEpD,MAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAE5B,QAAI,CAACA,IAAG,WAAW,WAAW,EAAG,QAAO;AACxC,UAAM,QAAQA,IAAG,YAAY,WAAW,EAAE,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC;AACzE,UAAM,QAAQ,MAAM,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC;AACrD,QAAI,OAAO;AACT,UAAI;AACF,cAAM,MAAMA,IAAG,aAAaD,MAAK,KAAK,aAAa,KAAK,GAAG,MAAM;AACjE,eAAO,KAAK,MAAM,GAAG;AAAA,MACvB,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAMC,IAAG,aAAa,UAAU,MAAM;AAC5C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAOb;AACD,QAAM,cAAc,eAAe;AACnC,MAAI,CAACA,IAAG,WAAW,WAAW,EAAG,QAAO,CAAC;AAEzC,QAAM,QAAQA,IAAG,YAAY,WAAW,EAAE,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC;AACzE,QAAM,WAOD,CAAC;AAEN,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,MAAMA,IAAG,aAAaD,MAAK,KAAK,aAAa,IAAI,GAAG,MAAM;AAChE,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,eAAS,KAAK;AAAA,QACZ,IAAI,KAAK;AAAA,QACT,OAAO,KAAK,SAAS;AAAA,QACrB,WAAW,KAAK,aAAa,KAAK;AAAA,QAClC,WAAW,KAAK,OAAO,UAAU;AAAA,QACjC,WAAW,KAAK,aAAa;AAAA,QAC7B,OAAO,KAAK,SAAS;AAAA,MACvB,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,SAAS,KAAK,CAAC,GAAG,MAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC;AAClG;AAEO,SAAS,cAAc,WAA4B;AACxD,QAAM,cAAc,eAAe;AACnC,QAAM,eAAe,UAAU,SAAS,OAAO,IAAI,YAAY,GAAG,SAAS;AAC3E,QAAM,WAAWA,MAAK,KAAK,aAAa,YAAY;AAEpD,MAAIC,IAAG,WAAW,QAAQ,GAAG;AAC3B,IAAAA,IAAG,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AAGA,MAAI,CAACA,IAAG,WAAW,WAAW,EAAG,QAAO;AACxC,QAAM,QAAQA,IAAG,YAAY,WAAW,EAAE,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC;AACzE,QAAM,QAAQ,MAAM,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC;AACrD,MAAI,OAAO;AACT,IAAAA,IAAG,WAAWD,MAAK,KAAK,aAAa,KAAK,CAAC;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,sBAAsB,SAA+B;AACnE,QAAM,QAAkB;AAAA,IACtB,2BAA2B,QAAQ,KAAK;AAAA,IACxC,qBAAqB,QAAQ,EAAE;AAAA,IAC/B,gBAAgB,QAAQ,KAAK;AAAA,IAC7B,oBAAoB,QAAQ,SAAS;AAAA,IACrC,gBAAgB,QAAQ,SAAS;AAAA,IACjC,gBAAgB,QAAQ,SAAS;AAAA,IACjC,qBAAqB,QAAQ,WAAW,WAAW;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,QAAQ,QAAQ,OAAO;AAChC,UAAM,cAAc,KAAK,SAAS,SAAS,uBAAgB,KAAK,SAAS,UAAU,+BAAwB;AAC3G,UAAM,KAAK,WAAW;AACtB,UAAM,KAAK,IAAI,KAAK,SAAS,GAAG;AAChC,UAAM,KAAK,EAAE;AAEb,QAAI,KAAK,MAAM;AACb,YAAM,KAAK,KAAK,IAAI;AACpB,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,YAAM,KAAK,iBAAiB;AAC5B,iBAAW,QAAQ,KAAK,WAAW;AACjC,cAAM,KAAK,OAAO,KAAK,IAAI,SAAS,KAAK,UAAU,KAAK,IAAI,CAAC,IAAI;AAAA,MACnE;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,QAAI,KAAK,eAAe,KAAK,YAAY,SAAS,GAAG;AACnD,YAAM,KAAK,mBAAmB;AAC9B,iBAAW,OAAO,KAAK,aAAa;AAClC,cAAM,UAAU,OAAO,IAAI,WAAW,WAAW,IAAI,OAAO,MAAM,GAAG,GAAG,IAAI,KAAK,UAAU,IAAI,MAAM,EAAE,MAAM,GAAG,GAAG;AACnH,cAAM,KAAK,OAAO,IAAI,IAAI,OAAO,OAAO,KAAK;AAAA,MAC/C;AACA,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,UAAM,KAAK,KAAK;AAChB,UAAM,KAAK,EAAE;AAAA,EACf;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACzMO,SAAS,cAAc,OAA2B,YAAY,IAAa;AAChF,SAAO,MAAM,SAAS;AACxB;AAEO,SAAS,aACd,OACA,oBAAoB,IACA;AACpB,MAAI,MAAM,UAAU,oBAAoB,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,MAAM,GAAG,MAAM,SAAS,iBAAiB;AACjE,QAAM,SAAS,MAAM,MAAM,MAAM,SAAS,iBAAiB;AAG3D,QAAM,gBAA0B,CAAC;AAEjC,aAAW,QAAQ,WAAW;AAC5B,QAAI,KAAK,SAAS,UAAU,KAAK,MAAM;AACrC,oBAAc,KAAK,kBAAkB,KAAK,KAAK,MAAM,GAAG,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC,GAAG;AAAA,IACrF,WAAW,KAAK,SAAS,SAAS;AAChC,UAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAC/C,cAAM,YAAY,KAAK,UAAU,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AAC3D,sBAAc,KAAK,2BAA2B,SAAS,EAAE;AAAA,MAC3D;AACA,UAAI,KAAK,MAAM;AACb,sBAAc,KAAK,uBAAuB,KAAK,KAAK,MAAM,GAAG,GAAG,EAAE,QAAQ,OAAO,GAAG,CAAC,MAAM;AAAA,MAC7F;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAkC;AAAA,IACtC,MAAM;AAAA,IACN,MAAM,oDAAoD,UAAU,MAAM;AAAA,EAAc,cAAc,KAAK,IAAI,CAAC;AAAA,IAChH,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,QAAM,UAA4B;AAAA,IAChC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,SAAO,CAAC,eAAe,SAAS,GAAG,MAAM;AAC3C;;;AC/CA,OAAOG,SAAQ;AACf,OAAOC,YAAU;AACjB,SAAS,gBAAgB;AAIlB,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EAER,cAAc;AACZ,SAAK,gBAAgBC,OAAK,KAAK,kBAAkB,GAAG,QAAQ;AAC5D,QAAI,CAACC,IAAG,WAAW,KAAK,aAAa,GAAG;AACtC,UAAI;AACF,QAAAA,IAAG,UAAU,KAAK,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,MACtD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEO,mBAA2B;AAChC,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,qBAAqB,WAA6B;AACvD,WAAO;AAAA,MACLD,OAAK,KAAK,WAAW,gBAAgB,QAAQ;AAAA,MAC7CA,OAAK,KAAK,WAAW,YAAY,QAAQ;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,YAAY,QAAQ,IAAI,GAAY;AACpD,UAAM,YAAgC,oBAAI,IAAI;AAC9C,UAAM,SAAS,WAAW;AAC1B,UAAM,mBAAmB,IAAI,IAAI,OAAO,gBAAgB,CAAC,CAAC;AAG1D,SAAK,uBAAuB,KAAK,eAAe,QAAQ,WAAW,gBAAgB;AAGnF,UAAM,cAAc,KAAK,qBAAqB,SAAS;AACvD,eAAW,QAAQ,aAAa;AAC9B,UAAIC,IAAG,WAAW,IAAI,GAAG;AACvB,aAAK,uBAAuB,MAAM,WAAW,WAAW,gBAAgB;AAAA,MAC1E;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EACnF;AAAA,EAEQ,uBACN,SACA,QACA,KACA,kBACM;AACN,QAAI,CAACA,IAAG,WAAW,OAAO,EAAG;AAE7B,QAAI;AACF,YAAM,UAAUA,IAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAE/D,iBAAW,SAAS,SAAS;AAC3B,YAAI,CAAC,MAAM,YAAY,EAAG;AAE1B,cAAM,cAAcD,OAAK,KAAK,SAAS,MAAM,IAAI;AACjD,cAAM,cAAcA,OAAK,KAAK,aAAa,UAAU;AAErD,YAAIC,IAAG,WAAW,WAAW,GAAG;AAC9B,cAAI;AACF,kBAAM,MAAMA,IAAG,aAAa,aAAa,MAAM;AAC/C,kBAAM,EAAE,MAAM,aAAa,QAAQ,IAAI,KAAK,aAAa,KAAK,MAAM,IAAI;AAGxE,kBAAM,aAAuB,CAAC;AAC9B,kBAAM,UAAUD,OAAK,KAAK,aAAa,YAAY;AACnD,gBAAIC,IAAG,WAAW,OAAO,GAAG;AAC1B,kBAAI;AACF,sBAAM,WAAWA,IAAG,YAAY,OAAO,EAAE,OAAO,OAAK,EAAE,SAAS,KAAK,KAAK,EAAE,SAAS,MAAM,CAAC;AAC5F,2BAAW,MAAM,UAAU;AACzB,6BAAW,KAAKD,OAAK,KAAK,SAAS,EAAE,CAAC;AAAA,gBACxC;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF;AAEA,kBAAM,qBAAqB,iBAAiB,IAAI,IAAI;AAEpD,gBAAI,IAAI,MAAM;AAAA,cACZ;AAAA,cACA;AAAA,cACA,MAAM;AAAA,cACN;AAAA,cACA,SAAS;AAAA,cACT;AAAA,cACA;AAAA,YACF,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEO,aAAa,YAAoB,aAA6E;AACnH,QAAI,OAAO;AACX,QAAI,cAAc;AAClB,QAAI,UAAU,WAAW,KAAK;AAG9B,QAAI,WAAW,WAAW,KAAK,GAAG;AAChC,YAAM,SAAS,WAAW,QAAQ,OAAO,CAAC;AAC1C,UAAI,WAAW,IAAI;AACjB,cAAM,cAAc,WAAW,MAAM,GAAG,MAAM,EAAE,KAAK;AACrD,kBAAU,WAAW,MAAM,SAAS,CAAC,EAAE,KAAK;AAE5C,cAAM,QAAQ,YAAY,MAAM,IAAI;AACpC,mBAAW,QAAQ,OAAO;AACxB,gBAAM,WAAW,KAAK,QAAQ,GAAG;AACjC,cAAI,aAAa,IAAI;AACnB,kBAAM,MAAM,KAAK,MAAM,GAAG,QAAQ,EAAE,KAAK,EAAE,YAAY;AACvD,kBAAM,MAAM,KAAK,MAAM,WAAW,CAAC,EAAE,KAAK,EAAE,QAAQ,gBAAgB,EAAE;AACtE,gBAAI,QAAQ,UAAU,IAAK,QAAO;AAClC,gBAAI,QAAQ,iBAAiB,IAAK,eAAc;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAEhB,YAAM,YAAY,QAAQ,MAAM,IAAI,EAAE,KAAK,OAAK,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAC9E,oBAAc,YAAY,UAAU,MAAM,GAAG,GAAG,IAAI;AAAA,IACtD;AAEA,WAAO,EAAE,MAAM,aAAa,QAAQ;AAAA,EACtC;AAAA,EAEO,SAAS,MAAc,YAAY,QAAQ,IAAI,GAAiB;AACrE,UAAM,MAAM,KAAK,WAAW,SAAS;AACrC,WAAO,IAAI,KAAK,OAAK,EAAE,KAAK,YAAY,MAAM,KAAK,YAAY,CAAC,KAAK;AAAA,EACvE;AAAA,EAEO,YAAY,MAAuB;AACxC,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,IAAI,OAAO,gBAAgB,CAAC,CAAC;AAChD,WAAO,IAAI,IAAI;AACf,WAAO,eAAe,MAAM,KAAK,MAAM;AACvC,eAAW,MAAM;AACjB,WAAO;AAAA,EACT;AAAA,EAEO,aAAa,MAAuB;AACzC,UAAM,SAAS,WAAW;AAC1B,UAAM,SAAS,IAAI,IAAI,OAAO,gBAAgB,CAAC,CAAC;AAChD,UAAM,UAAU,OAAO,OAAO,IAAI;AAClC,WAAO,eAAe,MAAM,KAAK,MAAM;AACvC,eAAW,MAAM;AACjB,WAAO;AAAA,EACT;AAAA,EAEO,iBAAiB,YAA8E;AACpG,UAAM,WAAWA,OAAK,QAAQ,UAAU;AACxC,QAAI,CAACC,IAAG,WAAW,QAAQ,GAAG;AAC5B,aAAO,EAAE,SAAS,OAAO,OAAO,wBAAwB,UAAU,GAAG;AAAA,IACvE;AAEA,UAAM,OAAOA,IAAG,SAAS,QAAQ;AACjC,QAAI,iBAAiB;AACrB,QAAI,YAAY;AAEhB,QAAI,KAAK,YAAY,GAAG;AACtB,YAAM,UAAUD,OAAK,KAAK,UAAU,UAAU;AAC9C,UAAI,CAACC,IAAG,WAAW,OAAO,GAAG;AAC3B,eAAO,EAAE,SAAS,OAAO,OAAO,mCAAmC,UAAU,GAAG;AAAA,MAClF;AACA,YAAM,MAAMA,IAAG,aAAa,SAAS,MAAM;AAC3C,YAAM,SAAS,KAAK,aAAa,KAAKD,OAAK,SAAS,QAAQ,CAAC;AAC7D,kBAAY,OAAO;AACnB,uBAAiBA,OAAK,KAAK,KAAK,eAAe,SAAS;AAGxD,MAAAC,IAAG,OAAO,UAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,IACzD,WAAW,KAAK,OAAO,KAAKD,OAAK,SAAS,QAAQ,EAAE,YAAY,EAAE,SAAS,KAAK,GAAG;AACjF,YAAM,MAAMC,IAAG,aAAa,UAAU,MAAM;AAC5C,kBAAYD,OAAK,SAAS,UAAUA,OAAK,QAAQ,QAAQ,CAAC;AAC1D,YAAM,SAAS,KAAK,aAAa,KAAK,SAAS;AAC/C,kBAAY,OAAO;AACnB,uBAAiBA,OAAK,KAAK,KAAK,eAAe,SAAS;AAExD,UAAI,CAACC,IAAG,WAAW,cAAc,GAAG;AAClC,QAAAA,IAAG,UAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,MAClD;AACA,MAAAA,IAAG,cAAcD,OAAK,KAAK,gBAAgB,UAAU,GAAG,KAAK,MAAM;AAAA,IACrE,OAAO;AACL,aAAO,EAAE,SAAS,OAAO,OAAO,kEAAkE;AAAA,IACpG;AAGA,SAAK,YAAY,SAAS;AAE1B,WAAO,EAAE,SAAS,MAAM,UAAU;AAAA,EACpC;AAAA,EAEO,gBAAgB,SAA2E;AAChG,QAAI;AACF,YAAM,eAAeA,OAAK,KAAK,KAAK,eAAe,SAAS,KAAK,IAAI,CAAC,EAAE;AACxE,eAAS,wBAAwB,OAAO,MAAM,YAAY,KAAK,EAAE,OAAO,OAAO,CAAC;AAEhF,YAAM,MAAM,KAAK,iBAAiB,YAAY;AAC9C,UAAI;AACF,QAAAC,IAAG,OAAO,cAAc,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MAC1D,QAAQ;AAAA,MAER;AAEA,aAAO;AAAA,IACT,SAAS,KAAU;AACjB,aAAO,EAAE,SAAS,OAAO,OAAO,qBAAqB,IAAI,OAAO,GAAG;AAAA,IACrE;AAAA,EACF;AAAA,EAEO,YAAY,MAAuB;AACxC,SAAK,aAAa,IAAI;AACtB,UAAM,YAAYD,OAAK,KAAK,KAAK,eAAe,IAAI;AACpD,QAAIC,IAAG,WAAW,SAAS,GAAG;AAC5B,UAAI;AACF,QAAAA,IAAG,OAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACrD,eAAO;AAAA,MACT,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,qBAAqB,YAAoB,YAAY,QAAQ,IAAI,GAAY;AAClF,UAAM,YAAY,KAAK,WAAW,SAAS;AAC3C,UAAM,UAAmB,CAAC;AAC1B,UAAM,cAAc,WAAW,YAAY;AAE3C,eAAW,SAAS,WAAW;AAE7B,UAAI,MAAM,SAAS;AACjB,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF;AAGA,YAAM,YAAY,MAAM,KAAK,YAAY;AACzC,YAAM,YAAY,MAAM,YAAY,YAAY,EAAE,MAAM,KAAK,EAAE,OAAO,OAAK,EAAE,SAAS,CAAC;AAEvF,UAAI,YAAY,SAAS,SAAS,GAAG;AACnC,gBAAQ,KAAK,KAAK;AAClB;AAAA,MACF;AAEA,UAAI,aAAa;AACjB,iBAAW,QAAQ,WAAW;AAC5B,YAAI,YAAY,SAAS,IAAI,GAAG;AAC9B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,cAAc,GAAG;AACnB,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACzRA,OAAOC,YAAU;AACjB,OAAOC,SAAQ;;;ACDf,OAAOC,SAAQ;AAEf,IAAM,iBAAiB,CAAC,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,UAAK,QAAG;AAEjE,IAAM,kBAAN,MAAsB;AAAA,EACnB,QAA+B;AAAA,EAC/B,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ,QAAQ,QAAQ,OAAO,KAAK;AAAA,EACpC,YAAY;AAAA,EAEb,MAAM,SAAuB;AAClC,SAAK,UAAU;AACf,SAAK,YAAY;AAEjB,QAAI,CAAC,KAAK,OAAO;AACf,cAAQ,IAAI,aAAa,OAAO,EAAE;AAClC,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AAAA,IAC1B;AAEA,YAAQ,OAAO,MAAM,WAAW;AAChC,SAAK,QAAQ,YAAY,MAAM;AAC7B,WAAK,OAAO;AAAA,IACd,GAAG,EAAE;AAEL,SAAK,OAAO;AACZ,WAAO;AAAA,EACT;AAAA,EAEO,OAAO,SAAuB;AACnC,SAAK,UAAU;AACf,QAAI,CAAC,KAAK,OAAO;AACf,cAAQ,IAAI,aAAa,OAAO,EAAE;AAAA,IACpC,WAAW,KAAK,WAAW;AACzB,WAAK,OAAO;AAAA,IACd;AACA,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,UAAkB,OAAqB;AACvD,WAAO,KAAK,OAAO,iBAAiBA,IAAG,KAAK,QAAQ,CAAC,KAAKA,IAAG,KAAK,KAAK,CAAC,MAAM;AAAA,EAChF;AAAA,EAEO,kBAAkB,UAAkB,OAAqB;AAC9D,WAAO,KAAK,OAAO,gCAAgCA,IAAG,KAAK,QAAQ,CAAC,KAAK;AAAA,EAC3E;AAAA,EAEO,UAAU,aAA4B;AAC3C,UAAM,SAAS,cAAc,KAAK,WAAW,aAAa;AAC1D,WAAO,KAAK,OAAO,+BAA+B,MAAM,EAAE;AAAA,EAC5D;AAAA,EAEO,SAAS,SAAiB,aAAqB,QAAsB;AAC1E,WAAO,KAAK,OAAO,0CAA0C,OAAO,IAAI,WAAW,SAAS,SAAS,KAAM,QAAQ,CAAC,CAAC,MAAM;AAAA,EAC7H;AAAA,EAEO,cAAc,UAAkB,SAAwB;AAC7D,UAAM,SAAS,UAAU,KAAK,OAAO,KAAK;AAC1C,WAAO,KAAK,OAAO,kBAAkBA,IAAG,KAAK,QAAQ,CAAC,GAAG,MAAM,KAAK;AAAA,EACtE;AAAA,EAEQ,SAAe;AACrB,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,UAAW;AACpC,UAAM,QAAQA,IAAG,OAAO,eAAe,KAAK,WAAW,eAAe,MAAM,CAAC;AAC7E,SAAK;AAGL,YAAQ,OAAO,MAAM,YAAY,KAAK,IAAIA,IAAG,IAAI,KAAK,OAAO,CAAC,EAAE;AAAA,EAClE;AAAA,EAEO,OAAa;AAClB,QAAI,KAAK,OAAO;AACd,oBAAc,KAAK,KAAK;AACxB,WAAK,QAAQ;AAAA,IACf;AACA,SAAK,YAAY;AAEjB,QAAI,KAAK,OAAO;AACd,cAAQ,OAAO,MAAM,WAAW;AAChC,cAAQ,OAAO,MAAM,WAAW;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAAA,EAEO,QAAQ,SAAuB;AACpC,SAAK,KAAK;AACV,YAAQ,IAAI,GAAGA,IAAG,MAAM,QAAG,CAAC,IAAI,OAAO,EAAE;AACzC,WAAO;AAAA,EACT;AAAA,EAEO,KAAK,SAAuB;AACjC,SAAK,KAAK;AACV,YAAQ,IAAI,GAAGA,IAAG,IAAI,QAAG,CAAC,IAAI,OAAO,EAAE;AACvC,WAAO;AAAA,EACT;AAAA,EAEO,KAAK,SAAuB;AACjC,SAAK,KAAK;AACV,YAAQ,IAAI,GAAGA,IAAG,KAAK,QAAG,CAAC,IAAI,OAAO,EAAE;AACxC,WAAO;AAAA,EACT;AACF;;;ADjFO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,cAAc;AACZ,SAAK,mBAAmB,IAAI,iBAAiB;AAC7C,SAAK,QAAQ,IAAI,aAAa;AAC9B,SAAK,aAAa,IAAI,WAAW;AACjC,SAAK,eAAe,IAAI,aAAa;AACrC,SAAK,iBAAiB,IAAI,eAAe,CAAC,CAAC;AAC3C,SAAK,UAAU,IAAI,gBAAgB;AAAA,EACrC;AAAA,EAEO,sBAAwC;AAC7C,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,kBAAgC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAa,UAAyB;AACpC,QAAI;AACF,YAAM,WAAW,MAAM,KAAK,WAAW,WAAW;AAClD,WAAK,MAAM,cAAc,QAAQ;AAAA,IACnC,QAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEA,MAAa,WAA0B;AACrC,UAAM,KAAK,WAAW,SAAS;AAAA,EACjC;AAAA,EAEO,kBAAkB,WAAmB,WAAW,OAAO,eAAwB,CAAC,GAAW;AAChG,UAAM,sBAAsB,wBAAwB,SAAS;AAE7D,UAAM,aAAa;AAAA,MACjB;AAAA,MACA,sBAAsBC,OAAK,QAAQ,SAAS,CAAC;AAAA,MAC7C,mBAAmB,QAAQ,QAAQ,KAAK,QAAQ,IAAI;AAAA,MACpD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,UAAU;AACZ,iBAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,oBAAoB,SAAS,oBAAoB,SAAS;AAC5D,iBAAW;AAAA,QACT;AAAA,QACA,yBAAyBA,OAAK,SAAS,oBAAoB,YAAY,cAAc,CAAC;AAAA,QACtF;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAGA,QAAI,aAAa,SAAS,GAAG;AAC3B,iBAAW,KAAK,IAAI,6BAA6B;AACjD,iBAAW,SAAS,cAAc;AAChC,mBAAW;AAAA,UACT,cAAc,MAAM,IAAI;AAAA,UACxB,gBAAgB,MAAM,WAAW;AAAA,UACjC;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,WAAO,WAAW,KAAK,IAAI;AAAA,EAC7B;AAAA,EAEA,MAAa,QACX,SACA,YACA,SACA,cAAgC,CAAC,GAMhC;AACD,UAAM,gBAAgB,KAAK,IAAI;AAC/B,SAAK,iBAAiB,IAAI,eAAe;AAAA,MACvC,MAAM,QAAQ;AAAA,MACd,UAAU,QAAQ;AAAA,IACpB,CAAC;AAGD,UAAM,kBAAkB,KAAK,aAAa,qBAAqB,YAAY,QAAQ,SAAS;AAC5F,UAAM,uBAAuB,QAAQ,gBAAgB,CAAC,GAAG;AAAA,MAAI,UAC3D,KAAK,aAAa,SAAS,MAAM,QAAQ,SAAS;AAAA,IACpD,EAAE,OAAO,CAAC,MAAkB,QAAQ,CAAC,CAAC;AAEtC,UAAM,oBAAoB,oBAAI,IAAmB;AACjD,eAAW,KAAK,CAAC,GAAG,qBAAqB,GAAG,eAAe,GAAG;AAC5D,wBAAkB,IAAI,EAAE,MAAM,CAAC;AAAA,IACjC;AACA,UAAM,eAAe,MAAM,KAAK,kBAAkB,OAAO,CAAC;AAE1D,QAAI,aAAa,SAAS,KAAK,CAAC,QAAQ,YAAY;AAClD,YAAM,QAAQ,aAAa,IAAI,OAAKC,IAAG,OAAO,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI;AAChE,cAAQ,IAAIA,IAAG,IAAI,4BAAqB,KAAK,EAAE,CAAC;AAAA,IAClD;AAEA,YAAQ,eAAe,aAAa,IAAI,OAAK,EAAE,IAAI;AAGnD,UAAM,WAAW,KAAK,iBAAiB,YAAY,QAAQ,QAAQ;AACnE,YAAQ,WAAW,SAAS;AAC5B,YAAQ,QAAQ,QAAQ;AAExB,UAAM,eAAe,KAAK,kBAAkB,QAAQ,WAAW,QAAQ,UAAU,YAAY;AAC7F,UAAM,cAAc,KAAK,MAAM,eAAe,QAAQ,QAAQ;AAG9D,UAAM,WAA6B;AAAA,MACjC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,MACpD,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AACA,YAAQ,MAAM,KAAK,QAAQ;AAE3B,QAAI,OAAO;AACX,UAAM,WAAW,QAAQ,YAAY;AACrC,QAAI,qBAAqB;AACzB,QAAI,qBAAqB;AAEzB,UAAM,eAA2B;AAAA,MAC/B,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AAEA,UAAM,mBAAsC;AAAA,MAC1C,SAAS;AAAA,MACT,iBAAiB,CAAC;AAAA,IACpB;AAEA,WAAO,OAAO,UAAU;AACtB;AAGA,UAAI,QAAQ,QAAQ,SAAS;AAC3B,aAAK,QAAQ,KAAK;AAClB,cAAM,QAAQ,OAAO,UAAU,IAAI,MAAM,8BAA8B;AAAA,MACzE;AAEA,WAAK,QAAQ,MAAM,iBAAiB,SAAS,WAAW,KAAK,QAAQ,KAAK,MAAM;AAEhF,UAAI,kBAAkB;AACtB,UAAI,mBAAmC,CAAC;AAExC,UAAI;AACF,cAAM,eAAe,MAAM,SAAS,eAAe;AAAA,UACjD,OAAO,QAAQ;AAAA,UACf,mBAAmB;AAAA,UACnB,SAAS,QAAQ;AAAA,UACjB,OAAO;AAAA,UACP,QAAQ,QAAQ;AAAA,UAChB,aAAa;AAAA,UACb,WAAW,QAAQ;AAAA,UACnB,qBAAqB,QAAQ;AAAA,UAC7B,YAAY,QAAQ;AAAA,UACpB,WAAW;AAAA,YACT,eAAe,CAAC,UAAkB;AAChC,kBAAI,UAAU,cAAc;AAC1B,qBAAK,QAAQ,WAAW,SAAS,aAAa,QAAQ,KAAK;AAAA,cAC7D,WAAW,UAAU,uBAAuB;AAC1C,qBAAK,QAAQ,kBAAkB,SAAS,aAAa,QAAQ,KAAK;AAAA,cACpE,WAAW,MAAM,WAAW,WAAW,GAAG;AACxC,sBAAM,UAAU,MAAM,MAAM,GAAG,EAAE,CAAC;AAClC,qBAAK,QAAQ,SAAS,SAAS,SAAS,EAAE,GAAG,GAAG,IAAI;AAAA,cACtD,WAAW,UAAU,aAAa;AAChC,qBAAK,QAAQ,KAAK;AAAA,cACpB;AAAA,YACF;AAAA,YACA,SAAS,CAAC,UAAkB;AAC1B,kBAAI,oBAAoB,IAAI;AAC1B,qBAAK,QAAQ,KAAK;AAAA,cACpB;AACA,iCAAmB;AACnB,kBAAI,CAAC,QAAQ,YAAY;AACvB,wBAAQ,OAAO,MAAM,KAAK;AAAA,cAC5B;AAAA,YACF;AAAA,YACA,aAAa,CAAC,UAA0B;AACtC,iCAAmB;AAAA,YACrB;AAAA,YACA,SAAS,CAAC,UAAsB;AAC9B,2BAAa,eAAe,MAAM;AAClC,2BAAa,mBAAmB,MAAM;AACtC,2BAAa,cAAc,MAAM;AAAA,YACnC;AAAA,UACF;AAAA,QACF,CAAC;AAED,aAAK,QAAQ,KAAK;AAGlB,YAAI,aAAa,QAAQ;AACvB,2BAAiB,iBAAiB,aAAa,OAAO;AACtD,2BAAiB,YAAY,aAAa,OAAO;AACjD,2BAAiB,SAAS,aAAa,OAAO;AAC9C,2BAAiB,WAAW,aAAa,OAAO;AAAA,QAClD;AAEA,YAAI,iBAAiB;AACnB,cAAI,CAAC,gBAAgB,SAAS,IAAI,GAAG;AACnC,oBAAQ,IAAI,EAAE;AAAA,UAChB;AACA,+BAAqB;AAAA,QACvB;AAGA,YAAI,CAAC,aAAa,aAAa,aAAa,UAAU,WAAW,GAAG;AAClE,kBAAQ,MAAM,KAAK;AAAA,YACjB,MAAM;AAAA,YACN,MAAM;AAAA,YACN,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,UACpC,CAAC;AACD;AAAA,QACF;AAGA,gBAAQ,MAAM,KAAK;AAAA,UACjB,MAAM;AAAA,UACN,MAAM,mBAAmB;AAAA,UACzB,WAAW,aAAa;AAAA,UACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAGD,cAAM,cAAgC,CAAC;AAEvC,mBAAW,QAAQ,aAAa,WAAW;AAEzC,cAAI,QAAQ,QAAQ,SAAS;AAC3B,kBAAM,QAAQ,OAAO,UAAU,IAAI,MAAM,oBAAoB;AAAA,UAC/D;AAEA;AACA,gBAAM,cAAc,GAAG,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,IAAI,EAAE,IAAI,OAAK,GAAG,CAAC,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAEvH,cAAI,CAAC,QAAQ,YAAY;AACvB,oBAAQ,IAAIA,IAAG,KAAK;AAAA,yBAAgBA,IAAG,KAAK,KAAK,IAAI,CAAC,EAAE,IAAIA,IAAG,IAAI,IAAI,YAAY,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC;AAAA,UACpG;AAEA,eAAK,QAAQ,cAAc,KAAK,IAAI;AAEpC,gBAAM,cAAc;AAAA,YAClB,WAAW,QAAQ;AAAA,YACnB,MAAM,KAAK,eAAe,OAAO;AAAA,YACjC,UAAU,QAAQ;AAAA,YAClB,QAAQ,QAAQ;AAAA,YAChB,iBAAiB,CAAC,QAAa;AAC7B,mBAAK,QAAQ,KAAK;AAClB,qBAAO,KAAK,eAAe,gBAAgB,GAAG;AAAA,YAChD;AAAA,UACF;AAEA,gBAAM,YAAY,KAAK,IAAI;AAC3B,gBAAM,kBAAkB,MAAM,KAAK,MAAM,YAAY,KAAK,MAAM,KAAK,MAAM,WAAW;AACtF,gBAAM,eAAe,KAAK,IAAI,IAAI;AAClC,2BAAiB,gBAAgB,KAAK,IAAI,KAAK,iBAAiB,gBAAgB,KAAK,IAAI,KAAK,KAAK;AAEnG,eAAK,QAAQ,KAAK;AAGlB,cAAI,gBAAgB,gBAAgB;AACpC,cAAI,cAAc,SAAS,MAAO;AAChC,4BAAgB,cAAc,MAAM,GAAG,IAAK,IAAI;AAAA,UAClD;AAEA,cAAI,gBAAgB,SAAS;AAC3B,gBAAI,CAAC,QAAQ,YAAY;AACvB,oBAAM,UAAU,gBAAgB,OAAO,SAAS,MAC5C,gBAAgB,OAAO,MAAM,GAAG,GAAG,IAAI,QACvC,gBAAgB;AACpB,sBAAQ,IAAIA,IAAG,MAAM,gBAAW,IAAIA,IAAG,IAAI,IAAI,QAAQ,QAAQ,OAAO,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC;AAAA,YACnG;AACA,wBAAY,KAAK;AAAA,cACf,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK;AAAA,cACX,QAAQ,gBAAgB,aAAa;AAAA,YACvC,CAAC;AAAA,UACH,OAAO;AACL,gBAAI,CAAC,QAAQ,YAAY;AACvB,sBAAQ,IAAIA,IAAG,IAAI,iBAAY,gBAAgB,SAAS,gBAAgB,MAAM,EAAE,CAAC;AAAA,YACnF;AACA,wBAAY,KAAK;AAAA,cACf,QAAQ,KAAK;AAAA,cACb,MAAM,KAAK;AAAA,cACX,QAAQ,EAAE,OAAO,gBAAgB,SAAS,gBAAgB,OAAO;AAAA,cACjE,OAAO,gBAAgB;AAAA,YACzB,CAAC;AAAA,UACH;AAAA,QACF;AAGA,gBAAQ,MAAM,KAAK;AAAA,UACjB,MAAM;AAAA,UACN;AAAA,UACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QACpC,CAAC;AAGD,YAAI,QAAQ,UAAU;AACpB,gBAAM,WAAW;AAAA,0CAA6C,QAAQ;AACtE,kBAAQ,IAAIA,IAAG,OAAO,QAAQ,CAAC;AAC/B,gCAAsB;AACtB;AAAA,QACF;AAAA,MACF,SAAS,KAAU;AACjB,aAAK,QAAQ,KAAK;AAClB,cAAM;AAAA,MACR;AAAA,IACF;AAGA,QAAI,cAAc,QAAQ,KAAK,GAAG;AAChC,cAAQ,QAAQ,aAAa,QAAQ,KAAK;AAAA,IAC5C;AAEA,qBAAiB,UAAU,KAAK,IAAI,IAAI;AAGxC,YAAQ,WAAW,gBAAgB,aAAa;AAChD,YAAQ,WAAW,oBAAoB,aAAa;AACpD,YAAQ,WAAW,eAAe,aAAa;AAC/C,gBAAY,OAAO;AAEnB,WAAO;AAAA,MACL,OAAO;AAAA,MACP,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;AEnYA,OAAOC,UAAQ;AACf,OAAOC,YAAU;AAGjB,IAAM,WAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,SAAS;AAAA,EACT,QAAQ;AACV;AAEA,IAAM,oBAAoB,oBAAI,IAAI,CAAC,QAAQ,QAAQ,SAAS,SAAS,QAAQ,MAAM,CAAC;AACpF,IAAM,sBAAsB,KAAK,OAAO;AAEjC,SAAS,eAAe,UAAkC;AAC/D,QAAM,WAAWA,OAAK,QAAQ,QAAQ;AAEtC,MAAI,CAACD,KAAG,WAAW,QAAQ,GAAG;AAC5B,UAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,EAC7D;AAEA,QAAM,OAAOA,KAAG,SAAS,QAAQ;AACjC,MAAI,CAAC,KAAK,OAAO,GAAG;AAClB,UAAM,IAAI,MAAM,oCAAoC,QAAQ,EAAE;AAAA,EAChE;AAEA,MAAI,KAAK,OAAO,qBAAqB;AACnC,UAAM,IAAI,MAAM,8BAA8B,QAAQ,MAAM,KAAK,QAAQ,OAAO,OAAO,QAAQ,CAAC,CAAC,eAAe;AAAA,EAClH;AAEA,QAAM,MAAMC,OAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,QAAM,WAAW,SAAS,GAAG,KAAK;AAClC,QAAM,OAAOA,OAAK,SAAS,QAAQ;AAEnC,MAAI,kBAAkB,IAAI,GAAG,GAAG;AAC9B,UAAM,SAASD,KAAG,aAAa,QAAQ;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM,KAAK;AAAA,MACX,YAAY,OAAO,SAAS,QAAQ;AAAA,IACtC;AAAA,EACF;AAGA,QAAM,cAAcA,KAAG,aAAa,UAAU,MAAM;AACpD,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,UAAU,SAAS,WAAW,OAAO,IAAI,WAAW;AAAA,IACpD,MAAM,KAAK;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,WAAwC;AACtE,MAAI,CAAC,aAAa,UAAU,WAAW,EAAG,QAAO,CAAC;AAClD,SAAO,UAAU,IAAI,OAAK,eAAe,CAAC,CAAC;AAC7C;","names":["fs","path","os","path","os","fs","path","path","path","fs","path","fs","pc","fs","path","fs","path","fs","path","path","fs","walk","buildTree","exec","fs","path","path","fs","pc","pc","fs","path","fs","path","crypto","path","fs","crypto","fs","path","path","fs","path","pc","pc","path","pc","fs","path"]}
|