@wrongstack/plug-lsp 0.270.0 → 0.272.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/command-resolver.ts","../src/slash-commands/install.ts","../src/presets.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/lsp.ts","../src/slash-commands/index.ts","../src/constants.ts","../src/formatters/symbols.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/codebase-lsp-search.ts","../src/formatters/location.ts","../src/position.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/workspace-edit.ts","../src/tools/workspace-edit.ts","../src/tools/rename.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","existsSync","path7","spawn","buildChildEnv","path2","path3","path4","pathToFileURL","path5","path6","fs4","installLang","path8","path9","fs5","fs6"],"mappings":"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","file":"index.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string, timeoutMs = 2000): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n const timer = setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeoutMs);\n timer.unref?.();\n child.on('error', () => {\n clearTimeout(timer);\n resolve(false);\n });\n child.on('close', (code) => {\n clearTimeout(timer);\n resolve(code === 0);\n });\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { buildChildEnv } from '@wrongstack/core';\nimport { spawn } from 'node:child_process';\nimport * as path from 'node:path';\nimport { commandExistsOnPath, resolveServerCommand } from '../utils/command-resolver.js';\n\nexport interface LanguageServerConfig {\n binary: string;\n npmPackages?: string[];\n args?: string[];\n languages: string[];\n rootPatterns?: string[];\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nexport interface InstallResult {\n language: string;\n binary: string;\n alreadyInstalled: boolean;\n dryRun: boolean;\n installCommand?: string;\n packageManager?: string;\n error?: string;\n}\n\nexport const LANGUAGE_SERVERS: Record<string, LanguageServerConfig> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n },\n};\n\nexport const SUPPORTED_LANGUAGES = Object.keys(LANGUAGE_SERVERS);\n\n/**\n * Install a language server for the given language.\n * Returns an InstallResult describing what happened.\n */\nexport async function installLang(\n language: string,\n server: LanguageServerConfig,\n cwd: string,\n dryRun = false,\n): Promise<InstallResult> {\n // Check if already available on PATH or in node_modules/.bin\n const existing = await resolveServerCommand(server.binary, cwd);\n if (existing) {\n return { language, binary: server.binary, alreadyInstalled: true, dryRun: false };\n }\n\n // Toolchain-based install (Go, Rust, Ruby)\n if (server.toolchain) {\n const { command, args, label } = server.toolchain;\n\n if (!(await commandExistsOnPath(command))) {\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun,\n installCommand: `${command} ${args.join(' ')}`,\n error: `${label} (${command}) is not on your PATH. Install it first.`,\n };\n }\n\n const installCmd = `${command} ${args.join(' ')}`;\n\n if (dryRun) {\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: true, installCommand: installCmd };\n }\n\n await runCommand(command, args, cwd, label);\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: false, packageManager: 'system', installCommand: installCmd };\n }\n\n // npm-based install\n if (server.npmPackages && server.npmPackages.length > 0) {\n const { command, args } = npmInstallCommand(server.npmPackages, cwd);\n const installCmd = `${command} ${args.join(' ')}`;\n\n if (dryRun) {\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: true, installCommand: installCmd };\n }\n\n try {\n await runCommand(command, args, cwd, `Installing ${language} LSP server via npm`);\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: false, installCommand: installCmd };\n } catch (err) {\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun: false,\n installCommand: installCmd,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun,\n error: 'No installation method available for this server.',\n };\n}\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nfunction npmInstallCommand(packages: string[], cwd: string): { command: string; args: string[] } {\n // Detect PM from lock files but fall back to pnpm as the default\n const pm = detectPackageManagerSync(cwd);\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nfunction detectPackageManagerSync(cwd: string): PackageManager {\n // Heuristic only — async version checks actual files\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'bun.lockb')) || existsSync(path.join(cwd, 'bun.lock'))) return 'bun';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction existsSync(filePath: string): boolean {\n try {\n require('node:fs').accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction runCommand(command: string, args: string[], cwd: string, label: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const isWindowsBatch = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n const child = spawn(command, args, {\n cwd,\n env: buildChildEnv(),\n stdio: 'inherit',\n shell: isWindowsBatch,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${label}: ${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n","import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n const pending = Object.entries(PRESETS).filter(([name]) => !out[name]);\n const resolved = await Promise.all(\n pending.map(async ([name, cfg]) => [name, cfg, await resolveServerCommand(cfg.command, cwd)] as const),\n );\n for (const [name, cfg, command] of resolved) {\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus | undefined,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown | undefined } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n const text = knownText ?? (await fs.readFile(absPath, 'utf8'));\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string> | undefined;\n languages: string[];\n rootPatterns?: string[] | undefined;\n initializationOptions?: unknown | undefined;\n settings?: unknown | undefined;\n startupTimeoutMs?: number | undefined;\n enabled?: boolean | undefined;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown | undefined,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal | undefined,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null | undefined;\n method?: string | undefined;\n params?: unknown | undefined;\n result?: unknown | undefined;\n error?: { code: number | undefined; message: string; data?: unknown | undefined };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: ((server: LSPServer) => void) | undefined;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string | undefined; diagnostics?: Diagnostic[] | undefined };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string | undefined } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] | undefined }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n // Cancel any pending auto-reconnect so the server doesn't come back\n // up moments after a user-requested stop.\n this.cancelReconnect(name);\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n // Cancel pending auto-reconnect AND clear the strike counter — a\n // manual restart should not count against the 3-attempt limit.\n this.cancelReconnect(name);\n this.reconnectAttempts.delete(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private cancelReconnect(name: string): void {\n const timer = this.reconnectTimers.get(name);\n if (timer) {\n clearTimeout(timer);\n this.reconnectTimers.delete(name);\n }\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msgRaw = typeof d.message === 'string' ? d.message : d.message.value;\n const msg = msgRaw.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx?.cwd ?? process.cwd(),\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport * as path from 'node:path';\nimport type { LSPRegistry } from '../registry.js';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LANGUAGE_SERVERS, SUPPORTED_LANGUAGES } from './install.js';\n\n// Re-export for use from the plugin entry\nexport { installLang, LANGUAGE_SERVERS, SUPPORTED_LANGUAGES } from './install.js';\n\ninterface LspContext {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n cwd: string;\n}\n\ntype LspSubcommand =\n | { type: 'list' }\n | { type: 'status' }\n | { type: 'install'; language: string }\n | { type: 'start'; name?: string | undefined }\n | { type: 'stop'; name?: string | undefined }\n | { type: 'restart'; name?: string | undefined }\n | { type: 'diagnostics'; file?: string | undefined }\n | { type: 'add'; name: string; command: string; args?: string[]; languages: string[]; rootPatterns?: string[] }\n | { type: 'remove'; name: string }\n | { type: 'enable'; name: string }\n | { type: 'disable'; name: string }\n | { type: 'help' };\n\nfunction parseArgs(args: string): LspSubcommand {\n const parts = args.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return { type: 'list' };\n\n const sub = parts[0]!.toLowerCase();\n\n if (sub === 'list' || sub === 'ls') return { type: 'list' };\n if (sub === 'status' || sub === 'stat') return { type: 'status' };\n if (sub === 'help' || sub === 'h' || sub === '--help') return { type: 'help' };\n\n if (sub === 'install' || sub === 'add') {\n const lang = parts[1];\n if (!lang) return { type: 'help' };\n return { type: 'install', language: lang };\n }\n\n if (sub === 'start') return { type: 'start', name: parts[1] };\n if (sub === 'stop') return { type: 'stop', name: parts[1] };\n if (sub === 'restart' || sub === 'reload') return { type: 'restart', name: parts[1] };\n\n if (sub === 'diagnostics' || sub === 'diag') {\n return { type: 'diagnostics', file: parts[1] };\n }\n\n if (sub === 'remove' || sub === 'rm' || sub === 'delete') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'remove', name };\n }\n\n if (sub === 'enable') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'enable', name };\n }\n\n if (sub === 'disable') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'disable', name };\n }\n\n return { type: 'help' };\n}\n\nfunction colorize(text: string, code: string): string {\n const colors: Record<string, string> = {\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n };\n return `${colors[code] ?? ''}${text}${colors.reset}`;\n}\n\nexport function buildLspCommand(ctx: LspContext): SlashCommand {\n return {\n name: 'lsp',\n category: 'Inspect',\n aliases: ['lsplsp'],\n description:\n 'Manage LSP language servers: /lsp [list|install <lang>|start [name]|stop [name]|restart [name]|diagnostics [file]|add|remove|enable|disable]',\n argsHint: '[list|install <lang>|start [name]|stop [name]|restart [name]|diagnostics [file]]',\n\n help: [\n 'Usage:',\n ' /lsp Show server list and status (alias for list)',\n ' /lsp list List all configured servers and their states',\n ' /lsp status Detailed status report for all servers',\n ' /lsp install <language> Install the language server for a given language',\n ' Supported: ' + SUPPORTED_LANGUAGES.join(', '),\n ' /lsp start [name] Start all servers, or a specific one by name',\n ' /lsp stop [name] Stop all servers, or a specific one by name',\n ' /lsp restart [name] Restart all servers, or a specific one by name',\n ' /lsp diagnostics [file] Show diagnostics for a file or the whole workspace',\n '',\n 'Examples:',\n ' /lsp (shows configured servers)',\n ' /lsp list',\n ' /lsp install typescript',\n ' /lsp install python',\n ' /lsp install go',\n ' /lsp start (start all enabled servers)',\n ' /lsp start gopls (start a specific server)',\n ' /lsp diagnostics src/index.ts',\n ' /lsp status',\n '',\n 'After installing, add the server to your WrongStack config under:',\n ' extensions[\"@wrongstack/plug-lsp\"].servers',\n 'Then restart your WrongStack session.',\n ].join('\\n'),\n\n async run(args) {\n const sub = parseArgs(args);\n\n switch (sub.type) {\n case 'list': return runListCommand(ctx);\n case 'status': return runStatusCommand(ctx);\n case 'install': return runInstallCommand(ctx, sub.language);\n case 'start': return runStartCommand(ctx, sub.name);\n case 'stop': return runStopCommand(ctx, sub.name);\n case 'restart': return runRestartCommand(ctx, sub.name);\n case 'diagnostics': return runDiagnosticsCommand(ctx, sub.file);\n case 'add':\n return { message: 'To add a custom server, edit your config and add an entry under\\n`extensions[\"@wrongstack/plug-lsp\"].servers`. Run `/lsp help` for usage.' };\n case 'remove':\n return { message: 'To remove a server, remove its entry from `extensions[\"@wrongstack/plug-lsp\"].servers`\\nin your WrongStack config, then restart.' };\n case 'enable':\n return { message: 'To enable a server, ensure `enabled: true` is set (or absent — it defaults to true)\\nin its config entry, then run `/lsp start <name>`.' };\n case 'disable':\n return { message: 'To disable a server, set `enabled: false` in its config entry,\\nthen run `/lsp stop <name>` to stop it.' };\n default:\n return { message: this.help ?? this.description };\n }\n },\n };\n}\n\n// ─── Subcommand Handlers ─────────────────────────────────────────────────────\n\nfunction runListCommand(ctx: LspContext): { message: string } {\n const servers = ctx.registry.list();\n if (servers.length === 0) {\n return {\n message: [\n `${colorize('LSP Servers', 'bold')}`,\n 'No servers configured.',\n '',\n 'Enable @wrongstack/plug-lsp in your config and add server definitions under',\n '`extensions[\"@wrongstack/plug-lsp\"].servers`, or run `/lsp install <language>`',\n 'to install a preset server.',\n ].join('\\n'),\n };\n }\n\n const lines: string[] = [`${colorize('LSP Servers', 'bold')} (${servers.length} configured)`];\n lines.push('─'.repeat(60));\n\n for (const srv of servers) {\n const state = srv.state;\n const enabled = srv.config.enabled ?? true;\n\n const stateColor = state === 'ready' ? 'green' : state === 'failed' ? 'red' : state === 'disabled' ? 'dim' : 'yellow';\n const stateLabel = `[${state.toUpperCase()}]`;\n const enabledLabel = enabled ? '' : colorize(' (disabled)', 'dim');\n\n const langs = srv.config.languages?.join(', ') ?? '';\n lines.push(\n ` ${colorize(srv.name, 'cyan')} ${colorize(stateLabel, stateColor)}${enabledLabel}`,\n );\n lines.push(` ${colorize('Languages:', 'dim')} ${langs}`);\n lines.push(` ${colorize('Command:', 'dim')} ${srv.config.command} ${(srv.config.args ?? []).join(' ')}`);\n lines.push('');\n }\n\n lines.push('─'.repeat(60));\n lines.push('Run `/lsp help` for usage, or `/lsp install <language>` to install a server.');\n\n return { message: lines.join('\\n') };\n}\n\nfunction runStatusCommand(ctx: LspContext): { message: string } {\n const servers = ctx.registry.list();\n const ready = servers.filter((s) => s.state === 'ready').length;\n const failed = servers.filter((s) => s.state === 'failed').length;\n const starting = servers.filter((s) => s.state === 'starting' || s.state === 'initializing').length;\n\n const lines: string[] = [\n `${colorize('LSP Status Report', 'bold')}`,\n '─'.repeat(60),\n ` ${colorize('Total servers:', 'dim')} ${servers.length}`,\n ` ${colorize('Ready:', 'dim')} ${colorize(String(ready), 'green')}`,\n ` ${colorize('Starting:', 'dim')} ${colorize(String(starting), 'yellow')}`,\n ` ${colorize('Failed:', 'dim')} ${colorize(String(failed), 'red')}`,\n '',\n ];\n\n if (failed > 0) {\n lines.push(`${colorize('Failed servers:', 'red')}`);\n for (const srv of servers.filter((s) => s.state === 'failed')) {\n const err = srv.lastStderr || 'unknown error';\n lines.push(` ${colorize(srv.name, 'cyan')} — ${err}`);\n }\n lines.push('');\n }\n\n const activeFiles = ctx.tracker.list().length;\n lines.push(` ${colorize('Active files tracked:', 'dim')} ${activeFiles}`);\n lines.push(` ${colorize('Auto-start mode:', 'dim')} ${ctx.cfg.autoStart}`);\n lines.push('');\n lines.push('─'.repeat(60));\n lines.push('Use `/lsp diagnostics` to check for problems, or `/lsp restart <name>` to recover.');\n\n return { message: lines.join('\\n') };\n}\n\nasync function runInstallCommand(ctx: LspContext, language: string): Promise<{ message: string }> {\n const lang = language.toLowerCase().trim();\n\n if (!SUPPORTED_LANGUAGES.includes(lang)) {\n return {\n message: [\n `${colorize('Unknown language:', 'red')} ${lang}`,\n `Supported languages: ${SUPPORTED_LANGUAGES.join(', ')}`,\n '',\n 'If the language server is already installed on your system, you can add it',\n 'manually to your WrongStack config under `extensions[\"@wrongstack/plug-lsp\"].servers`.',\n 'Run `/lsp help` for instructions.',\n ].join('\\n'),\n };\n }\n\n const server = LANGUAGE_SERVERS[lang]!;\n\n try {\n const { installLang } = await import('./install.js');\n const result = await installLang(lang, server, ctx.cwd);\n\n if (result.alreadyInstalled) {\n return {\n message: [\n `${colorize('Already installed:', 'green')} ${lang}`,\n ` Binary: ${colorize(server.binary, 'cyan')}`,\n '',\n 'The server is already available. Add it to your config to activate:',\n '',\n '```json',\n JSON.stringify(\n {\n extensions: {\n '@wrongstack/plug-lsp': {\n servers: {\n [lang]: {\n command: server.binary,\n args: server.args ?? ['--stdio'],\n languages: server.languages,\n rootPatterns: server.rootPatterns ?? [],\n },\n },\n },\n },\n },\n null,\n 2,\n ),\n '```',\n '',\n 'Then restart your WrongStack session to load the server.',\n ].join('\\n'),\n };\n }\n\n if (result.dryRun) {\n return {\n message: [\n `${colorize('Dry run — would install:', 'yellow')} ${lang}`,\n ` ${result.installCommand}`,\n '',\n 'Run without --dry-run to actually install.',\n ].join('\\n'),\n };\n }\n\n return {\n message: [\n `${colorize('Installed:', 'green')} ${lang}`,\n ` Binary: ${colorize(server.binary, 'cyan')}`,\n ` Method: ${result.packageManager === 'system' ? server.toolchain!.label : result.installCommand}`,\n '',\n 'Add this to your WrongStack config to activate the server:',\n '',\n '```json',\n JSON.stringify(\n {\n extensions: {\n '@wrongstack/plug-lsp': {\n servers: {\n [lang]: {\n command: server.binary,\n args: server.args ?? ['--stdio'],\n languages: server.languages,\n rootPatterns: server.rootPatterns ?? [],\n },\n },\n },\n },\n },\n null,\n 2,\n ),\n '```',\n '',\n 'Restart your WrongStack session to load the server, then run `/lsp start ${lang}`.',\n ].join('\\n'),\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n message: `${colorize('Installation failed:', 'red')} ${lang}\\n ${msg}`,\n };\n }\n}\n\nasync function runStartCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n const available = ctx.registry.list().map((s) => s.name);\n return {\n message: [\n `${colorize('Server not found:', 'red')} ${targetName}`,\n available.length > 0 ? `Available: ${available.join(', ')}` : 'No servers configured.',\n 'Run `/lsp install <language>` to install a server.',\n ].join('\\n'),\n };\n }\n\n try {\n await ctx.registry.start(targetName);\n return { message: `${colorize('Started:', 'green')} ${targetName}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { message: `${colorize('Failed to start:', 'red')} ${targetName}\\n ${msg}` };\n }\n }\n\n // Start all enabled servers\n const allServers = ctx.registry.list();\n const started: string[] = [];\n const failed: string[] = [];\n\n for (const srv of allServers) {\n if (!srv.config.enabled) continue;\n if (srv.state === 'ready') { started.push(srv.name); continue; }\n if (srv.state === 'disabled') continue;\n try {\n await ctx.registry.start(srv.name);\n started.push(srv.name);\n } catch {\n failed.push(srv.name);\n }\n }\n\n const lines: string[] = [];\n if (started.length > 0) lines.push(`${colorize('Started:', 'green')} ${started.join(', ')}`);\n if (failed.length > 0) lines.push(`${colorize('Failed to start:', 'red')} ${failed.join(', ')}`);\n if (started.length === 0 && failed.length === 0) {\n lines.push('No servers to start. Run `/lsp list` to see configured servers.');\n }\n\n return { message: lines.join('\\n') };\n}\n\nasync function runStopCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n return { message: `${colorize('Server not found:', 'red')} ${targetName}` };\n }\n ctx.registry.stop(targetName);\n return { message: `${colorize('Stopped:', 'yellow')} ${targetName}` };\n }\n\n // Stop all servers\n const allServers = ctx.registry.list();\n for (const srv of allServers) {\n ctx.registry.stop(srv.name);\n }\n\n return { message: `${colorize('Stopped', 'yellow')} ${allServers.length} server(s): ${allServers.map((s) => s.name).join(', ')}` };\n}\n\nasync function runRestartCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n return { message: `${colorize('Server not found:', 'red')} ${targetName}` };\n }\n\n ctx.registry.stop(targetName);\n try {\n await ctx.registry.start(targetName);\n return { message: `${colorize('Restarted:', 'green')} ${targetName}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { message: `${colorize('Restart failed:', 'red')} ${targetName}\\n ${msg}` };\n }\n }\n\n // Restart all enabled servers\n const allServers = ctx.registry.list().filter((s) => s.config.enabled);\n const restarted: string[] = [];\n const failed: string[] = [];\n\n for (const srv of allServers) {\n ctx.registry.stop(srv.name);\n try {\n await ctx.registry.start(srv.name);\n restarted.push(srv.name);\n } catch {\n failed.push(srv.name);\n }\n }\n\n const lines: string[] = [];\n if (restarted.length > 0) lines.push(`${colorize('Restarted:', 'green')} ${restarted.join(', ')}`);\n if (failed.length > 0) lines.push(`${colorize('Failed to restart:', 'red')} ${failed.join(', ')}`);\n\n return { message: lines.join('\\n') };\n}\n\nasync function runDiagnosticsCommand(ctx: LspContext, file?: string): Promise<{ message: string }> {\n const lines: string[] = [`${colorize('LSP Diagnostics', 'bold')}`, '─'.repeat(60)];\n\n // Aggregate diagnostics from all ready servers\n const allDiags = collectServerDiagnostics(ctx.registry);\n\n if (file) {\n const resolved = path.resolve(ctx.cwd, file);\n const fileDiags = allDiags.get(resolved);\n if (!fileDiags || fileDiags.length === 0) {\n return { message: lines.join('\\n') + `\\nNo diagnostics for ${file}` };\n }\n lines.push(`File: ${resolved}`);\n const diagMap = new Map([[resolved, fileDiags]]);\n lines.push(formatDiagnostics(diagMap, {\n cwd: ctx.cwd,\n severityFilter: ctx.cfg.severityFilter,\n maxPerFile: ctx.cfg.maxDiagnosticsPerFile,\n maxTotal: ctx.cfg.maxDiagnosticsTotal,\n }));\n return { message: lines.join('\\n') };\n }\n\n // Workspace overview\n if (allDiags.size === 0) {\n lines.push('No diagnostics reported by any LSP server.');\n lines.push('');\n lines.push('LSP diagnostics are reported by language servers after you open/edit files.');\n lines.push('Open a file and run `/lsp diagnostics <file>` to check specific files.');\n return { message: lines.join('\\n') };\n }\n\n const total = Array.from(allDiags.values()).reduce((sum, d) => sum + d.length, 0);\n lines.push(`Showing diagnostics for ${allDiags.size} file(s) (${total} total)`);\n lines.push('');\n\n for (const [fpath, diags] of allDiags) {\n lines.push(`${colorize(fpath, 'cyan')}`);\n const fdiagMap = new Map([[fpath, diags]]);\n lines.push(formatDiagnostics(fdiagMap, {\n cwd: ctx.cwd,\n severityFilter: ctx.cfg.severityFilter,\n maxPerFile: ctx.cfg.maxDiagnosticsPerFile,\n maxTotal: ctx.cfg.maxDiagnosticsTotal,\n }));\n lines.push('');\n }\n\n return { message: lines.join('\\n') };\n}\n\n/** Collect diagnostics from all ready LSP servers, keyed by file path. */\nfunction collectServerDiagnostics(registry: LSPRegistry): Map<string, import('vscode-languageserver-protocol').Diagnostic[]> {\n const result = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const srv of registry.list()) {\n if (srv.state !== 'ready') continue;\n for (const [uri, diags] of srv.diagnostics) {\n // Convert file:// URIs to paths\n const filePath = uri.startsWith('file://') ? uri.slice(7) : uri;\n const existing = result.get(filePath) ?? [];\n result.set(filePath, [...existing, ...diags]);\n }\n }\n return result;\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\nimport { buildLspCommand } from './lsp.js';\n\nexport function registerSlashCommands(\n api: PluginAPI,\n registry: LSPRegistry,\n tracker: DocumentTracker,\n cfg: PlugLSPConfig,\n cwd: string,\n): string[] {\n const lspCommand = buildLspCommand({ registry, tracker, cfg, cwd });\n const commands = [\n lspCommand,\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","/**\n * Shared constants for the plug-lsp package.\n */\nexport const LSP_CONSTANTS = Object.freeze({\n /** Default timeout for LSP tool operations (5 seconds). */\n TOOL_TIMEOUT_MS: 5000,\n} as const);","import { displayPath } from '../utils/uri.js';\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string | undefined;\n score?: number | undefined;\n snippet?: string | undefined;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n/**\n * Format `codebase-lsp-search` output for human-readable display.\n */\nexport function formatCodebaseLspResults(output: CodebaseLspSearchOutput, cwd: string): string {\n const { results, totalIndex, totalLsp, query, usedIndex, usedLsp } = output;\n\n if (results.length === 0) {\n const sources: string[] = [];\n if (usedIndex) sources.push(`index(${totalIndex})`);\n if (usedLsp) sources.push(`lsp(${totalLsp})`);\n return `No symbols matching \"${query}\". Searched: ${sources.join(', ') || 'none'}.`;\n }\n\n const lines: string[] = [];\n lines.push(`${results.length} results for \"${query}\" (index:${totalIndex} lsp:${totalLsp}):`);\n\n for (const r of results) {\n const sourceTag = r.source === 'index' ? '[index]' : `[lsp:${r.server ?? '?'}]`;\n const scoreTag = r.score !== undefined ? ` score=${r.score.toFixed(2)}` : '';\n const location = `${displayPath(r.file, cwd)}:${r.line}`;\n\n if (r.snippet) {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n lines.push(` ${r.snippet}`);\n } else {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","/**\n * `codebase-lsp-search` — index-first, LSP-fallback symbol search.\n *\n * Architecture:\n * 1. Query the codebase index through its host (FTS5 in the index worker —\n * this process's main thread never opens SQLite)\n * 2. If index has 0 results OR preferLsp=true, fall back to live LSP workspaceSymbol queries\n * 3. Deduplicate results present in both sources\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport {\n codebaseIndexDirOverride,\n internalKindToLspKind,\n lspKindToInternalKind,\n searchCodebaseIndex,\n} from '@wrongstack/tools/codebase-index/index';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\n\nimport { LSP_CONSTANTS } from '../constants.js';\nimport { formatCodebaseLspResults } from '../formatters/symbols.js';\nimport { supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { stringifyToolError, type ToolDeps } from './shared.js';\n\n// ─── Input / Output types ───────────────────────────────────────────────────────\n\ninterface CodebaseLspSearchInput {\n query: string;\n limit?: number | undefined;\n preferLsp?: boolean | undefined;\n}\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string | undefined;\n score?: number | undefined;\n snippet?: string | undefined;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n// ─── Tool factory ──────────────────────────────────────────────────────────────\n\nexport function createCodebaseLspSearchTool(deps: ToolDeps): Tool<CodebaseLspSearchInput, string> {\n return {\n name: 'codebase-lsp-search',\n description:\n 'Search code symbols using a fast SQLite+BM25 index, falling back to live LSP workspaceSymbol queries when needed.',\n usageHint:\n 'Pass `query` to search. Use `limit` (default 20) to cap results. Set `preferLsp=true` to skip the index and query LSP servers directly for live precision.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query string' },\n limit: {\n type: 'integer',\n description: 'Maximum number of results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n preferLsp: {\n type: 'boolean',\n description:\n 'If true, skip the index and query LSP servers directly. Useful for live precision when the index may be stale.',\n },\n },\n required: ['query'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS * 2, // Allow extra time for LSP round-robins\n async execute(input, ctx, opts) {\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n const query = input.query ?? '';\n\n let indexResults: CodebaseLspResult[] = [];\n let totalIndex = 0;\n let usedIndex = false;\n let usedLsp = false;\n let lspResults: CodebaseLspResult[] = [];\n let totalLsp = 0;\n\n // ── Step 1: Query index (unless preferLsp is set) ──────────────────────\n if (!input.preferLsp) {\n const indexOutcome = await searchIndex(\n ctx.projectRoot,\n query,\n limit,\n codebaseIndexDirOverride(ctx),\n );\n indexResults = indexOutcome.results;\n totalIndex = indexOutcome.total;\n usedIndex = true;\n }\n\n // ── Step 2: LSP fallback ───────────────────────────────────────────────\n // Fall back to LSP when:\n // - preferLsp is true (user wants live data), OR\n // - index returned 0 results\n const needsLsp = input.preferLsp || indexResults.length === 0;\n\n if (needsLsp) {\n const lspOutcome = await searchLsp(deps, query, limit, opts.signal);\n lspResults = lspOutcome.results;\n totalLsp = lspOutcome.total;\n usedLsp = true;\n }\n\n // ── Step 3: Merge & deduplicate ────────────────────────────────────────\n const output = mergeResults(indexResults, lspResults, limit);\n\n const fullOutput: CodebaseLspSearchOutput = {\n results: output,\n totalIndex,\n totalLsp,\n query,\n usedIndex,\n usedLsp,\n };\n\n return formatCodebaseLspResults(fullOutput, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\n// ─── Index search ─────────────────────────────────────────────────────────────\n\nasync function searchIndex(\n projectRoot: string,\n query: string,\n limit: number,\n indexDir?: string | undefined,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n // Ranked FTS5 query via the index host — runs in the index worker thread\n // when available, so a contended index can never block this process.\n const { results, total } = await searchCodebaseIndex({ projectRoot, indexDir, query, limit });\n\n return {\n results: results.map((c) => ({\n name: c.name,\n kind: c.kind,\n lspKind: internalKindToLspKind(c.kind) ?? 0,\n file: c.file,\n line: c.line,\n source: 'index' as const,\n score: c.score,\n snippet: c.snippet,\n })),\n total,\n };\n}\n\n// ─── LSP search ───────────────────────────────────────────────────────────────\n\nasync function searchLsp(\n deps: ToolDeps,\n query: string,\n limit: number,\n signal: AbortSignal,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const merged: SymbolInformation[] = [];\n\n const servers = deps.registry.list();\n const promises: Array<Promise<void>> = [];\n\n for (const server of servers) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n\n promises.push(\n (async () => {\n try {\n const result = await server.workspaceSymbol(\n { query },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n signal,\n );\n if (result) {\n for (const sym of result) {\n merged.push(sym);\n }\n }\n } catch {\n // Individual server errors are non-fatal; skip this server's results\n }\n })(),\n );\n }\n\n await Promise.all(promises);\n\n const deduplicated = deduplicateByKey(\n merged.map((sym) => ({\n name: sym.name,\n kind: lspKindToInternalKind(sym.kind) ?? 'symbol',\n lspKind: sym.kind,\n file: sym.location.uri.startsWith('file://')\n ? sym.location.uri.slice(7) // strip \"file://\"\n : sym.location.uri,\n line: sym.location.range.start.line + 1, // convert to 1-based\n source: 'lsp' as const,\n server: serverNameFromConfig(deps, sym),\n })),\n );\n\n return {\n results: deduplicated.slice(0, limit),\n total: deduplicated.length,\n };\n}\n\nfunction serverNameFromConfig(deps: ToolDeps, sym: SymbolInformation): string {\n // Try to find which server owns this file by its language\n // Heuristic: look at file extension\n const file = sym.location.uri;\n const ext = file.includes('.') ? (file.split('.').pop()?.toLowerCase() ?? '') : '';\n\n const langMap: Record<string, string[]> = {\n ts: ['typescript', 'tsserver'],\n tsx: ['typescript', 'tsserver'],\n js: ['javascript', 'typescript'],\n jsx: ['javascript', 'typescript'],\n py: ['python', 'pyright'],\n go: ['go', 'gopls'],\n rs: ['rust', 'rust-analyzer'],\n };\n\n const langs = langMap[ext] ?? [ext];\n const servers = deps.registry.list();\n\n for (const lang of langs) {\n for (const server of servers) {\n if (\n server.state === 'ready' &&\n server.config.languages.some((l) => l.toLowerCase() === lang.toLowerCase())\n ) {\n return server.name;\n }\n }\n }\n\n // Fallback: return first ready server\n return servers.find((s) => s.state === 'ready')?.name ?? 'unknown';\n}\n\n// ─── Merge & deduplication ────────────────────────────────────────────────────\n\nfunction mergeResults(\n indexResults: CodebaseLspResult[],\n lspResults: CodebaseLspResult[],\n limit: number,\n): CodebaseLspResult[] {\n const seen = new Map<string, CodebaseLspResult>();\n\n // Index results take priority (BM25-ranked)\n for (const r of indexResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n seen.set(key, r);\n }\n\n // LSP results fill in gaps (deduplicated)\n for (const r of lspResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n if (!seen.has(key)) {\n seen.set(key, r);\n }\n }\n\n // Sort: index results first (already ranked), then LSP results\n const merged = Array.from(seen.values());\n merged.sort((a, b) => {\n if (a.source === 'index' && b.source !== 'index') return -1;\n if (a.source !== 'index' && b.source === 'index') return 1;\n // Within same source, prefer higher score\n if (a.source === 'index' && b.source === 'index') {\n return (b.score ?? 0) - (a.score ?? 0);\n }\n return 0;\n });\n\n return merged.slice(0, limit);\n}\n\nfunction deduplicateByKey<T extends { name: string; file: string; line: number }>(items: T[]): T[] {\n const seen = new Set<string>();\n return items.filter((item) => {\n const key = `${item.file}:${item.line}:${item.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { LSP_CONSTANTS } from '../constants.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string | undefined;\n limit?: number | undefined;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits.filter((e): e is TextEdit => 'newText' in e));\n }\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodebaseLspSearchTool } from './codebase-lsp-search.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\n\n// NOTE: The following LSP tools are intentionally excluded from the registered set:\n//\n// lsp_references — marginal over read/grep; returns positions the agent still has to read\n// lsp_hover — usually confirms what reading the definition already showed\n// lsp_symbols — a symbol tree is less useful than reading the file; codebase-lsp-search covers the search case\n// lsp_code_actions — high noise-to-signal in well-maintained codebases; mostly cosmetic\n//\n// The kept tools (lsp_diagnostics, lsp_definition, lsp_rename, codebase-lsp-search)\n// are those where LSP provides genuinely unique data or capability the agent cannot\n// replicate with basic tools (read, grep, edit) at comparable cost.\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createCodebaseLspSearchTool(deps),\n createRenameTool(deps),\n ];\n}\n","import { expectDefined } from '@wrongstack/core';\nimport type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry | undefined } = {};\n const tracker = new DocumentTracker(() => expectDefined(holder.registry), api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry, tracker, cfg, cwd);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker.handleToolExecuted(event);\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}
1
+ {"version":3,"sources":["../src/utils/command-resolver.ts","../src/slash-commands/install.ts","../src/presets.ts","../src/auto-discover.ts","../src/config.ts","../src/language-detect.ts","../src/utils/uri.ts","../src/document-tracker.ts","../src/server/lifecycle.ts","../src/types.ts","../src/utils/safe-spawn.ts","../src/utils/timeout.ts","../src/server/connection.ts","../src/server/initialize.ts","../src/server/lsp-server.ts","../src/workspace-root.ts","../src/registry.ts","../src/formatters/diagnostics.ts","../src/slash-commands/diagnostics.ts","../src/slash-commands/list.ts","../src/slash-commands/restart.ts","../src/slash-commands/start.ts","../src/slash-commands/stop.ts","../src/slash-commands/lsp.ts","../src/slash-commands/index.ts","../src/constants.ts","../src/formatters/symbols.ts","../src/server/capabilities.ts","../src/tools/shared.ts","../src/tools/codebase-lsp-search.ts","../src/position.ts","../src/tools/completion.ts","../src/formatters/location.ts","../src/tools/definition.ts","../src/tools/diagnostics.ts","../src/formatters/workspace-edit.ts","../src/tools/workspace-edit.ts","../src/tools/rename.ts","../src/tools/index.ts","../src/index.ts"],"names":["resolve","fs","existsSync","path7","spawn","buildChildEnv","path2","path3","path4","pathToFileURL","path5","path6","fs4","installLang","path8","path9","fs5","fs6"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,eAAsB,oBAAA,CAAqB,SAAiB,GAAA,EAAqC;AAC/F,EAAA,MAAM,KAAA,GAAQ,MAAM,eAAA,CAAgB,GAAA,EAAK,OAAO,CAAA;AAChD,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,OAAQ,MAAM,mBAAA,CAAoB,OAAO,CAAA,GAAK,OAAA,GAAU,IAAA;AAC1D;AAEA,eAAsB,eAAA,CAAgB,KAAa,OAAA,EAAyC;AAC1F,EAAA,IAAS,IAAA,CAAA,UAAA,CAAW,OAAO,CAAA,EAAG,OAAQ,MAAM,WAAW,OAAO,CAAA,GAAU,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,IAAA;AAC7F,EAAA,IAAI,GAAA,GAAW,aAAQ,GAAG,CAAA;AAC1B,EAAA,WAAS;AACP,IAAA,MAAM,MAAA,GAAc,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAA,EAAgB,MAAM,CAAA;AACpD,IAAA,KAAA,MAAW,SAAA,IAAa,iBAAA,CAAkB,OAAO,CAAA,EAAG;AAClD,MAAA,MAAM,IAAA,GAAY,IAAA,CAAA,IAAA,CAAK,MAAA,EAAQ,SAAS,CAAA;AACxC,MAAA,IAAI,MAAM,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,IAAA;AAAA,IACrC;AACA,IAAA,MAAM,MAAA,GAAc,aAAQ,GAAG,CAAA;AAC/B,IAAA,IAAI,MAAA,KAAW,KAAK,OAAO,IAAA;AAC3B,IAAA,GAAA,GAAM,MAAA;AAAA,EACR;AACF;AAEA,eAAsB,mBAAA,CAAoB,OAAA,EAAiB,SAAA,GAAY,GAAA,EAAwB;AAC7F,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,WAAA,GAAc,IAAA;AAC3D,EAAA,MAAM,IAAA,GACJ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,CAAC,OAAO,CAAA,GAAI,CAAC,KAAA,EAAO,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AACxF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,EAAO,IAAA,EAAM,EAAE,GAAA,EAAK,aAAA,EAAc,EAAG,KAAA,EAAO,QAAA,EAAU,WAAA,EAAa,IAAA,EAAM,CAAA;AAC7F,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,KAAA,CAAM,IAAA,EAAK;AACX,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf,GAAG,SAAS,CAAA;AACZ,IAAA,KAAA,CAAM,KAAA,IAAQ;AACd,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM;AACtB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAAA,QAAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,SAAS,kBAAkB,OAAA,EAA2B;AAEpD,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,OAAA,EAAS,OAAO,CAAC,OAAO,CAAA;AACjD,EAAA,MAAM,GAAA,GAAW,IAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,CAAE,WAAA,EAAY;AAC9C,EAAA,IAAI,GAAA,EAAK,OAAO,CAAC,OAAO,CAAA;AACxB,EAAA,OAAO,CAAC,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,CAAA,EAAG,OAAO,CAAA,IAAA,CAAA,EAAQ,OAAA,EAAS,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM,CAAA;AACzF;AAEA,eAAe,WAAW,QAAA,EAAoC;AAC5D,EAAA,IAAI;AACF,IAAA,MAASC,WAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,WAAW,KAAA,EAAuB;AAEzC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;AApEA,IAAA,qBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACAA,IAAA,eAAA,GAAA,EAAA;AAAA,QAAA,CAAA,eAAA,EAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,mBAAA,EAAA,MAAA,mBAAA;AAAA,EAAA,WAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAoHA,eAAsB,WAAA,CACpB,QAAA,EACA,MAAA,EACA,GAAA,EACA,SAAS,KAAA,EACe;AAExB,EAAA,MAAM,QAAA,GAAW,MAAM,oBAAA,CAAqB,MAAA,CAAO,QAAQ,GAAG,CAAA;AAC9D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,EAAE,UAAU,MAAA,EAAQ,MAAA,CAAO,QAAQ,gBAAA,EAAkB,IAAA,EAAM,QAAQ,KAAA,EAAM;AAAA,EAClF;AAGA,EAAA,IAAI,OAAO,SAAA,EAAW;AACpB,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,KAAU,MAAA,CAAO,SAAA;AAExC,IAAA,IAAI,CAAE,MAAM,mBAAA,CAAoB,OAAO,CAAA,EAAI;AACzC,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,gBAAA,EAAkB,KAAA;AAAA,QAClB,MAAA;AAAA,QACA,gBAAgB,CAAA,EAAG,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAAA,QAC5C,KAAA,EAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,wCAAA;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,CAAA,EAAG,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAE/C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,kBAAkB,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAW;AAAA,IAC9G;AAEA,IAAA,MAAM,UAAA,CAAW,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,KAAK,CAAA;AAC1C,IAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,gBAAA,EAAkB,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAgB,QAAA,EAAU,cAAA,EAAgB,UAAA,EAAW;AAAA,EACzI;AAGA,EAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,EAAE,OAAA,EAAS,IAAA,KAAS,iBAAA,CAAkB,MAAA,CAAO,aAAa,GAAG,CAAA;AACnE,IAAA,MAAM,aAAa,CAAA,EAAG,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAE/C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,kBAAkB,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,cAAA,EAAgB,UAAA,EAAW;AAAA,IAC9G;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,CAAA,WAAA,EAAc,QAAQ,CAAA,mBAAA,CAAqB,CAAA;AAChF,MAAA,OAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,MAAA,CAAO,MAAA,EAAQ,kBAAkB,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,cAAA,EAAgB,UAAA,EAAW;AAAA,IAC/G,SAAS,GAAA,EAAK;AACZ,MAAA,OAAO;AAAA,QACL,QAAA;AAAA,QACA,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,gBAAA,EAAkB,KAAA;AAAA,QAClB,MAAA,EAAQ,KAAA;AAAA,QACR,cAAA,EAAgB,UAAA;AAAA,QAChB,OAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG;AAAA,OACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,gBAAA,EAAkB,KAAA;AAAA,IAClB,MAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAIA,SAAS,iBAAA,CAAkB,UAAoB,GAAA,EAAkD;AAE/F,EAAA,MAAM,EAAA,GAAK,yBAAyB,GAAG,CAAA;AACvC,EAAA,IAAI,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC9E,EAAA,IAAI,EAAA,KAAO,MAAA,EAAQ,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC9E,EAAA,IAAI,EAAA,KAAO,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,CAAC,KAAA,EAAO,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAC5E,EAAA,OAAO,EAAE,SAAS,KAAA,EAAO,IAAA,EAAM,CAAC,SAAA,EAAW,IAAA,EAAM,GAAG,QAAQ,CAAA,EAAE;AAChE;AAEA,SAAS,yBAAyB,GAAA,EAA6B;AAE7D,EAAA,IAAIC,YAAgBC,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,gBAAgB,CAAC,GAAG,OAAO,MAAA;AACzD,EAAA,IAAID,WAAAA,CAAgBC,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,CAAA,IAAKD,WAAAA,CAAgBC,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,UAAU,CAAC,CAAA,EAAG,OAAO,KAAA;AAC9F,EAAA,IAAID,YAAgBC,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,GAAG,OAAO,MAAA;AACpD,EAAA,OAAO,KAAA;AACT;AAEA,SAASD,YAAW,QAAA,EAA2B;AAC7C,EAAA,IAAI;AACF,IAAA,SAAA,CAAQ,IAAS,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,UAAA,CAAW,OAAA,EAAiB,IAAA,EAAgB,GAAA,EAAa,KAAA,EAA8B;AAC9F,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACF,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,iBAAiB,OAAA,CAAQ,QAAA,KAAa,OAAA,IAAW,eAAA,CAAgB,KAAK,OAAO,CAAA;AACnF,IAAA,MAAM,KAAA,GAAQI,KAAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,MACjC,GAAA;AAAA,MACA,KAAKC,aAAAA,EAAc;AAAA,MACnB,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,SAAS,MAAM,CAAA;AACxB,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,IAAA,KAAS,CAAA,EAAGL,QAAAA,EAAQ;AAAA,WACnB,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,kBAAA,EAAqB,IAAA,IAAQ,MAAM,CAAA,CAAE,CAAC,CAAA;AAAA,IAClF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAtOA,IA4Ba,gBAAA,EAkFA,mBAAA;AA9Gb,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAGA,IAAA,qBAAA,EAAA;AAyBO,IAAM,gBAAA,GAAyD;AAAA,MACpE,UAAA,EAAY;AAAA,QACV,MAAA,EAAQ,4BAAA;AAAA,QACR,WAAA,EAAa,CAAC,YAAA,EAAc,4BAA4B,CAAA;AAAA,QACxD,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,YAAA,EAAc,iBAAA,EAAmB,cAAc,iBAAiB,CAAA;AAAA,QAC5E,YAAA,EAAc,CAAC,eAAA,EAAiB,eAAA,EAAiB,cAAc;AAAA,OACjE;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,oBAAA;AAAA,QACR,WAAA,EAAa,CAAC,SAAS,CAAA;AAAA,QACvB,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,QACpB,YAAA,EAAc,CAAC,gBAAA,EAAkB,oBAAA,EAAsB,YAAY,kBAAkB;AAAA,OACvF;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,6BAAA;AAAA,QACR,WAAA,EAAa,CAAC,8BAA8B,CAAA;AAAA,QAC5C,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,QAClB,YAAA,EAAc,CAAC,cAAc;AAAA,OAC/B;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,6BAAA;AAAA,QACR,WAAA,EAAa,CAAC,8BAA8B,CAAA;AAAA,QAC5C,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,QAClB,YAAA,EAAc,CAAC,cAAc;AAAA,OAC/B;AAAA,MACA,GAAA,EAAK;AAAA,QACH,MAAA,EAAQ,4BAAA;AAAA,QACR,WAAA,EAAa,CAAC,8BAA8B,CAAA;AAAA,QAC5C,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,QACzB,YAAA,EAAc,CAAC,cAAc;AAAA,OAC/B;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,sBAAA;AAAA,QACR,WAAA,EAAa,CAAC,sBAAsB,CAAA;AAAA,QACpC,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,QAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,QAClB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM;AAAA,OACvC;AAAA,MACA,KAAA,EAAO;AAAA,QACL,MAAA,EAAQ,sBAAA;AAAA,QACR,WAAA,EAAa,CAAC,sBAAsB,CAAA;AAAA,QACpC,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,QACd,SAAA,EAAW,CAAC,aAAa,CAAA;AAAA,QACzB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM;AAAA,OACvC;AAAA,MACA,EAAA,EAAI;AAAA,QACF,MAAA,EAAQ,OAAA;AAAA,QACR,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,CAAC,SAAA,EAAW,iCAAiC,CAAA;AAAA,UACnD,KAAA,EAAO;AAAA,SACT;AAAA,QACA,SAAA,EAAW,CAAC,IAAI,CAAA;AAAA,QAChB,YAAA,EAAc,CAAC,QAAA,EAAU,SAAS;AAAA,OACpC;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,eAAA;AAAA,QACR,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,QAAA;AAAA,UACT,IAAA,EAAM,CAAC,WAAA,EAAa,KAAA,EAAO,eAAe,CAAA;AAAA,UAC1C,KAAA,EAAO;AAAA,SACT;AAAA,QACA,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,QAClB,YAAA,EAAc,CAAC,YAAY;AAAA,OAC7B;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,MAAA,EAAQ,UAAA;AAAA,QACR,SAAA,EAAW;AAAA,UACT,OAAA,EAAS,KAAA;AAAA,UACT,IAAA,EAAM,CAAC,SAAA,EAAW,UAAU,CAAA;AAAA,UAC5B,KAAA,EAAO;AAAA,SACT;AAAA,QACA,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,QAClB,YAAA,EAAc,CAAC,SAAA,EAAW,eAAe;AAAA;AAC3C,KACF;AAEO,IAAM,mBAAA,GAAsB,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5GxD,IAAM,OAAA,GAAwC;AAAA,EACnD,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,4BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,YAAA,EAAc,iBAAA,EAAmB,cAAc,iBAAiB,CAAA;AAAA,IAC5E,YAAA,EAAc,CAAC,eAAA,EAAiB,eAAA,EAAiB,cAAc,CAAA;AAAA,IAC/D,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,IAAI,CAAA;AAAA,IAChB,YAAA,EAAc,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,IAClC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,YAAY,CAAA;AAAA,IAC3B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,oBAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,QAAQ,CAAA;AAAA,IACpB,YAAA,EAAc,CAAC,gBAAA,EAAkB,oBAAA,EAAsB,YAAY,kBAAkB,CAAA;AAAA,IACrF,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,6BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,6BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,4BAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,KAAA,EAAO,MAAM,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,cAAc,CAAA;AAAA,IAC7B,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,sBAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,IACrC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,sBAAA;AAAA,IACT,IAAA,EAAM,CAAC,OAAO,CAAA;AAAA,IACd,SAAA,EAAW,CAAC,aAAa,CAAA;AAAA,IACzB,YAAA,EAAc,CAAC,cAAA,EAAgB,MAAM,CAAA;AAAA,IACrC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA,GACX;AAAA,EACA,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,UAAA;AAAA,IACT,SAAA,EAAW,CAAC,MAAM,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,SAAA,EAAW,eAAe,CAAA;AAAA,IACzC,gBAAA,EAAkB,IAAA;AAAA,IAClB,OAAA,EAAS;AAAA;AAEb,CAAA;;;AC/EA,qBAAA,EAAA;AAEA,eAAsB,mBAAA,CACpB,WAAA,EACA,GAAA,GAAM,OAAA,CAAQ,KAAI,EACqB;AACvC,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,IAAI,CAAA,KAAM,CAAC,GAAA,CAAI,IAAI,CAAC,CAAA;AACrE,EAAA,MAAM,QAAA,GAAW,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC7B,QAAQ,GAAA,CAAI,OAAO,CAAC,IAAA,EAAM,GAAG,CAAA,KAAM,CAAC,IAAA,EAAM,GAAA,EAAK,MAAM,oBAAA,CAAqB,GAAA,CAAI,OAAA,EAAS,GAAG,CAAC,CAAU;AAAA,GACvG;AACA,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAA,EAAK,OAAO,KAAK,QAAA,EAAU;AAC3C,IAAA,IAAI,SAAS,GAAA,CAAI,IAAI,IAAI,EAAE,GAAG,KAAK,OAAA,EAAQ;AAAA,EAC7C;AACA,EAAA,OAAO,GAAA;AACT;ACbO,IAAM,WAAA,GAAc,sBAAA;AAEpB,IAAM,cAAA,GAAiD;AAAA,EAC5D,SAAA,EAAW,MAAA;AAAA,EACX,oBAAA,EAAsB,YAAA;AAAA,EACtB,iBAAA,EAAmB,IAAA;AAAA,EACnB,cAAA,EAAgB,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,EACnC,qBAAA,EAAuB,CAAA;AAAA,EACvB,mBAAA,EAAqB,EAAA;AAAA,EACrB,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEO,IAAM,mBAAA,GAAkC;AAAA,EAC7C,IAAA,EAAM,QAAA;AAAA,EACN,UAAA,EAAY;AAAA,IACV,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,IAC1B,SAAA,EAAW,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA,EAAE;AAAA,IAC9D,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,YAAA,EAAc,QAAQ,CAAA,EAAE;AAAA,IACvE,iBAAA,EAAmB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACrC,cAAA,EAAgB;AAAA,MACd,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,CAAC,OAAA,EAAS,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAE,KACtE;AAAA,IACA,qBAAA,EAAuB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACzC,mBAAA,EAAqB,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IACvC,YAAA,EAAc,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,IAChC,eAAA,EAAiB,EAAE,IAAA,EAAM,SAAA;AAAU;AAEvC,CAAA;AAEO,SAAS,kBAAkB,GAAA,EAA+B;AAC/D,EAAA,MAAM,SAAA,GAAY,oBAAoB,GAAG,CAAA;AACzC,EAAA,MAAM,MAAM,SAAA,IAAa,GAAA,CAAI,OAAO,UAAA,GAAa,WAAW,KAAK,EAAC;AAClE,EAAA,OAAO,YAAY,GAAG,CAAA;AACxB;AAEO,SAAS,YAAY,GAAA,EAAuD;AACjF,EAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,CAAI,OAAO,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,GAC7C,GAAA,CAAI,cAAA,CAAe,MAAA,CAAO,cAAc,CAAA,GACxC,cAAA,CAAe,cAAA;AAEnB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,SAAA,EAAW,KAAA,CAAM,GAAA,CAAI,SAAA,EAAW,CAAC,QAAQ,OAAA,EAAS,OAAO,CAAA,EAAG,cAAA,CAAe,SAAS,CAAA;AAAA,IACpF,oBAAA,EAAsB,KAAA;AAAA,MACpB,GAAA,CAAI,oBAAA;AAAA,MACJ,CAAC,cAAc,QAAQ,CAAA;AAAA,MACvB,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,iBAAA,EAAmB,WAAA,CAAY,GAAA,CAAI,iBAAA,EAAmB,eAAe,iBAAiB,CAAA;AAAA,IACtF,cAAA,EAAgB,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,WAAW,cAAA,CAAe,cAAA;AAAA,IAChE,qBAAA,EAAuB,WAAA;AAAA,MACrB,GAAA,CAAI,qBAAA;AAAA,MACJ,cAAA,CAAe;AAAA,KACjB;AAAA,IACA,mBAAA,EAAqB,WAAA,CAAY,GAAA,CAAI,mBAAA,EAAqB,eAAe,mBAAmB,CAAA;AAAA,IAC5F,cACE,OAAO,GAAA,CAAI,iBAAiB,SAAA,GAAY,GAAA,CAAI,eAAe,cAAA,CAAe,YAAA;AAAA,IAC5E,iBACE,OAAO,GAAA,CAAI,oBAAoB,SAAA,GAC3B,GAAA,CAAI,kBACJ,cAAA,CAAe;AAAA,GACvB;AACF;AAEA,SAAS,oBAAoB,GAAA,EAA+D;AAC1F,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,CAAU,IAAI,MAAA,CAAO,WAAW,GAAG,OAAO,MAAA;AACnD,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,SAAA,CAAU,OAAA,CAAQ,OAAO,WAAW,CAAA,CAAE,aAAa,WAAW,CAAA;AAAA,EAC3E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,KAAA,EAA8C;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,SAAU,EAAC;AAC9B,EAAA,MAAM,MAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC/C,IAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AACpB,IAAA,IAAI,OAAO,GAAA,CAAI,OAAA,KAAY,QAAA,EAAU;AACrC,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,IAAK,GAAA,CAAI,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,EAAG;AACrF,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI;AAAA,MACV,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,IAAA,EAAM,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA;AAAA,MAC1B,GAAA,EAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAAA,MACzB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAA,EAAc,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA;AAAA,MAC1C,uBAAuB,GAAA,CAAI,qBAAA;AAAA,MAC3B,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,gBAAA,EAAkB,WAAA,CAAY,GAAA,CAAI,gBAAA,EAAkB,IAAM,CAAA;AAAA,MAC1D,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,SAAA,GAAY,IAAI,OAAA,GAAU;AAAA,KAC5D;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;AAUA,SAAS,KAAA,CAAwB,KAAA,EAAgB,OAAA,EAAuB,QAAA,EAAgB;AACtF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,QAAQ,QAAA,CAAS,KAAU,IAAK,KAAA,GAAc,QAAA;AACpF;AAEA,SAAS,WAAA,CAAY,OAAgB,QAAA,EAA0B;AAC7D,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,MAAA,CAAO,UAAU,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,QAAA;AACrF;AAEA,SAAS,YAAY,KAAA,EAAsC;AACzD,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA,KAAM,OAAO,CAAA,KAAM,QAAQ,CAAA,GAAI,KAAA,GAAQ,MAAA;AACrF;AAEA,SAAS,aAAa,KAAA,EAAoD;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,MAAA;AAC7B,EAAA,MAAM,MAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,GAAI,CAAA;AAAA,EACtC;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAAuC;AAC7D,EAAA,OAAO,UAAU,OAAA,IAAW,KAAA,KAAU,SAAA,IAAa,KAAA,KAAU,UAAU,KAAA,KAAU,MAAA;AACnF;AAEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;ACzIO,IAAM,YAAA,GAAiD;AAAA,EAC5D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,MAAA,EAAQ,YAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,QAAA,EAAU,OAAA;AAAA,EACV,IAAA,EAAM,GAAA;AAAA,EACN,IAAA,EAAM,GAAA;AAAA,EACN,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,KAAA,EAAO,QAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,MAAA,EAAQ,MAAA;AAAA,EACR,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,aAAA;AAAA,EACP,OAAA,EAAS;AACX,CAAA;AAEA,IAAM,YAAA,GAAiD;AAAA,EACrD,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU,UAAA;AAAA,EACV,gBAAA,EAAkB,OAAA;AAAA,EAClB,eAAA,EAAiB,MAAA;AAAA,EACjB,cAAA,EAAgB;AAClB,CAAA;AAEO,SAAS,cAAc,QAAA,EAAiC;AAC7D,EAAA,MAAM,IAAA,GAAYM,cAAS,QAAQ,CAAA;AACnC,EAAA,MAAM,KAAA,GAAQ,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,OAAO,OAAO,KAAA;AAElB,EAAA,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,KAAK,QAAA,CAAS,UAAU,GAAG,OAAO,YAAA;AACnE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,WAAW,GAAG,OAAO,iBAAA;AACrE,EAAA,IAAI,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,KAAK,QAAA,CAAS,UAAU,GAAG,OAAO,YAAA;AACnE,EAAA,IAAI,IAAA,CAAK,SAAS,WAAW,CAAA,IAAK,KAAK,QAAA,CAAS,WAAW,GAAG,OAAO,iBAAA;AAErE,EAAA,OAAO,YAAA,CAAkBA,IAAA,CAAA,OAAA,CAAQ,IAAI,CAAC,CAAA,IAAK,IAAA;AAC7C;ACrDO,SAAS,UAAU,QAAA,EAA0B;AAClD,EAAA,OAAO,aAAA,CAAmBC,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,EAAE,QAAA,EAAS;AACxD;AAEO,SAAS,UAAU,GAAA,EAAqB;AAC7C,EAAA,OAAO,cAAc,GAAG,CAAA;AAC1B;AAEO,SAAS,WAAA,CAAY,UAAkB,GAAA,EAAqB;AACjE,EAAA,MAAM,GAAA,GAAWA,IAAA,CAAA,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AACvC,EAAA,OAAO,GAAA,IAAO,CAAC,GAAA,CAAI,UAAA,CAAW,IAAI,CAAA,IAAK,CAAMA,IAAA,CAAA,UAAA,CAAW,GAAG,CAAA,GAAI,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,GAAI,QAAA;AAC3F;;;ACJO,IAAM,kBAAN,MAAsB;AAAA,EAI3B,WAAA,CACmB,QAAA,EACA,GAAA,EACjB,GAAA,EACiB,MAAA,EACjB;AAJiB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EANmB,QAAA;AAAA,EACA,GAAA;AAAA,EAEA,MAAA;AAAA,EAPF,IAAA,uBAAW,GAAA,EAA6B;AAAA,EACjD,GAAA;AAAA,EAWR,OAAO,GAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACb;AAAA,EAEA,MAAM,mBAAmB,KAAA,EAAiD;AACxE,IAAA,IAAI,CAAC,MAAM,EAAA,EAAI;AACf,IAAA,IAAI,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,OAAA,EAAS;AAC9E,IAAA,MAAM,QAAQ,KAAA,CAAM,KAAA;AACpB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,SAAS,QAAA,EAAU;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AACvC,IAAA,IAAI,MAAM,IAAA,KAAS,MAAA,EAAQ,MAAM,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,SAC7C,MAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAAA,EACrC;AAAA,EAEA,MAAM,YAAY,QAAA,EAAiC;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI;AACF,MAAA,IAAA,GAAO,MAAS,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAAA,IAC1C,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,OAAO,IAAI,GAAG,CAAA;AACxE,MAAA;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,OAAA,EAAA;AACJ,IAAA,GAAA,CAAI,IAAA,GAAO,IAAA;AACX,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAE3C,MAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,CAAC,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/E,MAAA,MAAA,CAAO,eAAA,CAAgB,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ,EAAG,IAAI,CAAA;AACnE,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,IAAA,CAAK,QAAA,EAAkB,SAAA,EAAmC;AAC9D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACrC,IAAA,MAAM,UAAA,GAAa,cAAc,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,MAAA,IAAA,GAAO,SAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,MAAS,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,MAAM,CAAA;AAAA,MAC1C,SAAS,GAAA,EAAK;AACZ,QAAA,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,OAAO,IAAI,GAAG,CAAA;AAChE,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA;AAE/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,GAAM;AAAA,QACJ,GAAA,EAAK,UAAU,OAAO,CAAA;AAAA,QACtB,IAAA,EAAM,OAAA;AAAA,QACN,UAAA;AAAA,QACA,OAAA,EAAS,CAAA;AAAA,QACT,IAAA;AAAA,QACA,WAAA,sBAAiB,GAAA;AAAI,OACvB;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,GAAG,CAAA;AAC1B,MAAA,IAAA,CAAK,MAAA,EAAQ,KAAK,qBAAA,EAAuB,EAAE,MAAM,OAAA,EAAS,QAAA,EAAU,YAAY,CAAA;AAAA,IAClF,CAAA,MAAA,IAAW,SAAA,KAAc,MAAA,IAAa,SAAA,KAAc,IAAI,IAAA,EAAM;AAC5D,MAAA,GAAA,CAAI,OAAA,EAAA;AACJ,MAAA,GAAA,CAAI,IAAA,GAAO,SAAA;AACX,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAC3C,QAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,CAAC,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAC/E,QAAA,IAAI,CAAC,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACvC,QAAA,MAAA,CAAO,eAAA,CAAgB,EAAE,GAAA,EAAK,GAAA,CAAI,KAAK,OAAA,EAAS,GAAA,CAAI,OAAA,EAAQ,EAAG,SAAS,CAAA;AAAA,MAC1E;AAAA,IACF;AACA,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAC3C,MAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,CAAC,OAAO,MAAA,CAAO,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAE/E,MAAA,IAAI,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,aAAA,CAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,MAAA,EAAkC;AAEtD,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC9B,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AAEpC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,UAAU,QAAA,CAAS,GAAA,CAAI,UAAU,CAAA,EAAG;AACvD,MAAA,MAAA,CAAO,aAAA,CAAc,kBAAA,CAAmB,GAAG,CAAC,CAAA;AAC5C,MAAA,GAAA,CAAI,WAAA,CAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,aAAA,GAA+B;AACnC,IAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAO,EAAG;AACpC,MAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,QAAA,EAAS,CAAE,MAAK,EAAG;AAE3C,QAAA,IAAI,MAAA,CAAO,UAAU,OAAA,IAAW,GAAA,CAAI,YAAY,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAChE,UAAA,MAAA,CAAO,cAAA,CAAe,IAAI,GAAG,CAAA;AAC7B,UAAA,IAAA,CAAK,QAAQ,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EAClB;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,KAAK,IAAA,CAAK,GAAA,CAAI,KAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA,IAAK,IAAA;AAAA,EAClD;AAAA,EAEA,IAAA,GAAmC;AACjC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEQ,QAAQ,QAAA,EAA0B;AACxC,IAAA,OAAYC,IAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAASA,IAAA,CAAA,SAAA,CAAU,QAAQ,CAAA,GAASA,IAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAA;AAAA,EAC/F;AACF,CAAA;AAEA,SAAS,mBAAmB,GAAA,EAAwC;AAClE,EAAA,OAAO;AAAA,IACL,KAAK,GAAA,CAAI,GAAA;AAAA,IACT,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,SAAS,GAAA,CAAI,OAAA;AAAA,IACb,MAAM,GAAA,CAAI;AAAA,GACZ;AACF;;;ACxIO,SAAS,mBAAmB,OAAA,EAAyB;AAE1D,EAAA,OAAO,CAAC,GAAA,EAAM,GAAA,EAAM,IAAM,EAAE,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAC,CAAA,IAAK,IAAA;AACpE;;;ACqDO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAClC,WAAA,CACW,IAAA,EACT,OAAA,EACS,OAAA,EACT;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJJ,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGT,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AAAA,EACd;AAAA,EANW,IAAA;AAAA,EAEA,OAAA;AAKb,CAAA;AC9EO,SAAS,SAAA,CAAU,KAAmB,GAAA,EAA6C;AAExF,EAAA,MAAM,QAAQ,OAAA,CAAQ,QAAA,KAAa,WAAW,eAAA,CAAgB,IAAA,CAAK,IAAI,OAAO,CAAA;AAC9E,EAAA,OAAOJ,MAAM,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,IAAA,IAAQ,EAAC,EAAG;AAAA,IACxC,GAAA;AAAA,IACA,KAAKC,aAAAA,CAAc,EAAE,KAAA,EAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACrC,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AAAA,IAC9B,KAAA;AAAA,IACA,WAAA,EAAa;AAAA,GACd,CAAA;AACH;;;ACZA,eAAsB,kBAAA,CACpB,OAAA,EACA,EAAA,EACA,MAAA,EACY;AACZ,EAAA,IAAI,MAAA,EAAQ,OAAA,EAAS,MAAM,UAAA,CAAW,MAAM,CAAA;AAC5C,EAAA,IAAI,KAAA;AACJ,EAAA,OAAO,MAAM,IAAI,OAAA,CAAW,CAACL,UAAS,MAAA,KAAW;AAC/C,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,MAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,OAAO,CAAA;AAAA,IAC9C,CAAA;AACA,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,UAAA,CAAW,MAAM,CAAC,CAAA;AAAA,IAC3B,CAAA;AACA,IAAA,KAAA,GAAQ,WAAW,MAAM;AACvB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,QAAA,CAAA,qBAAA,uBAAsC,CAAA,4BAAA,EAA+B,EAAE,IAAI,CAAC,CAAA;AAAA,IACzF,GAAG,EAAE,CAAA;AACL,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAC,KAAA,KAAU;AACT,QAAA,OAAA,EAAQ;AACR,QAAAA,SAAQ,KAAK,CAAA;AAAA,MACf,CAAA;AAAA,MACA,CAAC,GAAA,KAAQ;AACP,QAAA,OAAA,EAAQ;AACR,QAAA,MAAA,CAAO,GAAG,CAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAEA,SAAS,WAAW,MAAA,EAA6B;AAC/C,EAAA,OAAO,QAAQ,MAAA,YAAkB,KAAA,GAAQ,OAAO,MAAA,GAAS,IAAI,MAAM,SAAS,CAAA;AAC9E;;;ACnBO,IAAM,aAAN,MAAiB;AAAA,EAOtB,WAAA,CACmB,OACjB,MAAA,EACA;AAFiB,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AAGjB,IAAA,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AACvD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM,IAAA,CAAK,OAAO,CAAA;AACrC,IAAA,MAAA,CAAO,GAAG,OAAA,EAAS,CAAC,QAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,EAC/C;AAAA,EANmB,KAAA;AAAA,EAPX,MAAA,GAAS,CAAA;AAAA,EACA,OAAA,uBAAc,GAAA,EAAqB;AAAA,EACnC,MAAA,GAAS,IAAI,YAAA,EAAa;AAAA,EACnC,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAAA,EACvB,MAAA,GAAS,KAAA;AAAA,EAWjB,MAAM,WAAA,CACJ,MAAA,EACA,MAAA,EACA,WACA,MAAA,EACY;AACZ,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,MAAA,EAAA;AAChB,IAAA,MAAM,UAA0B,EAAE,OAAA,EAAS,KAAA,EAAO,EAAA,EAAI,QAAQ,MAAA,EAAO;AACrE,IAAA,MAAM,QAAA,GAAW,IAAI,OAAA,CAAW,CAACA,UAAS,MAAA,KAAW;AACnD,MAAA,IAAA,CAAK,QAAQ,GAAA,CAAI,EAAA,EAAI,EAAE,OAAA,EAASA,QAAAA,EAAqC,QAAQ,CAAA;AAC7E,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,kBAAA,CAAmB,QAAA,EAAU,SAAA,EAAW,MAAM,CAAA;AAAA,IAC7D,SAAS,GAAA,EAAK;AACZ,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,IAAI;AACF,UAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAA,EAAmB,EAAE,EAAA,EAAI,CAAA;AAAA,QACjD,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AACA,MAAA,MAAM,eAAe,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,QAAgB,MAAA,EAAuB;AACtD,IAAA,IAAA,CAAK,UAAA,EAAW;AAChB,IAAA,IAAA,CAAK,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,EAAQ,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,cAAA,CAAe,QAAgB,OAAA,EAAgD;AAC7E,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,OAAO,CAAA;AAAA,EAC9C;AAAA,EAEA,QAAQ,OAAA,EAAiC;AACvC,IAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,OAAO,CAAA;AAC/B,IAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,SAAS,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,MAAA,EAAQ;AACjB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAA,CAAA,oBAAA,sBAAqC,uBAAuB,CAAC,CAAA;AAC9E,IAAA,IAAA,CAAK,MAAA,CAAO,KAAK,OAAO,CAAA;AAAA,EAC1B;AAAA,EAEQ,OAAO,KAAA,EAAqB;AAGlC,IAAA,MAAM,UAAA,GAAa,KAAK,IAAA,GAAO,IAAA;AAC/B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,KAAA,CAAM,SAAS,UAAA,EAAY;AAClD,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,CAAK,MAAA,EAAQ,KAAK,CAAC,CAAA;AAChD,IAAA,WAAS;AACP,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAC1C,MAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,MAAA,MAAM,MAAA,GAAS,KAAK,MAAA,CAAO,QAAA,CAAS,GAAG,GAAG,CAAA,CAAE,SAAS,OAAO,CAAA;AAC5D,MAAA,MAAM,KAAA,GAAQ,0BAAA,CAA2B,IAAA,CAAK,MAAM,CAAA;AACpD,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC,CAAA;AAI9B,MAAA,IAAI,CAAC,OAAO,QAAA,CAAS,MAAM,KAAK,MAAA,GAAS,CAAA,IAAK,SAAS,UAAA,EAAY;AACjE,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA;AAC1C,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,MAAA;AACxB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,GAAS,KAAA,EAAO;AAChC,MAAA,MAAM,IAAA,GAAO,KAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG,KAAK,CAAA,CAAE,QAAA,CAAS,MAAM,CAAA;AACjE,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA;AACxC,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,CAAM,IAAI,CAAmB,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,GAAA,EAA2B;AAC/C,IAAA,IAAI,GAAA,CAAI,OAAO,MAAA,IAAa,GAAA,CAAI,OAAO,IAAA,IAAQ,CAAC,IAAI,MAAA,EAAQ;AAC1D,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA;AACxB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAA;AACnC,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtB,MAAA,IAAI,GAAA,CAAI,KAAA;AACN,QAAA,OAAA,CAAQ,MAAA,CAAO,IAAI,QAAA,CAAA,oBAAA,sBAAqC,GAAA,CAAI,MAAM,OAAA,EAAS,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,WAClF,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAC/B,MAAA;AAAA,IACF;AACA,IAAA,IAAI,GAAA,CAAI,QAAQ,IAAA,CAAK,MAAA,CAAO,KAAK,GAAA,CAAI,MAAA,EAAQ,IAAI,MAAM,CAAA;AAAA,EACzD;AAAA,EAEQ,MAAM,OAAA,EAA+B;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAA;AAC5C,IAAA,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,CAAA,gBAAA,EAAmB,KAAK,CAAA;AAAA;AAAA,EAAW,IAAI,IAAI,MAAM,CAAA;AAAA,EACpE;AAAA,EAEQ,UAAA,GAAmB;AACzB,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,MAAM,IAAI,mDAAqC,0BAA0B,CAAA;AAAA,EAC5F;AAAA,EAEQ,QAAQ,GAAA,EAAoB;AAClC,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,cAAA,CAAe,GAAG,CAAC,CAAA;AAC/E,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AACF,CAAA;AAEA,SAAS,eAAe,GAAA,EAAqB;AAC3C,EAAA,IAAI,GAAA,YAAe,OAAO,OAAO,GAAA;AAEjC,EAAA,OAAO,IAAI,QAAA,CAAA,oBAAA,sBAAqC,MAAA,CAAO,GAAG,CAAC,CAAA;AAC7D;ACpJO,IAAM,mBAAA,GAAwD;AAAA,EACnE,SAAA,EAAW;AAAA,IACT,gBAAA,EAAkB,IAAA;AAAA,IAClB,qBAAA,EAAuB,EAAE,mBAAA,EAAqB,KAAA,EAAM;AAAA,IACpD,QAAQ,EAAC;AAAA,IACT,cAAA,EAAgB,EAAE,mBAAA,EAAqB,KAAA;AAAM,GAC/C;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,KAAA;AAAA,MACT,mBAAA,EAAqB,KAAA;AAAA,MACrB,QAAA,EAAU,KAAA;AAAA,MACV,iBAAA,EAAmB;AAAA,KACrB;AAAA,IACA,UAAA,EAAY,EAAE,mBAAA,EAAqB,KAAA,EAAM;AAAA,IACzC,UAAA,EAAY,EAAE,WAAA,EAAa,IAAA,EAAK;AAAA,IAChC,YAAY,EAAC;AAAA,IACb,OAAO,EAAE,aAAA,EAAe,CAAC,UAAA,EAAY,WAAW,CAAA,EAAE;AAAA,IAClD,cAAA,EAAgB,EAAE,iCAAA,EAAmC,IAAA,EAAK;AAAA,IAC1D,MAAA,EAAQ,EAAE,cAAA,EAAgB,IAAA,EAAK;AAAA,IAC/B,YAAY;AAAC,GACf;AAAA,EACA,OAAA,EAAS,EAAE,iBAAA,EAAmB,CAAC,QAAQ,CAAA;AACzC,CAAA;AAEA,eAAsB,gBAAA,CACpB,UAAA,EACA,SAAA,EACA,QAAA,EACA,WACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,OAAA,GAAUS,aAAAA,CAAc,QAAQ,CAAA,CAAE,QAAA,EAAS;AACjD,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,WAAW,OAAA,CAAQ,GAAA;AAAA,IACnB,QAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA,EAAc,mBAAA;AAAA,IACd,uBAAuB,SAAA,CAAU,qBAAA;AAAA,IACjC,gBAAA,EAAkB;AAAA,MAChB;AAAA,QACE,GAAA,EAAK,OAAA;AAAA,QACL,MACE,QAAA,CACG,KAAA,CAAM,OAAO,CAAA,CACb,KAAI,IAA0B;AAAA;AACrC;AACF,GACF;AACA,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,WAAA;AAAA,IAC9B,YAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,UAAA,CAAW,gBAAA,CAAiB,aAAA,EAAe,EAAE,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,YAAA;AAChB;;;ACxBO,IAAM,YAAN,MAAgB;AAAA,EASrB,WAAA,CACW,IAAA,EACA,MAAA,EACQ,GAAA,EACjB;AAHS,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEjB,IAAA,IAAI,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO,IAAA,CAAK,KAAA,GAAQ,UAAA;AAAA,EAC7C;AAAA,EALW,IAAA;AAAA,EACA,MAAA;AAAA,EACQ,GAAA;AAAA,EAXnB,KAAA,GAAqB,QAAA;AAAA,EACrB,YAAA,GAA0C,IAAA;AAAA,EACjC,WAAA,uBAAkB,GAAA,EAA0B;AAAA,EAC7C,KAAA,GAA+C,IAAA;AAAA,EAC/C,UAAA,GAAgC,IAAA;AAAA,EAChC,mBAAA,GAAsB,KAAA;AAAA,EACtB,aAAuB,EAAC;AAAA,EAUhC,IAAI,QAAA,GAAmB;AACrB,IAAA,OAAO,KAAK,GAAA,CAAI,QAAA;AAAA,EAClB;AAAA,EAEA,IAAI,UAAA,GAAqB;AACvB,IAAA,OAAO,KAAK,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,GAAsB,IAAI,eAAA,GAAkB,MAAA,EAAuB;AAC7E,IAAA,IAAI,KAAK,KAAA,KAAU,OAAA,IAAW,KAAK,KAAA,KAAU,UAAA,IAAc,KAAK,KAAA,KAAU,cAAA;AACxE,MAAA;AACF,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,KAAA,EAAO;AACjC,MAAA,IAAA,CAAK,KAAA,GAAQ,UAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,KAAA,GAAQ,UAAA;AACb,IAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,qBAAA,EAAuB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAA;AAC7F,IAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,QAAQ,CAAA;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,KAAA,CAAM,MAAA,CAAO,GAAG,MAAA,EAAQ,CAAC,UAAkB,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AACpE,IAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AAC9B,MAAA,MAAM,kBAAkB,IAAA,CAAK,mBAAA;AAC7B,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,eAAA,IAAmB,IAAA,CAAK,UAAU,QAAA,EAAU;AAC7D,QAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB;AAAA,UACzC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,OAAO,CAAA,oBAAA,EAAuB,IAAA,IAAQ,MAAM,CAAA,QAAA,EAAW,OAAO,MAAM,CAAA;AAAA,SACrE,CAAA;AACD,QAAA,IAAI,eAAA,EAAiB,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAAA,MAC9C;AACA,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,mBAAA,EAAqB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,GAAA,EAAK,CAAA;AAChF,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,IAC7B,CAAC,CAAA;AACD,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,MAAM,kBAAkB,IAAA,CAAK,mBAAA;AAC7B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,oBAAA,EAAsB,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,GAAA,CAAI,OAAA,EAAS,CAAA;AAClF,MAAA,IAAI,eAAA,EAAiB,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,IAAI,CAAA;AAC5C,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAAA,IAC7B,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,aAAa,IAAI,UAAA,CAAW,KAAA,CAAM,KAAA,EAAO,MAAM,MAAM,CAAA;AAC1D,IAAA,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,iCAAA,EAAmC,CAAC,MAAA,KAAW;AAC5E,MAAA,MAAM,CAAA,GAAI,MAAA;AACV,MAAA,IAAI,CAAC,EAAE,GAAA,IAAO,CAAC,MAAM,OAAA,CAAQ,CAAA,CAAE,WAAW,CAAA,EAAG;AAC7C,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,CAAA,CAAE,GAAA,EAAK,EAAE,WAAW,CAAA;AACzC,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,yBAAA,EAA2B;AAAA,QAC9C,IAAA,EAAM,CAAA,CAAE,GAAA,CAAI,UAAA,CAAW,OAAO,IAAI,SAAA,CAAU,CAAA,CAAE,GAAG,CAAA,GAAI,CAAA,CAAE,GAAA;AAAA,QACvD,KAAA,EAAO,EAAE,WAAA,CAAY;AAAA,OACtB,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,cAAA,CAAe,mBAAA,EAAqB,CAAC,MAAA,KAAW;AAC9D,MAAA,IAAI,KAAK,MAAA,CAAO,OAAA,KAAY,KAAA,IAAS,MAAA,IAAU,KAAK,MAAA,EAAQ;AAC1D,QAAA,IAAA,CAAK,IAAI,GAAA,CAAI,KAAA,CAAM,OAAO,IAAA,CAAK,IAAI,QAAQ,MAAM,CAAA;AAAA,MACnD;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,UAAA,CAAW,QAAQ,MAAM;AAC5B,MAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,EAAS,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,IAC3C,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,KAAA,GAAQ,cAAA;AACb,IAAA,MAAM,OAAA,GAAU,eAAe,KAAK,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,OAAA,CAAQ,IAAA,CAAK;AAAA,QACrC,gBAAA;AAAA,UACE,IAAA,CAAK,UAAA;AAAA,UACL,IAAA,CAAK,MAAA;AAAA,UACL,KAAK,GAAA,CAAI,QAAA;AAAA,UACT,IAAA,CAAK,OAAO,gBAAA,IAAoB,IAAA;AAAA,UAChC;AAAA,SACF;AAAA,QACA,OAAA,CAAQ;AAAA,OACT,CAAA;AACD,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,MAAA,IAAA,CAAK,mBAAA,GAAsB,IAAA;AAC3B,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,kBAAA,EAAoB;AAAA,QACvC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,OACxB,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,MAAA,EAAO;AACf,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AACb,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,OAAO,IAAA,EAAK;AACjB,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,MAAA,MAAM,GAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,QAAA,IAAY,IAAA,CAAK,UAAU,UAAA,EAAY;AAC1D,IAAA,IAAA,CAAK,KAAA,GAAQ,eAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,QAAA,MAAM,IAAA,CAAK,UAAA,CACR,WAAA,CAAY,UAAA,EAAY,IAAA,EAAM,GAAA,EAAM,IAAA,CAAK,MAAM,CAAA,CAC/C,KAAA,CAAM,MAAM,KAAA,CAAS,CAAA;AACxB,QAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,MAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,MAAA,IAAI,IAAA,CAAK,SAAS,CAAC,IAAA,CAAK,MAAM,MAAA,EAAQ,IAAA,CAAK,MAAM,IAAA,EAAK;AACtD,MAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,MAAA,IAAA,CAAK,mBAAA,GAAsB,KAAA;AAC3B,MAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC6C;AAC7C,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC4B;AAC5B,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,EAAqB,SAAA,EAAmB,MAAA,EAA4C;AAC9F,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC3E;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACmD;AACnD,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,yBAAA,EAA2B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAChF;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACwD;AACxD,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,6BAAA,EAA+B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACpF;AAAA,EAEA,MAAM,eAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACqC;AACrC,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,kBAAA,EAAoB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACzE;AAAA,EAEA,MAAM,aAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAGA;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,4BAAA,EAA8B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACnF;AAAA,EAEA,MAAM,MAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EAC+B;AAC/B,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,qBAAA,EAAuB,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC5E;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,IAAA,OAAQ,MAAM,KAAK,OAAA,CAAQ,yBAAA,EAA2B,QAAQ,SAAA,EAAW,MAAM,KAAM,EAAC;AAAA,EACxF;AAAA,EAEA,MAAM,cAAA,CACJ,MAAA,EACA,SAAA,EACA,MAAA,EACkB;AAClB,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,0BAAA,EAA4B,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EACjF;AAAA,EAEA,MAAM,eAAA,CACJ,GAAA,EACA,SAAA,EACA,MAAA,EACuB;AACvB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA;AAAA,MACxB,yBAAA;AAAA,MACA,EAAE,YAAA,EAAc,EAAE,GAAA,EAAI,EAAE;AAAA,MACxB,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,KAAA,GAAQ,MAAA,EAAQ,KAAA,IAAS,EAAC;AAChC,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,eAAe,GAAA,EAA2B;AACxC,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAG,KAAK,EAAC;AAAA,EACvC;AAAA,EAEA,cAAc,GAAA,EAA6B;AACzC,IAAA,IAAA,CAAK,YAAA,CAAa,sBAAA,EAAwB,EAAE,YAAA,EAAc,KAAK,CAAA;AAAA,EACjE;AAAA,EAEA,eAAA,CAAgB,KAAsC,IAAA,EAAoB;AACxE,IAAA,IAAA,CAAK,aAAa,wBAAA,EAA0B;AAAA,MAC1C,YAAA,EAAc,GAAA;AAAA,MACd,cAAA,EAAgB,CAAC,EAAE,IAAA,EAAM;AAAA,KAC1B,CAAA;AAAA,EACH;AAAA,EAEA,eAAe,GAAA,EAAmB;AAChC,IAAA,IAAA,CAAK,aAAa,uBAAA,EAAyB,EAAE,cAAc,EAAE,GAAA,IAAO,CAAA;AAAA,EACtE;AAAA,EAEA,uBAAuB,QAAA,EAAmC;AACxD,IAAA,OAAO,EAAE,GAAA,EAAK,SAAA,CAAU,QAAQ,CAAA,EAAE;AAAA,EACpC;AAAA,EAEA,MAAc,OAAA,CACZ,MAAA,EACA,MAAA,EACA,WACA,MAAA,EACY;AACZ,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,IAAW,CAAC,KAAK,UAAA,EAAY;AAC9C,MAAA,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,QAAA,EAAW,IAAA,CAAK,IAAI,CAAA,cAAA,CAAgB,CAAA;AAAA,IACtF;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,YAAe,MAAA,EAAQ,MAAA,EAAQ,WAAW,MAAM,CAAA;AAAA,EAC/E;AAAA,EAEQ,YAAA,CAAa,QAAgB,MAAA,EAAuB;AAC1D,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,OAAA,IAAW,CAAC,KAAK,UAAA,EAAY;AAChD,IAAA,IAAA,CAAK,UAAA,CAAW,gBAAA,CAAiB,MAAA,EAAQ,MAAM,CAAA;AAAA,EACjD;AAAA,EAEQ,cAAc,KAAA,EAAqB;AACzC,IAAA,MAAM,KAAA,GAAQ,MAAM,QAAA,CAAS,MAAM,EAAE,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AAClE,IAAA,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,GAAG,KAAK,CAAA;AAC7B,IAAA,IAAI,IAAA,CAAK,WAAW,MAAA,GAAS,GAAA,OAAU,UAAA,GAAa,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AAAA,EAChF;AACF,CAAA;AAOA,SAAS,eAAe,KAAA,EAGtB;AACA,EAAA,IAAI,UAAU,MAAM,MAAA;AACpB,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAe,CAAC,GAAG,MAAA,KAAW;AAChD,IAAA,MAAM,OAAA,GAAU,CAAC,GAAA,KAAe;AAC9B,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA;AAAA,QACE,IAAI,QAAA,CAAA,mBAAA,qBAAoC,CAAA,4BAAA,EAA+B,GAAA,CAAI,OAAO,IAAI,GAAG;AAAA,OAC3F;AAAA,IACF,CAAA;AACA,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAqB,MAAA,KAAkC;AACrE,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA;AAAA,QACE,IAAI,QAAA;AAAA,UAAA,mBAAA;AAAA,UAEF,CAAA,sCAAA,EAAyC,IAAA,IAAQ,MAAM,CAAA,QAAA,EAAW,UAAU,MAAM,CAAA;AAAA;AACpF,OACF;AAAA,IACF,CAAA;AACA,IAAA,OAAA,GAAU,MAAM;AACd,MAAA,KAAA,CAAM,GAAA,CAAI,SAAS,OAAO,CAAA;AAC1B,MAAA,KAAA,CAAM,GAAA,CAAI,QAAQ,MAAM,CAAA;AAAA,IAC1B,CAAA;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,SAAS,OAAO,CAAA;AAC3B,IAAA,KAAA,CAAM,IAAA,CAAK,QAAQ,MAAM,CAAA;AAAA,EAC3B,CAAC,CAAA;AACD,EAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,OAAA,EAAQ;AACpC;AC1VO,SAAS,iBAAA,CACd,QAAA,EACA,YAAA,EACA,QAAA,EACQ;AACR,EAAA,MAAM,QAAA,GAAW,YAAA,EAAc,MAAA,GAAS,YAAA,GAAe,EAAC;AACxD,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAYC,aAAQ,QAAQ,CAAA;AAEvD,EAAA,IAAI,GAAA,GAAWA,IAAA,CAAA,OAAA,CAAaA,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAYA,IAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAE,IAAA;AAC7B,EAAA,WAAS;AACP,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,IAAI,SAAA,CAAU,GAAA,EAAK,OAAO,CAAA,EAAG,OAAO,GAAA;AAAA,IACtC;AACA,IAAA,IAAI,GAAA,KAAQ,IAAA,EAAM,OAAYA,IAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC9C,IAAA,GAAA,GAAWA,aAAQ,GAAG,CAAA;AAAA,EACxB;AACF;AAEA,SAAS,SAAA,CAAU,KAAa,OAAA,EAA0B;AACxD,EAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,SAAa,GAAA,CAAA,UAAA,CAAgBA,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,OAAO,CAAC,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,OAAA,CACb,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,QAAQ,oBAAA,EAAsB,MAAM,CAAC,CAAA,CACxD,KAAK,IAAI,CAAA;AACZ,EAAA,MAAM,EAAA,GAAK,IAAI,MAAA,CAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAG,CAAA;AACpC,EAAA,IAAI;AACF,IAAA,OAAU,GAAA,CAAA,WAAA,CAAY,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,IAAA,KAAS,EAAA,CAAG,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EACzD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;ACjBO,IAAM,cAAN,MAAkB;AAAA,EAQvB,WAAA,CACmB,GAAA,EACA,OAAA,EACA,GAAA,EACjB;AAHiB,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAEjB,IAAA,IAAA,CAAK,MAAM,GAAA,CAAI,GAAA;AAEf,IAAA,IAAA,CAAK,YAAY,GAAA,CAAI,SAAA;AAAA,EACvB;AAAA,EAPmB,GAAA;AAAA,EACA,OAAA;AAAA,EACA,GAAA;AAAA,EAVF,OAAA,uBAAc,GAAA,EAAuB;AAAA,EACrC,aAAA,uBAAoB,GAAA,EAAoB;AAAA,EACxC,iBAAA,uBAAwB,GAAA,EAAoB;AAAA,EAC5C,eAAA,uBAAsB,GAAA,EAA4B;AAAA,EAC3D,GAAA;AAAA,EACA,SAAA;AAAA,EAYR,MAAM,IAAA,CAAK,GAAA,EAAa,SAAA,GAA2B,IAAA,CAAK,IAAI,SAAA,EAA0B;AACpF,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAI,cAAc,OAAA,EAAS;AACzB,MAAA,MAAM,SAAA,GAAY,MAAM,sBAAA,CAAuB,GAAG,CAAA;AAClD,MAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,QACZ,KAAK,IAAA,EAAK,CACP,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,IAAA,CAAK,CAAC,IAAA,KAAS,SAAA,CAAU,IAAI,IAAI,CAAC,CAAC,CAAA,CACpE,GAAA;AAAA,UAAI,CAAC,CAAA,KACJ,CAAA,CAAE,KAAA,EAAM,CAAE,MAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,gBAAA,CAAA,EAAoB,GAAG,CAAC;AAAA;AAClF,OACJ;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,GAA0B;AAC9B,IAAA,KAAA,MAAW,SAAS,IAAA,CAAK,eAAA,CAAgB,MAAA,EAAO,eAAgB,KAAK,CAAA;AACrE,IAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAC3B,IAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,MACZ,IAAA,CAAK,MAAK,CAAE,GAAA;AAAA,QAAI,CAAC,CAAA,KACf,CAAA,CAAE,QAAA,EAAS,CAAE,MAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,GAAA,CAAI,IAAI,IAAA,CAAK,CAAA,IAAA,EAAO,EAAE,IAAI,CAAA,gBAAA,CAAA,EAAoB,GAAG,CAAC;AAAA;AACrF,KACF;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CAAY,QAAA,EAAkB,MAAA,EAAiD;AACnF,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,MAAM,QAAA,GAAW,cAAc,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AACtB,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,IAAA,IAAI,MAAA,CAAO,KAAA,KAAU,OAAA,IAAW,IAAA,CAAK,cAAc,MAAA,EAAQ;AACzD,MAAA,MAAM,MAAA,CAAO,MAAM,MAAM,CAAA;AACzB,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,IAC3C;AACA,IAAA,OAAO,MAAA,CAAO,KAAA,KAAU,OAAA,GAAU,MAAA,GAAS,IAAA;AAAA,EAC7C;AAAA,EAEA,IAAI,IAAA,EAAgC;AAClC,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,IAAA;AAAA,EACnC;AAAA,EAEA,IAAA,GAA6B;AAC3B,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,IAAA,KAAS,CAAA,OAAQ,cAAA,EAAe;AACjD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,MAAM,IAAA,EAA6B;AACvC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AACnC,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,KAAK,IAAA,EAA6B;AAGtC,IAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AACzB,IAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACvC;AAAA,EAEA,MAAM,QAAQ,IAAA,EAA6B;AACzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAGnC,IAAA,IAAA,CAAK,gBAAgB,IAAI,CAAA;AACzB,IAAA,IAAA,CAAK,iBAAA,CAAkB,OAAO,IAAI,CAAA;AAClC,IAAA,MAAM,OAAO,QAAA,EAAS;AACtB,IAAA,MAAM,OAAO,KAAA,EAAM;AACnB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,EAC3C;AAAA,EAEQ,gBAAgB,IAAA,EAAoB;AAC1C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,IAAI,CAAA;AAC3C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,IAAI,CAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAEQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,EAAG;AAC1D,MAAA,IAAI,GAAA,CAAI,YAAY,KAAA,EAAO;AAC3B,MAAA,MAAM,QAAA,GAAW,iBAAA;AAAA,QACVC,IAAA,CAAA,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAAA,QAC/B,GAAA,CAAI,YAAA;AAAA,QACJ,IAAA,CAAK;AAAA,OACP;AACA,MAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU,IAAA,EAAM,GAAA,EAAK;AAAA,QACtC,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,QAAA;AAAA,QACA,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA;AAAA,QACd,MAAA,EAAQ,KAAK,GAAA,CAAI,MAAA;AAAA,QACjB,OAAA,EAAS,CAAC,OAAA,KAAY,IAAA,CAAK,kBAAkB,OAAO;AAAA,OACrD,CAAA;AACD,MAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAA,EAAM,MAAM,CAAA;AAC7B,MAAA,KAAA,MAAW,QAAA,IAAY,IAAI,SAAA,EAAW;AACpC,QAAA,IAAI,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,EAAG;AACpC,UAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA;AAAA,YACX,iBAAiB,QAAQ,CAAA,6CAAA;AAAA,WAC3B;AACA,UAAA;AAAA,QACF;AACA,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,IAAI,CAAA;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,IAAA,EAAyB;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,CAAG,CAAA;AAC5F,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAAA,EAAyB;AACjD,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAC3C,IAAA,MAAM,UAAU,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA;AAC3D,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,IAAA,CAAK,IAAI,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,6BAAA,CAA+B,CAAA;AACnE,MAAA;AAAA,IACF;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,UAAU,CAAC,CAAA;AACnD,IAAA,MAAA,CAAO,KAAA,GAAQ,cAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACvC,MAAA,KAAK,MAAA,CACF,KAAA,EAAM,CACN,IAAA,CAAK,MAAM;AACV,QAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AACzC,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,eAAA,CAAgB,MAAM,CAAA;AAAA,MAC5C,CAAC,CAAA,CAEA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,IAAA,CAAK,CAAA,IAAA,EAAO,MAAA,CAAO,IAAI,CAAA,mBAAA,EAAsB,OAAA,GAAU,CAAC,CAAA,OAAA,CAAA,EAAW,GAAG,CAAA;AACnF,QAAA,MAAA,CAAO,KAAA,GAAQ,QAAA;AACf,QAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,MAC/B,CAAC,CAAA;AAAA,IAEL,CAAA,EAAG,kBAAA,CAAmB,OAAO,CAAC,CAAA;AAC9B,IAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA;AAAA,EAC7C;AACF,CAAA;AAEA,eAAe,uBAAuB,IAAA,EAAoC;AACxE,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAA,EAAa,KAAA,KAAiC;AACjE,IAAA,IAAI,QAAQ,CAAA,EAAG;AACf,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAASC,GAAA,CAAA,OAAA,CAAQ,GAAA,EAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAAA,IAEzD,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,SAAS,cAAA,IAAkB,KAAA,CAAM,SAAS,MAAA,IAAU,KAAA,CAAM,SAAS,MAAA,EAAQ;AACrF,MAAA,MAAM,CAAA,GAASD,IAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACnC,MAAA,IAAI,MAAM,WAAA,EAAY,QAAS,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,WAC5C;AACH,QAAA,MAAM,IAAA,GAAO,cAAc,CAAC,CAAA;AAC5B,QAAA,IAAI,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,MAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACnB,EAAA,OAAO,KAAA;AACT;;;AC1MA,IAAM,QAAA,GAAyC;AAAA,EAC7C,CAAA,EAAG,OAAA;AAAA,EACH,CAAA,EAAG,SAAA;AAAA,EACH,CAAA,EAAG,MAAA;AAAA,EACH,CAAA,EAAG;AACL,CAAA;AAEA,IAAM,KAAA,GAAsC;AAAA,EAC1C,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,MAAA;AAAA,EACT,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAEO,SAAS,iBAAA,CACd,QACA,IAAA,EAMQ;AACR,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,IAAA,CAAK,cAAc,CAAA;AAC3C,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,WAAW,CAAA,IAAK,MAAA,CAAO,SAAQ,EAAG;AAClD,IAAA,MAAM,QAAA,GAAW,YAEd,MAAA,CAAO,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA,IAAK,OAAO,CAAC,CAAA,CAC/D,IAAA,CAAK,kBAAkB,CAAA,CACvB,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,UAAU,CAAA;AAC3B,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,IAAA,KAAA,EAAA;AACA,IAAA,KAAA,IAAS,QAAA,CAAS,MAAA;AAClB,IAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAC,CAAC,CAAA;AACrD,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,EAAG,YAAY,IAAA,EAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,SAAS,MAAM,CAAA;AAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAChG;AACA,IAAA,IAAI,KAAA,IAAS,KAAK,QAAA,EAAU;AAAA,EAC9B;AACA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,qBAAA;AAClC,EAAA,OAAO,CAAA,EAAG,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC;;AAAA,OAAA,EAAc,KAAK,mBAAmB,KAAK,CAAA,OAAA,CAAA;AAC5E;AAEA,SAAS,iBAAiB,CAAA,EAAuB;AAE/C,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAA,CAAE,QAAA,IAAY,CAAC,CAAA,IAAK,OAAA;AACzC,EAAA,MAAM,SAAS,CAAA,CAAE,MAAA,GAAS,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,EAAG,CAAA,CAAE,IAAA,KAAS,MAAA,GAAY,IAAI,MAAA,CAAO,CAAA,CAAE,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA,GAAK,EAAA;AAC/F,EAAA,MAAM,MAAA,GAAS,OAAO,CAAA,CAAE,OAAA,KAAY,WAAW,CAAA,CAAE,OAAA,GAAU,EAAE,OAAA,CAAQ,KAAA;AACrE,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,KAAK,CAAA;AAChD,EAAA,OAAO,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,IAAA,GAAO,CAAC,IAAI,CAAA,CAAE,KAAA,CAAM,MAAM,SAAA,GAAY,CAAC,IAAI,KAAA,CAAM,GAAG,CAAC,CAAA,EAAG,MAAM,KAAK,GAAG,CAAA,CAAA;AACjG;AAEA,SAAS,kBAAA,CAAmB,GAAe,CAAA,EAAuB;AAChE,EAAA,OAAA,CACG,CAAA,CAAE,YAAY,CAAA,KAAM,CAAA,CAAE,YAAY,CAAA,CAAA,IACnC,CAAA,CAAE,MAAM,KAAA,CAAM,IAAA,GAAO,EAAE,KAAA,CAAM,KAAA,CAAM,QACnC,CAAA,CAAE,KAAA,CAAM,MAAM,SAAA,GAAY,CAAA,CAAE,MAAM,KAAA,CAAM,SAAA;AAE5C;;;AC5DO,SAAS,mBAAmB,QAAA,EAAqC;AACtE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,aAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,MAAM,GAAA,CAAI,KAAA,EAAO,GAAA,EAAK;AACpB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAAmE;AACtF,MAAA,KAAA,MAAW,MAAA,IAAU,QAAA,CAAS,IAAA,EAAK,EAAG;AACpC,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,WAAW,KAAK,MAAA,CAAO,WAAA,CAAY,SAAQ,EAAG;AAC7D,UAAA,MAAA,CAAO,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,WAAW,CAAA;AAAA,QACxC;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,kBAAkB,MAAA,EAAQ;AAAA,UACjC,GAAA,EAAK,GAAA,EAAK,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAAA,UAC7B,cAAA,EAAgB,CAAC,OAAA,EAAS,SAAS,CAAA;AAAA,UACnC,UAAA,EAAY,EAAA;AAAA,UACZ,QAAA,EAAU;AAAA,SACX;AAAA,OACH;AAAA,IACF;AAAA,GACF;AACF;;;ACvBO,SAAS,YAAY,QAAA,EAAqC;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,8BAAA;AAAA,IACb,MAAM,GAAA,GAAM;AACV,MAAA,MAAM,OAAO,QAAA,CAAS,IAAA,EAAK,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM;AACtC,QAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,SAAA,CAAU,KAAK,GAAG,CAAA;AACzC,QAAA,OAAO,GAAG,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA;AAAA,MAC1E,CAAC,CAAA;AACD,MAAA,OAAO,EAAE,SAAS,IAAA,CAAK,MAAA,GAAS,KAAK,IAAA,CAAK,IAAI,IAAI,4BAAA,EAA6B;AAAA,IACjF;AAAA,GACF;AACF;;;ACZO,SAAS,eAAe,QAAA,EAAqC;AAClE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,6CAAA,EAA8C;AAC3E,MAAA,MAAM,QAAA,CAAS,QAAQ,IAAI,CAAA;AAC3B,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,sBAAA,EAAyB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACtD;AAAA,GACF;AACF;;;ACXO,SAAS,aAAa,QAAA,EAAqC;AAChE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,sBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,2CAAA,EAA4C;AACzE,MAAA,MAAM,QAAA,CAAS,MAAM,IAAI,CAAA;AACzB,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACpD;AAAA,GACF;AACF;;;ACXO,SAAS,YAAY,QAAA,EAAqC;AAC/D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,EAAK;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,SAAS,0CAAA,EAA2C;AACxE,MAAA,MAAM,QAAA,CAAS,KAAK,IAAI,CAAA;AACxB,MAAA,OAAO,EAAE,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAI,CAAA,EAAA,CAAA,EAAK;AAAA,IACpD;AAAA,GACF;AACF;ACRA,YAAA,EAAA;AA0BA,SAAS,UAAU,IAAA,EAA6B;AAC9C,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK,CAAE,MAAM,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AACrD,EAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAE,MAAM,MAAA,EAAO;AAE9C,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,CAAC,CAAA,CAAG,WAAA,EAAY;AAElC,EAAA,IAAI,QAAQ,MAAA,IAAU,GAAA,KAAQ,MAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AAC1D,EAAA,IAAI,QAAQ,QAAA,IAAY,GAAA,KAAQ,QAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AAChE,EAAA,IAAI,GAAA,KAAQ,UAAU,GAAA,KAAQ,GAAA,IAAO,QAAQ,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AAE7E,EAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,KAAA,EAAO;AACtC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,IAAA,EAAK;AAAA,EAC3C;AAEA,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,EAAE,MAAM,OAAA,EAAS,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAC5D,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAC1D,EAAA,IAAI,GAAA,KAAQ,SAAA,IAAa,GAAA,KAAQ,QAAA,EAAU,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAEpF,EAAA,IAAI,GAAA,KAAQ,aAAA,IAAiB,GAAA,KAAQ,MAAA,EAAQ;AAC3C,IAAA,OAAO,EAAE,IAAA,EAAM,aAAA,EAAe,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,EAAE;AAAA,EAC/C;AAEA,EAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,GAAA,KAAQ,IAAA,IAAQ,QAAQ,QAAA,EAAU;AACxD,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAChC;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,IAAA,EAAK;AAAA,EAChC;AAEA,EAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,MAAM,MAAA,EAAO;AACjC,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK;AAAA,EACjC;AAEA,EAAA,OAAO,EAAE,MAAM,MAAA,EAAO;AACxB;AAEA,SAAS,QAAA,CAAS,MAAc,IAAA,EAAsB;AACpD,EAAA,MAAM,MAAA,GAAiC;AAAA,IACrC,KAAA,EAAO,UAAA;AAAA,IACP,GAAA,EAAK,UAAA;AAAA,IACL,MAAA,EAAQ,UAAA;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,GAAA,EAAK,SAAA;AAAA,IACL,KAAA,EAAO;AAAA,GACT;AACA,EAAA,OAAO,CAAA,EAAG,OAAO,IAAI,CAAA,IAAK,EAAE,CAAA,EAAG,IAAI,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA;AACpD;AAEO,SAAS,gBAAgB,GAAA,EAA+B;AAC7D,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,QAAA,EAAU,SAAA;AAAA,IACV,OAAA,EAAS,CAAC,QAAQ,CAAA;AAAA,IAClB,WAAA,EACE,8IAAA;AAAA,IACF,QAAA,EAAU,kFAAA;AAAA,IAEV,IAAA,EAAM;AAAA,MACJ,QAAA;AAAA,MACA,8EAAA;AAAA,MACA,8EAAA;AAAA,MACA,wEAAA;AAAA,MACA,iFAAA;AAAA,MACA,6CAAA,GAAgD,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAA;AAAA,MAC7E,8EAAA;AAAA,MACA,6EAAA;AAAA,MACA,gFAAA;AAAA,MACA,mFAAA;AAAA,MACA,EAAA;AAAA,MACA,WAAA;AAAA,MACA,4DAAA;AAAA,MACA,aAAA;AAAA,MACA,2BAAA;AAAA,MACA,uBAAA;AAAA,MACA,mBAAA;AAAA,MACA,6DAAA;AAAA,MACA,2DAAA;AAAA,MACA,iCAAA;AAAA,MACA,eAAA;AAAA,MACA,EAAA;AAAA,MACA,mEAAA;AAAA,MACA,8CAAA;AAAA,MACA;AAAA,KACF,CAAE,KAAK,IAAI,CAAA;AAAA,IAEX,MAAM,IAAI,IAAA,EAAM;AACd,MAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAE1B,MAAA,QAAQ,IAAI,IAAA;AAAM,QAChB,KAAK,MAAA;AAAQ,UAAA,OAAO,eAAe,GAAG,CAAA;AAAA,QACtC,KAAK,QAAA;AAAU,UAAA,OAAO,iBAAiB,GAAG,CAAA;AAAA,QAC1C,KAAK,SAAA;AAAW,UAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,GAAA,CAAI,QAAQ,CAAA;AAAA,QAC1D,KAAK,OAAA;AAAS,UAAA,OAAO,eAAA,CAAgB,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QAClD,KAAK,MAAA;AAAQ,UAAA,OAAO,cAAA,CAAe,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QAChD,KAAK,SAAA;AAAW,UAAA,OAAO,iBAAA,CAAkB,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QACtD,KAAK,aAAA;AAAe,UAAA,OAAO,qBAAA,CAAsB,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA;AAAA,QAC9D,KAAK,KAAA;AACH,UAAA,OAAO,EAAE,SAAS,2IAAA,EAA4I;AAAA,QAChK,KAAK,QAAA;AACH,UAAA,OAAO,EAAE,SAAS,kIAAA,EAAmI;AAAA,QACvJ,KAAK,QAAA;AACH,UAAA,OAAO,EAAE,SAAS,8IAAA,EAA0I;AAAA,QAC9J,KAAK,SAAA;AACH,UAAA,OAAO,EAAE,SAAS,yGAAA,EAA0G;AAAA,QAC9H;AACE,UAAA,OAAO,EAAE,OAAA,EAAS,IAAA,CAAK,IAAA,IAAQ,KAAK,WAAA,EAAY;AAAA;AACpD,IACF;AAAA,GACF;AACF;AAIA,SAAS,eAAe,GAAA,EAAsC;AAC5D,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AAClC,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,CAAA,EAAG,QAAA,CAAS,aAAA,EAAe,MAAM,CAAC,CAAA,CAAA;AAAA,QAClC,wBAAA;AAAA,QACA,EAAA;AAAA,QACA,6EAAA;AAAA,QACA,gFAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,EAAG,QAAA,CAAS,aAAA,EAAe,MAAM,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,YAAA,CAAc,CAAA;AAC7F,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAEzB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,OAAA,IAAW,IAAA;AAEtC,IAAA,MAAM,UAAA,GAAa,UAAU,OAAA,GAAU,OAAA,GAAU,UAAU,QAAA,GAAW,KAAA,GAAQ,KAAA,KAAU,UAAA,GAAa,KAAA,GAAQ,QAAA;AAC7G,IAAA,MAAM,UAAA,GAAa,CAAA,CAAA,EAAI,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,CAAA;AAC1C,IAAA,MAAM,YAAA,GAAe,OAAA,GAAU,EAAA,GAAK,QAAA,CAAS,eAAe,KAAK,CAAA;AAEjE,IAAA,MAAM,QAAQ,GAAA,CAAI,MAAA,CAAO,SAAA,EAAW,IAAA,CAAK,IAAI,CAAA,IAAK,EAAA;AAClD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,EAAA,EAAK,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,MAAM,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,UAAA,EAAY,UAAU,CAAC,CAAA,EAAG,YAAY,CAAA;AAAA,KACrF;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,OAAO,QAAA,CAAS,YAAA,EAAc,KAAK,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAC1D,IAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,QAAA,CAAS,YAAY,KAAK,CAAC,IAAI,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,CAAA,EAAA,CAAK,GAAA,CAAI,OAAO,IAAA,IAAQ,IAAI,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AAC1G,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AACzB,EAAA,KAAA,CAAM,KAAK,8EAA8E,CAAA;AAEzF,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AACrC;AAEA,SAAS,iBAAiB,GAAA,EAAsC;AAC9D,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AAClC,EAAA,MAAM,KAAA,GAAQ,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,CAAA,CAAE,MAAA;AACzD,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA,CAAE,MAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,UAAA,IAAc,CAAA,CAAE,KAAA,KAAU,cAAc,CAAA,CAAE,MAAA;AAE7F,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,CAAA,EAAG,QAAA,CAAS,mBAAA,EAAqB,MAAM,CAAC,CAAA,CAAA;AAAA,IACxC,QAAA,CAAI,OAAO,EAAE,CAAA;AAAA,IACb,KAAK,QAAA,CAAS,gBAAA,EAAkB,KAAK,CAAC,CAAA,EAAA,EAAK,QAAQ,MAAM,CAAA,CAAA;AAAA,IACzD,CAAA,EAAA,EAAK,QAAA,CAAS,QAAA,EAAU,KAAK,CAAC,CAAA,UAAA,EAAa,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,CAAC,CAAA,CAAA;AAAA,IAC3E,CAAA,EAAA,EAAK,QAAA,CAAS,WAAA,EAAa,KAAK,CAAC,CAAA,OAAA,EAAU,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAA;AAAA,IAC/E,CAAA,EAAA,EAAK,QAAA,CAAS,SAAA,EAAW,KAAK,CAAC,CAAA,SAAA,EAAY,QAAA,CAAS,MAAA,CAAO,MAAM,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA;AAAA,IAC1E;AAAA,GACF;AAEA,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,iBAAA,EAAmB,KAAK,CAAC,CAAA,CAAE,CAAA;AAClD,IAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,QAAQ,CAAA,EAAG;AAC7D,MAAA,MAAM,GAAA,GAAM,IAAI,UAAA,IAAc,eAAA;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,CAAS,GAAA,CAAI,MAAM,MAAM,CAAC,CAAA,QAAA,EAAM,GAAG,CAAA,CAAE,CAAA;AAAA,IACvD;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAK,CAAE,MAAA;AACvC,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,QAAA,CAAS,uBAAA,EAAyB,KAAK,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,CAAA;AACzE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAA,CAAS,kBAAA,EAAoB,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA,CAAE,CAAA;AAC1E,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AACzB,EAAA,KAAA,CAAM,KAAK,oFAAoF,CAAA;AAE/F,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AACrC;AAEA,eAAe,iBAAA,CAAkB,KAAiB,QAAA,EAAgD;AAChG,EAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,EAAY,CAAE,IAAA,EAAK;AAEzC,EAAA,IAAI,CAAC,mBAAA,CAAoB,QAAA,CAAS,IAAI,CAAA,EAAG;AACvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,GAAG,QAAA,CAAS,mBAAA,EAAqB,KAAK,CAAC,IAAI,IAAI,CAAA,CAAA;AAAA,QAC/C,CAAA,qBAAA,EAAwB,mBAAA,CAAoB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACtD,EAAA;AAAA,QACA,4EAAA;AAAA,QACA,wFAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,iBAAiB,IAAI,CAAA;AAEpC,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,WAAA,EAAAE,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,YAAA,EAAA,EAAA,eAAA,CAAA,CAAA;AAC9B,IAAA,MAAM,SAAS,MAAMA,YAAAA,CAAY,IAAA,EAAM,MAAA,EAAQ,IAAI,GAAG,CAAA;AAEtD,IAAA,IAAI,OAAO,gBAAA,EAAkB;AAC3B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,GAAG,QAAA,CAAS,oBAAA,EAAsB,OAAO,CAAC,IAAI,IAAI,CAAA,CAAA;AAAA,UAClD,CAAA,UAAA,EAAa,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,UAC5C,EAAA;AAAA,UACA,qEAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA;AAAA,UACA,IAAA,CAAK,SAAA;AAAA,YACH;AAAA,cACE,UAAA,EAAY;AAAA,gBACV,sBAAA,EAAwB;AAAA,kBACtB,OAAA,EAAS;AAAA,oBACP,CAAC,IAAI,GAAG;AAAA,sBACN,SAAS,MAAA,CAAO,MAAA;AAAA,sBAChB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,CAAC,SAAS,CAAA;AAAA,sBAC/B,WAAW,MAAA,CAAO,SAAA;AAAA,sBAClB,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB;AAAC;AACxC;AACF;AACF;AACF,aACF;AAAA,YACA,IAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,KAAA;AAAA,UACA,EAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI;AAAA,OACb;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,GAAG,QAAA,CAAS,+BAAA,EAA4B,QAAQ,CAAC,IAAI,IAAI,CAAA,CAAA;AAAA,UACzD,CAAA,EAAA,EAAK,OAAO,cAAc,CAAA,CAAA;AAAA,UAC1B,EAAA;AAAA,UACA;AAAA,SACF,CAAE,KAAK,IAAI;AAAA,OACb;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS;AAAA,QACP,GAAG,QAAA,CAAS,YAAA,EAAc,OAAO,CAAC,IAAI,IAAI,CAAA,CAAA;AAAA,QAC1C,CAAA,UAAA,EAAa,QAAA,CAAS,MAAA,CAAO,MAAA,EAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,QAC5C,CAAA,WAAA,EAAc,OAAO,cAAA,KAAmB,QAAA,GAAW,OAAO,SAAA,CAAW,KAAA,GAAQ,OAAO,cAAc,CAAA,CAAA;AAAA,QAClG,EAAA;AAAA,QACA,4DAAA;AAAA,QACA,EAAA;AAAA,QACA,SAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,UACH;AAAA,YACE,UAAA,EAAY;AAAA,cACV,sBAAA,EAAwB;AAAA,gBACtB,OAAA,EAAS;AAAA,kBACP,CAAC,IAAI,GAAG;AAAA,oBACN,SAAS,MAAA,CAAO,MAAA;AAAA,oBAChB,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,CAAC,SAAS,CAAA;AAAA,oBAC/B,WAAW,MAAA,CAAO,SAAA;AAAA,oBAClB,YAAA,EAAc,MAAA,CAAO,YAAA,IAAgB;AAAC;AACxC;AACF;AACF;AACF,WACF;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,KAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AAAA,EACF,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,IAAA,OAAO;AAAA,MACL,SAAS,CAAA,EAAG,QAAA,CAAS,wBAAwB,KAAK,CAAC,IAAI,IAAI;AAAA,EAAA,EAAO,GAAG,CAAA;AAAA,KACvE;AAAA,EACF;AACF;AAEA,eAAe,eAAA,CAAgB,KAAiB,IAAA,EAA6C;AAC3F,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACjE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,SAAA,GAAY,IAAI,QAAA,CAAS,IAAA,GAAO,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AACvD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS;AAAA,UACP,GAAG,QAAA,CAAS,mBAAA,EAAqB,KAAK,CAAC,IAAI,UAAU,CAAA,CAAA;AAAA,UACrD,SAAA,CAAU,SAAS,CAAA,GAAI,CAAA,WAAA,EAAc,UAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,wBAAA;AAAA,UAC9D;AAAA,SACF,CAAE,KAAK,IAAI;AAAA,OACb;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AACnC,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,YAAY,OAAO,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAG;AAAA,IACrE,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,oBAAoB,KAAK,CAAC,IAAI,UAAU;AAAA,EAAA,EAAO,GAAG,CAAA,CAAA,EAAG;AAAA,IACrF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AACrC,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,IAAI,CAAC,GAAA,CAAI,MAAA,CAAO,OAAA,EAAS;AACzB,IAAA,IAAI,GAAA,CAAI,UAAU,OAAA,EAAS;AAAE,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,IAAI,CAAA;AAAG,MAAA;AAAA,IAAU;AAC/D,IAAA,IAAI,GAAA,CAAI,UAAU,UAAA,EAAY;AAC9B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,CAAQ,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,UAAA,EAAY,OAAO,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC3F,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,kBAAA,EAAoB,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAC/F,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,EAAG;AAC/C,IAAA,KAAA,CAAM,KAAK,iEAAiE,CAAA;AAAA,EAC9E;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AACrC;AAEA,eAAe,cAAA,CAAe,KAAiB,IAAA,EAA6C;AAC1F,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACjE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,qBAAqB,KAAK,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAG;AAAA,IAC5E;AACA,IAAA,GAAA,CAAI,QAAA,CAAS,KAAK,UAAU,CAAA;AAC5B,IAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,YAAY,QAAQ,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAG;AAAA,EACtE;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK;AACrC,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,WAAW,QAAQ,CAAC,IAAI,UAAA,CAAW,MAAM,eAAe,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAG;AACnI;AAEA,eAAe,iBAAA,CAAkB,KAAiB,IAAA,EAA6C;AAC7F,EAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA;AACjE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,qBAAqB,KAAK,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAG;AAAA,IAC5E;AAEA,IAAA,GAAA,CAAI,QAAA,CAAS,KAAK,UAAU,CAAA;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AACnC,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,cAAc,OAAO,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,EAAG;AAAA,IACvE,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,MAAM,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC3D,MAAA,OAAO,EAAE,SAAS,CAAA,EAAG,QAAA,CAAS,mBAAmB,KAAK,CAAC,IAAI,UAAU;AAAA,EAAA,EAAO,GAAG,CAAA,CAAA,EAAG;AAAA,IACpF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,QAAA,CAAS,IAAA,EAAK,CAAE,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACrE,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,GAAA,CAAI,QAAA,CAAS,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA;AACjC,MAAA,SAAA,CAAU,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACzB,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACtB;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,YAAA,EAAc,OAAO,CAAC,CAAA,CAAA,EAAI,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACjG,EAAA,IAAI,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,oBAAA,EAAsB,KAAK,CAAC,CAAA,CAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAEjG,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AACrC;AAEA,eAAe,qBAAA,CAAsB,KAAiB,IAAA,EAA6C;AACjG,EAAA,MAAM,KAAA,GAAkB,CAAC,CAAA,EAAG,QAAA,CAAS,iBAAA,EAAmB,MAAM,CAAC,CAAA,CAAA,EAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAGjF,EAAA,MAAM,QAAA,GAAW,wBAAA,CAAyB,GAAA,CAAI,QAAQ,CAAA;AAEtD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,QAAA,GAAgBC,IAAA,CAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAC3C,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,GAAA,CAAI,QAAQ,CAAA;AACvC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACxC,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,mBAAA,EAAwB,IAAI,CAAA,CAAA,EAAG;AAAA,IACtE;AACA,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAE,CAAA;AAC9B,IAAA,MAAM,OAAA,uBAAc,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,SAAS,CAAC,CAAC,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA,CAAK,kBAAkB,OAAA,EAAS;AAAA,MACpC,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,cAAA,EAAgB,IAAI,GAAA,CAAI,cAAA;AAAA,MACxB,UAAA,EAAY,IAAI,GAAA,CAAI,qBAAA;AAAA,MACpB,QAAA,EAAU,IAAI,GAAA,CAAI;AAAA,KACnB,CAAC,CAAA;AACF,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,EACrC;AAGA,EAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,IAAA,KAAA,CAAM,KAAK,4CAA4C,CAAA;AACvD,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,KAAK,6EAA6E,CAAA;AACxF,IAAA,KAAA,CAAM,KAAK,wEAAwE,CAAA;AACnF,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAChF,EAAA,KAAA,CAAM,KAAK,CAAA,wBAAA,EAA2B,QAAA,CAAS,IAAI,CAAA,UAAA,EAAa,KAAK,CAAA,OAAA,CAAS,CAAA;AAC9E,EAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,QAAA,EAAU;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,EAAG,QAAA,CAAS,KAAA,EAAO,MAAM,CAAC,CAAA,CAAE,CAAA;AACvC,IAAA,MAAM,QAAA,uBAAe,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,KAAK,CAAC,CAAC,CAAA;AACzC,IAAA,KAAA,CAAM,IAAA,CAAK,kBAAkB,QAAA,EAAU;AAAA,MACrC,KAAK,GAAA,CAAI,GAAA;AAAA,MACT,cAAA,EAAgB,IAAI,GAAA,CAAI,cAAA;AAAA,MACxB,UAAA,EAAY,IAAI,GAAA,CAAI,qBAAA;AAAA,MACpB,QAAA,EAAU,IAAI,GAAA,CAAI;AAAA,KACnB,CAAC,CAAA;AACF,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAE;AACrC;AAGA,SAAS,yBAAyB,QAAA,EAA2F;AAC3H,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAmE;AACtF,EAAA,KAAA,MAAW,GAAA,IAAO,QAAA,CAAS,IAAA,EAAK,EAAG;AACjC,IAAA,IAAI,GAAA,CAAI,UAAU,OAAA,EAAS;AAC3B,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAI,WAAA,EAAa;AAE1C,MAAA,MAAM,QAAA,GAAW,IAAI,UAAA,CAAW,SAAS,IAAI,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GAAI,GAAA;AAC5D,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC1C,MAAA,MAAA,CAAO,IAAI,QAAA,EAAU,CAAC,GAAG,QAAA,EAAU,GAAG,KAAK,CAAC,CAAA;AAAA,IAC9C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;;;ACzfO,SAAS,qBAAA,CACd,GAAA,EACA,QAAA,EACA,OAAA,EACA,KACA,GAAA,EACU;AACV,EAAA,MAAM,aAAa,eAAA,CAAgB,EAAE,UAAU,OAAA,EAAS,GAAA,EAAK,KAAK,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,UAAA;AAAA,IACA,YAAY,QAAQ,CAAA;AAAA,IACpB,aAAa,QAAQ,CAAA;AAAA,IACrB,YAAY,QAAQ,CAAA;AAAA,IACpB,eAAe,QAAQ,CAAA;AAAA,IACvB,mBAAmB,QAAQ;AAAA,GAC7B;AACA,EAAA,KAAA,MAAW,OAAA,IAAW,QAAA,EAAU,GAAA,CAAI,aAAA,CAAc,SAAS,OAAO,CAAA;AAClE,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,IAAI,CAAA;AACvC;;;AC1BO,IAAM,aAAA,GAAgB,OAAO,MAAA,CAAO;AAAA;AAAA,EAEzC,eAAA,EAAiB;AACnB,CAAU,CAAA;;;ACoBH,SAAS,wBAAA,CAAyB,QAAiC,GAAA,EAAqB;AAC7F,EAAA,MAAM,EAAE,OAAA,EAAS,UAAA,EAAY,UAAU,KAAA,EAAO,SAAA,EAAW,SAAQ,GAAI,MAAA;AAErE,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,CAAA,MAAA,EAAS,UAAU,CAAA,CAAA,CAAG,CAAA;AAClD,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,IAAA,CAAK,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA,CAAG,CAAA;AAC5C,IAAA,OAAO,wBAAwB,KAAK,CAAA,aAAA,EAAgB,QAAQ,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EAClF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,cAAA,EAAiB,KAAK,CAAA,SAAA,EAAY,UAAU,CAAA,KAAA,EAAQ,QAAQ,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,SAAA,GAAY,EAAE,MAAA,KAAW,OAAA,GAAU,YAAY,CAAA,KAAA,EAAQ,CAAA,CAAE,UAAU,GAAG,CAAA,CAAA,CAAA;AAC5E,IAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,KAAU,MAAA,GAAY,CAAA,OAAA,EAAU,EAAE,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,GAAK,EAAA;AAC1E,IAAA,MAAM,QAAA,GAAW,GAAG,WAAA,CAAY,CAAA,CAAE,MAAM,GAAG,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AAEtD,IAAA,IAAI,EAAE,OAAA,EAAS;AACb,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AACtE,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACjC,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,SAAS,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AC/CO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;AAEO,SAAS,mBAAmB,GAAA,EAAkC;AACnE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;AAUO,SAAS,wBAAwB,GAAA,EAAkC;AACxE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,uBAAA;AACf;AAEO,SAAS,eAAe,GAAA,EAAkC;AAC/D,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,cAAA;AACf;AAWO,SAAS,wBAAwB,GAAA,EAAkC;AACxE,EAAA,OAAO,CAAC,CAAC,GAAA,CAAI,kBAAA;AACf;ACxBO,SAAS,gBAAA,CAAiB,WAAmB,GAAA,EAAsB;AACxE,EAAA,OAAYC,IAAA,CAAA,UAAA,CAAW,SAAS,CAAA,GAASA,IAAA,CAAA,SAAA,CAAU,SAAS,CAAA,GAASA,IAAA,CAAA,OAAA,CAAQ,GAAA,CAAI,GAAA,EAAK,SAAS,CAAA;AACjG;AAEA,eAAsB,aAAA,CACpB,QAAA,EACA,QAAA,EACA,MAAA,EACoB;AACpB,EAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,WAAA,CAAY,UAAU,MAAM,CAAA;AAC1D,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,QAAA,CAAA,sBAAA,uBAAsC,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,mBAAA,CACpB,UACA,OAAA,EACiB;AACjB,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,OAAO,OAAA,EAAS,IAAA,IAAS,MAASC,GAAA,CAAA,QAAA,CAAS,UAAU,MAAM,CAAA;AAC7D;AASO,SAAS,mBAAmB,GAAA,EAAsB;AACvD,EAAA,IAAI,GAAA,YAAe,UAAU,OAAO,CAAA,CAAA,EAAI,IAAI,IAAI,CAAA,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAChE,EAAA,IAAI,eAAe,KAAA,EAAO,OAAO,CAAA,CAAA,EAAA,oBAAA,qBAA8B,EAAA,EAAK,IAAI,OAAO,CAAA,CAAA;AAC/E,EAAA,OAAO,CAAA,CAAA,EAAA,oBAAA,qBAA8B,EAAA,EAAK,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AACvD;;;ACGO,SAAS,4BAA4B,IAAA,EAAsD;AAChG,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,qBAAA;AAAA,IACN,WAAA,EACE,mHAAA;AAAA,IACF,SAAA,EACE,4JAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,aAAa,qBAAA,EAAsB;AAAA,QAC5D,KAAA,EAAO;AAAA,UACL,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EAAa,2DAAA;AAAA,UACb,OAAA,EAAS,CAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,QACA,SAAA,EAAW;AAAA,UACT,IAAA,EAAM,SAAA;AAAA,UACN,WAAA,EACE;AAAA;AACJ,OACF;AAAA,MACA,QAAA,EAAU,CAAC,OAAO;AAAA,KACpB;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,SAAA,EAAW,cAAc,eAAA,GAAkB,CAAA;AAAA;AAAA,IAC3C,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,IAAI,GAAG,CAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAE7B,QAAA,IAAI,eAAoC,EAAC;AACzC,QAAA,IAAI,UAAA,GAAa,CAAA;AACjB,QAAA,IAAI,SAAA,GAAY,KAAA;AAChB,QAAA,IAAI,OAAA,GAAU,KAAA;AACd,QAAA,IAAI,aAAkC,EAAC;AACvC,QAAA,IAAI,QAAA,GAAW,CAAA;AAGf,QAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,UAAA,MAAM,eAAe,MAAM,WAAA;AAAA,YACzB,GAAA,CAAI,WAAA;AAAA,YACJ,KAAA;AAAA,YACA,KAAA;AAAA,YACA,yBAAyB,GAAG;AAAA,WAC9B;AACA,UAAA,YAAA,GAAe,YAAA,CAAa,OAAA;AAC5B,UAAA,UAAA,GAAa,YAAA,CAAa,KAAA;AAC1B,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAMA,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,SAAA,IAAa,YAAA,CAAa,MAAA,KAAW,CAAA;AAE5D,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,aAAa,MAAM,SAAA,CAAU,MAAM,KAAA,EAAO,KAAA,EAAO,KAAK,MAAM,CAAA;AAClE,UAAA,UAAA,GAAa,UAAA,CAAW,OAAA;AACxB,UAAA,QAAA,GAAW,UAAA,CAAW,KAAA;AACtB,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAGA,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,YAAA,EAAc,UAAA,EAAY,KAAK,CAAA;AAE3D,QAAA,MAAM,UAAA,GAAsC;AAAA,UAC1C,OAAA,EAAS,MAAA;AAAA,UACT,UAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAA,OAAO,wBAAA,CAAyB,UAAA,EAAY,GAAA,CAAI,GAAG,CAAA;AAAA,MACrD,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;AAIA,eAAe,WAAA,CACb,WAAA,EACA,KAAA,EACA,KAAA,EACA,QAAA,EAC0D;AAG1D,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAM,GAAI,MAAM,mBAAA,CAAoB,EAAE,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,KAAA,EAAO,CAAA;AAE5F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC3B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAA,EAAS,qBAAA,CAAsB,CAAA,CAAE,IAAI,CAAA,IAAK,CAAA;AAAA,MAC1C,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,MAAA,EAAQ,OAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,SAAS,CAAA,CAAE;AAAA,KACb,CAAE,CAAA;AAAA,IACF;AAAA,GACF;AACF;AAIA,eAAe,SAAA,CACb,IAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EAC0D;AAC1D,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AACnC,EAAA,MAAM,WAAiC,EAAC;AAExC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,MAAA,CAAO,UAAU,OAAA,EAAS;AAC9B,IAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,uBAAA,CAAwB,MAAA,CAAO,YAAY,CAAA,EAAG;AAE1E,IAAA,QAAA,CAAS,IAAA;AAAA,MAAA,CACN,YAAY;AACX,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,eAAA;AAAA,YAC1B,EAAE,KAAA,EAAM;AAAA,YACR,aAAA,CAAc,eAAA;AAAA,YACd;AAAA,WACF;AACA,UAAA,IAAI,MAAA,EAAQ;AACV,YAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,cAAA,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,YACjB;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF,CAAA;AAAG,KACL;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAe,gBAAA;AAAA,IACnB,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,MACnB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAA,EAAM,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA,IAAK,QAAA;AAAA,MACzC,SAAS,GAAA,CAAI,IAAA;AAAA,MACb,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,WAAW,SAAS,CAAA,GACvC,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GACxB,IAAI,QAAA,CAAS,GAAA;AAAA,MACjB,IAAA,EAAM,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,MACtC,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,oBAAA,CAAqB,IAAA,EAAM,GAAG;AAAA,KACxC,CAAE;AAAA,GACJ;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAAA,IACpC,OAAO,YAAA,CAAa;AAAA,GACtB;AACF;AAEA,SAAS,oBAAA,CAAqB,MAAgB,GAAA,EAAgC;AAG5E,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,GAAA;AAC1B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,EAAG,WAAA,MAAiB,EAAA,GAAM,EAAA;AAEhF,EAAA,MAAM,OAAA,GAAoC;AAAA,IACxC,EAAA,EAAI,CAAC,YAAA,EAAc,UAAU,CAAA;AAAA,IAC7B,GAAA,EAAK,CAAC,YAAA,EAAc,UAAU,CAAA;AAAA,IAC9B,EAAA,EAAI,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,IAC/B,GAAA,EAAK,CAAC,YAAA,EAAc,YAAY,CAAA;AAAA,IAChC,EAAA,EAAI,CAAC,QAAA,EAAU,SAAS,CAAA;AAAA,IACxB,EAAA,EAAI,CAAC,IAAA,EAAM,OAAO,CAAA;AAAA,IAClB,EAAA,EAAI,CAAC,MAAA,EAAQ,eAAe;AAAA,GAC9B;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAG,CAAA,IAAK,CAAC,GAAG,CAAA;AAClC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,IAAA,EAAK;AAEnC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IACE,MAAA,CAAO,KAAA,KAAU,OAAA,IACjB,MAAA,CAAO,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,WAAA,EAAY,KAAM,IAAA,CAAK,WAAA,EAAa,CAAA,EAC1E;AACA,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,OAAO,GAAG,IAAA,IAAQ,SAAA;AAC3D;AAIA,SAAS,YAAA,CACP,YAAA,EACA,UAAA,EACA,KAAA,EACqB;AACrB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAA+B;AAGhD,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AACzC,IAAA,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACjB;AAGA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,GAAA,GAAM,GAAG,CAAA,CAAE,IAAI,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAClB,MAAA,IAAA,CAAK,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACjB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACvC,EAAA,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACpB,IAAA,IAAI,EAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,SAAS,OAAO,EAAA;AACzD,IAAA,IAAI,EAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,MAAA,KAAW,SAAS,OAAO,CAAA;AAEzD,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,OAAA,IAAW,CAAA,CAAE,WAAW,OAAA,EAAS;AAChD,MAAA,OAAA,CAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,KAAM,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA;AAAA,IACtC;AACA,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC9B;AAEA,SAAS,iBAAyE,KAAA,EAAiB;AACjG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAS;AAC5B,IAAA,MAAM,GAAA,GAAM,GAAG,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAClD,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG,OAAO,KAAA;AAC1B,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT,CAAC,CAAA;AACH;;;AC/RO,SAAS,UAAA,CAAW,SAAiB,GAAA,EAAiC;AAC3E,EAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,IAAA,GAAO,CAAA,EAAG,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AAEpE,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAO,CAAA,IAAK,EAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,GAAA,CAAI,SAAA,GAAY,CAAA,EAAG,GAAG,MAAA,CAAO,UAAA,CAAW,IAAA,EAAM,MAAM,CAAC,CAAA;AAC3E,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,KAAA,MAAW,MAAM,IAAA,EAAM;AACrB,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,UAAA,CAAW,EAAA,EAAI,MAAM,CAAA;AACtC,IAAA,IAAI,KAAA,GAAQ,IAAI,OAAA,EAAS;AACzB,IAAA,KAAA,IAAS,CAAA;AACT,IAAA,KAAA,IAAS,EAAA,CAAG,MAAA;AAAA,EACd;AACA,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,SAAA,EAAW,KAAA,EAAM;AAC3C;AA0BO,SAAS,WAAW,OAAA,EAA2B;AACpD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,CAAC,EAAE,CAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,MAAM,YAAY,CAAA;AACnC;AAEA,SAAS,KAAA,CAAM,CAAA,EAAW,GAAA,EAAa,GAAA,EAAqB;AAC1D,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,GAAG,OAAO,GAAA;AAChC,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AACvC;;;AC5CO,SAAS,qBAAqB,IAAA,EAA+C;AAClF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,kEAAA;AAAA,IACb,SAAA,EACE,0IAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC7B,OAAA,EAAS,EAAE,IAAA,EAAM,QAAA,EAAU,WAAW,GAAA,EAAQ;AAAA,QAC9C,OAAO,EAAE,IAAA,EAAM,WAAW,OAAA,EAAS,CAAA,EAAG,SAAS,GAAA,EAAI;AAAA,QACnD,iBAAA,EAAmB,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACpC,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,MAAA,EAAQ,MAAM,CAAA;AAAE,OACnD;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,cAAA,EAAgB,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,EAAG;AACnE,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,6BAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACrC,KAAA,CAAM,OAAA,GACN,MAAM,mBAAA,CAAoB,IAAA,EAAM,IAAA,CAAK,OAAO,CAAA;AAChD,QAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AACrC,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,UAAA;AAAA,UAC1B;AAAA,YACE,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,YACrC,QAAA;AAAA,YACA,OAAA,EAAS,KAAA,CAAM,iBAAA,GACX,EAAE,WAAA,EAAa,CAAA,EAAG,gBAAA,EAAkB,KAAA,CAAM,iBAAA,EAAkB,GAC5D,EAAE,WAAA,EAAa,CAAA;AAAE,WACvB;AAAA,UACA,aAAA,CAAc,eAAA;AAAA,UACd,IAAA,CAAK;AAAA,SACP;AACA,QAAA,MAAM,KAAA,GAAQ,uBAAuB,MAAA,EAAQ,IAAA,CAAK,IAAI,KAAA,CAAM,KAAA,IAAS,EAAA,EAAI,GAAG,CAAC,CAAA;AAC7E,QAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAQ;AAC3B,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,cAC1B,OAAO,IAAA,CAAK,KAAA;AAAA,cACZ,UAAA,EAAY,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,KAAA;AAAA,cACpC,MAAM,IAAA,CAAK,IAAA,GAAO,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,cAClD,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAAA,cAC3B,aAAA,EAAe,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,aAAa,CAAC;AAAA,aAC9D,CAAE;AAAA,WACH,CAAA;AAAA,QACH;AACA,QAAA,OAAO,qBAAA,CAAsB,OAAO,MAAM,CAAA;AAAA,MAC5C,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;AAEA,SAAS,sBAAA,CACP,QACA,KAAA,EACkB;AAClB,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAU,MAAA,EAAQ,SAAS,EAAC;AAClE,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC7B;AAEA,SAAS,qBAAA,CACP,cACA,MAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAM,IAAI,MAAA,GAAU,MAAA,EAAQ,SAAS,EAAC;AAClE,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,uBAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC9C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,UAAA,IAAc,WAAA;AAC/C,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA,GAAO,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,GAAI,YAAA;AACzD,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAClC,IAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,aAAa,CAAC,CAAA;AAC1D,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,EAAQ,IAAI,EAAE,MAAA,CAAO,OAAO,CAAA,CAAE,IAAA,CAAK,UAAK,CAAA;AACxD,IAAA,OAAO,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,MAAA,GAAS,CAAA,QAAA,EAAM,MAAM,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AAAA,EACxE,CAAC,CAAA;AACD,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,YAAA,CAAa,MAAA,EAAQ;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAA,GAAS,YAAA,CAAa,MAAM,CAAA,KAAA,CAAO,CAAA;AAAA,EACvE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,kBAAkB,KAAA,EAA4D;AACrF,EAAA,IAAI,CAAC,OAAO,OAAO,MAAA;AACnB,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,OAAO,KAAA,CAAM,KAAA;AACf;AAEA,SAAS,QAAQ,KAAA,EAA+C;AAC9D,EAAA,MAAM,UAAU,KAAA,EAAO,OAAA,CAAQ,cAAA,EAAgB,GAAG,EAAE,IAAA,EAAK;AACzD,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,OAAO,OAAA,CAAQ,UAAU,GAAA,GAAM,OAAA,GAAU,GAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA;AACnE;AAEA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,MAAM,KAAA,GAAgC;AAAA,IACpC,CAAA,EAAG,MAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,CAAA,EAAG,UAAA;AAAA,IACH,CAAA,EAAG,aAAA;AAAA,IACH,CAAA,EAAG,OAAA;AAAA,IACH,CAAA,EAAG,UAAA;AAAA,IACH,CAAA,EAAG,OAAA;AAAA,IACH,CAAA,EAAG,WAAA;AAAA,IACH,CAAA,EAAG,QAAA;AAAA,IACH,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,SAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI,MAAA;AAAA,IACJ,EAAA,EAAI,WAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,YAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI,QAAA;AAAA,IACJ,EAAA,EAAI,OAAA;AAAA,IACJ,EAAA,EAAI,UAAA;AAAA,IACJ,EAAA,EAAI;AAAA,GACN;AACA,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAK,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA;AACpC;;;AChKO,SAAS,eAAA,CACd,SAAA,EACA,GAAA,EACA,KAAA,GAAQ,GAAA,EACA;AACR,EAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,GAAG,OAAO,qBAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,UAAU,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AACnD,IAAA,MAAM,GAAA,GAAM,KAAA,IAAS,GAAA,GAAM,GAAA,CAAI,MAAM,GAAA,CAAI,SAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,IAAW,GAAA,GAAM,GAAA,CAAI,QAAQ,GAAA,CAAI,oBAAA;AAC/C,IAAA,OAAO,GAAG,WAAA,CAAY,SAAA,CAAU,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,YAAY,CAAC,CAAA,CAAA;AAAA,EACjG,CAAC,CAAA;AACD,EAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,SAAA,CAAU,MAAA,GAAS,KAAK,CAAA,KAAA,CAAO,CAAA;AACzF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACKO,SAAS,qBAAqB,IAAA,EAA6C;AAChF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,gBAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,SAAA,EACE,+FAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA;AAAU,OAC/B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,WAAW;AAAA,KACxC;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA,EAAG;AACnE,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,6BAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,UAAA;AAAA,UACxB,EAAE,cAAc,EAAE,GAAA,EAAK,UAAU,IAAI,CAAA,IAAK,QAAA,EAAS;AAAA,UACnD,aAAA,CAAc,eAAA;AAAA,UACd,IAAA,CAAK;AAAA,SACP;AACA,QAAA,OAAO,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AAAA,MACtC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;AClDO,SAAS,sBAAsB,IAAA,EAAgD;AACpF,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAa,mDAAA;AAAA,IACb,SAAA,EACE,sJAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS,EAAG,KAAA,EAAO,EAAE,IAAA,EAAM,SAAA,EAAU;AAAE,KACrE;AAAA,IACA,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,WAAW,aAAA,CAAc,eAAA;AAAA,IACzB,cAAA,EAAgB,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,uBAAa,GAAA,EAAmE;AACtF,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,UAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,UAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,UAAA,MAAM,cACJ,MAAA,CAAO,YAAA,IAAgB,wBAAwB,MAAA,CAAO,YAAY,IAC9D,MAAM,MAAA,CAAO,eAAA,CAAgB,GAAA,EAAK,cAAc,eAAA,EAAiB,IAAA,CAAK,MAAM,CAAA,GAC5E,MAAA,CAAO,eAAe,GAAG,CAAA;AAC/B,UAAA,MAAA,CAAO,GAAA,CAAI,MAAM,WAAW,CAAA;AAAA,QAC9B,CAAA,MAAO;AACL,UAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAK,EAAG;AACrC,YAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,YAAY,GAAA,CAAI,IAAA,EAAM,KAAK,MAAM,CAAA;AACpE,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,MAAA,CAAO,GAAA,CAAI,UAAU,GAAA,CAAI,GAAG,GAAG,MAAA,CAAO,cAAA,CAAe,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,UAC/D;AAAA,QACF;AACA,QAAA,OAAO,kBAAkB,MAAA,EAAQ;AAAA,UAC/B,KAAK,GAAA,CAAI,GAAA;AAAA,UACT,cAAA,EAAgB,KAAK,GAAA,CAAI,cAAA;AAAA,UACzB,UAAA,EAAY,KAAK,GAAA,CAAI,qBAAA;AAAA,UACrB,QAAA,EAAU,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,GAAA,CAAI;AAAA,SACnC,CAAA;AAAA,MACH,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACrDO,SAAS,sBAAA,CAAuB,MAAqB,GAAA,EAAqB;AAC/E,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,CAAA,EAAG,OAAO,uCAAA;AAC/B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,CAAC,iBAAiB,CAAA;AAChC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACnC,IAAA,KAAA,IAAS,KAAA,CAAM,MAAA;AACf,IAAA,KAAA,CAAM,IAAA,CAAK,KAAK,WAAA,CAAY,IAAA,EAAM,GAAG,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,EAClE;AACA,EAAA,KAAA,CAAM,KAAK,CAAA,OAAA,EAAU,KAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA,OAAA,CAAS,CAAA;AAChE,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEO,SAAS,YAAY,IAAA,EAA8C;AACxE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAwB;AACxC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,MAAA,CAAO,QAAQ,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,EAAG;AAC7D,IAAA,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,EAC/B;AACA,EAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,eAAA,IAAmB,EAAC,EAAG;AAC/C,IAAA,IAAI,kBAAkB,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC3D,MAAA,GAAA,CAAI,GAAA,CAAI,SAAA,CAAU,MAAA,CAAO,YAAA,CAAa,GAAG,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAqB,SAAA,IAAa,CAAC,CAAC,CAAA;AAAA,IACvG;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT;ACfA,eAAsB,kBAAA,CACpB,MACA,OAAA,EACmC;AACnC,EAAA,MAAM,OAAA,GAAU,YAAY,IAAI,CAAA;AAChC,EAAA,MAAM,MAA8E,EAAC;AACrF,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,CAAA,IAAK,OAAA,EAAS;AACnC,IAAA,MAAM,QAAA,GAAW,MAASC,GAAA,CAAA,QAAA,CAAS,IAAA,EAAM,MAAM,CAAA;AAC/C,IAAA,GAAA,CAAI,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,cAAA,CAAe,QAAA,EAAU,KAAK,CAAA,EAAG,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAAA,EAC/F;AAEA,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,MAAM,GAAA,EAAK;AACpB,MAAA,MAAM,WAAA,CAAY,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,IAAI,CAAA;AAClC,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,SAAS,GAAA,EAAK;AAEZ,IAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,CAAY,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,QAAQ,CAAA;AAAA,MACxC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAM,IAAI,QAAA,CAAA,uBAAA,wBAAuC,gCAAA,EAAkC,GAAG,CAAA;AAAA,EAExF;AAEA,EAAA,KAAA,MAAW,MAAM,GAAA,EAAK,MAAM,OAAA,CAAQ,WAAA,CAAY,GAAG,IAAI,CAAA;AACvD,EAAA,OAAO,EAAE,KAAA,EAAO,GAAA,CAAI,IAAI,CAAC,EAAA,KAAO,GAAG,IAAI,CAAA,EAAG,OAAO,GAAA,CAAI,MAAA,CAAO,CAAC,GAAA,EAAK,EAAA,KAAO,MAAM,EAAA,CAAG,KAAA,EAAO,CAAC,CAAA,EAAE;AAC9F;AAEO,SAAS,cAAA,CAAe,UAAkB,KAAA,EAA2B;AAC1E,EAAA,MAAM,UAAA,GAAa,gBAAgB,QAAQ,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA;AAAA,IACxB,CAAC,CAAA,EAAG,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,KAAA,EAAO,UAAU,CAAA,GAAI,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,OAAO,UAAU;AAAA,GACpF;AACA,EAAA,IAAI,GAAA,GAAM,QAAA;AACV,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,OAAO,UAAU,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,KAAK,UAAU,CAAA;AAC/C,IAAA,GAAA,GAAM,GAAA,CAAI,MAAM,CAAA,EAAG,KAAK,IAAI,IAAA,CAAK,OAAA,GAAU,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA;AAAA,EAC1D;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,gBAAgB,IAAA,EAAwB;AAC/C,EAAA,MAAM,MAAA,GAAS,CAAC,CAAC,CAAA;AACjB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,UAAA,CAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,EAAA,KAAO,EAAA,EAAI,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,QAAA,CAAS,KAA0C,UAAA,EAA8B;AACxF,EAAA,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA,IAAK,UAAA,CAAW,WAAW,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,IAAK,GAAA,CAAI,SAAA;AAChF;;;ACjDO,SAAS,iBAAiB,IAAA,EAA2C;AAC1E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,WAAA,EAAa,oDAAA;AAAA,IACb,SAAA,EACE,+HAAA;AAAA,IACF,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY;AAAA,QACV,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QACvB,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QACxB,SAAA,EAAW,EAAE,IAAA,EAAM,SAAA,EAAU;AAAA,QAC7B,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA;AAAS,OAC7B;AAAA,MACA,QAAA,EAAU,CAAC,MAAA,EAAQ,MAAA,EAAQ,aAAa,UAAU;AAAA,KACpD;AAAA,IACA,UAAA,EAAY,SAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,SAAA,EAAW,IAAA;AAAA,IACX,cAAA,EAAgB,KAAA;AAAA,IAChB,MAAM,OAAA,CAAQ,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM;AAC9B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,IAAA,EAAM,GAAG,CAAA;AAC7C,QAAA,MAAM,SAAS,MAAM,aAAA,CAAc,KAAK,QAAA,EAAU,IAAA,EAAM,KAAK,MAAM,CAAA;AACnE,QAAA,IAAI,OAAO,YAAA,IAAgB,CAAC,cAAA,CAAe,MAAA,CAAO,YAAY,CAAA,EAAG;AAC/D,UAAA,MAAM,IAAI,QAAA;AAAA,YAAA,wBAAA;AAAA,YAER,CAAA,QAAA,EAAW,OAAO,IAAI,CAAA,yBAAA;AAAA,WACxB;AAAA,QACF;AACA,QAAA,MAAM,OAAA,GAAU,MAAM,mBAAA,CAAoB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,UAAA,CAAW,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,IAAA,EAAM,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,CAAA;AACrF,QAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,MAAA;AAAA,UACxB;AAAA,YACE,YAAA,EAAc,EAAE,GAAA,EAAK,SAAA,CAAU,IAAI,CAAA,EAAE;AAAA,YACrC,QAAA;AAAA,YACA,SAAS,KAAA,CAAM;AAAA,WACjB;AAAA,UACA,IAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AACA,QAAA,IAAI,CAAC,MAAM,OAAO,2BAAA;AAClB,QAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA;AACpD,QAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,IAAA,EAAM,KAAK,OAAO,CAAA;AAC3D,QAAA,OAAO,GAAG,OAAO;AAAA,SAAA,EAAc,OAAA,CAAQ,KAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,MAAM,MAAM,CAAA,OAAA,CAAA;AAAA,MACnF,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,mBAAmB,GAAG,CAAA;AAAA,MAC/B;AAAA,IACF;AAAA,GACF;AACF;;;ACrDO,SAAS,aAAa,IAAA,EAAwB;AACnD,EAAA,OAAO;AAAA,IACL,sBAAsB,IAAI,CAAA;AAAA,IAC1B,qBAAqB,IAAI,CAAA;AAAA,IACzB,qBAAqB,IAAI,CAAA;AAAA,IACzB,4BAA4B,IAAI,CAAA;AAAA,IAChC,iBAAiB,IAAI;AAAA,GACvB;AACF;;;ACZA,IAAI,aAAA,GAMO,IAAA;AAEX,IAAM,MAAA,GAAiB;AAAA,EACrB,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,OAAA;AAAA,EACT,WAAA,EAAa,gDAAA;AAAA,EACb,UAAA,EAAY,QAAA;AAAA,EACZ,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,IAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,WAAW;AAAC,GACd;AAAA,EACA,YAAA,EAAc,mBAAA;AAAA,EACd,MAAM,MAAM,GAAA,EAAK;AACf,IAAA,MAAM,GAAA,GAAM,kBAAkB,GAAG,CAAA;AACjC,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,GAAA,IAAO,QAAQ,GAAA,EAAI;AAC1C,IAAA,IAAI,IAAI,YAAA,EAAc;AACpB,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,mBAAA,CAAoB,GAAA,CAAI,SAAS,GAAG,CAAA;AAAA,IAC1D;AACA,IAAA,MAAM,SAAiD,EAAC;AACxD,IAAA,MAAM,OAAA,GAAU,IAAI,eAAA,CAAgB,MAAM,aAAA,CAAc,MAAA,CAAO,QAAQ,CAAA,EAAG,GAAA,CAAI,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,MAAM,CAAA;AAClG,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,GAAA,EAAK,OAAA,EAAS,EAAE,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAA;AACxF,IAAA,MAAA,CAAO,QAAA,GAAW,QAAA;AAClB,IAAA,MAAM,QAAA,CAAS,IAAA,CAAK,GAAA,EAAK,GAAA,CAAI,SAAS,CAAA;AAEtC,IAAA,MAAM,KAAA,GAAQ,aAAa,EAAE,QAAA,EAAU,SAAS,GAAA,EAAK,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,CAAA;AACnE,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,SAAS,IAAI,CAAA;AACjD,IAAA,MAAM,eAAe,qBAAA,CAAsB,GAAA,EAAK,QAAA,EAAU,OAAA,EAAS,KAAK,GAAG,CAAA;AAE3E,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,iBAAA,EAAmB,MAAM;AACrC,QAAA,MAAM,OAAA,GAAU,GAAA,CAAI,MAAA,CAAO,GAAA,IAAO,QAAQ,GAAA,EAAI;AAC9C,QAAA,OAAA,CAAQ,OAAO,OAAO,CAAA;AACtB,QAAA,KAAK,QAAA,CAAS,IAAA,CAAK,OAAA,EAAS,GAAA,CAAI,SAAS,CAAA;AAAA,MAC3C,CAAC,CAAA;AAAA,MACD,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,MAAM;AACnC,QAAA,KAAK,QAAQ,aAAA,EAAc,CAAE,QAAQ,MAAM,QAAA,CAAS,UAAU,CAAA;AAAA,MAChE,CAAC,CAAA;AAAA,MACD,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,eAAA,EAAiB,CAAC,KAAA,KAAU;AACxC,QAAA,KAAK,OAAA,CACF,kBAAA,CAAmB,KAAK,CAAA,CACxB,KAAA,CAAM,CAAC,GAAA,KAAQ,GAAA,CAAI,GAAA,CAAI,KAAA,CAAM,yCAAA,EAA2C,GAAG,CAAC,CAAA;AAAA,MACjF,CAAC;AAAA,KACH;AAEA,IAAA,aAAA,GAAgB;AAAA,MACd,IAAA;AAAA,MACA,WAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,MAClC,YAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA,MAAM,SAAS,GAAA,EAAK;AAClB,IAAA,MAAM,KAAA,GAAQ,aAAA;AACd,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,EAAM,GAAA,EAAI;AAClC,IAAA,KAAA,MAAW,QAAQ,KAAA,CAAM,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,WAAW,IAAI,CAAA;AAC7D,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,YAAA,EAAc,GAAA,CAAI,aAAA,CAAc,WAAW,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAC5F,IAAA,MAAM,KAAA,CAAM,QAAQ,aAAA,EAAc;AAClC,IAAA,MAAM,KAAA,CAAM,SAAS,QAAA,EAAS;AAAA,EAChC;AACF,CAAA;AAEA,IAAO,aAAA,GAAQ","file":"index.js","sourcesContent":["import { spawn } from 'node:child_process';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport async function resolveServerCommand(command: string, cwd: string): Promise<string | null> {\n const local = await findLocalBinary(cwd, command);\n if (local) return local;\n return (await commandExistsOnPath(command)) ? command : null;\n}\n\nexport async function findLocalBinary(cwd: string, command: string): Promise<string | null> {\n if (path.isAbsolute(command)) return (await fileExists(command)) ? path.normalize(command) : null;\n let dir = path.resolve(cwd);\n for (;;) {\n const binDir = path.join(dir, 'node_modules', '.bin');\n for (const candidate of commandCandidates(command)) {\n const full = path.join(binDir, candidate);\n if (await fileExists(full)) return full;\n }\n const parent = path.dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n}\n\nexport async function commandExistsOnPath(command: string, timeoutMs = 2000): Promise<boolean> {\n const probe = process.platform === 'win32' ? 'where.exe' : 'sh';\n const args =\n process.platform === 'win32' ? [command] : ['-lc', `command -v ${shellQuote(command)}`];\n return new Promise((resolve) => {\n const child = spawn(probe, args, { env: buildChildEnv(), stdio: 'ignore', windowsHide: true });\n const timer = setTimeout(() => {\n child.kill();\n resolve(false);\n }, timeoutMs);\n timer.unref?.();\n child.on('error', () => {\n clearTimeout(timer);\n resolve(false);\n });\n child.on('close', (code) => {\n clearTimeout(timer);\n resolve(code === 0);\n });\n });\n}\n\nfunction commandCandidates(command: string): string[] {\n /* v8 ignore next -- platform-specific branch; covered on non-Windows CI. */\n if (process.platform !== 'win32') return [command];\n const ext = path.extname(command).toLowerCase();\n if (ext) return [command];\n return [`${command}.cmd`, `${command}.exe`, `${command}.bat`, command, `${command}.ps1`];\n}\n\nasync function fileExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction shellQuote(value: string): string {\n /* v8 ignore next -- only used by POSIX command probing. */\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n","import { buildChildEnv } from '@wrongstack/core';\nimport { spawn } from 'node:child_process';\nimport * as path from 'node:path';\nimport { commandExistsOnPath, resolveServerCommand } from '../utils/command-resolver.js';\n\nexport interface LanguageServerConfig {\n binary: string;\n npmPackages?: string[];\n args?: string[];\n languages: string[];\n rootPatterns?: string[];\n toolchain?: {\n command: string;\n args: string[];\n label: string;\n };\n}\n\nexport interface InstallResult {\n language: string;\n binary: string;\n alreadyInstalled: boolean;\n dryRun: boolean;\n installCommand?: string;\n packageManager?: string;\n error?: string;\n}\n\nexport const LANGUAGE_SERVERS: Record<string, LanguageServerConfig> = {\n typescript: {\n binary: 'typescript-language-server',\n npmPackages: ['typescript', 'typescript-language-server'],\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n },\n python: {\n binary: 'pyright-langserver',\n npmPackages: ['pyright'],\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n },\n json: {\n binary: 'vscode-json-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n },\n html: {\n binary: 'vscode-html-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n },\n css: {\n binary: 'vscode-css-language-server',\n npmPackages: ['vscode-langservers-extracted'],\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n },\n yaml: {\n binary: 'yaml-language-server',\n npmPackages: ['yaml-language-server'],\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n },\n shell: {\n binary: 'bash-language-server',\n npmPackages: ['bash-language-server'],\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n },\n go: {\n binary: 'gopls',\n toolchain: {\n command: 'go',\n args: ['install', 'golang.org/x/tools/gopls@latest'],\n label: 'Go toolchain',\n },\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n },\n rust: {\n binary: 'rust-analyzer',\n toolchain: {\n command: 'rustup',\n args: ['component', 'add', 'rust-analyzer'],\n label: 'Rust toolchain',\n },\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n },\n ruby: {\n binary: 'ruby-lsp',\n toolchain: {\n command: 'gem',\n args: ['install', 'ruby-lsp'],\n label: 'RubyGems',\n },\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n },\n};\n\nexport const SUPPORTED_LANGUAGES = Object.keys(LANGUAGE_SERVERS);\n\n/**\n * Install a language server for the given language.\n * Returns an InstallResult describing what happened.\n */\nexport async function installLang(\n language: string,\n server: LanguageServerConfig,\n cwd: string,\n dryRun = false,\n): Promise<InstallResult> {\n // Check if already available on PATH or in node_modules/.bin\n const existing = await resolveServerCommand(server.binary, cwd);\n if (existing) {\n return { language, binary: server.binary, alreadyInstalled: true, dryRun: false };\n }\n\n // Toolchain-based install (Go, Rust, Ruby)\n if (server.toolchain) {\n const { command, args, label } = server.toolchain;\n\n if (!(await commandExistsOnPath(command))) {\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun,\n installCommand: `${command} ${args.join(' ')}`,\n error: `${label} (${command}) is not on your PATH. Install it first.`,\n };\n }\n\n const installCmd = `${command} ${args.join(' ')}`;\n\n if (dryRun) {\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: true, installCommand: installCmd };\n }\n\n await runCommand(command, args, cwd, label);\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: false, packageManager: 'system', installCommand: installCmd };\n }\n\n // npm-based install\n if (server.npmPackages && server.npmPackages.length > 0) {\n const { command, args } = npmInstallCommand(server.npmPackages, cwd);\n const installCmd = `${command} ${args.join(' ')}`;\n\n if (dryRun) {\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: true, installCommand: installCmd };\n }\n\n try {\n await runCommand(command, args, cwd, `Installing ${language} LSP server via npm`);\n return { language, binary: server.binary, alreadyInstalled: false, dryRun: false, installCommand: installCmd };\n } catch (err) {\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun: false,\n installCommand: installCmd,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n return {\n language,\n binary: server.binary,\n alreadyInstalled: false,\n dryRun,\n error: 'No installation method available for this server.',\n };\n}\n\ntype PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';\n\nfunction npmInstallCommand(packages: string[], cwd: string): { command: string; args: string[] } {\n // Detect PM from lock files but fall back to pnpm as the default\n const pm = detectPackageManagerSync(cwd);\n if (pm === 'pnpm') return { command: 'pnpm', args: ['add', '-D', ...packages] };\n if (pm === 'yarn') return { command: 'yarn', args: ['add', '-D', ...packages] };\n if (pm === 'bun') return { command: 'bun', args: ['add', '-d', ...packages] };\n return { command: 'npm', args: ['install', '-D', ...packages] };\n}\n\nfunction detectPackageManagerSync(cwd: string): PackageManager {\n // Heuristic only — async version checks actual files\n if (existsSync(path.join(cwd, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(path.join(cwd, 'bun.lockb')) || existsSync(path.join(cwd, 'bun.lock'))) return 'bun';\n if (existsSync(path.join(cwd, 'yarn.lock'))) return 'yarn';\n return 'npm';\n}\n\nfunction existsSync(filePath: string): boolean {\n try {\n require('node:fs').accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction runCommand(command: string, args: string[], cwd: string, label: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const isWindowsBatch = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(command);\n const child = spawn(command, args, {\n cwd,\n env: buildChildEnv(),\n stdio: 'inherit',\n shell: isWindowsBatch,\n windowsHide: true,\n });\n child.on('error', reject);\n child.on('close', (code) => {\n if (code === 0) resolve();\n else reject(new Error(`${label}: ${command} exited with code ${code ?? 'null'}`));\n });\n });\n}\n","import type { ServerConfig } from './types.js';\n\nexport const PRESETS: Record<string, ServerConfig> = {\n typescript: {\n command: 'typescript-language-server',\n args: ['--stdio'],\n languages: ['typescript', 'typescriptreact', 'javascript', 'javascriptreact'],\n rootPatterns: ['tsconfig.json', 'jsconfig.json', 'package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n gopls: {\n command: 'gopls',\n args: ['serve'],\n languages: ['go'],\n rootPatterns: ['go.mod', 'go.work'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'rust-analyzer': {\n command: 'rust-analyzer',\n languages: ['rust'],\n rootPatterns: ['Cargo.toml'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n pyright: {\n command: 'pyright-langserver',\n args: ['--stdio'],\n languages: ['python'],\n rootPatterns: ['pyproject.toml', 'pyrightconfig.json', 'setup.py', 'requirements.txt'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n json: {\n command: 'vscode-json-language-server',\n args: ['--stdio'],\n languages: ['json'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n html: {\n command: 'vscode-html-language-server',\n args: ['--stdio'],\n languages: ['html'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n css: {\n command: 'vscode-css-language-server',\n args: ['--stdio'],\n languages: ['css', 'scss'],\n rootPatterns: ['package.json'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n yaml: {\n command: 'yaml-language-server',\n args: ['--stdio'],\n languages: ['yaml'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n bash: {\n command: 'bash-language-server',\n args: ['start'],\n languages: ['shellscript'],\n rootPatterns: ['package.json', '.git'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n 'ruby-lsp': {\n command: 'ruby-lsp',\n languages: ['ruby'],\n rootPatterns: ['Gemfile', '.ruby-version'],\n startupTimeoutMs: 15_000,\n enabled: true,\n },\n};\n","import { PRESETS } from './presets.js';\nimport type { ServerConfig } from './types.js';\nimport { resolveServerCommand } from './utils/command-resolver.js';\n\nexport async function autoDiscoverServers(\n userServers: Record<string, ServerConfig>,\n cwd = process.cwd(),\n): Promise<Record<string, ServerConfig>> {\n const out = { ...userServers };\n const pending = Object.entries(PRESETS).filter(([name]) => !out[name]);\n const resolved = await Promise.all(\n pending.map(async ([name, cfg]) => [name, cfg, await resolveServerCommand(cfg.command, cwd)] as const),\n );\n for (const [name, cfg, command] of resolved) {\n if (command) out[name] = { ...cfg, command };\n }\n return out;\n}\n","import { type JSONSchema, type PluginAPI, TOKENS } from '@wrongstack/core';\nimport { PRESETS } from './presets.js';\nimport type { PlugLSPConfig, ServerConfig, SeverityName } from './types.js';\n\nexport const PLUGIN_NAME = '@wrongstack/plug-lsp';\n\nexport const DEFAULT_CONFIG: Omit<PlugLSPConfig, 'servers'> = {\n autoStart: 'lazy',\n diagnosticsAfterEdit: 'background',\n diagnosticsWaitMs: 1500,\n severityFilter: ['error', 'warning'],\n maxDiagnosticsPerFile: 5,\n maxDiagnosticsTotal: 50,\n autoDiscover: true,\n logServerOutput: false,\n};\n\nexport const plugLspConfigSchema: JSONSchema = {\n type: 'object',\n properties: {\n servers: { type: 'object' },\n autoStart: { type: 'string', enum: ['lazy', 'eager', 'never'] },\n diagnosticsAfterEdit: { type: 'string', enum: ['background', 'manual'] },\n diagnosticsWaitMs: { type: 'integer' },\n severityFilter: {\n type: 'array',\n items: { type: 'string', enum: ['error', 'warning', 'info', 'hint'] },\n },\n maxDiagnosticsPerFile: { type: 'integer' },\n maxDiagnosticsTotal: { type: 'integer' },\n autoDiscover: { type: 'boolean' },\n logServerOutput: { type: 'boolean' },\n },\n};\n\nexport function readPlugLSPConfig(api: PluginAPI): PlugLSPConfig {\n const fromStore = readFromConfigStore(api);\n const raw = fromStore ?? api.config.extensions?.[PLUGIN_NAME] ?? {};\n return mergeConfig(raw);\n}\n\nexport function mergeConfig(raw: Readonly<Record<string, unknown>>): PlugLSPConfig {\n const servers = normalizeServers(raw.servers);\n const severity = Array.isArray(raw.severityFilter)\n ? raw.severityFilter.filter(isSeverityName)\n : DEFAULT_CONFIG.severityFilter;\n\n return {\n servers,\n autoStart: oneOf(raw.autoStart, ['lazy', 'eager', 'never'], DEFAULT_CONFIG.autoStart),\n diagnosticsAfterEdit: oneOf(\n raw.diagnosticsAfterEdit,\n ['background', 'manual'],\n DEFAULT_CONFIG.diagnosticsAfterEdit,\n ),\n diagnosticsWaitMs: positiveInt(raw.diagnosticsWaitMs, DEFAULT_CONFIG.diagnosticsWaitMs),\n severityFilter: severity.length > 0 ? severity : DEFAULT_CONFIG.severityFilter,\n maxDiagnosticsPerFile: positiveInt(\n raw.maxDiagnosticsPerFile,\n DEFAULT_CONFIG.maxDiagnosticsPerFile,\n ),\n maxDiagnosticsTotal: positiveInt(raw.maxDiagnosticsTotal, DEFAULT_CONFIG.maxDiagnosticsTotal),\n autoDiscover:\n typeof raw.autoDiscover === 'boolean' ? raw.autoDiscover : DEFAULT_CONFIG.autoDiscover,\n logServerOutput:\n typeof raw.logServerOutput === 'boolean'\n ? raw.logServerOutput\n : DEFAULT_CONFIG.logServerOutput,\n };\n}\n\nfunction readFromConfigStore(api: PluginAPI): Readonly<Record<string, unknown>> | undefined {\n if (!api.container.has(TOKENS.ConfigStore)) return undefined;\n try {\n return api.container.resolve(TOKENS.ConfigStore).getExtension(PLUGIN_NAME);\n } catch {\n return undefined;\n }\n}\n\nfunction normalizeServers(value: unknown): Record<string, ServerConfig> {\n if (!isRecord(value)) return {};\n const out: Record<string, ServerConfig> = {};\n for (const [name, raw] of Object.entries(value)) {\n if (!isRecord(raw)) continue;\n if (typeof raw.command !== 'string') continue;\n if (!Array.isArray(raw.languages) || raw.languages.some((x) => typeof x !== 'string')) {\n continue;\n }\n out[name] = {\n command: raw.command,\n args: stringArray(raw.args),\n env: stringRecord(raw.env),\n languages: raw.languages,\n rootPatterns: stringArray(raw.rootPatterns),\n initializationOptions: raw.initializationOptions,\n settings: raw.settings,\n startupTimeoutMs: positiveInt(raw.startupTimeoutMs, 15_000),\n enabled: typeof raw.enabled === 'boolean' ? raw.enabled : true,\n };\n }\n return out;\n}\n\nexport function withPresetFallbacks(cfg: PlugLSPConfig): PlugLSPConfig {\n const typescript = PRESETS.typescript;\n return {\n ...cfg,\n servers: Object.keys(cfg.servers).length > 0 || !typescript ? cfg.servers : { typescript },\n };\n}\n\nfunction oneOf<T extends string>(value: unknown, allowed: readonly T[], fallback: T): T {\n return typeof value === 'string' && allowed.includes(value as T) ? (value as T) : fallback;\n}\n\nfunction positiveInt(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction stringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((x) => typeof x === 'string') ? value : undefined;\n}\n\nfunction stringRecord(value: unknown): Record<string, string> | undefined {\n if (!isRecord(value)) return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(value)) {\n if (typeof v === 'string') out[k] = v;\n }\n return out;\n}\n\nfunction isSeverityName(value: unknown): value is SeverityName {\n return value === 'error' || value === 'warning' || value === 'info' || value === 'hint';\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import * as path from 'node:path';\n\nexport const LANGUAGE_MAP: Readonly<Record<string, string>> = {\n '.ts': 'typescript',\n '.tsx': 'typescriptreact',\n '.js': 'javascript',\n '.jsx': 'javascriptreact',\n '.mjs': 'javascript',\n '.cjs': 'javascript',\n '.go': 'go',\n '.rs': 'rust',\n '.py': 'python',\n '.pyi': 'python',\n '.rb': 'ruby',\n '.java': 'java',\n '.kt': 'kotlin',\n '.swift': 'swift',\n '.c': 'c',\n '.h': 'c',\n '.cpp': 'cpp',\n '.cc': 'cpp',\n '.cxx': 'cpp',\n '.hpp': 'cpp',\n '.cs': 'csharp',\n '.lua': 'lua',\n '.zig': 'zig',\n '.php': 'php',\n '.json': 'json',\n '.html': 'html',\n '.css': 'css',\n '.scss': 'scss',\n '.yml': 'yaml',\n '.yaml': 'yaml',\n '.sh': 'shellscript',\n '.bash': 'shellscript',\n};\n\nconst FILENAME_MAP: Readonly<Record<string, string>> = {\n Dockerfile: 'dockerfile',\n Makefile: 'makefile',\n 'CMakeLists.txt': 'cmake',\n 'tsconfig.json': 'json',\n 'package.json': 'json',\n};\n\nexport function languageIdFor(filePath: string): string | null {\n const base = path.basename(filePath);\n const exact = FILENAME_MAP[base];\n if (exact) return exact;\n\n if (base.endsWith('.test.ts') || base.endsWith('.spec.ts')) return 'typescript';\n if (base.endsWith('.test.tsx') || base.endsWith('.spec.tsx')) return 'typescriptreact';\n if (base.endsWith('.test.js') || base.endsWith('.spec.js')) return 'javascript';\n if (base.endsWith('.test.jsx') || base.endsWith('.spec.jsx')) return 'javascriptreact';\n\n return LANGUAGE_MAP[path.extname(base)] ?? null;\n}\n","import * as path from 'node:path';\nimport { fileURLToPath, pathToFileURL } from 'node:url';\n\nexport function pathToUri(filePath: string): string {\n return pathToFileURL(path.resolve(filePath)).toString();\n}\n\nexport function uriToPath(uri: string): string {\n return fileURLToPath(uri);\n}\n\nexport function displayPath(filePath: string, cwd: string): string {\n const rel = path.relative(cwd, filePath);\n return rel && !rel.startsWith('..') && !path.isAbsolute(rel) ? rel.replace(/\\\\/g, '/') : filePath;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, EventMap, Logger } from '@wrongstack/core';\nimport type { TextDocumentItem } from 'vscode-languageserver-protocol';\nimport { languageIdFor } from './language-detect.js';\nimport type { LSPRegistry } from './registry.js';\nimport type { LSPServer } from './server/lsp-server.js';\nimport type { TrackedDocument } from './types.js';\nimport { pathToUri } from './utils/uri.js';\n\nexport class DocumentTracker {\n private readonly docs = new Map<string, TrackedDocument>();\n private cwd: string;\n\n constructor(\n private readonly registry: () => LSPRegistry,\n private readonly log: Logger,\n cwd: string,\n private readonly events?: EventBus | undefined,\n ) {\n this.cwd = cwd;\n }\n\n setCwd(cwd: string): void {\n this.cwd = cwd;\n }\n\n async handleToolExecuted(event: EventMap['tool.executed']): Promise<void> {\n if (!event.ok) return;\n if (event.name !== 'read' && event.name !== 'edit' && event.name !== 'write') return;\n const input = event.input as { path?: unknown | undefined } | undefined;\n if (!input || typeof input.path !== 'string') return;\n const absPath = this.resolve(input.path);\n if (event.name === 'read') await this.open(absPath);\n else await this.fileWritten(absPath);\n }\n\n async fileWritten(filePath: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read changed file ${absPath}`, err);\n return;\n }\n const doc = this.docs.get(absPath);\n if (!doc) {\n await this.open(absPath, text);\n return;\n }\n doc.version++;\n doc.text = text;\n for (const server of this.registry().list()) {\n /* v8 ignore next -- false branch is defensive for mixed registries. */\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, text);\n doc.serverNames.add(server.name);\n }\n }\n\n async open(filePath: string, knownText?: string): Promise<void> {\n const absPath = this.resolve(filePath);\n const languageId = languageIdFor(absPath);\n if (!languageId) return;\n let text: string;\n if (knownText !== undefined) {\n text = knownText;\n } else {\n try {\n text = await fs.readFile(absPath, 'utf8');\n } catch (err) {\n this.log.debug(`LSP tracker could not read file ${absPath}`, err);\n return;\n }\n }\n let doc = this.docs.get(absPath);\n /* v8 ignore next -- both create and existing paths are covered; branch accounting is source-map noisy. */\n if (!doc) {\n doc = {\n uri: pathToUri(absPath),\n path: absPath,\n languageId,\n version: 1,\n text,\n serverNames: new Set(),\n };\n this.docs.set(absPath, doc);\n this.events?.emit('lsp.document.opened', { path: absPath, language: languageId });\n } else if (knownText !== undefined && knownText !== doc.text) {\n doc.version++;\n doc.text = knownText;\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n if (!doc.serverNames.has(server.name)) continue;\n server.notifyDidChange({ uri: doc.uri, version: doc.version }, knownText);\n }\n }\n for (const server of this.registry().list()) {\n if (server.state !== 'ready' || !server.config.languages.includes(languageId)) continue;\n /* v8 ignore next -- duplicate-open guard is defensive/idempotent. */\n if (doc.serverNames.has(server.name)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async reopenForServer(server: LSPServer): Promise<void> {\n /* v8 ignore next -- non-ready guard is covered but branch accounting is source-map noisy. */\n if (server.state !== 'ready') return;\n for (const doc of this.docs.values()) {\n /* v8 ignore next -- mixed-language registries are covered elsewhere. */\n if (!server.config.languages.includes(doc.languageId)) continue;\n server.notifyDidOpen(toTextDocumentItem(doc));\n doc.serverNames.add(server.name);\n }\n }\n\n async forceCloseAll(): Promise<void> {\n for (const doc of this.docs.values()) {\n for (const server of this.registry().list()) {\n /* v8 ignore next -- close only applies to ready servers that saw the doc. */\n if (server.state === 'ready' && doc.serverNames.has(server.name)) {\n server.notifyDidClose(doc.uri);\n this.events?.emit('lsp.document.closed', { path: doc.path });\n }\n }\n }\n this.docs.clear();\n }\n\n get(filePath: string): TrackedDocument | null {\n return this.docs.get(this.resolve(filePath)) ?? null;\n }\n\n list(): readonly TrackedDocument[] {\n return Array.from(this.docs.values());\n }\n\n private resolve(filePath: string): string {\n return path.isAbsolute(filePath) ? path.normalize(filePath) : path.resolve(this.cwd, filePath);\n }\n}\n\nfunction toTextDocumentItem(doc: TrackedDocument): TextDocumentItem {\n return {\n uri: doc.uri,\n languageId: doc.languageId,\n version: doc.version,\n text: doc.text,\n };\n}\n","import type { ServerState } from '../types.js';\n\nconst ALLOWED: Record<ServerState, ServerState[]> = {\n disabled: ['starting'],\n starting: ['initializing', 'failed', 'exited'],\n initializing: ['ready', 'failed', 'exited'],\n ready: ['shutting_down', 'failed', 'exited'],\n failed: ['reconnecting', 'disabled', 'starting'],\n reconnecting: ['starting', 'failed'],\n shutting_down: ['exited', 'failed'],\n exited: ['starting', 'disabled'],\n};\n\nexport function canTransition(from: ServerState, to: ServerState): boolean {\n return from === to || ALLOWED[from].includes(to);\n}\n\nexport function nextReconnectDelay(attempt: number): number {\n /* v8 ignore next -- array fallback is defensive after clamping. */\n return [1000, 4000, 16_000][Math.max(0, Math.min(2, attempt))] ?? 16_000;\n}\n","export type {\n CodeAction,\n CompletionItem,\n CompletionList,\n Diagnostic,\n DocumentSymbol,\n Hover,\n Location,\n LocationLink,\n Range,\n ServerCapabilities,\n SymbolInformation,\n WorkspaceEdit,\n} from 'vscode-languageserver-protocol';\n\nexport type AutoStartMode = 'lazy' | 'eager' | 'never';\nexport type DiagnosticsAfterEdit = 'background' | 'manual';\nexport type SeverityName = 'error' | 'warning' | 'info' | 'hint';\n\nexport interface ServerConfig {\n command: string;\n args?: string[] | undefined;\n env?: Record<string, string> | undefined;\n languages: string[];\n rootPatterns?: string[] | undefined;\n initializationOptions?: unknown | undefined;\n settings?: unknown | undefined;\n startupTimeoutMs?: number | undefined;\n enabled?: boolean | undefined;\n}\n\nexport interface PlugLSPConfig {\n servers: Record<string, ServerConfig>;\n autoStart: AutoStartMode;\n diagnosticsAfterEdit: DiagnosticsAfterEdit;\n diagnosticsWaitMs: number;\n severityFilter: SeverityName[];\n maxDiagnosticsPerFile: number;\n maxDiagnosticsTotal: number;\n autoDiscover: boolean;\n logServerOutput: boolean;\n}\n\nexport type ServerState =\n | 'disabled'\n | 'starting'\n | 'initializing'\n | 'ready'\n | 'failed'\n | 'shutting_down'\n | 'exited'\n | 'reconnecting';\n\nexport interface TrackedDocument {\n uri: string;\n path: string;\n languageId: string;\n version: number;\n text: string;\n serverNames: Set<string>;\n}\n\nexport enum LSPErrorCode {\n ServerNotFound = 'LSP_SERVER_NOT_FOUND',\n ServerNotReady = 'LSP_SERVER_NOT_READY',\n ServerFailed = 'LSP_SERVER_FAILED',\n CapabilityMissing = 'LSP_CAPABILITY_MISSING',\n RequestTimeout = 'LSP_REQUEST_TIMEOUT',\n InvalidPosition = 'LSP_INVALID_POSITION',\n ProtocolError = 'LSP_PROTOCOL_ERROR',\n ApplyEditFailed = 'LSP_APPLY_EDIT_FAILED',\n}\n\nexport class LSPError extends Error {\n constructor(\n readonly code: LSPErrorCode,\n message: string,\n readonly details?: unknown | undefined,\n ) {\n super(message);\n this.name = 'LSPError';\n }\n}\n\ndeclare module '@wrongstack/core' {\n interface EventMap {\n 'lsp.server.starting': { name: string; command: string };\n 'lsp.server.ready': { name: string; languages: string[] };\n 'lsp.server.exited': { name: string; code: number | null; signal: string | null };\n 'lsp.server.crashed': { name: string; error: string };\n 'lsp.diagnostics.updated': { path: string; count: number };\n 'lsp.document.opened': { path: string; language: string };\n 'lsp.document.closed': { path: string };\n }\n}\n","import { type ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport type { ServerConfig } from '../types.js';\nimport { buildChildEnv } from '@wrongstack/core';\n\nexport function safeSpawn(cfg: ServerConfig, cwd: string): ChildProcessWithoutNullStreams {\n /* v8 ignore next -- platform-specific branch differs between Windows and POSIX. */\n const shell = process.platform === 'win32' && /\\.(cmd|bat)$/i.test(cfg.command);\n return spawn(cfg.command, cfg.args ?? [], {\n cwd,\n env: buildChildEnv({ extra: cfg.env }),\n stdio: ['pipe', 'pipe', 'pipe'],\n shell,\n windowsHide: true,\n });\n}\n","import { LSPError, LSPErrorCode } from '../types.js';\n\nexport async function promiseWithTimeout<T>(\n promise: Promise<T>,\n ms: number,\n signal?: AbortSignal | undefined,\n): Promise<T> {\n if (signal?.aborted) throw abortError(signal);\n let timer: NodeJS.Timeout | undefined;\n return await new Promise<T>((resolve, reject) => {\n const cleanup = () => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = () => {\n cleanup();\n reject(abortError(signal));\n };\n timer = setTimeout(() => {\n cleanup();\n reject(new LSPError(LSPErrorCode.RequestTimeout, `LSP request timed out after ${ms}ms`));\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n promise.then(\n (value) => {\n cleanup();\n resolve(value);\n },\n (err) => {\n cleanup();\n reject(err);\n },\n );\n });\n}\n\nfunction abortError(signal?: AbortSignal): Error {\n return signal?.reason instanceof Error ? signal.reason : new Error('aborted');\n}\n","import { EventEmitter } from 'node:events';\nimport type { Readable, Writable } from 'node:stream';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { promiseWithTimeout } from '../utils/timeout.js';\n\ninterface JsonRpcMessage {\n jsonrpc: '2.0';\n id?: number | string | null | undefined;\n method?: string | undefined;\n params?: unknown | undefined;\n result?: unknown | undefined;\n error?: { code: number | undefined; message: string; data?: unknown | undefined };\n}\n\ninterface Pending {\n resolve(value: unknown): void;\n reject(err: unknown): void;\n}\n\nexport class Connection {\n private nextId = 1;\n private readonly pending = new Map<number, Pending>();\n private readonly events = new EventEmitter();\n private buffer = Buffer.alloc(0);\n private closed = false;\n\n constructor(\n private readonly stdin: Writable,\n stdout: Readable,\n ) {\n stdout.on('data', (chunk: Buffer) => this.onData(chunk));\n stdout.on('close', () => this.close());\n stdout.on('error', (err) => this.failAll(err));\n }\n\n async sendRequest<R>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<R> {\n this.assertOpen();\n const id = this.nextId++;\n const request: JsonRpcMessage = { jsonrpc: '2.0', id, method, params };\n const response = new Promise<R>((resolve, reject) => {\n this.pending.set(id, { resolve: resolve as (value: unknown) => void, reject });\n this.write(request);\n });\n try {\n return await promiseWithTimeout(response, timeoutMs, signal);\n } catch (err) {\n this.pending.delete(id);\n if (signal.aborted) {\n try {\n this.sendNotification('$/cancelRequest', { id });\n } catch {\n // ignore cancellation write failure\n }\n }\n throw normalizeError(err);\n }\n }\n\n sendNotification(method: string, params: unknown): void {\n this.assertOpen();\n this.write({ jsonrpc: '2.0', method, params });\n }\n\n onNotification(method: string, handler: (params: unknown) => void): () => void {\n this.events.on(method, handler);\n return () => this.events.off(method, handler);\n }\n\n onClose(handler: () => void): () => void {\n this.events.on('close', handler);\n return () => this.events.off('close', handler);\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n this.failAll(new LSPError(LSPErrorCode.ProtocolError, 'LSP connection closed'));\n this.events.emit('close');\n }\n\n private onData(chunk: Buffer): void {\n // Cap the receive buffer so a misbehaving server that floods data\n // without proper Content-Length headers can't exhaust memory.\n const MAX_BUFFER = 16 * 1024 * 1024; // 16 MiB\n if (this.buffer.length + chunk.length > MAX_BUFFER) {\n this.close();\n return;\n }\n this.buffer = Buffer.concat([this.buffer, chunk]);\n for (;;) {\n const sep = this.buffer.indexOf('\\r\\n\\r\\n');\n if (sep === -1) return;\n const header = this.buffer.subarray(0, sep).toString('ascii');\n const match = /Content-Length:\\s*(\\d+)/i.exec(header);\n if (!match) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const length = Number(match[1]);\n // Reject NaN, negative, or absurd lengths. Without this a\n // Content-Length: abc slips past as NaN and permanently stalls\n // the message parser.\n if (!Number.isFinite(length) || length < 0 || length > MAX_BUFFER) {\n this.buffer = this.buffer.subarray(sep + 4);\n continue;\n }\n const total = sep + 4 + length;\n if (this.buffer.length < total) return;\n const body = this.buffer.subarray(sep + 4, total).toString('utf8');\n this.buffer = this.buffer.subarray(total);\n try {\n this.handleMessage(JSON.parse(body) as JsonRpcMessage);\n } catch {\n // Malformed server output should not take down the agent.\n }\n }\n }\n\n private handleMessage(msg: JsonRpcMessage): void {\n if (msg.id !== undefined && msg.id !== null && !msg.method) {\n const id = Number(msg.id);\n const pending = this.pending.get(id);\n if (!pending) return;\n this.pending.delete(id);\n if (msg.error)\n pending.reject(new LSPError(LSPErrorCode.ProtocolError, msg.error.message, msg.error));\n else pending.resolve(msg.result);\n return;\n }\n if (msg.method) this.events.emit(msg.method, msg.params);\n }\n\n private write(message: JsonRpcMessage): void {\n const body = JSON.stringify(message);\n const bytes = Buffer.byteLength(body, 'utf8');\n this.stdin.write(`Content-Length: ${bytes}\\r\\n\\r\\n${body}`, 'utf8');\n }\n\n private assertOpen(): void {\n if (this.closed) throw new LSPError(LSPErrorCode.ProtocolError, 'LSP connection is closed');\n }\n\n private failAll(err: unknown): void {\n for (const pending of this.pending.values()) pending.reject(normalizeError(err));\n this.pending.clear();\n }\n}\n\nfunction normalizeError(err: unknown): Error {\n if (err instanceof Error) return err;\n /* v8 ignore next -- Node stream errors are Error objects; retained for protocol safety. */\n return new LSPError(LSPErrorCode.ProtocolError, String(err));\n}\n","import { pathToFileURL } from 'node:url';\nimport type {\n InitializeParams,\n InitializeResult,\n ServerCapabilities,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig } from '../types.js';\nimport type { Connection } from './connection.js';\n\nexport const CLIENT_CAPABILITIES: InitializeParams['capabilities'] = {\n workspace: {\n workspaceFolders: true,\n didChangeWatchedFiles: { dynamicRegistration: false },\n symbol: {},\n executeCommand: { dynamicRegistration: false },\n },\n textDocument: {\n synchronization: {\n didSave: false,\n dynamicRegistration: false,\n willSave: false,\n willSaveWaitUntil: false,\n },\n diagnostic: { dynamicRegistration: false },\n definition: { linkSupport: true },\n references: {},\n hover: { contentFormat: ['markdown', 'plaintext'] },\n documentSymbol: { hierarchicalDocumentSymbolSupport: true },\n rename: { prepareSupport: true },\n codeAction: {},\n },\n general: { positionEncodings: ['utf-16'] },\n};\n\nexport async function initializeServer(\n connection: Connection,\n serverCfg: ServerConfig,\n rootPath: string,\n timeoutMs: number,\n signal: AbortSignal,\n): Promise<ServerCapabilities> {\n const rootUri = pathToFileURL(rootPath).toString();\n const params: InitializeParams = {\n processId: process.pid,\n rootPath,\n rootUri,\n capabilities: CLIENT_CAPABILITIES,\n initializationOptions: serverCfg.initializationOptions,\n workspaceFolders: [\n {\n uri: rootUri,\n name:\n rootPath\n .split(/[\\\\/]/)\n .pop() /* v8 ignore next */ ?? rootPath,\n },\n ],\n };\n const result = await connection.sendRequest<InitializeResult>(\n 'initialize',\n params,\n timeoutMs,\n signal,\n );\n connection.sendNotification('initialized', {});\n return result.capabilities;\n}\n","import type { ChildProcessWithoutNullStreams } from 'node:child_process';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type {\n CodeAction,\n CodeActionParams,\n CompletionItem,\n CompletionList,\n CompletionParams,\n Diagnostic,\n DocumentSymbol,\n DocumentSymbolParams,\n ExecuteCommandParams,\n Hover,\n HoverParams,\n Location,\n LocationLink,\n Position,\n PrepareRenameParams,\n ReferenceParams,\n RenameParams,\n ServerCapabilities,\n SymbolInformation,\n TextDocumentItem,\n VersionedTextDocumentIdentifier,\n WorkspaceEdit,\n WorkspaceSymbolParams,\n} from 'vscode-languageserver-protocol';\nimport type { ServerConfig, ServerState } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { safeSpawn } from '../utils/safe-spawn.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { Connection } from './connection.js';\nimport { initializeServer } from './initialize.js';\n\nexport interface ServerContext {\n cwd: string;\n rootPath: string;\n log: Logger;\n events: EventBus;\n onCrash?: ((server: LSPServer) => void) | undefined;\n}\n\nexport class LSPServer {\n state: ServerState = 'exited';\n capabilities: ServerCapabilities | null = null;\n readonly diagnostics = new Map<string, Diagnostic[]>();\n private child: ChildProcessWithoutNullStreams | null = null;\n private connection: Connection | null = null;\n private processReachedReady = false;\n private stderrRing: string[] = [];\n\n constructor(\n readonly name: string,\n readonly config: ServerConfig,\n private readonly ctx: ServerContext,\n ) {\n if (config.enabled === false) this.state = 'disabled';\n }\n\n get rootPath(): string {\n return this.ctx.rootPath;\n }\n\n get lastStderr(): string {\n return this.stderrRing.slice(-20).join('\\n');\n }\n\n async start(signal: AbortSignal = new AbortController().signal): Promise<void> {\n if (this.state === 'ready' || this.state === 'starting' || this.state === 'initializing')\n return;\n if (this.config.enabled === false) {\n this.state = 'disabled';\n return;\n }\n this.state = 'starting';\n this.processReachedReady = false;\n this.ctx.events.emit('lsp.server.starting', { name: this.name, command: this.config.command });\n const child = safeSpawn(this.config, this.ctx.rootPath);\n this.child = child;\n child.stderr.on('data', (chunk: Buffer) => this.captureStderr(chunk));\n child.on('exit', (code, sig) => {\n const shouldReconnect = this.processReachedReady;\n this.connection?.close();\n this.connection = null;\n this.child = null;\n if (this.state !== 'shutting_down' && this.state !== 'exited') {\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', {\n name: this.name,\n error: `process exited code=${code ?? 'null'} signal=${sig ?? 'null'}`,\n });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n }\n this.ctx.events.emit('lsp.server.exited', { name: this.name, code, signal: sig });\n this.processReachedReady = false;\n });\n child.on('error', (err) => {\n const shouldReconnect = this.processReachedReady;\n this.state = 'failed';\n this.ctx.events.emit('lsp.server.crashed', { name: this.name, error: err.message });\n if (shouldReconnect) this.ctx.onCrash?.(this);\n this.processReachedReady = false;\n });\n\n this.connection = new Connection(child.stdin, child.stdout);\n this.connection.onNotification('textDocument/publishDiagnostics', (params) => {\n const p = params as { uri?: string | undefined; diagnostics?: Diagnostic[] | undefined };\n if (!p.uri || !Array.isArray(p.diagnostics)) return;\n this.diagnostics.set(p.uri, p.diagnostics);\n this.ctx.events.emit('lsp.diagnostics.updated', {\n path: p.uri.startsWith('file:') ? uriToPath(p.uri) : p.uri,\n count: p.diagnostics.length,\n });\n });\n this.connection.onNotification('window/logMessage', (params) => {\n if (this.config.enabled !== false && params && this.config) {\n this.ctx.log.debug(`LSP ${this.name} log`, params);\n }\n });\n this.connection.onClose(() => {\n if (this.state === 'ready') this.state = 'failed';\n });\n\n this.state = 'initializing';\n const startup = startupFailure(child);\n try {\n this.capabilities = await Promise.race([\n initializeServer(\n this.connection,\n this.config,\n this.ctx.rootPath,\n this.config.startupTimeoutMs ?? 15_000,\n signal,\n ),\n startup.promise,\n ]);\n startup.cancel();\n this.state = 'ready';\n this.processReachedReady = true;\n this.ctx.events.emit('lsp.server.ready', {\n name: this.name,\n languages: this.config.languages,\n });\n } catch (err) {\n startup.cancel();\n this.state = 'failed';\n this.connection?.close();\n this.child?.kill();\n this.processReachedReady = false;\n throw err;\n }\n }\n\n async shutdown(): Promise<void> {\n if (this.state === 'exited' || this.state === 'disabled') return;\n this.state = 'shutting_down';\n try {\n if (this.connection) {\n const ctrl = new AbortController();\n await this.connection\n .sendRequest('shutdown', null, 3000, ctrl.signal)\n .catch(() => undefined);\n this.connection.sendNotification('exit', null);\n }\n } finally {\n this.connection?.close();\n this.connection = null;\n if (this.child && !this.child.killed) this.child.kill();\n this.child = null;\n this.processReachedReady = false;\n this.state = 'exited';\n }\n }\n\n async definition(\n params: TextDocumentPositionParamsLike,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | LocationLink[] | null> {\n return await this.request('textDocument/definition', params, timeoutMs, signal);\n }\n\n async references(\n params: ReferenceParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Location[] | null> {\n return await this.request('textDocument/references', params, timeoutMs, signal);\n }\n\n async hover(params: HoverParams, timeoutMs: number, signal: AbortSignal): Promise<Hover | null> {\n return await this.request('textDocument/hover', params, timeoutMs, signal);\n }\n\n async completion(\n params: CompletionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CompletionItem[] | CompletionList | null> {\n return await this.request('textDocument/completion', params, timeoutMs, signal);\n }\n\n async documentSymbol(\n params: DocumentSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<DocumentSymbol[] | SymbolInformation[] | null> {\n return await this.request('textDocument/documentSymbol', params, timeoutMs, signal);\n }\n\n async workspaceSymbol(\n params: WorkspaceSymbolParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<SymbolInformation[] | null> {\n return await this.request('workspace/symbol', params, timeoutMs, signal);\n }\n\n async prepareRename(\n params: PrepareRenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<\n { range: unknown; placeholder?: string | undefined } | import('vscode-languageserver-protocol').Range | null\n > {\n return await this.request('textDocument/prepareRename', params, timeoutMs, signal);\n }\n\n async rename(\n params: RenameParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<WorkspaceEdit | null> {\n return await this.request('textDocument/rename', params, timeoutMs, signal);\n }\n\n async codeAction(\n params: CodeActionParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<CodeAction[]> {\n return (await this.request('textDocument/codeAction', params, timeoutMs, signal)) ?? [];\n }\n\n async executeCommand(\n params: ExecuteCommandParams,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<unknown> {\n return await this.request('workspace/executeCommand', params, timeoutMs, signal);\n }\n\n async pullDiagnostics(\n uri: string,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<Diagnostic[]> {\n const result = await this.request<{ items?: Diagnostic[] | undefined }>(\n 'textDocument/diagnostic',\n { textDocument: { uri } },\n timeoutMs,\n signal,\n );\n const items = result?.items ?? [];\n this.diagnostics.set(uri, items);\n return items;\n }\n\n getDiagnostics(uri: string): Diagnostic[] {\n return this.diagnostics.get(uri) ?? [];\n }\n\n notifyDidOpen(doc: TextDocumentItem): void {\n this.notification('textDocument/didOpen', { textDocument: doc });\n }\n\n notifyDidChange(doc: VersionedTextDocumentIdentifier, text: string): void {\n this.notification('textDocument/didChange', {\n textDocument: doc,\n contentChanges: [{ text }],\n });\n }\n\n notifyDidClose(uri: string): void {\n this.notification('textDocument/didClose', { textDocument: { uri } });\n }\n\n textDocumentIdentifier(filePath: string): { uri: string } {\n return { uri: pathToUri(filePath) };\n }\n\n private async request<T>(\n method: string,\n params: unknown,\n timeoutMs: number,\n signal: AbortSignal,\n ): Promise<T> {\n if (this.state !== 'ready' || !this.connection) {\n throw new LSPError(LSPErrorCode.ServerNotReady, `Server \"${this.name}\" is not ready`);\n }\n return await this.connection.sendRequest<T>(method, params, timeoutMs, signal);\n }\n\n private notification(method: string, params: unknown): void {\n if (this.state !== 'ready' || !this.connection) return;\n this.connection.sendNotification(method, params);\n }\n\n private captureStderr(chunk: Buffer): void {\n const lines = chunk.toString('utf8').split(/\\r?\\n/).filter(Boolean);\n this.stderrRing.push(...lines);\n if (this.stderrRing.length > 100) this.stderrRing = this.stderrRing.slice(-100);\n }\n}\n\ninterface TextDocumentPositionParamsLike {\n textDocument: { uri: string };\n position: Position;\n}\n\nfunction startupFailure(child: ChildProcessWithoutNullStreams): {\n promise: Promise<never>;\n cancel: () => void;\n} {\n let cleanup = () => undefined;\n const promise = new Promise<never>((_, reject) => {\n const onError = (err: Error) => {\n cleanup();\n reject(\n new LSPError(LSPErrorCode.ServerFailed, `LSP server failed to start: ${err.message}`, err),\n );\n };\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n cleanup();\n reject(\n new LSPError(\n LSPErrorCode.ServerFailed,\n `LSP server exited during startup code=${code ?? 'null'} signal=${signal ?? 'null'}`,\n ),\n );\n };\n cleanup = () => {\n child.off('error', onError);\n child.off('exit', onExit);\n };\n child.once('error', onError);\n child.once('exit', onExit);\n });\n return { promise, cancel: cleanup };\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport function findWorkspaceRoot(\n filePath: string,\n rootPatterns: string[] | undefined,\n fallback: string,\n): string {\n const patterns = rootPatterns?.length ? rootPatterns : [];\n if (patterns.length === 0) return path.resolve(fallback);\n\n let dir = path.dirname(path.resolve(filePath));\n const stop = path.parse(dir).root;\n for (;;) {\n for (const pattern of patterns) {\n if (matchesAt(dir, pattern)) return dir;\n }\n if (dir === stop) return path.resolve(fallback);\n dir = path.dirname(dir);\n }\n}\n\nfunction matchesAt(dir: string, pattern: string): boolean {\n if (!pattern.includes('*')) return fs.existsSync(path.join(dir, pattern));\n const escaped = pattern\n .split('*')\n .map((part) => part.replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n .join('.*');\n const re = new RegExp(`^${escaped}$`);\n try {\n return fs.readdirSync(dir).some((name) => re.test(name));\n } catch {\n return false;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { EventBus, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from './document-tracker.js';\nimport { languageIdFor } from './language-detect.js';\nimport { nextReconnectDelay } from './server/lifecycle.js';\nimport { LSPServer } from './server/lsp-server.js';\nimport type { AutoStartMode, PlugLSPConfig } from './types.js';\nimport { LSPError, LSPErrorCode } from './types.js';\nimport { findWorkspaceRoot } from './workspace-root.js';\n\nexport interface RegistryContext {\n cwd: string;\n log: Logger;\n events: EventBus;\n}\n\nexport class LSPRegistry {\n private readonly servers = new Map<string, LSPServer>();\n private readonly languageIndex = new Map<string, string>();\n private readonly reconnectAttempts = new Map<string, number>();\n private readonly reconnectTimers = new Map<string, NodeJS.Timeout>();\n private cwd: string;\n private autoStart: AutoStartMode;\n\n constructor(\n private readonly cfg: PlugLSPConfig,\n private readonly tracker: DocumentTracker,\n private readonly ctx: RegistryContext,\n ) {\n this.cwd = ctx.cwd;\n /* v8 ignore next -- constructor assignment has no alternate behavior. */\n this.autoStart = cfg.autoStart;\n }\n\n async bind(cwd: string, autoStart: AutoStartMode = this.cfg.autoStart): Promise<void> {\n this.cwd = cwd;\n this.autoStart = autoStart;\n this.rebuildServers();\n if (autoStart === 'eager') {\n const languages = await detectProjectLanguages(cwd);\n await Promise.all(\n this.list()\n .filter((s) => s.config.languages.some((lang) => languages.has(lang)))\n .map((s) =>\n s.start().catch((err) => this.ctx.log.warn(`LSP ${s.name} failed to start`, err)),\n ),\n );\n }\n }\n\n async shutdown(): Promise<void> {\n for (const timer of this.reconnectTimers.values()) clearTimeout(timer);\n this.reconnectTimers.clear();\n await Promise.all(\n this.list().map((s) =>\n s.shutdown().catch((err) => this.ctx.log.warn(`LSP ${s.name} shutdown failed`, err)),\n ),\n );\n }\n\n async findForPath(filePath: string, signal?: AbortSignal): Promise<LSPServer | null> {\n if (this.servers.size === 0) this.rebuildServers();\n const language = languageIdFor(filePath);\n if (!language) return null;\n const name = this.languageIndex.get(language);\n if (!name) return null;\n const server = this.servers.get(name);\n if (!server) return null;\n if (server.state !== 'ready' && this.autoStart === 'lazy') {\n await server.start(signal);\n await this.tracker.reopenForServer(server);\n }\n return server.state === 'ready' ? server : null;\n }\n\n get(name: string): LSPServer | null {\n if (this.servers.size === 0) this.rebuildServers();\n return this.servers.get(name) ?? null;\n }\n\n list(): readonly LSPServer[] {\n if (this.servers.size === 0) this.rebuildServers();\n return Array.from(this.servers.values());\n }\n\n async start(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n async stop(name: string): Promise<void> {\n // Cancel any pending auto-reconnect so the server doesn't come back\n // up moments after a user-requested stop.\n this.cancelReconnect(name);\n await this.getOrThrow(name).shutdown();\n }\n\n async restart(name: string): Promise<void> {\n const server = this.getOrThrow(name);\n // Cancel pending auto-reconnect AND clear the strike counter — a\n // manual restart should not count against the 3-attempt limit.\n this.cancelReconnect(name);\n this.reconnectAttempts.delete(name);\n await server.shutdown();\n await server.start();\n await this.tracker.reopenForServer(server);\n }\n\n private cancelReconnect(name: string): void {\n const timer = this.reconnectTimers.get(name);\n if (timer) {\n clearTimeout(timer);\n this.reconnectTimers.delete(name);\n }\n }\n\n private rebuildServers(): void {\n this.servers.clear();\n this.languageIndex.clear();\n for (const [name, cfg] of Object.entries(this.cfg.servers)) {\n if (cfg.enabled === false) continue;\n const rootPath = findWorkspaceRoot(\n path.join(this.cwd, '__probe__'),\n cfg.rootPatterns,\n this.cwd,\n );\n const server = new LSPServer(name, cfg, {\n cwd: this.cwd,\n rootPath,\n log: this.ctx.log,\n events: this.ctx.events,\n onCrash: (crashed) => this.scheduleReconnect(crashed),\n });\n this.servers.set(name, server);\n for (const language of cfg.languages) {\n if (this.languageIndex.has(language)) {\n this.ctx.log.warn(\n `LSP language \"${language}\" is claimed by multiple servers; using first`,\n );\n continue;\n }\n this.languageIndex.set(language, name);\n }\n }\n }\n\n private getOrThrow(name: string): LSPServer {\n const server = this.get(name);\n if (!server) throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server named \"${name}\"`);\n return server;\n }\n\n private scheduleReconnect(server: LSPServer): void {\n if (this.reconnectTimers.has(server.name)) return;\n const attempt = this.reconnectAttempts.get(server.name) ?? 0;\n if (attempt >= 3) {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempts exhausted`);\n return;\n }\n this.reconnectAttempts.set(server.name, attempt + 1);\n server.state = 'reconnecting';\n const timer = setTimeout(() => {\n this.reconnectTimers.delete(server.name);\n void server\n .start()\n .then(() => {\n this.reconnectAttempts.delete(server.name);\n return this.tracker.reopenForServer(server);\n })\n /* v8 ignore start -- reconnect failure exhaustion is timing-dependent; startup failure is covered separately. */\n .catch((err) => {\n this.ctx.log.warn(`LSP ${server.name} reconnect attempt ${attempt + 1} failed`, err);\n server.state = 'failed';\n this.scheduleReconnect(server);\n });\n /* v8 ignore stop */\n }, nextReconnectDelay(attempt));\n this.reconnectTimers.set(server.name, timer);\n }\n}\n\nasync function detectProjectLanguages(root: string): Promise<Set<string>> {\n const found = new Set<string>();\n const visit = async (dir: string, depth: number): Promise<void> => {\n if (depth > 3) return;\n let entries: import('node:fs').Dirent[];\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n /* v8 ignore next -- unreadable directories depend on OS permissions. */\n } catch {\n return;\n }\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === 'dist' || entry.name === '.git') continue;\n const p = path.join(dir, entry.name);\n if (entry.isDirectory()) await visit(p, depth + 1);\n else {\n const lang = languageIdFor(p);\n if (lang) found.add(lang);\n }\n }\n };\n await visit(root, 0);\n return found;\n}\n","import type { Diagnostic } from 'vscode-languageserver-protocol';\nimport type { SeverityName } from '../types.js';\nimport { displayPath } from '../utils/uri.js';\n\nconst SEVERITY: Record<number, SeverityName> = {\n 1: 'error',\n 2: 'warning',\n 3: 'info',\n 4: 'hint',\n};\n\nconst LABEL: Record<SeverityName, string> = {\n error: 'ERROR',\n warning: 'WARN',\n info: 'INFO',\n hint: 'HINT',\n};\n\nexport function formatDiagnostics(\n byFile: Map<string, Diagnostic[]>,\n opts: {\n cwd: string;\n severityFilter: SeverityName[];\n maxPerFile: number;\n maxTotal: number;\n },\n): string {\n const allowed = new Set(opts.severityFilter);\n const sections: string[] = [];\n let total = 0;\n let files = 0;\n for (const [file, diagnostics] of byFile.entries()) {\n const filtered = diagnostics\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n .filter((d) => allowed.has(SEVERITY[d.severity ?? 1] ?? 'error'))\n .sort(compareDiagnostics)\n .slice(0, opts.maxPerFile);\n if (filtered.length === 0) continue;\n files++;\n total += filtered.length;\n const lines = filtered.map((d) => formatDiagnostic(d));\n sections.push(\n `${displayPath(file, opts.cwd)} (${filtered.length}):\\n${lines.map((l) => ` ${l}`).join('\\n')}`,\n );\n if (total >= opts.maxTotal) break;\n }\n if (sections.length === 0) return 'No LSP diagnostics.';\n return `${sections.join('\\n\\n')}\\n\\nTotal: ${total} diagnostics in ${files} files.`;\n}\n\nfunction formatDiagnostic(d: Diagnostic): string {\n /* v8 ignore next -- fallback handles invalid server severity values defensively. */\n const sev = SEVERITY[d.severity ?? 1] ?? 'error';\n const source = d.source ? ` ${d.source}${d.code !== undefined ? `(${String(d.code)})` : ''}` : '';\n const msgRaw = typeof d.message === 'string' ? d.message : d.message.value;\n const msg = msgRaw.replace(/\\s*\\r?\\n\\s*/g, ' | ');\n return `L${d.range.start.line + 1}:${d.range.start.character + 1} ${LABEL[sev]}${source}: ${msg}`;\n}\n\nfunction compareDiagnostics(a: Diagnostic, b: Diagnostic): number {\n return (\n (a.severity ?? 1) - (b.severity ?? 1) ||\n a.range.start.line - b.range.start.line ||\n a.range.start.character - b.range.start.character\n );\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { LSPRegistry } from '../registry.js';\nimport { uriToPath } from '../utils/uri.js';\n\nexport function diagnosticsCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'diagnostics',\n description: 'Print buffered LSP diagnostics.',\n async run(_args, ctx) {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const server of registry.list()) {\n for (const [uri, diagnostics] of server.diagnostics.entries()) {\n byFile.set(uriToPath(uri), diagnostics);\n }\n }\n return {\n message: formatDiagnostics(byFile, {\n cwd: ctx?.cwd ?? process.cwd(),\n severityFilter: ['error', 'warning'],\n maxPerFile: 10,\n maxTotal: 100,\n }),\n };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function listCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'list',\n description: 'List configured LSP servers.',\n async run() {\n const rows = registry.list().map((s) => {\n const langs = s.config.languages.join(',');\n return `${s.name.padEnd(18)} ${s.state.padEnd(14)} ${langs} ${s.rootPath}`;\n });\n return { message: rows.length ? rows.join('\\n') : 'No LSP servers configured.' };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function restartCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'restart',\n description: 'Restart an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:restart <name>' };\n await registry.restart(name);\n return { message: `Restarted LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function startCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'start',\n description: 'Start an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:start <name>' };\n await registry.start(name);\n return { message: `Started LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\n\nexport function stopCommand(registry: LSPRegistry): SlashCommand {\n return {\n name: 'stop',\n description: 'Stop an LSP server.',\n async run(args) {\n const name = args.trim();\n if (!name) return { message: 'Usage: /@wrongstack/plug-lsp:stop <name>' };\n await registry.stop(name);\n return { message: `Stopped LSP server \"${name}\".` };\n },\n };\n}\n","import type { SlashCommand } from '@wrongstack/core';\nimport * as path from 'node:path';\nimport type { LSPRegistry } from '../registry.js';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LANGUAGE_SERVERS, SUPPORTED_LANGUAGES } from './install.js';\n\n// Re-export for use from the plugin entry\nexport { installLang, LANGUAGE_SERVERS, SUPPORTED_LANGUAGES } from './install.js';\n\ninterface LspContext {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n cwd: string;\n}\n\ntype LspSubcommand =\n | { type: 'list' }\n | { type: 'status' }\n | { type: 'install'; language: string }\n | { type: 'start'; name?: string | undefined }\n | { type: 'stop'; name?: string | undefined }\n | { type: 'restart'; name?: string | undefined }\n | { type: 'diagnostics'; file?: string | undefined }\n | { type: 'add'; name: string; command: string; args?: string[]; languages: string[]; rootPatterns?: string[] }\n | { type: 'remove'; name: string }\n | { type: 'enable'; name: string }\n | { type: 'disable'; name: string }\n | { type: 'help' };\n\nfunction parseArgs(args: string): LspSubcommand {\n const parts = args.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return { type: 'list' };\n\n const sub = parts[0]!.toLowerCase();\n\n if (sub === 'list' || sub === 'ls') return { type: 'list' };\n if (sub === 'status' || sub === 'stat') return { type: 'status' };\n if (sub === 'help' || sub === 'h' || sub === '--help') return { type: 'help' };\n\n if (sub === 'install' || sub === 'add') {\n const lang = parts[1];\n if (!lang) return { type: 'help' };\n return { type: 'install', language: lang };\n }\n\n if (sub === 'start') return { type: 'start', name: parts[1] };\n if (sub === 'stop') return { type: 'stop', name: parts[1] };\n if (sub === 'restart' || sub === 'reload') return { type: 'restart', name: parts[1] };\n\n if (sub === 'diagnostics' || sub === 'diag') {\n return { type: 'diagnostics', file: parts[1] };\n }\n\n if (sub === 'remove' || sub === 'rm' || sub === 'delete') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'remove', name };\n }\n\n if (sub === 'enable') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'enable', name };\n }\n\n if (sub === 'disable') {\n const name = parts[1];\n if (!name) return { type: 'help' };\n return { type: 'disable', name };\n }\n\n return { type: 'help' };\n}\n\nfunction colorize(text: string, code: string): string {\n const colors: Record<string, string> = {\n green: '\\x1b[32m',\n red: '\\x1b[31m',\n yellow: '\\x1b[33m',\n cyan: '\\x1b[36m',\n bold: '\\x1b[1m',\n dim: '\\x1b[2m',\n reset: '\\x1b[0m',\n };\n return `${colors[code] ?? ''}${text}${colors.reset}`;\n}\n\nexport function buildLspCommand(ctx: LspContext): SlashCommand {\n return {\n name: 'lsp',\n category: 'Inspect',\n aliases: ['lsplsp'],\n description:\n 'Manage LSP language servers: /lsp [list|install <lang>|start [name]|stop [name]|restart [name]|diagnostics [file]|add|remove|enable|disable]',\n argsHint: '[list|install <lang>|start [name]|stop [name]|restart [name]|diagnostics [file]]',\n\n help: [\n 'Usage:',\n ' /lsp Show server list and status (alias for list)',\n ' /lsp list List all configured servers and their states',\n ' /lsp status Detailed status report for all servers',\n ' /lsp install <language> Install the language server for a given language',\n ' Supported: ' + SUPPORTED_LANGUAGES.join(', '),\n ' /lsp start [name] Start all servers, or a specific one by name',\n ' /lsp stop [name] Stop all servers, or a specific one by name',\n ' /lsp restart [name] Restart all servers, or a specific one by name',\n ' /lsp diagnostics [file] Show diagnostics for a file or the whole workspace',\n '',\n 'Examples:',\n ' /lsp (shows configured servers)',\n ' /lsp list',\n ' /lsp install typescript',\n ' /lsp install python',\n ' /lsp install go',\n ' /lsp start (start all enabled servers)',\n ' /lsp start gopls (start a specific server)',\n ' /lsp diagnostics src/index.ts',\n ' /lsp status',\n '',\n 'After installing, add the server to your WrongStack config under:',\n ' extensions[\"@wrongstack/plug-lsp\"].servers',\n 'Then restart your WrongStack session.',\n ].join('\\n'),\n\n async run(args) {\n const sub = parseArgs(args);\n\n switch (sub.type) {\n case 'list': return runListCommand(ctx);\n case 'status': return runStatusCommand(ctx);\n case 'install': return runInstallCommand(ctx, sub.language);\n case 'start': return runStartCommand(ctx, sub.name);\n case 'stop': return runStopCommand(ctx, sub.name);\n case 'restart': return runRestartCommand(ctx, sub.name);\n case 'diagnostics': return runDiagnosticsCommand(ctx, sub.file);\n case 'add':\n return { message: 'To add a custom server, edit your config and add an entry under\\n`extensions[\"@wrongstack/plug-lsp\"].servers`. Run `/lsp help` for usage.' };\n case 'remove':\n return { message: 'To remove a server, remove its entry from `extensions[\"@wrongstack/plug-lsp\"].servers`\\nin your WrongStack config, then restart.' };\n case 'enable':\n return { message: 'To enable a server, ensure `enabled: true` is set (or absent — it defaults to true)\\nin its config entry, then run `/lsp start <name>`.' };\n case 'disable':\n return { message: 'To disable a server, set `enabled: false` in its config entry,\\nthen run `/lsp stop <name>` to stop it.' };\n default:\n return { message: this.help ?? this.description };\n }\n },\n };\n}\n\n// ─── Subcommand Handlers ─────────────────────────────────────────────────────\n\nfunction runListCommand(ctx: LspContext): { message: string } {\n const servers = ctx.registry.list();\n if (servers.length === 0) {\n return {\n message: [\n `${colorize('LSP Servers', 'bold')}`,\n 'No servers configured.',\n '',\n 'Enable @wrongstack/plug-lsp in your config and add server definitions under',\n '`extensions[\"@wrongstack/plug-lsp\"].servers`, or run `/lsp install <language>`',\n 'to install a preset server.',\n ].join('\\n'),\n };\n }\n\n const lines: string[] = [`${colorize('LSP Servers', 'bold')} (${servers.length} configured)`];\n lines.push('─'.repeat(60));\n\n for (const srv of servers) {\n const state = srv.state;\n const enabled = srv.config.enabled ?? true;\n\n const stateColor = state === 'ready' ? 'green' : state === 'failed' ? 'red' : state === 'disabled' ? 'dim' : 'yellow';\n const stateLabel = `[${state.toUpperCase()}]`;\n const enabledLabel = enabled ? '' : colorize(' (disabled)', 'dim');\n\n const langs = srv.config.languages?.join(', ') ?? '';\n lines.push(\n ` ${colorize(srv.name, 'cyan')} ${colorize(stateLabel, stateColor)}${enabledLabel}`,\n );\n lines.push(` ${colorize('Languages:', 'dim')} ${langs}`);\n lines.push(` ${colorize('Command:', 'dim')} ${srv.config.command} ${(srv.config.args ?? []).join(' ')}`);\n lines.push('');\n }\n\n lines.push('─'.repeat(60));\n lines.push('Run `/lsp help` for usage, or `/lsp install <language>` to install a server.');\n\n return { message: lines.join('\\n') };\n}\n\nfunction runStatusCommand(ctx: LspContext): { message: string } {\n const servers = ctx.registry.list();\n const ready = servers.filter((s) => s.state === 'ready').length;\n const failed = servers.filter((s) => s.state === 'failed').length;\n const starting = servers.filter((s) => s.state === 'starting' || s.state === 'initializing').length;\n\n const lines: string[] = [\n `${colorize('LSP Status Report', 'bold')}`,\n '─'.repeat(60),\n ` ${colorize('Total servers:', 'dim')} ${servers.length}`,\n ` ${colorize('Ready:', 'dim')} ${colorize(String(ready), 'green')}`,\n ` ${colorize('Starting:', 'dim')} ${colorize(String(starting), 'yellow')}`,\n ` ${colorize('Failed:', 'dim')} ${colorize(String(failed), 'red')}`,\n '',\n ];\n\n if (failed > 0) {\n lines.push(`${colorize('Failed servers:', 'red')}`);\n for (const srv of servers.filter((s) => s.state === 'failed')) {\n const err = srv.lastStderr || 'unknown error';\n lines.push(` ${colorize(srv.name, 'cyan')} — ${err}`);\n }\n lines.push('');\n }\n\n const activeFiles = ctx.tracker.list().length;\n lines.push(` ${colorize('Active files tracked:', 'dim')} ${activeFiles}`);\n lines.push(` ${colorize('Auto-start mode:', 'dim')} ${ctx.cfg.autoStart}`);\n lines.push('');\n lines.push('─'.repeat(60));\n lines.push('Use `/lsp diagnostics` to check for problems, or `/lsp restart <name>` to recover.');\n\n return { message: lines.join('\\n') };\n}\n\nasync function runInstallCommand(ctx: LspContext, language: string): Promise<{ message: string }> {\n const lang = language.toLowerCase().trim();\n\n if (!SUPPORTED_LANGUAGES.includes(lang)) {\n return {\n message: [\n `${colorize('Unknown language:', 'red')} ${lang}`,\n `Supported languages: ${SUPPORTED_LANGUAGES.join(', ')}`,\n '',\n 'If the language server is already installed on your system, you can add it',\n 'manually to your WrongStack config under `extensions[\"@wrongstack/plug-lsp\"].servers`.',\n 'Run `/lsp help` for instructions.',\n ].join('\\n'),\n };\n }\n\n const server = LANGUAGE_SERVERS[lang]!;\n\n try {\n const { installLang } = await import('./install.js');\n const result = await installLang(lang, server, ctx.cwd);\n\n if (result.alreadyInstalled) {\n return {\n message: [\n `${colorize('Already installed:', 'green')} ${lang}`,\n ` Binary: ${colorize(server.binary, 'cyan')}`,\n '',\n 'The server is already available. Add it to your config to activate:',\n '',\n '```json',\n JSON.stringify(\n {\n extensions: {\n '@wrongstack/plug-lsp': {\n servers: {\n [lang]: {\n command: server.binary,\n args: server.args ?? ['--stdio'],\n languages: server.languages,\n rootPatterns: server.rootPatterns ?? [],\n },\n },\n },\n },\n },\n null,\n 2,\n ),\n '```',\n '',\n 'Then restart your WrongStack session to load the server.',\n ].join('\\n'),\n };\n }\n\n if (result.dryRun) {\n return {\n message: [\n `${colorize('Dry run — would install:', 'yellow')} ${lang}`,\n ` ${result.installCommand}`,\n '',\n 'Run without --dry-run to actually install.',\n ].join('\\n'),\n };\n }\n\n return {\n message: [\n `${colorize('Installed:', 'green')} ${lang}`,\n ` Binary: ${colorize(server.binary, 'cyan')}`,\n ` Method: ${result.packageManager === 'system' ? server.toolchain!.label : result.installCommand}`,\n '',\n 'Add this to your WrongStack config to activate the server:',\n '',\n '```json',\n JSON.stringify(\n {\n extensions: {\n '@wrongstack/plug-lsp': {\n servers: {\n [lang]: {\n command: server.binary,\n args: server.args ?? ['--stdio'],\n languages: server.languages,\n rootPatterns: server.rootPatterns ?? [],\n },\n },\n },\n },\n },\n null,\n 2,\n ),\n '```',\n '',\n 'Restart your WrongStack session to load the server, then run `/lsp start ${lang}`.',\n ].join('\\n'),\n };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n message: `${colorize('Installation failed:', 'red')} ${lang}\\n ${msg}`,\n };\n }\n}\n\nasync function runStartCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n const available = ctx.registry.list().map((s) => s.name);\n return {\n message: [\n `${colorize('Server not found:', 'red')} ${targetName}`,\n available.length > 0 ? `Available: ${available.join(', ')}` : 'No servers configured.',\n 'Run `/lsp install <language>` to install a server.',\n ].join('\\n'),\n };\n }\n\n try {\n await ctx.registry.start(targetName);\n return { message: `${colorize('Started:', 'green')} ${targetName}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { message: `${colorize('Failed to start:', 'red')} ${targetName}\\n ${msg}` };\n }\n }\n\n // Start all enabled servers\n const allServers = ctx.registry.list();\n const started: string[] = [];\n const failed: string[] = [];\n\n for (const srv of allServers) {\n if (!srv.config.enabled) continue;\n if (srv.state === 'ready') { started.push(srv.name); continue; }\n if (srv.state === 'disabled') continue;\n try {\n await ctx.registry.start(srv.name);\n started.push(srv.name);\n } catch {\n failed.push(srv.name);\n }\n }\n\n const lines: string[] = [];\n if (started.length > 0) lines.push(`${colorize('Started:', 'green')} ${started.join(', ')}`);\n if (failed.length > 0) lines.push(`${colorize('Failed to start:', 'red')} ${failed.join(', ')}`);\n if (started.length === 0 && failed.length === 0) {\n lines.push('No servers to start. Run `/lsp list` to see configured servers.');\n }\n\n return { message: lines.join('\\n') };\n}\n\nasync function runStopCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n return { message: `${colorize('Server not found:', 'red')} ${targetName}` };\n }\n ctx.registry.stop(targetName);\n return { message: `${colorize('Stopped:', 'yellow')} ${targetName}` };\n }\n\n // Stop all servers\n const allServers = ctx.registry.list();\n for (const srv of allServers) {\n ctx.registry.stop(srv.name);\n }\n\n return { message: `${colorize('Stopped', 'yellow')} ${allServers.length} server(s): ${allServers.map((s) => s.name).join(', ')}` };\n}\n\nasync function runRestartCommand(ctx: LspContext, name?: string): Promise<{ message: string }> {\n const targetName = name?.trim();\n\n if (targetName) {\n const srv = ctx.registry.list().find((s) => s.name === targetName);\n if (!srv) {\n return { message: `${colorize('Server not found:', 'red')} ${targetName}` };\n }\n\n ctx.registry.stop(targetName);\n try {\n await ctx.registry.start(targetName);\n return { message: `${colorize('Restarted:', 'green')} ${targetName}` };\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return { message: `${colorize('Restart failed:', 'red')} ${targetName}\\n ${msg}` };\n }\n }\n\n // Restart all enabled servers\n const allServers = ctx.registry.list().filter((s) => s.config.enabled);\n const restarted: string[] = [];\n const failed: string[] = [];\n\n for (const srv of allServers) {\n ctx.registry.stop(srv.name);\n try {\n await ctx.registry.start(srv.name);\n restarted.push(srv.name);\n } catch {\n failed.push(srv.name);\n }\n }\n\n const lines: string[] = [];\n if (restarted.length > 0) lines.push(`${colorize('Restarted:', 'green')} ${restarted.join(', ')}`);\n if (failed.length > 0) lines.push(`${colorize('Failed to restart:', 'red')} ${failed.join(', ')}`);\n\n return { message: lines.join('\\n') };\n}\n\nasync function runDiagnosticsCommand(ctx: LspContext, file?: string): Promise<{ message: string }> {\n const lines: string[] = [`${colorize('LSP Diagnostics', 'bold')}`, '─'.repeat(60)];\n\n // Aggregate diagnostics from all ready servers\n const allDiags = collectServerDiagnostics(ctx.registry);\n\n if (file) {\n const resolved = path.resolve(ctx.cwd, file);\n const fileDiags = allDiags.get(resolved);\n if (!fileDiags || fileDiags.length === 0) {\n return { message: lines.join('\\n') + `\\nNo diagnostics for ${file}` };\n }\n lines.push(`File: ${resolved}`);\n const diagMap = new Map([[resolved, fileDiags]]);\n lines.push(formatDiagnostics(diagMap, {\n cwd: ctx.cwd,\n severityFilter: ctx.cfg.severityFilter,\n maxPerFile: ctx.cfg.maxDiagnosticsPerFile,\n maxTotal: ctx.cfg.maxDiagnosticsTotal,\n }));\n return { message: lines.join('\\n') };\n }\n\n // Workspace overview\n if (allDiags.size === 0) {\n lines.push('No diagnostics reported by any LSP server.');\n lines.push('');\n lines.push('LSP diagnostics are reported by language servers after you open/edit files.');\n lines.push('Open a file and run `/lsp diagnostics <file>` to check specific files.');\n return { message: lines.join('\\n') };\n }\n\n const total = Array.from(allDiags.values()).reduce((sum, d) => sum + d.length, 0);\n lines.push(`Showing diagnostics for ${allDiags.size} file(s) (${total} total)`);\n lines.push('');\n\n for (const [fpath, diags] of allDiags) {\n lines.push(`${colorize(fpath, 'cyan')}`);\n const fdiagMap = new Map([[fpath, diags]]);\n lines.push(formatDiagnostics(fdiagMap, {\n cwd: ctx.cwd,\n severityFilter: ctx.cfg.severityFilter,\n maxPerFile: ctx.cfg.maxDiagnosticsPerFile,\n maxTotal: ctx.cfg.maxDiagnosticsTotal,\n }));\n lines.push('');\n }\n\n return { message: lines.join('\\n') };\n}\n\n/** Collect diagnostics from all ready LSP servers, keyed by file path. */\nfunction collectServerDiagnostics(registry: LSPRegistry): Map<string, import('vscode-languageserver-protocol').Diagnostic[]> {\n const result = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n for (const srv of registry.list()) {\n if (srv.state !== 'ready') continue;\n for (const [uri, diags] of srv.diagnostics) {\n // Convert file:// URIs to paths\n const filePath = uri.startsWith('file://') ? uri.slice(7) : uri;\n const existing = result.get(filePath) ?? [];\n result.set(filePath, [...existing, ...diags]);\n }\n }\n return result;\n}\n","import type { PluginAPI } from '@wrongstack/core';\nimport type { LSPRegistry } from '../registry.js';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { diagnosticsCommand } from './diagnostics.js';\nimport { listCommand } from './list.js';\nimport { restartCommand } from './restart.js';\nimport { startCommand } from './start.js';\nimport { stopCommand } from './stop.js';\nimport { buildLspCommand } from './lsp.js';\n\nexport function registerSlashCommands(\n api: PluginAPI,\n registry: LSPRegistry,\n tracker: DocumentTracker,\n cfg: PlugLSPConfig,\n cwd: string,\n): string[] {\n const lspCommand = buildLspCommand({ registry, tracker, cfg, cwd });\n const commands = [\n lspCommand,\n listCommand(registry),\n startCommand(registry),\n stopCommand(registry),\n restartCommand(registry),\n diagnosticsCommand(registry),\n ];\n for (const command of commands) api.slashCommands.register(command);\n return commands.map((cmd) => cmd.name);\n}\n","/**\n * Shared constants for the plug-lsp package.\n */\nexport const LSP_CONSTANTS = Object.freeze({\n /** Default timeout for LSP tool operations (5 seconds). */\n TOOL_TIMEOUT_MS: 5000,\n} as const);","import { displayPath } from '../utils/uri.js';\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string | undefined;\n score?: number | undefined;\n snippet?: string | undefined;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n/**\n * Format `codebase-lsp-search` output for human-readable display.\n */\nexport function formatCodebaseLspResults(output: CodebaseLspSearchOutput, cwd: string): string {\n const { results, totalIndex, totalLsp, query, usedIndex, usedLsp } = output;\n\n if (results.length === 0) {\n const sources: string[] = [];\n if (usedIndex) sources.push(`index(${totalIndex})`);\n if (usedLsp) sources.push(`lsp(${totalLsp})`);\n return `No symbols matching \"${query}\". Searched: ${sources.join(', ') || 'none'}.`;\n }\n\n const lines: string[] = [];\n lines.push(`${results.length} results for \"${query}\" (index:${totalIndex} lsp:${totalLsp}):`);\n\n for (const r of results) {\n const sourceTag = r.source === 'index' ? '[index]' : `[lsp:${r.server ?? '?'}]`;\n const scoreTag = r.score !== undefined ? ` score=${r.score.toFixed(2)}` : '';\n const location = `${displayPath(r.file, cwd)}:${r.line}`;\n\n if (r.snippet) {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n lines.push(` ${r.snippet}`);\n } else {\n lines.push(` ${sourceTag} ${r.kind} ${r.name} ${location}${scoreTag}`);\n }\n }\n\n return lines.join('\\n');\n}\n","import type { ServerCapabilities } from 'vscode-languageserver-protocol';\n\nexport function supportsHover(cap: ServerCapabilities): boolean {\n return !!cap.hoverProvider;\n}\n\nexport function supportsCompletion(cap: ServerCapabilities): boolean {\n return !!cap.completionProvider;\n}\n\nexport function supportsDefinition(cap: ServerCapabilities): boolean {\n return !!cap.definitionProvider;\n}\n\nexport function supportsReferences(cap: ServerCapabilities): boolean {\n return !!cap.referencesProvider;\n}\n\nexport function supportsDocumentSymbol(cap: ServerCapabilities): boolean {\n return !!cap.documentSymbolProvider;\n}\n\nexport function supportsWorkspaceSymbol(cap: ServerCapabilities): boolean {\n return !!cap.workspaceSymbolProvider;\n}\n\nexport function supportsRename(cap: ServerCapabilities): boolean {\n return !!cap.renameProvider;\n}\n\nexport function supportsPrepareRename(cap: ServerCapabilities): boolean {\n const provider = cap.renameProvider;\n return typeof provider === 'object' && provider !== null && provider.prepareProvider === true;\n}\n\nexport function supportsCodeAction(cap: ServerCapabilities): boolean {\n return !!cap.codeActionProvider;\n}\n\nexport function supportsPullDiagnostics(cap: ServerCapabilities): boolean {\n return !!cap.diagnosticProvider;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { Context, Logger } from '@wrongstack/core';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport type { LSPRegistry } from '../registry.js';\nimport type { LSPServer } from '../server/lsp-server.js';\nimport type { PlugLSPConfig } from '../types.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\n\nexport interface ToolDeps {\n registry: LSPRegistry;\n tracker: DocumentTracker;\n cfg: PlugLSPConfig;\n log: Logger;\n}\n\nexport function resolveInputPath(inputPath: string, ctx: Context): string {\n return path.isAbsolute(inputPath) ? path.normalize(inputPath) : path.resolve(ctx.cwd, inputPath);\n}\n\nexport async function requireServer(\n registry: LSPRegistry,\n filePath: string,\n signal: AbortSignal,\n): Promise<LSPServer> {\n const server = await registry.findForPath(filePath, signal);\n if (!server) {\n throw new LSPError(LSPErrorCode.ServerNotFound, `No LSP server is configured for ${filePath}`);\n }\n return server;\n}\n\nexport async function readDocumentContent(\n filePath: string,\n tracker: DocumentTracker,\n): Promise<string> {\n const tracked = tracker.get(filePath);\n return tracked?.text ?? (await fs.readFile(filePath, 'utf8'));\n}\n\nexport function textDocumentPosition(\n uriPath: string,\n position: { line: number; character: number },\n) {\n return { textDocument: { uri: pathToUri(uriPath) }, position };\n}\n\nexport function stringifyToolError(err: unknown): string {\n if (err instanceof LSPError) return `[${err.code}] ${err.message}`;\n if (err instanceof Error) return `[${LSPErrorCode.ProtocolError}] ${err.message}`;\n return `[${LSPErrorCode.ProtocolError}] ${String(err)}`;\n}\n","/**\n * `codebase-lsp-search` — index-first, LSP-fallback symbol search.\n *\n * Architecture:\n * 1. Query the codebase index through its host (FTS5 in the index worker —\n * this process's main thread never opens SQLite)\n * 2. If index has 0 results OR preferLsp=true, fall back to live LSP workspaceSymbol queries\n * 3. Deduplicate results present in both sources\n */\n\nimport type { Tool } from '@wrongstack/core';\nimport {\n codebaseIndexDirOverride,\n internalKindToLspKind,\n lspKindToInternalKind,\n searchCodebaseIndex,\n} from '@wrongstack/tools/codebase-index/index';\nimport type { SymbolInformation } from 'vscode-languageserver-protocol';\n\nimport { LSP_CONSTANTS } from '../constants.js';\nimport { formatCodebaseLspResults } from '../formatters/symbols.js';\nimport { supportsWorkspaceSymbol } from '../server/capabilities.js';\nimport { stringifyToolError, type ToolDeps } from './shared.js';\n\n// ─── Input / Output types ───────────────────────────────────────────────────────\n\ninterface CodebaseLspSearchInput {\n query: string;\n limit?: number | undefined;\n preferLsp?: boolean | undefined;\n}\n\ninterface CodebaseLspResult {\n name: string;\n kind: string;\n lspKind: number;\n file: string;\n line: number;\n source: 'index' | 'lsp';\n server?: string | undefined;\n score?: number | undefined;\n snippet?: string | undefined;\n}\n\ninterface CodebaseLspSearchOutput {\n results: CodebaseLspResult[];\n totalIndex: number;\n totalLsp: number;\n query: string;\n usedIndex: boolean;\n usedLsp: boolean;\n}\n\n// ─── Tool factory ──────────────────────────────────────────────────────────────\n\nexport function createCodebaseLspSearchTool(deps: ToolDeps): Tool<CodebaseLspSearchInput, string> {\n return {\n name: 'codebase-lsp-search',\n description:\n 'Search code symbols using a fast SQLite+BM25 index, falling back to live LSP workspaceSymbol queries when needed.',\n usageHint:\n 'Pass `query` to search. Use `limit` (default 20) to cap results. Set `preferLsp=true` to skip the index and query LSP servers directly for live precision.',\n inputSchema: {\n type: 'object',\n properties: {\n query: { type: 'string', description: 'Search query string' },\n limit: {\n type: 'integer',\n description: 'Maximum number of results to return (default 20, max 100)',\n minimum: 1,\n maximum: 100,\n },\n preferLsp: {\n type: 'boolean',\n description:\n 'If true, skip the index and query LSP servers directly. Useful for live precision when the index may be stale.',\n },\n },\n required: ['query'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS * 2, // Allow extra time for LSP round-robins\n async execute(input, ctx, opts) {\n try {\n const limit = Math.min(input.limit ?? 20, 100);\n const query = input.query ?? '';\n\n let indexResults: CodebaseLspResult[] = [];\n let totalIndex = 0;\n let usedIndex = false;\n let usedLsp = false;\n let lspResults: CodebaseLspResult[] = [];\n let totalLsp = 0;\n\n // ── Step 1: Query index (unless preferLsp is set) ──────────────────────\n if (!input.preferLsp) {\n const indexOutcome = await searchIndex(\n ctx.projectRoot,\n query,\n limit,\n codebaseIndexDirOverride(ctx),\n );\n indexResults = indexOutcome.results;\n totalIndex = indexOutcome.total;\n usedIndex = true;\n }\n\n // ── Step 2: LSP fallback ───────────────────────────────────────────────\n // Fall back to LSP when:\n // - preferLsp is true (user wants live data), OR\n // - index returned 0 results\n const needsLsp = input.preferLsp || indexResults.length === 0;\n\n if (needsLsp) {\n const lspOutcome = await searchLsp(deps, query, limit, opts.signal);\n lspResults = lspOutcome.results;\n totalLsp = lspOutcome.total;\n usedLsp = true;\n }\n\n // ── Step 3: Merge & deduplicate ────────────────────────────────────────\n const output = mergeResults(indexResults, lspResults, limit);\n\n const fullOutput: CodebaseLspSearchOutput = {\n results: output,\n totalIndex,\n totalLsp,\n query,\n usedIndex,\n usedLsp,\n };\n\n return formatCodebaseLspResults(fullOutput, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\n// ─── Index search ─────────────────────────────────────────────────────────────\n\nasync function searchIndex(\n projectRoot: string,\n query: string,\n limit: number,\n indexDir?: string | undefined,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n // Ranked FTS5 query via the index host — runs in the index worker thread\n // when available, so a contended index can never block this process.\n const { results, total } = await searchCodebaseIndex({ projectRoot, indexDir, query, limit });\n\n return {\n results: results.map((c) => ({\n name: c.name,\n kind: c.kind,\n lspKind: internalKindToLspKind(c.kind) ?? 0,\n file: c.file,\n line: c.line,\n source: 'index' as const,\n score: c.score,\n snippet: c.snippet,\n })),\n total,\n };\n}\n\n// ─── LSP search ───────────────────────────────────────────────────────────────\n\nasync function searchLsp(\n deps: ToolDeps,\n query: string,\n limit: number,\n signal: AbortSignal,\n): Promise<{ results: CodebaseLspResult[]; total: number }> {\n const merged: SymbolInformation[] = [];\n\n const servers = deps.registry.list();\n const promises: Array<Promise<void>> = [];\n\n for (const server of servers) {\n if (server.state !== 'ready') continue;\n if (server.capabilities && !supportsWorkspaceSymbol(server.capabilities)) continue;\n\n promises.push(\n (async () => {\n try {\n const result = await server.workspaceSymbol(\n { query },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n signal,\n );\n if (result) {\n for (const sym of result) {\n merged.push(sym);\n }\n }\n } catch {\n // Individual server errors are non-fatal; skip this server's results\n }\n })(),\n );\n }\n\n await Promise.all(promises);\n\n const deduplicated = deduplicateByKey(\n merged.map((sym) => ({\n name: sym.name,\n kind: lspKindToInternalKind(sym.kind) ?? 'symbol',\n lspKind: sym.kind,\n file: sym.location.uri.startsWith('file://')\n ? sym.location.uri.slice(7) // strip \"file://\"\n : sym.location.uri,\n line: sym.location.range.start.line + 1, // convert to 1-based\n source: 'lsp' as const,\n server: serverNameFromConfig(deps, sym),\n })),\n );\n\n return {\n results: deduplicated.slice(0, limit),\n total: deduplicated.length,\n };\n}\n\nfunction serverNameFromConfig(deps: ToolDeps, sym: SymbolInformation): string {\n // Try to find which server owns this file by its language\n // Heuristic: look at file extension\n const file = sym.location.uri;\n const ext = file.includes('.') ? (file.split('.').pop()?.toLowerCase() ?? '') : '';\n\n const langMap: Record<string, string[]> = {\n ts: ['typescript', 'tsserver'],\n tsx: ['typescript', 'tsserver'],\n js: ['javascript', 'typescript'],\n jsx: ['javascript', 'typescript'],\n py: ['python', 'pyright'],\n go: ['go', 'gopls'],\n rs: ['rust', 'rust-analyzer'],\n };\n\n const langs = langMap[ext] ?? [ext];\n const servers = deps.registry.list();\n\n for (const lang of langs) {\n for (const server of servers) {\n if (\n server.state === 'ready' &&\n server.config.languages.some((l) => l.toLowerCase() === lang.toLowerCase())\n ) {\n return server.name;\n }\n }\n }\n\n // Fallback: return first ready server\n return servers.find((s) => s.state === 'ready')?.name ?? 'unknown';\n}\n\n// ─── Merge & deduplication ────────────────────────────────────────────────────\n\nfunction mergeResults(\n indexResults: CodebaseLspResult[],\n lspResults: CodebaseLspResult[],\n limit: number,\n): CodebaseLspResult[] {\n const seen = new Map<string, CodebaseLspResult>();\n\n // Index results take priority (BM25-ranked)\n for (const r of indexResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n seen.set(key, r);\n }\n\n // LSP results fill in gaps (deduplicated)\n for (const r of lspResults) {\n const key = `${r.file}:${r.line}:${r.name}`;\n if (!seen.has(key)) {\n seen.set(key, r);\n }\n }\n\n // Sort: index results first (already ranked), then LSP results\n const merged = Array.from(seen.values());\n merged.sort((a, b) => {\n if (a.source === 'index' && b.source !== 'index') return -1;\n if (a.source !== 'index' && b.source === 'index') return 1;\n // Within same source, prefer higher score\n if (a.source === 'index' && b.source === 'index') {\n return (b.score ?? 0) - (a.score ?? 0);\n }\n return 0;\n });\n\n return merged.slice(0, limit);\n}\n\nfunction deduplicateByKey<T extends { name: string; file: string; line: number }>(items: T[]): T[] {\n const seen = new Set<string>();\n return items.filter((item) => {\n const key = `${item.file}:${item.line}:${item.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","export interface LSPPosition {\n line: number;\n character: number;\n}\n\nexport interface HumanPosition {\n line: number;\n character: number;\n}\n\nexport interface LSPRange {\n start: LSPPosition;\n end: LSPPosition;\n}\n\nexport interface HumanRange {\n start: HumanPosition;\n end: HumanPosition;\n}\n\nexport function humanToLSP(content: string, pos: HumanPosition): LSPPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line - 1, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const byteCol = clamp(pos.character - 1, 0, Buffer.byteLength(line, 'utf8'));\n let bytes = 0;\n let utf16 = 0;\n for (const ch of line) {\n const b = Buffer.byteLength(ch, 'utf8');\n if (bytes + b > byteCol) break;\n bytes += b;\n utf16 += ch.length;\n }\n return { line: lineIdx, character: utf16 };\n}\n\nexport function lspToHuman(content: string, pos: LSPPosition): HumanPosition {\n const lines = splitLines(content);\n const lineIdx = clamp(pos.line, 0, Math.max(0, lines.length - 1));\n /* v8 ignore next -- splitLines always returns at least one line. */\n const line = lines[lineIdx] ?? '';\n const utf16Col = clamp(pos.character, 0, line.length);\n let utf16 = 0;\n let bytes = 0;\n for (const ch of line) {\n if (utf16 + ch.length > utf16Col) break;\n utf16 += ch.length;\n bytes += Buffer.byteLength(ch, 'utf8');\n }\n return { line: lineIdx + 1, character: bytes + 1 };\n}\n\nexport function humanToLSPRange(content: string, range: HumanRange): LSPRange {\n return { start: humanToLSP(content, range.start), end: humanToLSP(content, range.end) };\n}\n\nexport function lspToHumanRange(content: string, range: LSPRange): HumanRange {\n return { start: lspToHuman(content, range.start), end: lspToHuman(content, range.end) };\n}\n\nexport function splitLines(content: string): string[] {\n if (content.length === 0) return [''];\n return content.split(/\\r\\n|\\r|\\n/);\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n if (!Number.isFinite(n)) return min;\n return Math.max(min, Math.min(max, n));\n}\n","import type { Tool } from '@wrongstack/core';\nimport type { CompletionItem, CompletionList } from 'vscode-languageserver-protocol';\nimport { LSP_CONSTANTS } from '../constants.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsCompletion } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\n\ninterface CompletionInput {\n path: string;\n line: number;\n character: number;\n content?: string | undefined;\n limit?: number | undefined;\n trigger_character?: string | undefined;\n format?: 'text' | 'json' | undefined;\n}\n\nexport function createCompletionTool(deps: ToolDeps): Tool<CompletionInput, string> {\n return {\n name: 'lsp_completion',\n description: 'Get semantic code completions from a configured language server.',\n usageHint:\n 'Use for context-aware completion at a cursor location. Lines and columns are 1-based; pass trigger_character for member access like \".\".',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n content: { type: 'string', maxLength: 500_000 },\n limit: { type: 'integer', minimum: 1, maximum: 100 },\n trigger_character: { type: 'string' },\n format: { type: 'string', enum: ['text', 'json'] },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n maxOutputBytes: 32_768,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsCompletion(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support completion`,\n );\n }\n const content = typeof input.content === 'string'\n ? input.content\n : await readDocumentContent(file, deps.tracker);\n await deps.tracker.open(file, content);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const result = await server.completion(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n context: input.trigger_character\n ? { triggerKind: 2, triggerCharacter: input.trigger_character }\n : { triggerKind: 1 },\n },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n const items = collectCompletionItems(result, Math.min(input.limit ?? 25, 100));\n if (input.format === 'json') {\n return JSON.stringify({\n items: items.map((item) => ({\n label: item.label,\n insertText: item.insertText ?? item.label,\n kind: item.kind ? completionKindName(item.kind) : undefined,\n detail: compact(item.detail),\n documentation: compact(documentationText(item.documentation)),\n })),\n });\n }\n return formatCompletionItems(items, result);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n\nfunction collectCompletionItems(\n result: CompletionItem[] | CompletionList | null,\n limit: number,\n): CompletionItem[] {\n const items = Array.isArray(result) ? result : (result?.items ?? []);\n return items.slice(0, limit);\n}\n\nfunction formatCompletionItems(\n visibleItems: CompletionItem[],\n result: CompletionItem[] | CompletionList | null,\n): string {\n const items = Array.isArray(result) ? result : (result?.items ?? []);\n if (items.length === 0) return 'No completions found.';\n const lines = visibleItems.map((item, index) => {\n const label = item.label || item.insertText || '(unnamed)';\n const kind = item.kind ? completionKindName(item.kind) : 'Completion';\n const detail = compact(item.detail);\n const docs = compact(documentationText(item.documentation));\n const suffix = [detail, docs].filter(Boolean).join(' — ');\n return `${index + 1}. ${label} [${kind}]${suffix ? ` — ${suffix}` : ''}`;\n });\n if (items.length > visibleItems.length) {\n lines.push(`... truncated ${items.length - visibleItems.length} more`);\n }\n return lines.join('\\n');\n}\n\nfunction documentationText(value: CompletionItem['documentation']): string | undefined {\n if (!value) return undefined;\n if (typeof value === 'string') return value;\n return value.value;\n}\n\nfunction compact(value: string | undefined): string | undefined {\n const cleaned = value?.replace(/\\s*\\r?\\n\\s*/g, ' ').trim();\n if (!cleaned) return undefined;\n return cleaned.length <= 160 ? cleaned : `${cleaned.slice(0, 157)}...`;\n}\n\nfunction completionKindName(kind: number): string {\n const names: Record<number, string> = {\n 1: 'Text',\n 2: 'Method',\n 3: 'Function',\n 4: 'Constructor',\n 5: 'Field',\n 6: 'Variable',\n 7: 'Class',\n 8: 'Interface',\n 9: 'Module',\n 10: 'Property',\n 11: 'Unit',\n 12: 'Value',\n 13: 'Enum',\n 14: 'Keyword',\n 15: 'Snippet',\n 16: 'Color',\n 17: 'File',\n 18: 'Reference',\n 19: 'Folder',\n 20: 'EnumMember',\n 21: 'Constant',\n 22: 'Struct',\n 23: 'Event',\n 24: 'Operator',\n 25: 'TypeParameter',\n };\n return names[kind] ?? `Kind ${kind}`;\n}\n","import type { Location, LocationLink } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function formatLocations(\n locations: Array<Location | LocationLink> | null,\n cwd: string,\n limit = 100,\n): string {\n if (!locations || locations.length === 0) return 'No locations found.';\n const lines = locations.slice(0, limit).map((loc) => {\n const uri = 'uri' in loc ? loc.uri : loc.targetUri;\n const range = 'range' in loc ? loc.range : loc.targetSelectionRange;\n return `${displayPath(uriToPath(uri), cwd)}:${range.start.line + 1}:${range.start.character + 1}`;\n });\n if (locations.length > limit) lines.push(`... truncated ${locations.length - limit} more`);\n return lines.join('\\n');\n}\n","import type { Tool } from '@wrongstack/core';\nimport { formatLocations } from '../formatters/location.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsDefinition } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { LSP_CONSTANTS } from '../constants.js';\n\ninterface PositionInput {\n path: string;\n line: number;\n character: number;\n}\n\nexport function createDefinitionTool(deps: ToolDeps): Tool<PositionInput, string> {\n return {\n name: 'lsp_definition',\n description: 'Find where a symbol is defined.',\n usageHint:\n 'Use for semantic navigation when you know the symbol position. Lines and columns are 1-based.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n },\n required: ['path', 'line', 'character'],\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsDefinition(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support definition`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const locs = await server.definition(\n { textDocument: { uri: pathToUri(file) }, position },\n LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n opts.signal,\n );\n return formatLocations(locs, ctx.cwd);\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import { LSP_CONSTANTS } from '../constants.js';\nimport type { Tool } from '@wrongstack/core';\nimport { formatDiagnostics } from '../formatters/diagnostics.js';\nimport { supportsPullDiagnostics } from '../server/capabilities.js';\nimport { pathToUri, uriToPath } from '../utils/uri.js';\nimport { type ToolDeps, requireServer, resolveInputPath, stringifyToolError } from './shared.js';\n\ninterface DiagnosticsInput {\n path?: string | undefined;\n limit?: number | undefined;\n}\n\nexport function createDiagnosticsTool(deps: ToolDeps): Tool<DiagnosticsInput, string> {\n return {\n name: 'lsp_diagnostics',\n description: 'Get diagnostics from configured language servers.',\n usageHint:\n 'Use after reading or editing a file when an LSP server is configured. Pass `path` for file diagnostics or omit it for tracked workspace diagnostics.',\n inputSchema: {\n type: 'object',\n properties: { path: { type: 'string' }, limit: { type: 'integer' } },\n },\n permission: 'auto',\n mutating: false,\n timeoutMs: LSP_CONSTANTS.TOOL_TIMEOUT_MS,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const byFile = new Map<string, import('vscode-languageserver-protocol').Diagnostic[]>();\n if (input.path) {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n const uri = pathToUri(file);\n const diagnostics =\n server.capabilities && supportsPullDiagnostics(server.capabilities)\n ? await server.pullDiagnostics(uri, LSP_CONSTANTS.TOOL_TIMEOUT_MS, opts.signal)\n : server.getDiagnostics(uri);\n byFile.set(file, diagnostics);\n } else {\n for (const doc of deps.tracker.list()) {\n const server = await deps.registry.findForPath(doc.path, opts.signal);\n if (!server) continue;\n byFile.set(uriToPath(doc.uri), server.getDiagnostics(doc.uri));\n }\n }\n return formatDiagnostics(byFile, {\n cwd: ctx.cwd,\n severityFilter: deps.cfg.severityFilter,\n maxPerFile: deps.cfg.maxDiagnosticsPerFile,\n maxTotal: input.limit ?? deps.cfg.maxDiagnosticsTotal,\n });\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport { displayPath, uriToPath } from '../utils/uri.js';\n\nexport function summarizeWorkspaceEdit(edit: WorkspaceEdit, cwd: string): string {\n const entries = editsByPath(edit);\n if (entries.size === 0) return 'WorkspaceEdit contains no text edits.';\n let total = 0;\n const lines = ['Workspace edit:'];\n for (const [file, edits] of entries) {\n total += edits.length;\n lines.push(` ${displayPath(file, cwd)} ${edits.length} edit(s)`);\n }\n lines.push(`Total: ${total} edits across ${entries.size} files.`);\n return lines.join('\\n');\n}\n\nexport function editsByPath(edit: WorkspaceEdit): Map<string, TextEdit[]> {\n const out = new Map<string, TextEdit[]>();\n for (const [uri, edits] of Object.entries(edit.changes ?? {})) {\n out.set(uriToPath(uri), edits);\n }\n for (const change of edit.documentChanges ?? []) {\n if ('textDocument' in change && Array.isArray(change.edits)) {\n out.set(uriToPath(change.textDocument.uri), change.edits.filter((e): e is TextEdit => 'newText' in e));\n }\n }\n return out;\n}\n","import * as fs from 'node:fs/promises';\nimport { atomicWrite } from '@wrongstack/core';\nimport type { TextEdit, WorkspaceEdit } from 'vscode-languageserver-protocol';\nimport type { DocumentTracker } from '../document-tracker.js';\nimport { editsByPath } from '../formatters/workspace-edit.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\n\nexport interface ApplyWorkspaceEditResult {\n files: string[];\n edits: number;\n}\n\nexport async function applyWorkspaceEdit(\n edit: WorkspaceEdit,\n tracker: DocumentTracker,\n): Promise<ApplyWorkspaceEditResult> {\n const entries = editsByPath(edit);\n const ops: Array<{ path: string; original: string; next: string; edits: number }> = [];\n for (const [file, edits] of entries) {\n const original = await fs.readFile(file, 'utf8');\n ops.push({ path: file, original, next: applyTextEdits(original, edits), edits: edits.length });\n }\n\n const written: typeof ops = [];\n try {\n for (const op of ops) {\n await atomicWrite(op.path, op.next);\n written.push(op);\n }\n } catch (err) {\n /* v8 ignore start -- atomicWrite failures are OS-dependent; read failures are covered separately. */\n for (const op of written) {\n try {\n await atomicWrite(op.path, op.original);\n } catch {\n // best-effort rollback\n }\n }\n throw new LSPError(LSPErrorCode.ApplyEditFailed, 'Failed to apply workspace edit', err);\n /* v8 ignore stop */\n }\n\n for (const op of ops) await tracker.fileWritten(op.path);\n return { files: ops.map((op) => op.path), edits: ops.reduce((sum, op) => sum + op.edits, 0) };\n}\n\nexport function applyTextEdits(original: string, edits: TextEdit[]): string {\n const lineStarts = buildLineStarts(original);\n const sorted = [...edits].sort(\n (a, b) => offsetOf(b.range.start, lineStarts) - offsetOf(a.range.start, lineStarts),\n );\n let out = original;\n for (const edit of sorted) {\n const start = offsetOf(edit.range.start, lineStarts);\n const end = offsetOf(edit.range.end, lineStarts);\n out = out.slice(0, start) + edit.newText + out.slice(end);\n }\n return out;\n}\n\nfunction buildLineStarts(text: string): number[] {\n const starts = [0];\n for (let i = 0; i < text.length; i++) {\n const ch = text.charCodeAt(i);\n if (ch === 10) starts.push(i + 1);\n }\n return starts;\n}\n\nfunction offsetOf(pos: { line: number; character: number }, lineStarts: number[]): number {\n return (lineStarts[pos.line] ?? lineStarts[lineStarts.length - 1] ?? 0) + pos.character;\n}\n","import type { Tool } from '@wrongstack/core';\nimport { summarizeWorkspaceEdit } from '../formatters/workspace-edit.js';\nimport { humanToLSP } from '../position.js';\nimport { supportsRename } from '../server/capabilities.js';\nimport { LSPError, LSPErrorCode } from '../types.js';\nimport { pathToUri } from '../utils/uri.js';\nimport {\n type ToolDeps,\n readDocumentContent,\n requireServer,\n resolveInputPath,\n stringifyToolError,\n} from './shared.js';\nimport { applyWorkspaceEdit } from './workspace-edit.js';\n\ninterface RenameInput {\n path: string;\n line: number;\n character: number;\n new_name: string;\n}\n\nexport function createRenameTool(deps: ToolDeps): Tool<RenameInput, string> {\n return {\n name: 'lsp_rename',\n description: 'Rename a symbol semantically across the workspace.',\n usageHint:\n 'Prefer this over find-and-replace for functions, classes, variables, and types. This mutates files and requires confirmation.',\n inputSchema: {\n type: 'object',\n properties: {\n path: { type: 'string' },\n line: { type: 'integer' },\n character: { type: 'integer' },\n new_name: { type: 'string' },\n },\n required: ['path', 'line', 'character', 'new_name'],\n },\n permission: 'confirm',\n mutating: true,\n timeoutMs: 15_000,\n maxOutputBytes: 65_536,\n async execute(input, ctx, opts) {\n try {\n const file = resolveInputPath(input.path, ctx);\n const server = await requireServer(deps.registry, file, opts.signal);\n if (server.capabilities && !supportsRename(server.capabilities)) {\n throw new LSPError(\n LSPErrorCode.CapabilityMissing,\n `Server \"${server.name}\" does not support rename`,\n );\n }\n const content = await readDocumentContent(file, deps.tracker);\n const position = humanToLSP(content, { line: input.line, character: input.character });\n const edit = await server.rename(\n {\n textDocument: { uri: pathToUri(file) },\n position,\n newName: input.new_name,\n },\n 15_000,\n opts.signal,\n );\n if (!edit) return 'Rename produced no edits.';\n const summary = summarizeWorkspaceEdit(edit, ctx.cwd);\n const applied = await applyWorkspaceEdit(edit, deps.tracker);\n return `${summary}\\nApplied: ${applied.edits} edits across ${applied.files.length} files.`;\n } catch (err) {\n return stringifyToolError(err);\n }\n },\n };\n}\n","import type { Tool } from '@wrongstack/core';\nimport { createCodebaseLspSearchTool } from './codebase-lsp-search.js';\nimport { createCompletionTool } from './completion.js';\nimport { createDefinitionTool } from './definition.js';\nimport { createDiagnosticsTool } from './diagnostics.js';\nimport { createRenameTool } from './rename.js';\nimport type { ToolDeps } from './shared.js';\n\n// NOTE: The following LSP tools are intentionally excluded from the registered set:\n//\n// lsp_references — marginal over read/grep; returns positions the agent still has to read\n// lsp_hover — usually confirms what reading the definition already showed\n// lsp_symbols — a symbol tree is less useful than reading the file; codebase-lsp-search covers the search case\n// lsp_code_actions — high noise-to-signal in well-maintained codebases; mostly cosmetic\n//\n// The kept tools (lsp_diagnostics, lsp_definition, lsp_completion, lsp_rename, codebase-lsp-search)\n// are those where LSP provides genuinely unique data or capability the agent cannot\n// replicate with basic tools (read, grep, edit) at comparable cost.\n\nexport function makeLSPTools(deps: ToolDeps): Tool[] {\n return [\n createDiagnosticsTool(deps),\n createDefinitionTool(deps),\n createCompletionTool(deps),\n createCodebaseLspSearchTool(deps),\n createRenameTool(deps),\n ];\n}\n","import { expectDefined } from '@wrongstack/core';\nimport type { Plugin } from '@wrongstack/core';\nimport { autoDiscoverServers } from './auto-discover.js';\nimport { PLUGIN_NAME, plugLspConfigSchema, readPlugLSPConfig } from './config.js';\nimport { DocumentTracker } from './document-tracker.js';\nimport { LSPRegistry } from './registry.js';\nimport { registerSlashCommands } from './slash-commands/index.js';\nimport { makeLSPTools } from './tools/index.js';\nexport type {\n AutoStartMode,\n DiagnosticsAfterEdit,\n PlugLSPConfig,\n ServerConfig,\n} from './types.js';\n\nlet teardownState: {\n offs: Array<() => void>;\n toolNames: string[];\n commandNames: string[];\n registry: LSPRegistry;\n tracker: DocumentTracker;\n} | null = null;\n\nconst plugin: Plugin = {\n name: PLUGIN_NAME,\n version: '0.1.0',\n description: 'Language Server Protocol tools for WrongStack.',\n apiVersion: '^0.1.1',\n capabilities: {\n tools: true,\n slashCommands: true,\n pipelines: [],\n },\n configSchema: plugLspConfigSchema,\n async setup(api) {\n const cfg = readPlugLSPConfig(api);\n const cwd = api.config.cwd ?? process.cwd();\n if (cfg.autoDiscover) {\n cfg.servers = await autoDiscoverServers(cfg.servers, cwd);\n }\n const holder: { registry?: LSPRegistry | undefined } = {};\n const tracker = new DocumentTracker(() => expectDefined(holder.registry), api.log, cwd, api.events);\n const registry = new LSPRegistry(cfg, tracker, { cwd, log: api.log, events: api.events });\n holder.registry = registry;\n await registry.bind(cwd, cfg.autoStart);\n\n const tools = makeLSPTools({ registry, tracker, cfg, log: api.log });\n for (const tool of tools) api.tools.register(tool);\n const commandNames = registerSlashCommands(api, registry, tracker, cfg, cwd);\n\n const offs = [\n api.events.on('session.started', () => {\n const nextCwd = api.config.cwd ?? process.cwd();\n tracker.setCwd(nextCwd);\n void registry.bind(nextCwd, cfg.autoStart);\n }),\n api.events.on('session.ended', () => {\n void tracker.forceCloseAll().finally(() => registry.shutdown());\n }),\n api.events.on('tool.executed', (event) => {\n void tracker\n .handleToolExecuted(event)\n .catch((err) => api.log.debug('LSP tracker failed to handle tool event', err));\n }),\n ];\n\n teardownState = {\n offs,\n toolNames: tools.map((t) => t.name),\n commandNames,\n registry,\n tracker,\n };\n },\n async teardown(api) {\n const state = teardownState;\n if (!state) return;\n teardownState = null;\n for (const off of state.offs) off();\n for (const name of state.toolNames) api.tools.unregister(name);\n for (const name of state.commandNames) api.slashCommands.unregister(`${PLUGIN_NAME}:${name}`);\n await state.tracker.forceCloseAll();\n await state.registry.shutdown();\n },\n};\n\nexport default plugin;\n"]}