devsurface 0.5.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/language.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/presets.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/run.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/server/index.ts","../../src/core/process/manager.ts","../../src/core/hub/registry.ts","../../src/core/hub/workspaceRoots.ts","../../src/core/hub/runtime.ts","../../src/server/routes/api.ts","../../src/version.ts","../../src/server/localAccess.ts","../../src/server/listenConfig.ts","../../src/server/accessControl.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/cli/hub/client.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/workspace.ts","../../src/cli/updateCheck.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { serveCommand } from './commands/serve.js';\nimport {\n workspaceAddCommand,\n workspaceListCommand,\n workspaceRemoveCommand\n} from './commands/workspace.js';\nimport { printUpdateNotice } from './updateCheck.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command\n .then(async () => {\n await printUpdateNotice(DEV_SURFACE_VERSION);\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('serve')\n .description('Start the DevSurface hub server (multi-workspace mode).')\n .option('-p, --port <port>', 'hub port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n serveCommand({\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nconst workspace = program.command('workspace').description('Manage registered workspaces.');\n\nworkspace\n .command('add [path]')\n .description('Register a project directory with the hub.')\n .action((dirPath?: string) => {\n handle(workspaceAddCommand(dirPath));\n });\n\nworkspace\n .command('list')\n .description('List all registered workspaces.')\n .action(() => {\n handle(workspaceListCommand());\n });\n\nworkspace\n .command('remove <id>')\n .description('Remove a workspace from the hub registry.')\n .action((id: string) => {\n handle(workspaceRemoveCommand(id));\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n const isNodeProject = result.language.detected.includes('node');\n const hasKnownProjectLanguage = result.language.detected.length > 0;\n\n if (result.packageJson === null && !hasKnownProjectLanguage) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (isNodeProject && !(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectProjectLanguage } from './language.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { detectPresets, mergePresetCommands, mergePresetGroups } from './presets.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const language = await detectProjectLanguage(resolvedRoot, packageJson);\n const presets = await detectPresets({\n root: resolvedRoot,\n packageJson,\n framework,\n language\n });\n const presetCommands = mergePresetCommands(presets);\n const presetGroups = mergePresetGroups(presets);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework),\n ...presets.flatMap((preset) => preset.ports)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n language,\n scripts,\n env,\n docker,\n git,\n framework,\n presets,\n presetCommands,\n presetGroups,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n Setup: ['install'],\n Development: ['dev'],\n Quality: ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo, ProjectLanguage, ProjectLanguageInfo } from '../types.js';\n\nconst languageFiles: Array<{ language: ProjectLanguage; candidates: string[] }> = [\n { language: 'python', candidates: ['requirements.txt', 'pyproject.toml', 'Pipfile'] },\n { language: 'go', candidates: ['go.mod'] },\n { language: 'java', candidates: ['pom.xml', 'build.gradle', 'build.gradle.kts'] }\n];\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function safeFile(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, stat, realPath] = await Promise.all([\n fs.realpath(root),\n fs.stat(filePath),\n fs.realpath(filePath)\n ]);\n if (stat.isFile() && isWithinRoot(realRoot, realPath)) {\n return realPath;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport async function detectProjectLanguage(\n root: string,\n packageJson: PackageJsonInfo | null\n): Promise<ProjectLanguageInfo> {\n const detected: ProjectLanguage[] = [];\n const files: string[] = [];\n\n if (packageJson !== null) {\n detected.push('node');\n files.push(packageJson.path);\n }\n\n for (const definition of languageFiles) {\n let found = false;\n for (const candidate of definition.candidates) {\n const file = await safeFile(root, candidate);\n if (file !== null) {\n found = true;\n files.push(file);\n }\n }\n if (found) {\n detected.push(definition.language);\n }\n }\n\n return {\n primary: detected[0] ?? null,\n detected,\n files\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FrameworkInfo, PackageJsonInfo, PresetInfo, ProjectLanguageInfo } from '../types.js';\n\ntype PresetDraft = Omit<PresetInfo, 'commands' | 'groups' | 'ports'> & {\n commands?: Record<string, string>;\n groups?: Record<string, string[]>;\n ports?: number[];\n};\n\nfunction dependencyNames(packageJson: PackageJsonInfo | null): Set<string> {\n const data = packageJson?.data;\n return new Set(\n Object.keys({\n ...data?.dependencies,\n ...data?.devDependencies,\n ...data?.optionalDependencies,\n ...data?.peerDependencies\n })\n );\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, names: string[]): boolean {\n return names.some((name) => dependencies.has(name));\n}\n\nasync function readIfPresent(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, realPath] = await Promise.all([fs.realpath(root), fs.realpath(filePath)]);\n const relative = path.relative(realRoot, realPath);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n return null;\n }\n return await fs.readFile(realPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction completePreset(draft: PresetDraft): PresetInfo {\n return {\n name: draft.name,\n label: draft.label,\n commands: draft.commands ?? {},\n groups: draft.groups ?? {},\n ports: draft.ports ?? []\n };\n}\n\nfunction nodePresets(\n framework: FrameworkInfo | null,\n packageJson: PackageJsonInfo | null\n): PresetInfo[] {\n const detected = new Set(framework?.detected ?? []);\n const dependencies = dependencyNames(packageJson);\n const presets: PresetDraft[] = [];\n\n if (detected.has('Next.js')) {\n presets.push({\n name: 'next',\n label: 'Next.js',\n commands: {\n 'next:dev': 'next dev',\n 'next:build': 'next build',\n 'next:start': 'next start'\n },\n groups: {\n 'Next.js': ['next:dev', 'next:build', 'next:start']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Vite')) {\n presets.push({\n name: 'vite',\n label: 'Vite',\n commands: {\n 'vite:dev': 'vite --host 127.0.0.1',\n 'vite:build': 'vite build',\n 'vite:preview': 'vite preview --host 127.0.0.1'\n },\n groups: {\n Vite: ['vite:dev', 'vite:build', 'vite:preview']\n },\n ports: [5173, 4173]\n });\n }\n\n if (detected.has('NestJS')) {\n presets.push({\n name: 'nestjs',\n label: 'NestJS',\n commands: {\n 'nest:start': 'nest start --watch',\n 'nest:build': 'nest build'\n },\n groups: {\n NestJS: ['nest:start', 'nest:build']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Remix')) {\n presets.push({\n name: 'remix',\n label: 'Remix',\n commands: {\n 'remix:dev': 'remix vite:dev',\n 'remix:build': 'remix vite:build'\n },\n groups: {\n Remix: ['remix:dev', 'remix:build']\n },\n ports: [5173]\n });\n }\n\n if (detected.has('Express') || detected.has('Fastify')) {\n presets.push({\n name: detected.has('Fastify') ? 'fastify' : 'express',\n label: detected.has('Fastify') ? 'Fastify' : 'Express',\n ports: [3000]\n });\n }\n\n if (detected.has('Prisma') || hasAnyDependency(dependencies, ['prisma', '@prisma/client'])) {\n presets.push({\n name: 'prisma',\n label: 'Prisma',\n commands: {\n 'prisma:migrate': 'prisma migrate dev',\n 'prisma:studio': 'prisma studio'\n },\n groups: {\n Database: ['prisma:migrate', 'prisma:studio']\n },\n ports: [5555]\n });\n }\n\n return presets.map(completePreset);\n}\n\nasync function pythonPresets(root: string, language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('python')) {\n return [];\n }\n\n const [requirements, pyproject, pipfile] = await Promise.all([\n readIfPresent(root, 'requirements.txt'),\n readIfPresent(root, 'pyproject.toml'),\n readIfPresent(root, 'Pipfile')\n ]);\n const manifest = [requirements, pyproject, pipfile].filter(Boolean).join('\\n').toLowerCase();\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n const ports: number[] = [];\n\n if (requirements !== null) {\n commands['python:install'] = 'python -m pip install -r requirements.txt';\n groups.Setup = ['python:install'];\n }\n\n if (manifest.includes('uvicorn') || manifest.includes('fastapi')) {\n commands['python:dev'] = 'uvicorn main:app --reload --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'python:dev'];\n ports.push(8000);\n }\n\n if (manifest.includes('flask')) {\n commands['flask:dev'] = 'flask --app app run --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'flask:dev'];\n ports.push(5000);\n }\n\n if (manifest.includes('django') || (await readIfPresent(root, 'manage.py')) !== null) {\n commands['django:dev'] = 'python manage.py runserver 127.0.0.1:8000';\n commands['django:migrate'] = 'python manage.py migrate';\n groups.Python = [...(groups.Python ?? []), 'django:dev', 'django:migrate'];\n ports.push(8000);\n }\n\n return [\n completePreset({\n name: 'python',\n label: 'Python',\n commands,\n groups,\n ports\n })\n ];\n}\n\nfunction goPresets(language: ProjectLanguageInfo): PresetInfo[] {\n if (!language.detected.includes('go')) {\n return [];\n }\n\n return [\n completePreset({\n name: 'go',\n label: 'Go',\n commands: {\n 'go:run': 'go run .',\n 'go:build': 'go build ./...',\n 'go:test': 'go test ./...'\n },\n groups: {\n Go: ['go:run', 'go:build', 'go:test']\n }\n })\n ];\n}\n\nasync function javaPresets(language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('java')) {\n return [];\n }\n\n const hasMaven = language.files.some((file) => path.basename(file) === 'pom.xml');\n const hasGradle = language.files.some((file) => path.basename(file).startsWith('build.gradle'));\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n\n if (hasMaven) {\n commands['maven:test'] = 'mvn test';\n commands['maven:package'] = 'mvn package';\n groups.Maven = ['maven:test', 'maven:package'];\n }\n\n if (hasGradle) {\n commands['gradle:test'] = 'gradle test';\n commands['gradle:build'] = 'gradle build';\n groups.Gradle = ['gradle:test', 'gradle:build'];\n }\n\n return [completePreset({ name: 'java', label: 'Java', commands, groups })];\n}\n\nexport async function detectPresets(options: {\n root: string;\n packageJson: PackageJsonInfo | null;\n framework: FrameworkInfo | null;\n language: ProjectLanguageInfo;\n}): Promise<PresetInfo[]> {\n return [\n ...nodePresets(options.framework, options.packageJson),\n ...(await pythonPresets(options.root, options.language)),\n ...goPresets(options.language),\n ...(await javaPresets(options.language))\n ].filter(\n (preset) =>\n Object.keys(preset.commands).length > 0 ||\n Object.keys(preset.groups).length > 0 ||\n preset.ports.length > 0\n );\n}\n\nexport function mergePresetCommands(presets: PresetInfo[]): Record<string, string> {\n return Object.assign({}, ...presets.map((preset) => preset.commands));\n}\n\nexport function mergePresetGroups(presets: PresetInfo[]): Record<string, string[]> {\n const groups: Record<string, string[]> = {};\n for (const preset of presets) {\n for (const [group, commands] of Object.entries(preset.groups)) {\n groups[group] = [...(groups[group] ?? []), ...commands];\n }\n }\n return groups;\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport {\n isDangerousCommand,\n runConfiguredCommandToTerminal,\n runPackageScriptToTerminal\n} from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.scripts[script] !== undefined) {\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n return;\n }\n\n const configuredCommand = scan.config?.config.commands?.[script] ?? scan.presetCommands[script];\n if (configuredCommand !== undefined) {\n if (isDangerousCommand(configuredCommand)) {\n console.error(pc.red(`Refusing to run dangerous command \"${safeTerminalText(script)}\".`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runConfiguredCommandToTerminal({\n cwd,\n command: configuredCommand\n });\n process.exitCode = exitCode;\n return;\n }\n\n const available = [\n ...Object.keys(scan.scripts),\n ...Object.keys(scan.config?.config.commands ?? {}),\n ...Object.keys(scan.presetCommands)\n ];\n const hint = available.length > 0 ? ` Available commands: ${safeTerminalList(available)}.` : '';\n console.error(pc.red(`Command \"${safeTerminalText(script)}\" was not found.${hint}`));\n process.exitCode = 1;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n\nexport async function runConfiguredCommandToTerminal(options: {\n cwd: string;\n command: string;\n}): Promise<number> {\n const resolvedCommand = await resolveConfiguredCommand(options.cwd, options.command);\n if (resolvedCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(resolvedCommand.command, resolvedCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Language: ${formatList(scan.language.detected) || 'unknown'}`);\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Presets: ${formatList(scan.presets.map((preset) => preset.label)) || 'none'}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport open from 'open';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isHubRunning, registerWorkspaceRemotely, dashboardUrl } from '../hub/client.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const port = options.port ?? 4567;\n\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n if (await isHubRunning(port)) {\n console.log('\\nHub already running. Registering workspace...');\n const registered = await registerWorkspaceRemotely(cwd, port);\n if (registered) {\n const url = dashboardUrl(registered.id, port);\n console.log(`Workspace ${pc.cyan(registered.name)} attached.`);\n console.log(`Dashboard -> ${pc.cyan(url)}`);\n if (options.openBrowser !== false) {\n await open(url);\n }\n return;\n }\n console.log('Could not register with running hub. Starting a new instance...');\n }\n\n const server = await startHubServer({\n port,\n openBrowser: options.openBrowser,\n initialWorkspace: cwd\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { Hub } from '../core/hub/runtime.js';\nimport { registerApiRoutes, registerHubApiRoutes } from './routes/api.js';\nimport { setupWebSocket, setupHubWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\nimport { initializeListenHost, DEFAULT_PORT } from './listenConfig.js';\n\nexport { DEFAULT_HOST, DEFAULT_PORT, resolveHost } from './listenConfig.js';\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n host: string;\n hub: Hub;\n close: () => Promise<void>;\n processManager: ProcessManager;\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\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, host: string, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${host}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${host}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n host: string,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(toListenError(error, host, port));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, host);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nasync function mountWebUi(app: Hono): Promise<void> {\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n}\n\n// Legacy single-project createApp (backward compat with existing tests)\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\n// Hub-mode createApp\nexport async function createHubApp(options: { hub: Hub; mutationToken?: string }): Promise<Hono> {\n const app = new Hono();\n registerHubApiRoutes(app, {\n hub: options.hub,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\nexport async function startHubServer(options: {\n port?: number;\n openBrowser?: boolean;\n dataDir?: string;\n initialWorkspace?: string;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub({ dataDir: options.dataDir });\n hub.attachCleanupHandlers();\n\n if (options.initialWorkspace) {\n await hub.registry.add(options.initialWorkspace);\n }\n\n const mutationToken = createMutationToken();\n const app = await createHubApp({ hub, mutationToken });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupHubWebSocket(server, hub);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n const entries = await hub.registry.list();\n const deepLink = entries.length > 0 ? `${url}/?workspace=${entries[0].id}` : url;\n await open(deepLink);\n }\n\n const dummyProcessManager = new ProcessManager();\n\n return {\n url,\n port,\n host,\n hub,\n processManager: dummyProcessManager,\n close: async () => {\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n\n// Legacy single-project server (used by old tests)\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub();\n hub.attachCleanupHandlers();\n\n await hub.registry.add(options.projectRoot);\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n host,\n hub,\n processManager,\n close: async () => {\n processManager.killAll();\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { assertWithinWorkspaceRoots } from './workspaceRoots.js';\n\nexport interface WorkspaceEntry {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n}\n\nfunction workspaceId(realPath: string): string {\n const base =\n path\n .basename(realPath)\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .slice(0, 32) || 'workspace';\n const hash = createHash('sha256').update(realPath).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\nfunction defaultDataDir(): string {\n return process.env.DEVSURFACE_DATA_DIR ?? path.join(os.homedir(), '.devsurface');\n}\n\nasync function readPackageName(dirPath: string): Promise<string | null> {\n try {\n const raw = JSON.parse(await fs.readFile(path.join(dirPath, 'package.json'), 'utf8'));\n return typeof raw?.name === 'string' && raw.name.length > 0 ? raw.name : null;\n } catch {\n return null;\n }\n}\n\nexport class WorkspaceRegistry {\n private readonly filePath: string;\n private seeded = false;\n\n constructor(dataDir?: string) {\n const dir = dataDir ?? defaultDataDir();\n this.filePath = path.join(dir, 'workspaces.json');\n }\n\n async list(): Promise<WorkspaceEntry[]> {\n await this.seedFromEnv();\n return await this.read();\n }\n\n async add(dirPath: string): Promise<WorkspaceEntry> {\n const realDir = await this.resolveDir(dirPath);\n await assertWithinWorkspaceRoots(realDir);\n const entries = await this.read();\n\n const existing = entries.find((entry) => entry.path === realDir);\n if (existing) {\n return existing;\n }\n\n const name = (await readPackageName(realDir)) ?? path.basename(realDir);\n const entry: WorkspaceEntry = {\n id: workspaceId(realDir),\n name,\n path: realDir,\n addedAt: new Date().toISOString()\n };\n entries.push(entry);\n await this.write(entries);\n return entry;\n }\n\n async remove(id: string): Promise<boolean> {\n const entries = await this.read();\n const filtered = entries.filter((entry) => entry.id !== id);\n if (filtered.length === entries.length) {\n return false;\n }\n await this.write(filtered);\n return true;\n }\n\n async findByPath(dirPath: string): Promise<WorkspaceEntry | null> {\n try {\n const realDir = await fs.realpath(path.resolve(dirPath));\n const entries = await this.read();\n return entries.find((entry) => entry.path === realDir) ?? null;\n } catch {\n return null;\n }\n }\n\n async resolve(id: string): Promise<WorkspaceEntry | null> {\n const entries = await this.read();\n const entry = entries.find((item) => item.id === id);\n if (!entry) {\n return null;\n }\n\n try {\n const realDir = await this.resolveDir(entry.path);\n await assertWithinWorkspaceRoots(realDir);\n if (realDir !== entry.path) {\n const updated: WorkspaceEntry = { ...entry, path: realDir };\n await this.write(entries.map((item) => (item.id === id ? updated : item)));\n return updated;\n }\n return entry;\n } catch {\n await this.remove(id);\n return null;\n }\n }\n\n private async resolveDir(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const realDir = await fs.realpath(resolved);\n const stat = await fs.stat(realDir);\n if (!stat.isDirectory()) {\n throw new Error(`${dirPath} is not a directory.`);\n }\n return realDir;\n }\n\n private async read(): Promise<WorkspaceEntry[]> {\n try {\n const content = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: WorkspaceEntry[]): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(this.filePath, JSON.stringify(entries, null, 2) + '\\n', 'utf8');\n }\n\n private async seedFromEnv(): Promise<void> {\n if (this.seeded) {\n return;\n }\n this.seeded = true;\n\n const seedValue = process.env.DEVSURFACE_WORKSPACES;\n if (!seedValue) {\n return;\n }\n\n const paths = seedValue\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (const p of paths) {\n try {\n await this.add(p);\n } catch {\n // Skip invalid seed paths.\n }\n }\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function configuredWorkspaceRoots(): Promise<string[]> {\n const raw = process.env.DEVSURFACE_WORKSPACE_ROOTS;\n if (!raw) {\n return [];\n }\n\n const roots: string[] = [];\n for (const entry of raw.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n try {\n roots.push(await fs.realpath(path.resolve(trimmed)));\n } catch {\n // Skip invalid roots.\n }\n }\n\n return roots;\n}\n\nexport async function assertWithinWorkspaceRoots(targetPath: string): Promise<void> {\n const roots = await configuredWorkspaceRoots();\n if (roots.length === 0) {\n return;\n }\n\n for (const root of roots) {\n if (isWithinRoot(root, targetPath)) {\n return;\n }\n }\n\n throw new Error('Path must be inside a configured workspace root.');\n}\n","import { ProcessManager } from '../process/manager.js';\nimport { DockerComposeController, type DockerController } from '../docker/compose.js';\nimport { WorkspaceRegistry, type WorkspaceEntry } from './registry.js';\n\nexport interface WorkspaceRuntime {\n readonly id: string;\n readonly root: string;\n readonly processManager: ProcessManager;\n readonly dockerController: DockerController;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n runningProcesses: number;\n}\n\nexport class Hub {\n readonly registry: WorkspaceRegistry;\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private cleanupInstalled = false;\n\n constructor(options?: { dataDir?: string }) {\n this.registry = new WorkspaceRegistry(options?.dataDir);\n }\n\n get(id: string): WorkspaceRuntime | null {\n return this.runtimes.get(id) ?? null;\n }\n\n ensure(entry: WorkspaceEntry): WorkspaceRuntime {\n const existing = this.runtimes.get(entry.id);\n if (existing) {\n return existing;\n }\n\n const runtime: WorkspaceRuntime = {\n id: entry.id,\n root: entry.path,\n processManager: new ProcessManager(),\n dockerController: new DockerComposeController(entry.path)\n };\n this.runtimes.set(entry.id, runtime);\n return runtime;\n }\n\n async listSummaries(): Promise<WorkspaceSummary[]> {\n const entries = await this.registry.list();\n return entries.map((entry) => {\n const runtime = this.runtimes.get(entry.id);\n const running = runtime\n ? runtime.processManager.list().filter((p) => p.status === 'running').length\n : 0;\n return {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n addedAt: entry.addedAt,\n runningProcesses: running\n };\n });\n }\n\n killAll(): void {\n for (const runtime of this.runtimes.values()) {\n runtime.processManager.killAll();\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n this.cleanupInstalled = true;\n\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { createApiAccessMiddleware } from '../accessControl.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction registerMutationGuard(app: Hono, mutationToken: string): void {\n app.use('/api/*', createApiAccessMiddleware());\n app.use('/api/*', async (context, next) => {\n if (context.req.method === 'GET' || context.req.method === 'HEAD') {\n await next();\n return;\n }\n\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n\n await next();\n });\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nfunction handleDockerError(\n error: unknown,\n context: { json: (data: unknown, status: number) => Response }\n): Response {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n}\n\nfunction registerWorkspaceRoutes(\n app: Hono,\n resolveWorkspace: (id: string) => Promise<{\n root: string;\n processManager: ProcessManager;\n dockerController: DockerController;\n } | null>\n): void {\n app.get('/api/workspaces/:id/project', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await scanProject(ws.root));\n });\n\n app.get('/api/workspaces/:id/health', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await runDoctor(ws.root));\n });\n\n app.get('/api/workspaces/:id/processes', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.list());\n });\n\n app.get('/api/workspaces/:id/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.listLogs());\n });\n\n app.get('/api/workspaces/:id/docker/:service/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/start', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/stop', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/run/:script', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(ws.root);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: ws.root,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/workspaces/:id/install', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const command = await resolvePackageInstallCommand({\n cwd: ws.root,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/workspaces/:id/commands/:name', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(ws.root);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(ws.root, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/workspaces/:id/open/folder', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n await open(ws.root);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/workspaces/:id/open/package', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const packagePath = path.join(ws.root, 'package.json');\n if (!(await realPathWithinRoot(ws.root, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/workspaces/:id/open/terminal', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const opened = openTerminalAt(ws.root);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/workspaces/:id/env/copy', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination = localPath ?? path.join(ws.root, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(ws.root, examplePath)) ||\n !(await writableDestinationWithinRoot(ws.root, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/workspaces/:id/run/:pid', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = ws.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n\nexport function registerHubApiRoutes(\n app: Hono,\n options: {\n hub: Hub;\n mutationToken: string;\n }\n): void {\n const { hub } = options;\n registerMutationGuard(app, options.mutationToken);\n\n async function resolveWorkspace(id: string) {\n const entry = await hub.registry.resolve(id);\n if (!entry) return null;\n const runtime = hub.ensure(entry);\n return {\n root: runtime.root,\n processManager: runtime.processManager,\n dockerController: runtime.dockerController\n };\n }\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/workspaces', async (context) => {\n return context.json(await hub.listSummaries());\n });\n\n app.post('/api/workspaces', async (context) => {\n const body = await context.req.json<{ path: string }>().catch(() => null);\n if (!body?.path) {\n return context.json({ error: 'path is required.' }, 400);\n }\n try {\n const entry = await hub.registry.add(body.path);\n return context.json(entry, 201);\n } catch (error) {\n return context.json({ error: error instanceof Error ? error.message : 'Invalid path.' }, 400);\n }\n });\n\n app.delete('/api/workspaces/:id', async (context) => {\n const id = context.req.param('id');\n const runtime = hub.get(id);\n if (runtime) {\n runtime.processManager.killAll();\n }\n const removed = await hub.registry.remove(id);\n return context.json({ removed }, removed ? 200 : 404);\n });\n\n registerWorkspaceRoutes(app, resolveWorkspace);\n\n // Backward-compatible single-project aliases: proxy to the first workspace\n app.get('/api/project', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await scanProject(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/health', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await runDoctor(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/processes', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.list());\n });\n\n app.get('/api/logs', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.listLogs());\n });\n}\n\n// Legacy single-project API for backward compatibility with tests\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n registerMutationGuard(app, options.mutationToken);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","export const DEV_SURFACE_VERSION = '0.5.0';\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","export const DEFAULT_HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\nconst CONTAINER_HOSTS = new Set(['0.0.0.0', '::']);\n\nexport function resolveHost(): string {\n const envHost = process.env.DEVSURFACE_HOST;\n if (!envHost) {\n return DEFAULT_HOST;\n }\n\n if (LOOPBACK_HOSTS.has(envHost)) {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost) && process.env.DEVSURFACE_CONTAINER === 'true') {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost)) {\n throw new Error(\n 'All-interface DevSurface binding is only allowed when DEVSURFACE_CONTAINER=true. DevSurface binds to 127.0.0.1 on bare metal.'\n );\n }\n\n throw new Error('DEVSURFACE_HOST must be a loopback host, or 0.0.0.0 inside a container.');\n}\n\nlet listenHost = DEFAULT_HOST;\n\nexport function setListenHost(host: string): void {\n listenHost = host;\n}\n\nexport function getListenHost(): string {\n return listenHost;\n}\n\nexport function resetListenHost(): void {\n listenHost = DEFAULT_HOST;\n}\n\nexport function normalizeRemoteAddress(raw: string | undefined): string | null {\n if (typeof raw !== 'string' || raw.length === 0) {\n return null;\n }\n\n if (raw.startsWith('::ffff:')) {\n return raw.slice('::ffff:'.length);\n }\n\n return raw;\n}\n\nexport function isLoopbackRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (address === '::1' || address === '127.0.0.1') {\n return true;\n }\n\n return address.startsWith('127.');\n}\n\nfunction parseIpv4(address: string): [number, number, number, number] | null {\n const parts = address.split('.');\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nexport function isPrivateRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (isLoopbackRemoteAddress(address)) {\n return true;\n }\n\n if (address.startsWith('fe80:')) {\n return true;\n }\n\n const ipv4 = parseIpv4(address);\n if (!ipv4) {\n return false;\n }\n\n const [a, b] = ipv4;\n if (a === 10) {\n return true;\n }\n if (a === 192 && b === 168) {\n return true;\n }\n if (a === 172 && b >= 16 && b <= 31) {\n return true;\n }\n\n return false;\n}\n\nexport function isAllowedRemoteAddress(raw: string | undefined, host: string): boolean {\n if (host === '0.0.0.0' || host === '::') {\n return isPrivateRemoteAddress(raw);\n }\n\n return isLoopbackRemoteAddress(raw);\n}\n\nexport function isAllowedClientConnection(\n raw: string | undefined,\n host: string = getListenHost()\n): boolean {\n if (raw === undefined) {\n return true;\n }\n\n return isAllowedRemoteAddress(raw, host);\n}\n\nexport function initializeListenHost(): string {\n const host = resolveHost();\n setListenHost(host);\n return host;\n}\n","import type { IncomingMessage } from 'node:http';\nimport type { Context, Next } from 'hono';\nimport { isAllowedLocalHostHeader } from './localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from './listenConfig.js';\n\nexport function remoteAddressFromRequest(request: IncomingMessage | undefined): string | undefined {\n return request?.socket?.remoteAddress;\n}\n\nexport function createRemoteAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n await next();\n };\n}\n\nexport function createApiAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n\n await next();\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from '../listenConfig.js';\nimport { remoteAddressFromRequest } from '../accessControl.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (!isAllowedClientConnection(remoteAddressFromRequest(request), getListenHost())) {\n return false;\n }\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nfunction workspaceIdFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, 'http://localhost');\n return parsed.searchParams.get('workspace');\n } catch {\n return null;\n }\n}\n\n// Legacy single-ProcessManager WebSocket (backward compat with tests)\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n\n// Hub-aware WebSocket: each connection is scoped to a workspace via ?workspace=<id>\nexport function setupHubWebSocket(server: Server, hub: Hub): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n const clientWorkspaces = new WeakMap<WebSocket, string>();\n const attachedManagers = new Set<string>();\n\n function attachManager(workspaceId: string, processManager: ProcessManager): void {\n if (attachedManagers.has(workspaceId)) {\n return;\n }\n attachedManagers.add(workspaceId);\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcastToWorkspace(workspaceId, { type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcastToWorkspace(workspaceId, { type: 'process', process: processInfo });\n });\n }\n\n function broadcastToWorkspace(workspaceId: string, payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN && clientWorkspaces.get(client) === workspaceId) {\n client.send(serialized);\n }\n }\n }\n\n wss.on('connection', async (socket, request) => {\n const workspaceId = workspaceIdFromUrl(request.url);\n if (!workspaceId) {\n socket.close(4000, 'Missing workspace query parameter.');\n return;\n }\n\n const entry = await hub.registry.resolve(workspaceId);\n if (!entry) {\n socket.close(4004, 'Workspace not found.');\n return;\n }\n\n const runtime = hub.ensure(entry);\n clientWorkspaces.set(socket, workspaceId);\n attachManager(workspaceId, runtime.processManager);\n\n socket.send(\n JSON.stringify({\n type: 'hello',\n workspace: workspaceId,\n processes: runtime.processManager.list(),\n logs: runtime.processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","import { DEFAULT_HOST, DEFAULT_PORT } from '../../server/index.js';\n\nexport async function isHubRunning(port: number = DEFAULT_PORT): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/api/hub/status`, {\n signal: AbortSignal.timeout(2000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function registerWorkspaceRemotely(\n dirPath: string,\n port: number = DEFAULT_PORT\n): Promise<{ id: string; name: string } | null> {\n try {\n const sessionResponse = await fetch(`http://127.0.0.1:${port}/api/session`, {\n signal: AbortSignal.timeout(2000)\n });\n if (!sessionResponse.ok) return null;\n const session = (await sessionResponse.json()) as { token: string };\n\n const response = await fetch(`http://127.0.0.1:${port}/api/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DevSurface-Intent': 'dashboard',\n 'X-DevSurface-Token': session.token\n },\n body: JSON.stringify({ path: dirPath }),\n signal: AbortSignal.timeout(5000)\n });\n if (!response.ok) return null;\n return (await response.json()) as { id: string; name: string };\n } catch {\n return null;\n }\n}\n\nexport function dashboardUrl(\n workspaceId: string,\n port: number = DEFAULT_PORT,\n host: string = DEFAULT_HOST\n): string {\n const displayHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n return `http://${displayHost}:${port}/?workspace=${workspaceId}`;\n}\n","import pc from 'picocolors';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\n\nexport async function serveCommand(options: {\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n console.log(pc.bold(`DevSurface Hub v${DEV_SURFACE_VERSION}`));\n console.log('Starting hub server...\\n');\n\n const server = await startHubServer({\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n const summaries = await server.hub.listSummaries();\n if (summaries.length > 0) {\n console.log(`Registered workspaces: ${summaries.length}`);\n for (const ws of summaries) {\n console.log(` ${pc.cyan(ws.name)} -> ${ws.path}`);\n }\n } else {\n console.log(\n 'No workspaces registered yet. Use `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n }\n\n console.log(`\\nHub running at -> ${pc.cyan(server.url)}`);\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { WorkspaceRegistry } from '../../core/hub/registry.js';\n\nexport async function workspaceAddCommand(dirPath?: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const target = path.resolve(dirPath ?? process.cwd());\n const entry = await registry.add(target);\n console.log(`Added workspace ${pc.cyan(entry.name)} (${entry.id}) -> ${entry.path}`);\n}\n\nexport async function workspaceListCommand(): Promise<void> {\n const registry = new WorkspaceRegistry();\n const entries = await registry.list();\n\n if (entries.length === 0) {\n console.log(\n 'No workspaces registered. Run `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n return;\n }\n\n console.log(`${entries.length} workspace${entries.length === 1 ? '' : 's'}:\\n`);\n for (const entry of entries) {\n console.log(` ${pc.cyan(entry.name)} (${entry.id})`);\n console.log(` ${entry.path}`);\n }\n}\n\nexport async function workspaceRemoveCommand(id: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const removed = await registry.remove(id);\n if (removed) {\n console.log(`Removed workspace ${pc.cyan(id)}.`);\n } else {\n console.error(`Workspace \"${id}\" not found.`);\n process.exitCode = 1;\n }\n}\n","const REGISTRY_LATEST_URL = 'https://registry.npmjs.org/devsurface/latest';\nconst UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n}\n\nfunction parseVersion(version: string): [number, number, number] | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/);\n if (!match) {\n return null;\n }\n\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function isNewerVersion(latestVersion: string, currentVersion: string): boolean {\n const latest = parseVersion(latestVersion);\n const current = parseVersion(currentVersion);\n if (latest === null || current === null) {\n return false;\n }\n\n for (let index = 0; index < latest.length; index += 1) {\n if (latest[index] > current[index]) {\n return true;\n }\n if (latest[index] < current[index]) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `Update available: v${info.latestVersion}\\nRun: npx devsurface@latest`;\n}\n\nfunction shouldCheckForUpdates(): boolean {\n return process.env.DEVSURFACE_UPDATE_CHECK !== '0' && process.env.CI !== 'true';\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetchImpl: typeof fetch = fetch\n): Promise<UpdateInfo | null> {\n if (!shouldCheckForUpdates()) {\n return null;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetchImpl(REGISTRY_LATEST_URL, {\n headers: {\n accept: 'application/json'\n },\n signal: controller.signal\n });\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { version?: unknown };\n const latestVersion = typeof body.version === 'string' ? body.version : null;\n if (latestVersion === null || !isNewerVersion(latestVersion, currentVersion)) {\n return null;\n }\n\n return {\n currentVersion,\n latestVersion\n };\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function printUpdateNotice(currentVersion: string): Promise<void> {\n const update = await checkForUpdate(currentVersion);\n if (update !== null) {\n console.log(`\\n${formatUpdateNotice(update)}`);\n }\n}\n"],"mappings":"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","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","fs","path","readIfPresent","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","spawn","runCommand","spawn","pc","pc","pc","pc","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","fs","path","fileURLToPath","spawn","fs","os","path","fs","path","isWithinRoot","path","os","fs","entry","constants","fs","path","spawn","isWithinRoot","path","fs","handle","constants","spawn","workspaceId","fs","path","fileURLToPath","workspaceId","pc","pc","pc","path","pc","path","pc"]}
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/cli/commands/doctor.ts","../../src/core/doctor/index.ts","../../src/core/documentation.ts","../../src/core/scanner/index.ts","../../src/core/config/load.ts","../../src/core/security/url.ts","../../src/core/config/defaults.ts","../../src/core/docker/compose.ts","../../src/core/process/executable.ts","../../src/core/scanner/docker.ts","../../src/core/scanner/env.ts","../../src/core/scanner/framework.ts","../../src/core/scanner/git.ts","../../src/core/scanner/language.ts","../../src/core/scanner/packageManager.ts","../../src/core/scanner/packageJson.ts","../../src/core/scanner/ports.ts","../../src/core/scanner/presets.ts","../../src/core/scanner/scripts.ts","../../src/core/security/text.ts","../../src/cli/commands/init.ts","../../src/cli/commands/onboard.ts","../../src/core/onboarding/index.ts","../../src/cli/commands/run.ts","../../src/core/process/runner.ts","../../src/core/security/dangerousCommand.ts","../../src/cli/commands/scan.ts","../../src/cli/commands/start.ts","../../node_modules/open/index.js","../../node_modules/wsl-utils/index.js","../../node_modules/is-wsl/index.js","../../node_modules/is-inside-container/index.js","../../node_modules/is-docker/index.js","../../node_modules/define-lazy-prop/index.js","../../node_modules/default-browser/index.js","../../node_modules/default-browser-id/index.js","../../node_modules/run-applescript/index.js","../../node_modules/bundle-name/index.js","../../node_modules/default-browser/windows.js","../../src/server/index.ts","../../src/core/process/manager.ts","../../src/core/hub/registry.ts","../../src/core/hub/workspaceRoots.ts","../../src/core/hub/runtime.ts","../../src/server/routes/api.ts","../../src/version.ts","../../src/server/localAccess.ts","../../src/server/listenConfig.ts","../../src/server/accessControl.ts","../../src/server/mutationToken.ts","../../src/server/terminal.ts","../../src/server/routes/ws.ts","../../src/cli/hub/client.ts","../../src/cli/commands/serve.ts","../../src/cli/commands/workspace.ts","../../src/cli/updateCheck.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command } from 'commander';\nimport { doctorCommand } from './commands/doctor.js';\nimport { initCommand } from './commands/init.js';\nimport { onboardCommand } from './commands/onboard.js';\nimport { runCommand } from './commands/run.js';\nimport { scanCommand } from './commands/scan.js';\nimport { startCommand } from './commands/start.js';\nimport { serveCommand } from './commands/serve.js';\nimport {\n workspaceAddCommand,\n workspaceListCommand,\n workspaceRemoveCommand\n} from './commands/workspace.js';\nimport { printUpdateNotice } from './updateCheck.js';\nimport { DEV_SURFACE_VERSION } from '../version.js';\n\nconst program = new Command();\n\nfunction toPort(value: string): number {\n const port = Number(value);\n if (!Number.isInteger(port) || port <= 0 || port > 65535) {\n throw new Error('Port must be an integer between 1 and 65535.');\n }\n\n return port;\n}\n\nfunction handle(command: Promise<void>): void {\n command\n .then(async () => {\n await printUpdateNotice(DEV_SURFACE_VERSION);\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n console.error(message);\n process.exitCode = 1;\n });\n}\n\nprogram\n .name('devsurface')\n .description('Turn any Node.js repository into a local developer control panel.')\n .version(DEV_SURFACE_VERSION)\n .option('-p, --port <port>', 'dashboard port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n startCommand({\n cwd: process.cwd(),\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nprogram\n .command('serve')\n .description('Start the DevSurface hub server (multi-workspace mode).')\n .option('-p, --port <port>', 'hub port', toPort, 4567)\n .option('--no-open', 'do not open the browser automatically')\n .action((options: { port: number; open: boolean }) => {\n handle(\n serveCommand({\n port: options.port,\n openBrowser: options.open\n })\n );\n });\n\nconst workspace = program.command('workspace').description('Manage registered workspaces.');\n\nworkspace\n .command('add [path]')\n .description('Register a project directory with the hub.')\n .action((dirPath?: string) => {\n handle(workspaceAddCommand(dirPath));\n });\n\nworkspace\n .command('list')\n .description('List all registered workspaces.')\n .action(() => {\n handle(workspaceListCommand());\n });\n\nworkspace\n .command('remove <id>')\n .description('Remove a workspace from the hub registry.')\n .action((id: string) => {\n handle(workspaceRemoveCommand(id));\n });\n\nprogram\n .command('scan')\n .description('Print detected project info.')\n .action(() => {\n handle(scanCommand(process.cwd()));\n });\n\nprogram\n .command('doctor')\n .description('Print setup health warnings.')\n .action(() => {\n handle(doctorCommand(process.cwd()));\n });\n\nprogram\n .command('onboard')\n .description('Print a guided setup checklist with readiness score.')\n .action(() => {\n handle(onboardCommand(process.cwd()));\n });\n\nprogram\n .command('init')\n .description('Create a starter devsurface.config.json.')\n .action(() => {\n handle(initCommand(process.cwd()));\n });\n\nprogram\n .command('run')\n .argument('<script>', 'package.json script to run')\n .description('Run a package script and stream logs.')\n .action((script: string) => {\n handle(runCommand(script, process.cwd()));\n });\n\nawait program.parseAsync(process.argv);\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction colorSeverity(severity: 'error' | 'warning' | 'info'): string {\n if (severity === 'error') {\n return pc.red('error');\n }\n\n if (severity === 'warning') {\n return pc.yellow('warning');\n }\n\n return pc.cyan('info');\n}\n\nexport async function doctorCommand(cwd = process.cwd()): Promise<void> {\n const warnings = await runDoctor(cwd);\n\n if (warnings.length === 0) {\n console.log(pc.green('No health warnings found.'));\n return;\n }\n\n for (const item of warnings) {\n console.log(`${colorSeverity(item.severity)} ${pc.bold(safeTerminalText(item.title))}`);\n console.log(` ${safeTerminalText(item.message)}`);\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { extractScriptReferences } from '../documentation.js';\nimport type { DoctorWarning, ScanResult } from '../types.js';\nimport { scanProject } from '../scanner/index.js';\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readIfPresent(filePath: string | null): Promise<string | null> {\n if (filePath === null) {\n return null;\n }\n\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction warning(\n id: string,\n severity: DoctorWarning['severity'],\n title: string,\n message: string,\n target?: string\n): DoctorWarning {\n return { id, severity, title, message, target };\n}\n\nexport async function runDoctor(root = process.cwd(), scan?: ScanResult): Promise<DoctorWarning[]> {\n const result = scan ?? (await scanProject(root));\n const warnings: DoctorWarning[] = [];\n\n for (const configWarning of result.config?.warnings ?? []) {\n warnings.push(\n warning('config-warning', 'warning', 'Config warning', configWarning, result.config?.path)\n );\n }\n\n const isNodeProject = result.language.detected.includes('node');\n const hasKnownProjectLanguage = result.language.detected.length > 0;\n\n if (result.packageJson === null && !hasKnownProjectLanguage) {\n warnings.push(\n warning(\n 'missing-package-json',\n 'error',\n 'No package.json',\n 'This directory is not a Node.js project.'\n )\n );\n return warnings;\n }\n\n if (isNodeProject && !(await pathExists(path.join(root, 'node_modules', '.bin')))) {\n warnings.push(\n warning(\n 'missing-node-modules',\n 'warning',\n 'Dependencies are not installed',\n 'node_modules/.bin is missing. Run the project install command before starting scripts.'\n )\n );\n }\n\n if (result.env?.hasExample && !result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env',\n 'error',\n '.env is missing',\n '.env.example exists, but the local .env file is missing.',\n result.env.examplePath ?? undefined\n )\n );\n }\n\n if (result.env && result.env.missingKeys.length > 0 && result.env.hasLocal) {\n warnings.push(\n warning(\n 'missing-env-keys',\n 'warning',\n 'Environment keys are missing',\n `Missing keys: ${result.env.missingKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n if (result.env && result.env.emptyKeys.length > 0) {\n warnings.push(\n warning(\n 'empty-env-keys',\n 'info',\n 'Environment keys are empty',\n `Empty keys: ${result.env.emptyKeys.join(', ')}. Values are intentionally hidden.`\n )\n );\n }\n\n const missingReadme = !result.readme.exists;\n if (missingReadme) {\n warnings.push(\n warning('missing-readme', 'warning', 'No README', 'No README.md or README file was found.')\n );\n } else {\n const readme = await readIfPresent(result.readme.path);\n if (readme !== null) {\n const references = extractScriptReferences(readme);\n const missingScripts = references.filter((script) => result.scripts[script] === undefined);\n if (missingScripts.length > 0) {\n warnings.push(\n warning(\n 'readme-script-mismatch',\n 'warning',\n 'README references missing scripts',\n `README mentions scripts not present in package.json: ${missingScripts.join(', ')}.`\n )\n );\n }\n }\n }\n\n for (const port of result.ports.filter((probe) => probe.inUse)) {\n warnings.push(\n warning(\n `port-${port.port}-in-use`,\n 'error',\n `Port ${port.port} is already in use`,\n `Something is already bound to 127.0.0.1:${port.port}.`\n )\n );\n }\n\n if (result.docker && result.docker.dockerRunning === false) {\n warnings.push(\n warning(\n 'docker-not-running',\n 'warning',\n 'Docker Compose found but Docker is not running',\n result.docker.message ?? 'A compose file exists, but Docker is not available.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.test === undefined) {\n warnings.push(\n warning(\n 'missing-test-script',\n 'warning',\n 'No test script',\n 'package.json does not define a test script.'\n )\n );\n }\n\n if (isNodeProject && result.scripts.build === undefined) {\n warnings.push(\n warning(\n 'missing-build-script',\n 'warning',\n 'No build script',\n 'package.json does not define a build script.'\n )\n );\n }\n\n return warnings;\n}\n","export function extractScriptReferences(content: string): string[] {\n const references = new Set<string>();\n const commandRegexes = [\n /\\bnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bpnpm\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bbun\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\byarn\\s+run\\s+([A-Za-z0-9:_-]+)/g,\n /\\bnpm\\s+(test|start|build)\\b/g,\n /\\bpnpm\\s+(test|start|build)\\b/g,\n /\\byarn\\s+(test|start|build)\\b/g,\n /\\bbun\\s+(test|start|build)\\b/g\n ];\n\n for (const regex of commandRegexes) {\n for (const match of content.matchAll(regex)) {\n references.add(match[1]);\n }\n }\n\n return Array.from(references);\n}\n\nexport function documentsEnvironmentSetup(content: string): boolean {\n return /(?:\\.env(?:\\.example)?|environment\\s+variables?)/i.test(content);\n}\n\nexport function undocumentedPorts(content: string, ports: number[]): number[] {\n return ports.filter((port) => !new RegExp(`\\\\b${port}\\\\b`).test(content));\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FilePresence, ScanResult } from '../types.js';\nimport { loadConfig } from '../config/load.js';\nimport { detectDocker } from './docker.js';\nimport { detectEnv } from './env.js';\nimport { detectFramework } from './framework.js';\nimport { detectGit } from './git.js';\nimport { detectProjectLanguage } from './language.js';\nimport { detectPackageManager } from './packageManager.js';\nimport { readPackageJson } from './packageJson.js';\nimport { defaultPortsForFramework, detectPorts, inferPortsFromScripts } from './ports.js';\nimport { detectPresets, mergePresetCommands, mergePresetGroups } from './presets.js';\nimport { extractScripts } from './scripts.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function findFirstFile(root: string, candidates: string[]): Promise<FilePresence> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n\n for (const candidate of candidates) {\n const filePath = path.join(root, candidate);\n try {\n const [stat, realPath] = await Promise.all([fs.stat(filePath), fs.realpath(filePath)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realPath)) {\n return { path: realPath, exists: true };\n }\n } catch {\n // Keep looking through the candidate list.\n }\n }\n\n return { path: null, exists: false };\n}\n\nfunction configuredPorts(configPorts: number[] | undefined): number[] {\n return Array.isArray(configPorts) ? configPorts : [];\n}\n\nexport async function scanProject(root = process.cwd()): Promise<ScanResult> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const config = await loadConfig(resolvedRoot);\n const packageJson = await readPackageJson(resolvedRoot);\n const scripts = extractScripts(packageJson) ?? {};\n const framework = detectFramework(packageJson);\n const language = await detectProjectLanguage(resolvedRoot, packageJson);\n const presets = await detectPresets({\n root: resolvedRoot,\n packageJson,\n framework,\n language\n });\n const presetCommands = mergePresetCommands(presets);\n const presetGroups = mergePresetGroups(presets);\n const portsToProbe = [\n ...configuredPorts(config?.config.ports),\n ...inferPortsFromScripts(scripts),\n ...defaultPortsForFramework(framework),\n ...presets.flatMap((preset) => preset.ports)\n ];\n\n const [packageManager, env, docker, git, ports, readme, license] = await Promise.all([\n detectPackageManager(resolvedRoot),\n detectEnv(resolvedRoot, config?.config),\n detectDocker(resolvedRoot),\n detectGit(resolvedRoot),\n detectPorts(portsToProbe),\n findFirstFile(resolvedRoot, ['README.md', 'README']),\n findFirstFile(resolvedRoot, ['LICENSE', 'LICENSE.md', 'COPYING'])\n ]);\n\n return {\n root: resolvedRoot,\n projectName: config?.config.name ?? packageJson?.data.name ?? path.basename(resolvedRoot),\n packageJson,\n packageManager: packageManager ?? (packageJson ? 'npm' : null),\n language,\n scripts,\n env,\n docker,\n git,\n framework,\n presets,\n presetCommands,\n presetGroups,\n ports: ports ?? [],\n readme,\n license,\n config\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { isSafeHttpUrl } from '../security/url.js';\nimport type { ConfigLoadResult, DevSurfaceConfig, SetupGuideStep } from '../types.js';\nimport { CONFIG_FILE_NAME } from './defaults.js';\n\nexport const MAX_CONFIGURED_PORTS = 32;\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction toStringRecord(\n value: unknown,\n warnings: string[],\n label: string\n): Record<string, string> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push(`${label} must be an object.`);\n return undefined;\n }\n\n const record: Record<string, string> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (typeof raw === 'string') {\n record[key] = raw;\n } else {\n warnings.push(`${label}.${key} must be a string.`);\n }\n }\n\n return record;\n}\n\nfunction toGroups(value: unknown, warnings: string[]): Record<string, string[]> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!isRecord(value)) {\n warnings.push('groups must be an object.');\n return undefined;\n }\n\n const groups: Record<string, string[]> = {};\n for (const [key, raw] of Object.entries(value)) {\n if (Array.isArray(raw) && raw.every((entry) => typeof entry === 'string')) {\n groups[key] = raw;\n } else {\n warnings.push(`groups.${key} must be an array of command names.`);\n }\n }\n\n return groups;\n}\n\nexport const MAX_SETUP_GUIDE_STEPS = 24;\nconst MAX_SETUP_GUIDE_STEP_LENGTH = 200;\n\nfunction toSetupGuide(\n value: unknown,\n warnings: string[]\n): Array<string | SetupGuideStep> | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('setupGuide must be an array of strings or step objects.');\n return undefined;\n }\n\n const steps: Array<string | SetupGuideStep> = [];\n for (const entry of value) {\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n if (trimmed.length > 0) {\n steps.push(trimmed.slice(0, MAX_SETUP_GUIDE_STEP_LENGTH));\n }\n } else if (isRecord(entry)) {\n if (typeof entry.title !== 'string' || entry.title.trim().length === 0) {\n warnings.push('setupGuide step objects must have a non-empty title string.');\n continue;\n }\n const step: SetupGuideStep = {\n title: entry.title.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH)\n };\n if (typeof entry.description === 'string' && entry.description.trim().length > 0) {\n step.description = entry.description.trim().slice(0, MAX_SETUP_GUIDE_STEP_LENGTH);\n }\n if (typeof entry.command === 'string' && entry.command.trim().length > 0) {\n step.command = entry.command.trim();\n }\n if (typeof entry.script === 'string' && entry.script.trim().length > 0) {\n step.script = entry.script.trim();\n }\n steps.push(step);\n } else {\n warnings.push('setupGuide entries must be strings or step objects.');\n }\n }\n\n if (steps.length > MAX_SETUP_GUIDE_STEPS) {\n warnings.push(`setupGuide may contain at most ${MAX_SETUP_GUIDE_STEPS} steps.`);\n }\n\n return steps.slice(0, MAX_SETUP_GUIDE_STEPS);\n}\n\nfunction toPorts(value: unknown, warnings: string[]): number[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n warnings.push('ports must be an array of numbers.');\n return undefined;\n }\n\n const ports = value.filter(\n (port): port is number => Number.isInteger(port) && port > 0 && port < 65536\n );\n if (ports.length !== value.length) {\n warnings.push('ports may only contain integers between 1 and 65535.');\n }\n\n if (ports.length > MAX_CONFIGURED_PORTS) {\n warnings.push(`ports may contain at most ${MAX_CONFIGURED_PORTS} entries.`);\n }\n\n return ports.slice(0, MAX_CONFIGURED_PORTS);\n}\n\nexport function validateConfig(raw: unknown): { config: DevSurfaceConfig; warnings: string[] } {\n const warnings: string[] = [];\n if (!isRecord(raw)) {\n return { config: {}, warnings: ['devsurface.config.json must contain a JSON object.'] };\n }\n\n const env = isRecord(raw.env)\n ? {\n example: typeof raw.env.example === 'string' ? raw.env.example : undefined,\n local: typeof raw.env.local === 'string' ? raw.env.local : undefined\n }\n : undefined;\n\n if (raw.env !== undefined && !isRecord(raw.env)) {\n warnings.push('env must be an object.');\n }\n\n const services = isRecord(raw.services)\n ? {\n docker: typeof raw.services.docker === 'boolean' ? raw.services.docker : undefined\n }\n : undefined;\n\n if (raw.services !== undefined && !isRecord(raw.services)) {\n warnings.push('services must be an object.');\n }\n\n let docs: string | undefined;\n if (typeof raw.docs === 'string' && raw.docs.length > 0) {\n if (isSafeHttpUrl(raw.docs)) {\n docs = raw.docs;\n } else {\n warnings.push('docs must be an http or https URL.');\n }\n }\n\n return {\n config: {\n name: typeof raw.name === 'string' ? raw.name : undefined,\n description: typeof raw.description === 'string' ? raw.description : undefined,\n commands: toStringRecord(raw.commands, warnings, 'commands'),\n groups: toGroups(raw.groups, warnings),\n ports: toPorts(raw.ports, warnings),\n env,\n services,\n setupGuide: toSetupGuide(raw.setupGuide ?? raw.setup_guide, warnings),\n docs\n },\n warnings\n };\n}\n\nexport async function loadConfig(root: string): Promise<ConfigLoadResult | null> {\n const configPath = path.join(root, CONFIG_FILE_NAME);\n\n try {\n const [realRoot, realConfigPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(configPath)\n ]);\n if (!isWithinRoot(realRoot, realConfigPath)) {\n return null;\n }\n const content = await fs.readFile(realConfigPath, 'utf8');\n const parsed = JSON.parse(content) as unknown;\n const { config, warnings } = validateConfig(parsed);\n return { path: realConfigPath, config, warnings };\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'ENOENT') {\n return null;\n }\n\n if (error instanceof SyntaxError) {\n return {\n path: configPath,\n config: {},\n warnings: [`${CONFIG_FILE_NAME} contains invalid JSON.`]\n };\n }\n\n return null;\n }\n}\n","export function isSafeHttpUrl(value: string): boolean {\n try {\n const url = new URL(value);\n return url.protocol === 'http:' || url.protocol === 'https:';\n } catch {\n return false;\n }\n}\n","import type { DevSurfaceConfig } from '../types.js';\n\nexport const CONFIG_FILE_NAME = 'devsurface.config.json';\n\nexport const defaultConfig: DevSurfaceConfig = {\n name: 'My App',\n description: 'Local developer control panel',\n commands: {\n install: 'npm install',\n migrate: 'npm run db:migrate',\n seed: 'npm run db:seed',\n dev: 'npm run dev',\n build: 'npm run build',\n test: 'npm test',\n lint: 'npm run lint'\n },\n groups: {\n 'First-time setup': ['install', 'migrate', 'seed'],\n 'Daily development': ['dev'],\n 'Before committing': ['test', 'lint'],\n Build: ['build']\n },\n ports: [3000],\n env: {\n example: '.env.example',\n local: '.env'\n },\n services: {\n docker: true\n },\n setupGuide: [\n {\n title: 'Install dependencies',\n description: 'Run the package manager install to set up node_modules.',\n command: 'install'\n },\n 'Copy .env.example to .env',\n 'Fill in required environment values (DATABASE_URL, etc.)',\n {\n title: 'Run database migrations',\n description: 'Apply the database schema to your local database.',\n command: 'migrate'\n },\n {\n title: 'Start the development server',\n description: 'Run the local dev server and open the app in a browser.',\n command: 'dev'\n }\n ],\n docs: ''\n};\n","import { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport { parse as parseYaml } from 'yaml';\nimport { resolveExecutableOutsideRoot } from '../process/executable.js';\nimport type {\n DockerDaemonStatus,\n DockerInfo,\n DockerServiceInfo,\n DockerServiceStatus\n} from '../types.js';\n\nconst COMPOSE_FILES = ['docker-compose.yml', 'docker-compose.yaml', 'compose.yml', 'compose.yaml'];\nconst COMMAND_OUTPUT_LIMIT = 200_000;\nconst ESC = String.fromCharCode(27);\nconst ANSI_CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\n\nexport interface DockerCommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n error: 'not-found' | 'timeout' | 'spawn' | null;\n}\n\nexport interface DockerCommandOptions {\n timeoutMs?: number;\n outputLimit?: number;\n}\n\nexport type DockerCommandRunner = (\n root: string,\n args: string[],\n options?: DockerCommandOptions\n) => Promise<DockerCommandResult>;\n\nexport interface DockerActionResult {\n service: string;\n action: 'start' | 'stop';\n output: string;\n}\n\nexport interface DockerLogsResult {\n service: string;\n logs: string;\n}\n\nexport interface DockerController {\n inspect(): Promise<DockerInfo | null>;\n start(service: string): Promise<DockerActionResult>;\n stop(service: string): Promise<DockerActionResult>;\n logs(service: string): Promise<DockerLogsResult>;\n}\n\nexport type DockerOperationErrorCode =\n | 'compose-not-found'\n | 'service-not-found'\n | 'docker-not-installed'\n | 'docker-not-running'\n | 'command-failed';\n\nexport class DockerOperationError extends Error {\n constructor(\n public readonly code: DockerOperationErrorCode,\n message: string\n ) {\n super(message);\n this.name = 'DockerOperationError';\n }\n}\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction dockerCommandCwd(root: string): string {\n const candidates = [os.homedir(), os.tmpdir(), path.parse(path.resolve(root)).root];\n return candidates.find((candidate) => !isWithinRoot(root, candidate)) ?? os.homedir();\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n const combined = current + chunk;\n return combined.length <= limit ? combined : combined.slice(-limit);\n}\n\nexport const runDockerCommand: DockerCommandRunner = async (root, args, options = {}) => {\n const dockerExecutable = await resolveExecutableOutsideRoot(root, 'docker');\n if (dockerExecutable === null) {\n return { code: null, stdout: '', stderr: '', error: 'not-found' };\n }\n\n const timeoutMs = options.timeoutMs ?? 5000;\n const outputLimit = options.outputLimit ?? COMMAND_OUTPUT_LIMIT;\n\n return await new Promise((resolve) => {\n const child = spawn(dockerExecutable, args, {\n cwd: dockerCommandCwd(root),\n windowsHide: true\n });\n let settled = false;\n let stdout = '';\n let stderr = '';\n\n const finish = (result: DockerCommandResult) => {\n if (settled) {\n return;\n }\n settled = true;\n clearTimeout(timeout);\n resolve(result);\n };\n\n const timeout = setTimeout(() => {\n child.kill();\n finish({ code: null, stdout, stderr, error: 'timeout' });\n }, timeoutMs);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n stdout = appendBounded(stdout, chunk.toString(), outputLimit);\n });\n child.stderr?.on('data', (chunk: Buffer) => {\n stderr = appendBounded(stderr, chunk.toString(), outputLimit);\n });\n child.on('error', () => {\n finish({ code: null, stdout, stderr, error: 'spawn' });\n });\n child.on('close', (code) => {\n finish({ code, stdout, stderr, error: null });\n });\n });\n};\n\nasync function findComposeFiles(root: string): Promise<string[]> {\n const resolvedRoot = await fs.realpath(root).catch(() => path.resolve(root));\n const matches: string[] = [];\n\n for (const file of COMPOSE_FILES) {\n const candidate = path.join(root, file);\n try {\n const [stat, realCandidate] = await Promise.all([fs.stat(candidate), fs.realpath(candidate)]);\n if (stat.isFile() && isWithinRoot(resolvedRoot, realCandidate)) {\n matches.push(realCandidate);\n }\n } catch {\n // Continue through the supported Compose filenames.\n }\n }\n\n return matches;\n}\n\nasync function serviceNamesFromFiles(composeFiles: string[]): Promise<string[]> {\n const names = new Set<string>();\n\n for (const composeFile of composeFiles) {\n try {\n const parsed = parseYaml(await fs.readFile(composeFile, 'utf8')) as unknown;\n if (\n typeof parsed !== 'object' ||\n parsed === null ||\n !('services' in parsed) ||\n typeof parsed.services !== 'object' ||\n parsed.services === null ||\n Array.isArray(parsed.services)\n ) {\n continue;\n }\n\n for (const name of Object.keys(parsed.services)) {\n if (name.length > 0) {\n names.add(name);\n }\n }\n } catch {\n // Malformed files remain visible as Compose files, but expose no actions.\n }\n }\n\n return Array.from(names);\n}\n\nfunction composeArgs(root: string, composeFiles: string[], args: string[]): string[] {\n return [\n 'compose',\n ...composeFiles.flatMap((composeFile) => ['-f', composeFile]),\n '--project-directory',\n root,\n ...args\n ];\n}\n\nfunction cleanMessage(value: string): string {\n return value.replace(ANSI_CSI_SEQUENCE, '').trim().slice(-1000);\n}\n\nfunction resultMessage(result: DockerCommandResult): string {\n return cleanMessage(result.stderr || result.stdout);\n}\n\nfunction daemonStatus(\n result: DockerCommandResult,\n platform: NodeJS.Platform\n): {\n status: DockerDaemonStatus;\n running: boolean;\n message: string | null;\n} {\n if (result.error === 'not-found') {\n return {\n status: 'not-installed',\n running: false,\n message: 'Docker CLI was not found. Install Docker and refresh this page.'\n };\n }\n\n if (result.code === 0) {\n return { status: 'running', running: true, message: null };\n }\n\n if (platform === 'win32' || platform === 'darwin') {\n return {\n status: 'stopped',\n running: false,\n message:\n 'Docker is installed, but its engine is not responding. Start Docker Desktop and refresh.'\n };\n }\n\n const detail = resultMessage(result);\n return {\n status: result.error === 'timeout' ? 'unknown' : 'stopped',\n running: false,\n message: detail\n ? `Docker is installed, but its daemon is not responding: ${detail}`\n : 'Docker is installed, but its daemon is not responding. Start Docker and refresh.'\n };\n}\n\nfunction exitCodeFromRow(record: Record<string, unknown>): number | null {\n if (typeof record.ExitCode === 'number') {\n return record.ExitCode;\n }\n if (typeof record.ExitCode === 'string' && /^\\d+$/.test(record.ExitCode)) {\n return Number(record.ExitCode);\n }\n if (typeof record.Status === 'string') {\n const match = /\\bExited\\s+\\((\\d+)\\)/i.exec(record.Status);\n if (match?.[1]) {\n return Number(match[1]);\n }\n }\n return null;\n}\n\nfunction serviceStatusFromRow(record: Record<string, unknown>): DockerServiceStatus {\n const state = typeof record.State === 'string' ? record.State.toLowerCase() : '';\n const exitCode = exitCodeFromRow(record);\n\n if (state === 'running') {\n return 'running';\n }\n if (exitCode !== null && exitCode > 0) {\n return 'error';\n }\n if (state === 'created' || state === 'exited' || state === 'stopped') {\n return 'stopped';\n }\n if (state === 'dead' || state === 'restarting' || state === 'paused') {\n return 'error';\n }\n return 'unknown';\n}\n\nfunction addComposeStatusRow(statuses: Map<string, DockerServiceInfo>, row: unknown): void {\n if (typeof row !== 'object' || row === null) {\n return;\n }\n\n const record = row as Record<string, unknown>;\n if (typeof record.Service !== 'string') {\n return;\n }\n\n const detail =\n typeof record.Status === 'string' && record.Status.trim()\n ? record.Status.trim()\n : typeof record.State === 'string' && record.State.trim()\n ? record.State.trim()\n : null;\n\n statuses.set(record.Service, {\n name: record.Service,\n status: serviceStatusFromRow(record),\n statusDetail: detail,\n containerId: typeof record.ID === 'string' && record.ID.length > 0 ? record.ID : null\n });\n}\n\nfunction parseComposePs(output: string): Map<string, DockerServiceInfo> {\n const statuses = new Map<string, DockerServiceInfo>();\n const compactOutput = output.trim();\n if (!compactOutput) {\n return statuses;\n }\n\n try {\n const parsed = JSON.parse(compactOutput) as unknown;\n for (const row of Array.isArray(parsed) ? parsed : [parsed]) {\n addComposeStatusRow(statuses, row);\n }\n return statuses;\n } catch {\n // Older Compose builds can emit one JSON object per line.\n }\n\n for (const line of compactOutput.split(/\\r?\\n/)) {\n try {\n addComposeStatusRow(statuses, JSON.parse(line) as unknown);\n } catch {\n return new Map();\n }\n }\n\n return statuses;\n}\n\nfunction unknownServices(serviceNames: string[]): DockerServiceInfo[] {\n return serviceNames.map((name) => ({\n name,\n status: 'unknown',\n statusDetail: null,\n containerId: null\n }));\n}\n\nfunction commandFailureMessage(action: string, result: DockerCommandResult): string {\n const detail = resultMessage(result);\n return detail ? `Docker Compose ${action} failed: ${detail}` : `Docker Compose ${action} failed.`;\n}\n\nexport class DockerComposeController implements DockerController {\n private readonly runner: DockerCommandRunner;\n private readonly platform: NodeJS.Platform;\n\n constructor(\n private readonly root: string,\n options: {\n runner?: DockerCommandRunner;\n platform?: NodeJS.Platform;\n } = {}\n ) {\n this.runner = options.runner ?? runDockerCommand;\n this.platform = options.platform ?? process.platform;\n }\n\n private async definition(): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n } | null> {\n const composeFiles = await findComposeFiles(this.root);\n if (composeFiles.length === 0) {\n return null;\n }\n return {\n composeFiles,\n serviceNames: await serviceNamesFromFiles(composeFiles)\n };\n }\n\n private async requireService(service: string): Promise<{\n composeFiles: string[];\n serviceNames: string[];\n }> {\n const definition = await this.definition();\n if (definition === null) {\n throw new DockerOperationError('compose-not-found', 'No Docker Compose file was found.');\n }\n if (!definition.serviceNames.includes(service)) {\n throw new DockerOperationError(\n 'service-not-found',\n `Docker Compose service \"${service}\" was not found.`\n );\n }\n return definition;\n }\n\n private async requireDaemon(): Promise<void> {\n const result = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(result, this.platform);\n if (daemon.status === 'not-installed') {\n throw new DockerOperationError('docker-not-installed', daemon.message ?? 'Docker not found.');\n }\n if (!daemon.running) {\n throw new DockerOperationError(\n 'docker-not-running',\n daemon.message ?? 'Docker is not running.'\n );\n }\n }\n\n async inspect(): Promise<DockerInfo | null> {\n const definition = await this.definition();\n if (definition === null) {\n return null;\n }\n\n const infoResult = await this.runner(this.root, ['info'], { timeoutMs: 5000 });\n const daemon = daemonStatus(infoResult, this.platform);\n if (!daemon.running) {\n return {\n composeFiles: definition.composeFiles,\n services: unknownServices(definition.serviceNames),\n dockerRunning: false,\n daemonStatus: daemon.status,\n message: daemon.message\n };\n }\n\n const ps = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, ['ps', '--all', '--format', 'json']),\n { timeoutMs: 8000 }\n );\n if (ps.code !== 0 || ps.error !== null) {\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map((name) => ({\n name,\n status: 'error',\n statusDetail: null,\n containerId: null\n })),\n dockerRunning: true,\n daemonStatus: 'running',\n message: commandFailureMessage('status check', ps)\n };\n }\n\n const statuses = parseComposePs(ps.stdout);\n return {\n composeFiles: definition.composeFiles,\n services: definition.serviceNames.map(\n (name) =>\n statuses.get(name) ?? {\n name,\n status: 'stopped',\n statusDetail: null,\n containerId: null\n }\n ),\n dockerRunning: true,\n daemonStatus: 'running',\n message: null\n };\n }\n\n private async action(service: string, action: 'start' | 'stop'): Promise<DockerActionResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const composeCommand =\n action === 'start' ? ['up', '-d', '--', service] : ['stop', '--', service];\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, composeCommand),\n { timeoutMs: 60_000 }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage(action, result));\n }\n return {\n service,\n action,\n output: cleanMessage(result.stdout || result.stderr)\n };\n }\n\n async start(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'start');\n }\n\n async stop(service: string): Promise<DockerActionResult> {\n return await this.action(service, 'stop');\n }\n\n async logs(service: string): Promise<DockerLogsResult> {\n const definition = await this.requireService(service);\n await this.requireDaemon();\n const result = await this.runner(\n this.root,\n composeArgs(this.root, definition.composeFiles, [\n 'logs',\n '--no-color',\n '--tail',\n '200',\n '--',\n service\n ]),\n { timeoutMs: 15_000, outputLimit: COMMAND_OUTPUT_LIMIT }\n );\n if (result.code !== 0 || result.error !== null) {\n throw new DockerOperationError('command-failed', commandFailureMessage('logs', result));\n }\n return {\n service,\n logs: appendBounded('', `${result.stdout}${result.stderr}`, COMMAND_OUTPUT_LIMIT)\n };\n }\n}\n","import { constants } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction pathEntries(pathValue: string): string[] {\n return pathValue\n .split(path.delimiter)\n .map((entry) => entry.trim().replace(/^\"|\"$/g, ''))\n .filter((entry) => entry.length > 0);\n}\n\nfunction hasPathSeparator(command: string): boolean {\n return command.includes('/') || command.includes('\\\\');\n}\n\nfunction executableNames(command: string): string[] {\n if (process.platform !== 'win32' || path.extname(command)) {\n return [command];\n }\n\n const extensions = (process.env.PATHEXT ?? '.COM;.EXE;.BAT;.CMD')\n .split(';')\n .map((extension) => extension.trim().toLowerCase())\n .filter(Boolean);\n return extensions.map((extension) => `${command}${extension}`);\n}\n\nasync function executableOutsideRoot(root: string, candidate: string): Promise<string | null> {\n if (isWithinRoot(root, candidate)) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n if (isWithinRoot(realRoot, realCandidate)) {\n return null;\n }\n\n await fs.access(realCandidate, constants.X_OK);\n return realCandidate;\n } catch {\n return null;\n }\n}\n\nexport async function resolveExecutableOutsideRoot(\n root: string,\n command: string\n): Promise<string | null> {\n if (path.isAbsolute(command) || hasPathSeparator(command)) {\n return await executableOutsideRoot(root, path.resolve(command));\n }\n\n for (const entry of pathEntries(process.env.PATH ?? '')) {\n const directory = path.resolve(entry);\n if (isWithinRoot(root, directory)) {\n continue;\n }\n\n for (const executableName of executableNames(command)) {\n const executable = await executableOutsideRoot(root, path.join(directory, executableName));\n if (executable !== null) {\n return executable;\n }\n }\n }\n\n return null;\n}\n","import { DockerComposeController } from '../docker/compose.js';\nimport type { DockerInfo } from '../types.js';\n\nexport async function detectDocker(root: string): Promise<DockerInfo | null> {\n return await new DockerComposeController(root).inspect();\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { DevSurfaceConfig, EnvInfo } from '../types.js';\n\ninterface ParsedEnv {\n keys: string[];\n emptyKeys: string[];\n}\n\nasync function readIfPresent(filePath: string): Promise<string | null> {\n try {\n return await fs.readFile(filePath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction resolveInsideRoot(root: string, configuredPath: string): string | null {\n const resolvedRoot = path.resolve(root);\n const resolvedPath = path.resolve(resolvedRoot, configuredPath);\n const relative = path.relative(resolvedRoot, resolvedPath);\n const insideRoot = relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? resolvedPath : null;\n}\n\nasync function resolveExistingInsideRoot(\n root: string,\n configuredPath: string\n): Promise<string | null> {\n const candidate = resolveInsideRoot(root, configuredPath);\n if (candidate === null) {\n return null;\n }\n\n try {\n const [realRoot, realCandidate] = await Promise.all([\n fs.realpath(root),\n fs.realpath(candidate)\n ]);\n const relative = path.relative(realRoot, realCandidate);\n const insideRoot =\n relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n return insideRoot ? candidate : null;\n } catch {\n return null;\n }\n}\n\nexport function parseEnvKeys(content: string): ParsedEnv {\n const keys: string[] = [];\n const emptyKeys: string[] = [];\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = rawLine.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const normalized = line.startsWith('export ') ? line.slice('export '.length).trim() : line;\n const separator = normalized.indexOf('=');\n if (separator <= 0) {\n continue;\n }\n\n const key = normalized.slice(0, separator).trim();\n const value = normalized.slice(separator + 1).trim();\n if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n keys.push(key);\n if (value.length === 0 || value === '\"\"' || value === \"''\") {\n emptyKeys.push(key);\n }\n }\n }\n\n return { keys: Array.from(new Set(keys)), emptyKeys: Array.from(new Set(emptyKeys)) };\n}\n\nexport async function detectEnv(\n root: string,\n config?: DevSurfaceConfig | null\n): Promise<EnvInfo | null> {\n const exampleName = config?.env?.example ?? '.env.example';\n const localName = config?.env?.local ?? '.env';\n const [examplePath, localPath] = await Promise.all([\n resolveExistingInsideRoot(root, exampleName),\n resolveExistingInsideRoot(root, localName)\n ]);\n const [exampleContent, localContent] = await Promise.all([\n examplePath === null ? null : readIfPresent(examplePath),\n localPath === null ? null : readIfPresent(localPath)\n ]);\n\n if (exampleContent === null && localContent === null) {\n return null;\n }\n\n const example =\n exampleContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(exampleContent);\n const local = localContent === null ? { keys: [], emptyKeys: [] } : parseEnvKeys(localContent);\n const localKeySet = new Set(local.keys);\n const localEmptySet = new Set(local.emptyKeys);\n const missingKeys = example.keys.filter((key) => !localKeySet.has(key));\n const emptyKeys = local.keys.filter((key) => localEmptySet.has(key));\n\n return {\n examplePath: exampleContent === null ? null : examplePath,\n localPath: localContent === null ? null : localPath,\n hasExample: exampleContent !== null,\n hasLocal: localContent !== null,\n exampleKeys: example.keys,\n localKeys: local.keys,\n missingKeys,\n emptyKeys,\n keys: example.keys.map((key) => ({\n key,\n present: localKeySet.has(key),\n empty: localEmptySet.has(key)\n }))\n };\n}\n","import type { FrameworkInfo, PackageJsonInfo } from '../types.js';\n\nconst frameworkPackages: Array<{ packageName: string; label: string }> = [\n { packageName: 'next', label: 'Next.js' },\n { packageName: 'vite', label: 'Vite' },\n { packageName: 'express', label: 'Express' },\n { packageName: 'fastify', label: 'Fastify' },\n { packageName: '@nestjs/core', label: 'NestJS' },\n { packageName: '@remix-run/react', label: 'Remix' },\n { packageName: 'prisma', label: 'Prisma' }\n];\n\nexport function detectFramework(packageJson: PackageJsonInfo | null): FrameworkInfo | null {\n if (packageJson === null) {\n return null;\n }\n\n const dependencies = {\n ...packageJson.data.dependencies,\n ...packageJson.data.devDependencies,\n ...packageJson.data.optionalDependencies,\n ...packageJson.data.peerDependencies\n };\n\n const detected = frameworkPackages\n .filter((framework) => dependencies[framework.packageName] !== undefined)\n .map((framework) => framework.label);\n\n if (detected.length === 0) {\n return {\n type: 'Node.js',\n detected: ['Node.js']\n };\n }\n\n return {\n type: ['Node.js', ...detected].join(' / '),\n detected\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { GitInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const resolvedRoot = path.resolve(root);\n const resolvedTarget = path.resolve(target);\n const relative = path.relative(resolvedRoot, resolvedTarget);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function resolveGitDirectory(root: string): Promise<string | null> {\n const gitPath = path.join(root, '.git');\n\n try {\n const stat = await fs.stat(gitPath);\n if (stat.isDirectory()) {\n return gitPath;\n }\n\n if (stat.isFile()) {\n const content = await fs.readFile(gitPath, 'utf8');\n const match = content.match(/^gitdir:\\s*(.+)\\s*$/m);\n if (match) {\n const gitDir = match[1].trim();\n const resolvedGitDir = path.isAbsolute(gitDir)\n ? path.resolve(gitDir)\n : path.resolve(root, gitDir);\n if (!isWithinRoot(root, resolvedGitDir)) {\n return null;\n }\n\n const [realRoot, realGitDir] = await Promise.all([\n fs.realpath(root),\n fs.realpath(resolvedGitDir)\n ]);\n return isWithinRoot(realRoot, realGitDir) ? resolvedGitDir : null;\n }\n }\n } catch {\n return null;\n }\n\n return null;\n}\n\nexport async function detectGit(root: string): Promise<GitInfo | null> {\n const gitRoot = await resolveGitDirectory(root);\n if (gitRoot === null) {\n return null;\n }\n\n try {\n const head = await fs.readFile(path.join(gitRoot, 'HEAD'), 'utf8');\n const refMatch = head.match(/^ref:\\s+refs\\/heads\\/(.+)\\s*$/);\n return {\n root: gitRoot,\n branch: refMatch ? refMatch[1] : head.trim().slice(0, 12)\n };\n } catch {\n return {\n root: gitRoot,\n branch: null\n };\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo, ProjectLanguage, ProjectLanguageInfo } from '../types.js';\n\nconst languageFiles: Array<{ language: ProjectLanguage; candidates: string[] }> = [\n { language: 'python', candidates: ['requirements.txt', 'pyproject.toml', 'Pipfile'] },\n { language: 'go', candidates: ['go.mod'] },\n { language: 'java', candidates: ['pom.xml', 'build.gradle', 'build.gradle.kts'] }\n];\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nasync function safeFile(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, stat, realPath] = await Promise.all([\n fs.realpath(root),\n fs.stat(filePath),\n fs.realpath(filePath)\n ]);\n if (stat.isFile() && isWithinRoot(realRoot, realPath)) {\n return realPath;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nexport async function detectProjectLanguage(\n root: string,\n packageJson: PackageJsonInfo | null\n): Promise<ProjectLanguageInfo> {\n const detected: ProjectLanguage[] = [];\n const files: string[] = [];\n\n if (packageJson !== null) {\n detected.push('node');\n files.push(packageJson.path);\n }\n\n for (const definition of languageFiles) {\n let found = false;\n for (const candidate of definition.candidates) {\n const file = await safeFile(root, candidate);\n if (file !== null) {\n found = true;\n files.push(file);\n }\n }\n if (found) {\n detected.push(definition.language);\n }\n }\n\n return {\n primary: detected[0] ?? null,\n detected,\n files\n };\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageManager } from '../types.js';\n\nconst lockFiles: Array<{ file: string; manager: PackageManager }> = [\n { file: 'pnpm-lock.yaml', manager: 'pnpm' },\n { file: 'yarn.lock', manager: 'yarn' },\n { file: 'bun.lockb', manager: 'bun' },\n { file: 'bun.lock', manager: 'bun' },\n { file: 'package-lock.json', manager: 'npm' }\n];\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(root: string): Promise<PackageManager | null> {\n for (const lockFile of lockFiles) {\n if (await exists(path.join(root, lockFile.file))) {\n return lockFile.manager;\n }\n }\n\n return null;\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { PackageJsonInfo } from '../types.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function readPackageJson(root: string): Promise<PackageJsonInfo | null> {\n const packageJsonPath = path.join(root, 'package.json');\n\n try {\n const [realRoot, realPackageJsonPath] = await Promise.all([\n fs.realpath(root),\n fs.realpath(packageJsonPath)\n ]);\n if (!isWithinRoot(realRoot, realPackageJsonPath)) {\n return null;\n }\n\n const content = await fs.readFile(realPackageJsonPath, 'utf8');\n const data = JSON.parse(content) as PackageJsonInfo['data'];\n return { path: realPackageJsonPath, data };\n } catch {\n return null;\n }\n}\n","import net from 'node:net';\nimport type { FrameworkInfo, PortProbe } from '../types.js';\n\nexport const DEFAULT_PORTS = [3000, 5173];\nexport const MAX_PORT_PROBES = 64;\nexport const PORT_PROBE_CONCURRENCY = 16;\n\nfunction uniquePorts(ports: number[]): number[] {\n return Array.from(\n new Set(ports.filter((port) => Number.isInteger(port) && port > 0 && port < 65536))\n );\n}\n\nexport function inferPortsFromScripts(scripts: Record<string, string>): number[] {\n const ports: number[] = [];\n\n for (const command of Object.values(scripts)) {\n const patterns = [\n /(?:--port|-p)\\s+(\\d{2,5})/g,\n /\\bPORT=(\\d{2,5})\\b/g,\n /localhost:(\\d{2,5})/g,\n /127\\.0\\.0\\.1:(\\d{2,5})/g\n ];\n\n for (const pattern of patterns) {\n for (const match of command.matchAll(pattern)) {\n ports.push(Number(match[1]));\n }\n }\n }\n\n return uniquePorts(ports);\n}\n\nexport function defaultPortsForFramework(framework: FrameworkInfo | null): number[] {\n if (framework === null) {\n return [];\n }\n\n const ports: number[] = [];\n if (framework.detected.includes('Next.js') || framework.detected.includes('Express')) {\n ports.push(3000);\n }\n\n if (framework.detected.includes('Vite')) {\n ports.push(5173);\n }\n\n if (framework.detected.includes('Prisma')) {\n ports.push(5555);\n }\n\n return uniquePorts(ports);\n}\n\nexport async function probePort(port: number): Promise<PortProbe> {\n return await new Promise((resolve) => {\n const server = net.createServer();\n\n server.once('error', () => {\n resolve({ port, inUse: true });\n });\n\n server.once('listening', () => {\n server.close(() => {\n resolve({ port, inUse: false });\n });\n });\n\n server.listen(port, '127.0.0.1');\n });\n}\n\nexport async function detectPorts(ports: number[]): Promise<PortProbe[] | null> {\n const normalized = uniquePorts(ports).slice(0, MAX_PORT_PROBES);\n if (normalized.length === 0) {\n return null;\n }\n\n const results: PortProbe[] = [];\n let nextIndex = 0;\n\n async function worker(): Promise<void> {\n while (nextIndex < normalized.length) {\n const port = normalized[nextIndex];\n nextIndex += 1;\n results.push(await probePort(port));\n }\n }\n\n await Promise.all(\n Array.from({ length: Math.min(PORT_PROBE_CONCURRENCY, normalized.length) }, () => worker())\n );\n\n return results.sort(\n (left, right) => normalized.indexOf(left.port) - normalized.indexOf(right.port)\n );\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport type { FrameworkInfo, PackageJsonInfo, PresetInfo, ProjectLanguageInfo } from '../types.js';\n\ntype PresetDraft = Omit<PresetInfo, 'commands' | 'groups' | 'ports'> & {\n commands?: Record<string, string>;\n groups?: Record<string, string[]>;\n ports?: number[];\n};\n\nfunction dependencyNames(packageJson: PackageJsonInfo | null): Set<string> {\n const data = packageJson?.data;\n return new Set(\n Object.keys({\n ...data?.dependencies,\n ...data?.devDependencies,\n ...data?.optionalDependencies,\n ...data?.peerDependencies\n })\n );\n}\n\nfunction hasAnyDependency(dependencies: Set<string>, names: string[]): boolean {\n return names.some((name) => dependencies.has(name));\n}\n\nasync function readIfPresent(root: string, candidate: string): Promise<string | null> {\n const filePath = path.join(root, candidate);\n try {\n const [realRoot, realPath] = await Promise.all([fs.realpath(root), fs.realpath(filePath)]);\n const relative = path.relative(realRoot, realPath);\n if (relative.startsWith('..') || path.isAbsolute(relative)) {\n return null;\n }\n return await fs.readFile(realPath, 'utf8');\n } catch {\n return null;\n }\n}\n\nfunction completePreset(draft: PresetDraft): PresetInfo {\n return {\n name: draft.name,\n label: draft.label,\n commands: draft.commands ?? {},\n groups: draft.groups ?? {},\n ports: draft.ports ?? []\n };\n}\n\nfunction nodePresets(\n framework: FrameworkInfo | null,\n packageJson: PackageJsonInfo | null\n): PresetInfo[] {\n const detected = new Set(framework?.detected ?? []);\n const dependencies = dependencyNames(packageJson);\n const presets: PresetDraft[] = [];\n\n if (detected.has('Next.js')) {\n presets.push({\n name: 'next',\n label: 'Next.js',\n commands: {\n 'next:dev': 'next dev',\n 'next:build': 'next build',\n 'next:start': 'next start'\n },\n groups: {\n 'Next.js': ['next:dev', 'next:build', 'next:start']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Vite')) {\n presets.push({\n name: 'vite',\n label: 'Vite',\n commands: {\n 'vite:dev': 'vite --host 127.0.0.1',\n 'vite:build': 'vite build',\n 'vite:preview': 'vite preview --host 127.0.0.1'\n },\n groups: {\n Vite: ['vite:dev', 'vite:build', 'vite:preview']\n },\n ports: [5173, 4173]\n });\n }\n\n if (detected.has('NestJS')) {\n presets.push({\n name: 'nestjs',\n label: 'NestJS',\n commands: {\n 'nest:start': 'nest start --watch',\n 'nest:build': 'nest build'\n },\n groups: {\n NestJS: ['nest:start', 'nest:build']\n },\n ports: [3000]\n });\n }\n\n if (detected.has('Remix')) {\n presets.push({\n name: 'remix',\n label: 'Remix',\n commands: {\n 'remix:dev': 'remix vite:dev',\n 'remix:build': 'remix vite:build'\n },\n groups: {\n Remix: ['remix:dev', 'remix:build']\n },\n ports: [5173]\n });\n }\n\n if (detected.has('Express') || detected.has('Fastify')) {\n presets.push({\n name: detected.has('Fastify') ? 'fastify' : 'express',\n label: detected.has('Fastify') ? 'Fastify' : 'Express',\n ports: [3000]\n });\n }\n\n if (detected.has('Prisma') || hasAnyDependency(dependencies, ['prisma', '@prisma/client'])) {\n presets.push({\n name: 'prisma',\n label: 'Prisma',\n commands: {\n 'prisma:migrate': 'prisma migrate dev',\n 'prisma:studio': 'prisma studio'\n },\n groups: {\n Database: ['prisma:migrate', 'prisma:studio']\n },\n ports: [5555]\n });\n }\n\n return presets.map(completePreset);\n}\n\nasync function pythonPresets(root: string, language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('python')) {\n return [];\n }\n\n const [requirements, pyproject, pipfile] = await Promise.all([\n readIfPresent(root, 'requirements.txt'),\n readIfPresent(root, 'pyproject.toml'),\n readIfPresent(root, 'Pipfile')\n ]);\n const manifest = [requirements, pyproject, pipfile].filter(Boolean).join('\\n').toLowerCase();\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n const ports: number[] = [];\n\n if (requirements !== null) {\n commands['python:install'] = 'python -m pip install -r requirements.txt';\n groups.Setup = ['python:install'];\n }\n\n if (manifest.includes('uvicorn') || manifest.includes('fastapi')) {\n commands['python:dev'] = 'uvicorn main:app --reload --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'python:dev'];\n ports.push(8000);\n }\n\n if (manifest.includes('flask')) {\n commands['flask:dev'] = 'flask --app app run --host 127.0.0.1';\n groups.Python = [...(groups.Python ?? []), 'flask:dev'];\n ports.push(5000);\n }\n\n if (manifest.includes('django') || (await readIfPresent(root, 'manage.py')) !== null) {\n commands['django:dev'] = 'python manage.py runserver 127.0.0.1:8000';\n commands['django:migrate'] = 'python manage.py migrate';\n groups.Python = [...(groups.Python ?? []), 'django:dev', 'django:migrate'];\n ports.push(8000);\n }\n\n return [\n completePreset({\n name: 'python',\n label: 'Python',\n commands,\n groups,\n ports\n })\n ];\n}\n\nfunction goPresets(language: ProjectLanguageInfo): PresetInfo[] {\n if (!language.detected.includes('go')) {\n return [];\n }\n\n return [\n completePreset({\n name: 'go',\n label: 'Go',\n commands: {\n 'go:run': 'go run .',\n 'go:build': 'go build ./...',\n 'go:test': 'go test ./...'\n },\n groups: {\n Go: ['go:run', 'go:build', 'go:test']\n }\n })\n ];\n}\n\nasync function javaPresets(language: ProjectLanguageInfo): Promise<PresetInfo[]> {\n if (!language.detected.includes('java')) {\n return [];\n }\n\n const hasMaven = language.files.some((file) => path.basename(file) === 'pom.xml');\n const hasGradle = language.files.some((file) => path.basename(file).startsWith('build.gradle'));\n const commands: Record<string, string> = {};\n const groups: Record<string, string[]> = {};\n\n if (hasMaven) {\n commands['maven:test'] = 'mvn test';\n commands['maven:package'] = 'mvn package';\n groups.Maven = ['maven:test', 'maven:package'];\n }\n\n if (hasGradle) {\n commands['gradle:test'] = 'gradle test';\n commands['gradle:build'] = 'gradle build';\n groups.Gradle = ['gradle:test', 'gradle:build'];\n }\n\n return [completePreset({ name: 'java', label: 'Java', commands, groups })];\n}\n\nexport async function detectPresets(options: {\n root: string;\n packageJson: PackageJsonInfo | null;\n framework: FrameworkInfo | null;\n language: ProjectLanguageInfo;\n}): Promise<PresetInfo[]> {\n return [\n ...nodePresets(options.framework, options.packageJson),\n ...(await pythonPresets(options.root, options.language)),\n ...goPresets(options.language),\n ...(await javaPresets(options.language))\n ].filter(\n (preset) =>\n Object.keys(preset.commands).length > 0 ||\n Object.keys(preset.groups).length > 0 ||\n preset.ports.length > 0\n );\n}\n\nexport function mergePresetCommands(presets: PresetInfo[]): Record<string, string> {\n return Object.assign({}, ...presets.map((preset) => preset.commands));\n}\n\nexport function mergePresetGroups(presets: PresetInfo[]): Record<string, string[]> {\n const groups: Record<string, string[]> = {};\n for (const preset of presets) {\n for (const [group, commands] of Object.entries(preset.groups)) {\n groups[group] = [...(groups[group] ?? []), ...commands];\n }\n }\n return groups;\n}\n","import type { PackageJsonInfo } from '../types.js';\n\nexport function extractScripts(packageJson: PackageJsonInfo | null): Record<string, string> | null {\n if (\n !packageJson?.data.scripts ||\n typeof packageJson.data.scripts !== 'object' ||\n Array.isArray(packageJson.data.scripts)\n ) {\n return null;\n }\n\n return Object.fromEntries(\n Object.entries(packageJson.data.scripts).filter((entry): entry is [string, string] => {\n const [, command] = entry;\n return typeof command === 'string';\n })\n );\n}\n","const ESC = String.fromCharCode(27);\nconst BEL = String.fromCharCode(7);\n\nconst OSC_SEQUENCE = new RegExp(`${ESC}\\\\][\\\\s\\\\S]*?(?:${BEL}|${ESC}\\\\\\\\)`, 'g');\nconst CSI_SEQUENCE = new RegExp(`${ESC}\\\\[[0-?]*[ -/]*[@-~]`, 'g');\nconst ESCAPE_SEQUENCE = new RegExp(`${ESC}[@-Z\\\\\\\\-_]`, 'g');\n\nfunction stripControlCharacters(value: string): string {\n let result = '';\n for (const character of value) {\n const code = character.charCodeAt(0);\n if ((code > 31 && code < 127) || code > 159) {\n result += character;\n }\n }\n return result;\n}\n\nexport function safeDisplayText(value: unknown): string {\n return stripControlCharacters(\n String(value).replace(OSC_SEQUENCE, '').replace(CSI_SEQUENCE, '').replace(ESCAPE_SEQUENCE, '')\n );\n}\n\nexport function safeDisplayList(values: string[]): string {\n return values.length > 0 ? values.map((value) => safeDisplayText(value)).join(', ') : 'none';\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport pc from 'picocolors';\nimport { CONFIG_FILE_NAME, defaultConfig } from '../../core/config/defaults.js';\n\nexport async function initCommand(cwd = process.cwd()): Promise<void> {\n const configPath = path.join(cwd, CONFIG_FILE_NAME);\n\n try {\n await fs.access(configPath);\n console.log(pc.yellow(`${CONFIG_FILE_NAME} already exists.`));\n return;\n } catch {\n await fs.writeFile(configPath, `${JSON.stringify(defaultConfig, null, 2)}\\n`, 'utf8');\n console.log(pc.green(`Created ${CONFIG_FILE_NAME}.`));\n }\n}\n","import pc from 'picocolors';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { OnboardingStep } from '../../core/types.js';\nimport { safeTerminalText } from '../terminal.js';\n\nfunction statusGlyph(status: OnboardingStep['status']): string {\n if (status === 'done') {\n return pc.green('[x]');\n }\n\n if (status === 'todo') {\n return pc.yellow('[ ]');\n }\n\n return pc.cyan('[~]');\n}\n\nexport async function onboardCommand(cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n const warnings = await runDoctor(cwd, scan);\n const plan = buildOnboardingPlan(scan, warnings);\n\n console.log(pc.bold(`Onboarding ${safeTerminalText(scan.projectName)}`));\n console.log(`${plan.readiness}% ready — ${safeTerminalText(plan.summary)}`);\n console.log('');\n\n if (plan.steps.length === 0) {\n console.log(pc.green('No onboarding steps detected.'));\n return;\n }\n\n for (const step of plan.steps) {\n console.log(`${statusGlyph(step.status)} ${pc.bold(safeTerminalText(step.title))}`);\n console.log(` ${safeTerminalText(step.description)}`);\n if (step.action && step.status !== 'done') {\n console.log(pc.dim(` → ${safeTerminalText(step.action.label)}`));\n }\n }\n}\n","import { isSafeHttpUrl } from '../security/url.js';\nimport type {\n DoctorWarning,\n OnboardingAction,\n OnboardingPlan,\n OnboardingStep,\n ScanResult,\n SetupGuideStep\n} from '../types.js';\n\nfunction hasWarning(warnings: DoctorWarning[], id: string): boolean {\n return warnings.some((warning) => warning.id === id);\n}\n\n/**\n * Pick the command that starts the project's dev server, preferring a real\n * package script, then a configured/preset command named \"dev\".\n */\nfunction pickStartAction(scan: ScanResult): OnboardingAction | null {\n if (scan.scripts.dev !== undefined) {\n return { kind: 'run-script', label: 'Start dev server', target: 'dev' };\n }\n if (scan.scripts.start !== undefined) {\n return { kind: 'run-script', label: 'Start app', target: 'start' };\n }\n\n const configuredCommands = {\n ...scan.presetCommands,\n ...scan.config?.config.commands\n };\n for (const name of ['dev', 'start', 'serve']) {\n if (configuredCommands[name] !== undefined) {\n return { kind: 'run-command', label: `Run ${name}`, target: name };\n }\n }\n\n return null;\n}\n\nfunction dockerStep(scan: ScanResult): OnboardingStep | null {\n const docker = scan.docker;\n if (docker === null) {\n return null;\n }\n\n const runningServices = docker.services.filter((service) => service.status === 'running');\n const allRunning =\n docker.services.length > 0 && runningServices.length === docker.services.length;\n\n if (docker.daemonStatus !== 'running') {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.message ?? 'A Docker Compose file was found, but the Docker engine is not running.',\n status: 'manual',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n }\n\n if (docker.services.length === 0 || allRunning) {\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description:\n docker.services.length === 0\n ? 'Docker is running. No Compose services need to be started.'\n : 'All Docker Compose services are running.',\n status: 'done',\n blocking: false\n };\n }\n\n return {\n id: 'docker-start',\n title: 'Start Docker services',\n description: `${runningServices.length}/${docker.services.length} Compose services running. Start the rest in Services.`,\n status: 'todo',\n blocking: false,\n action: { kind: 'docker', label: 'Open Services' }\n };\n}\n\n/**\n * Build an ordered onboarding checklist from a scan result and its doctor\n * warnings. Each step is either already satisfied (`done`), resolvable with a\n * one-click action (`todo`), or needs the contributor to act outside DevSurface\n * (`manual`). Readiness reflects only the blocking steps so a project can reach\n * 100% once it is genuinely runnable.\n */\nexport function buildOnboardingPlan(scan: ScanResult, warnings: DoctorWarning[]): OnboardingPlan {\n const steps: OnboardingStep[] = [];\n const isNodeProject = scan.language.detected.includes('node');\n\n // 1. Install dependencies (Node projects only).\n if (isNodeProject && scan.packageJson !== null) {\n const needsInstall = hasWarning(warnings, 'missing-node-modules');\n steps.push({\n id: 'install-dependencies',\n title: 'Install dependencies',\n description: needsInstall\n ? 'node_modules is missing. Install dependencies before running scripts.'\n : 'Dependencies are installed.',\n status: needsInstall ? 'todo' : 'done',\n blocking: true,\n action: needsInstall ? { kind: 'install', label: 'Install' } : undefined\n });\n }\n\n // 2. Create the local .env file from the example.\n if (scan.env?.hasExample) {\n const missingLocal = !scan.env.hasLocal;\n steps.push({\n id: 'create-env',\n title: 'Create .env file',\n description: missingLocal\n ? '.env.example exists but the local .env file is missing.'\n : '.env is present.',\n status: missingLocal ? 'todo' : 'done',\n blocking: true,\n action: missingLocal ? { kind: 'env-copy', label: 'Copy .env' } : undefined\n });\n\n // 3. Fill required env values (only meaningful once .env exists).\n if (scan.env.hasLocal) {\n const unset = [...new Set([...scan.env.missingKeys, ...scan.env.emptyKeys])];\n steps.push({\n id: 'fill-env',\n title: 'Fill in environment values',\n description:\n unset.length > 0\n ? `Set values for: ${unset.join(', ')}. Values are intentionally hidden.`\n : 'All environment keys from the example are present.',\n status: unset.length > 0 ? 'manual' : 'done',\n blocking: true\n });\n }\n }\n\n // 4. Docker services.\n const docker = dockerStep(scan);\n if (docker !== null) {\n steps.push(docker);\n }\n\n // 5. Free conflicting ports (informational guidance).\n const portsInUse = scan.ports.filter((probe) => probe.inUse);\n if (portsInUse.length > 0) {\n steps.push({\n id: 'free-ports',\n title: 'Resolve port conflicts',\n description: `Already in use: ${portsInUse.map((probe) => probe.port).join(', ')}. Stop the conflicting process or change the port.`,\n status: 'manual',\n blocking: false\n });\n }\n\n // 6. Maintainer-authored setup guide steps (non-blocking guidance).\n const allCommands = { ...scan.presetCommands, ...(scan.config?.config.commands ?? {}) };\n for (const [index, entry] of (scan.config?.config.setupGuide ?? []).entries()) {\n if (typeof entry === 'string') {\n steps.push({\n id: `guide-${index}`,\n title: entry,\n description: 'From the project setup guide.',\n status: 'manual',\n blocking: false\n });\n } else {\n const step = entry as SetupGuideStep;\n let action: OnboardingAction | undefined;\n if (step.command !== undefined && step.command in allCommands) {\n action = { kind: 'run-command', label: 'Run', target: step.command };\n } else if (step.script !== undefined) {\n action = { kind: 'run-script', label: 'Run', target: step.script };\n }\n steps.push({\n id: `guide-${index}`,\n title: step.title,\n description: step.description ?? 'From the project setup guide.',\n status: action !== undefined ? 'todo' : 'manual',\n blocking: false,\n action\n });\n }\n }\n\n // 7. Project docs link.\n const docs = scan.config?.config.docs;\n if (typeof docs === 'string' && docs.length > 0 && isSafeHttpUrl(docs)) {\n steps.push({\n id: 'read-docs',\n title: 'Read the project docs',\n description: docs,\n status: 'manual',\n blocking: false,\n action: { kind: 'open-docs', label: 'Open docs', target: docs }\n });\n }\n\n // 8. Start the app (the goal — never blocking).\n const startAction = pickStartAction(scan);\n if (startAction !== null) {\n steps.push({\n id: 'start-app',\n title: 'Start the app',\n description: 'Run the development server once setup is complete.',\n status: 'todo',\n blocking: false,\n action: startAction\n });\n }\n\n const blocking = steps.filter((step) => step.blocking);\n const blockingDone = blocking.filter((step) => step.status === 'done');\n const readiness =\n blocking.length === 0 ? 100 : Math.round((blockingDone.length / blocking.length) * 100);\n const ready = readiness === 100;\n const remaining = blocking.length - blockingDone.length;\n const summary = ready\n ? 'Project is ready to run.'\n : `${remaining} setup step${remaining === 1 ? '' : 's'} remaining before the project is ready.`;\n\n return { steps, readiness, ready, summary };\n}\n","import pc from 'picocolors';\nimport {\n isDangerousCommand,\n runConfiguredCommandToTerminal,\n runPackageScriptToTerminal\n} from '../../core/process/runner.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nexport async function runCommand(script: string, cwd = process.cwd()): Promise<void> {\n const scan = await scanProject(cwd);\n\n if (scan.scripts[script] !== undefined) {\n const exitCode = await runPackageScriptToTerminal({\n cwd,\n packageManager: scan.packageManager,\n script\n });\n process.exitCode = exitCode;\n return;\n }\n\n const configuredCommand = scan.config?.config.commands?.[script] ?? scan.presetCommands[script];\n if (configuredCommand !== undefined) {\n if (isDangerousCommand(configuredCommand)) {\n console.error(pc.red(`Refusing to run dangerous command \"${safeTerminalText(script)}\".`));\n process.exitCode = 1;\n return;\n }\n\n const exitCode = await runConfiguredCommandToTerminal({\n cwd,\n command: configuredCommand\n });\n process.exitCode = exitCode;\n return;\n }\n\n const available = [\n ...Object.keys(scan.scripts),\n ...Object.keys(scan.config?.config.commands ?? {}),\n ...Object.keys(scan.presetCommands)\n ];\n const hint = available.length > 0 ? ` Available commands: ${safeTerminalList(available)}.` : '';\n console.error(pc.red(`Command \"${safeTerminalText(script)}\" was not found.${hint}`));\n process.exitCode = 1;\n}\n","import spawn from 'cross-spawn';\nimport type { PackageManager } from '../types.js';\nimport { isDangerousCommand } from '../security/dangerousCommand.js';\nimport { resolveExecutableOutsideRoot } from './executable.js';\n\nexport { isDangerousCommand };\n\nexport interface PackageRunCommand {\n command: string;\n args: string[];\n displayCommand: string;\n}\n\nexport function getPackageRunCommand(\n packageManager: PackageManager | null,\n script: string\n): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n const args = ['run', script];\n return {\n command: manager,\n args,\n displayCommand: `${manager} ${args.join(' ')}`\n };\n}\n\nexport async function resolvePackageRunCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<PackageRunCommand | null> {\n const runCommand = getPackageRunCommand(options.packageManager, options.script);\n const executable = await resolveExecutableOutsideRoot(options.cwd, runCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...runCommand,\n command: executable\n };\n}\n\nexport function getPackageInstallCommand(packageManager: PackageManager | null): PackageRunCommand {\n const manager = packageManager ?? 'npm';\n if (manager === 'npm') {\n return {\n command: manager,\n args: ['ci'],\n displayCommand: 'npm ci'\n };\n }\n\n if (manager === 'pnpm') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'pnpm install --frozen-lockfile'\n };\n }\n\n if (manager === 'yarn') {\n return {\n command: manager,\n args: ['install', '--frozen-lockfile'],\n displayCommand: 'yarn install --frozen-lockfile'\n };\n }\n\n return {\n command: manager,\n args: ['install'],\n displayCommand: 'bun install'\n };\n}\n\nexport async function resolvePackageInstallCommand(options: {\n cwd: string;\n packageManager: PackageManager | null;\n}): Promise<PackageRunCommand | null> {\n const installCommand = getPackageInstallCommand(options.packageManager);\n const executable = await resolveExecutableOutsideRoot(options.cwd, installCommand.command);\n if (executable === null) {\n return null;\n }\n\n return {\n ...installCommand,\n command: executable\n };\n}\n\nexport function splitCommandLine(command: string): string[] {\n const tokens: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n } else if (character === '\\\\' && quote === '\"') {\n const next = command[index + 1];\n if (next === '\"' || next === '\\\\') {\n index += 1;\n current += next ?? '';\n } else {\n current += character;\n }\n } else {\n current += character;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (/\\s/.test(character)) {\n if (current.length > 0) {\n tokens.push(current);\n current = '';\n }\n continue;\n }\n\n current += character;\n }\n\n if (current.length > 0) {\n tokens.push(current);\n }\n\n return tokens;\n}\n\nexport function containsShellMetacharacters(command: string): boolean {\n let quote: '\"' | \"'\" | null = null;\n\n for (let index = 0; index < command.length; index += 1) {\n const character = command[index] ?? '';\n if (quote !== null) {\n if (character === quote) {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\") {\n quote = character;\n continue;\n }\n\n if (character === '\\n' || character === '\\r') {\n return true;\n }\n\n if (';|&<>'.includes(character)) {\n return true;\n }\n\n if (character === '`') {\n return true;\n }\n\n if (character === '$' && (command[index + 1] === '(' || command[index + 1] === '{')) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function resolveConfiguredCommand(\n cwd: string,\n command: string\n): Promise<PackageRunCommand | null> {\n const trimmed = command.trim();\n if (trimmed.length === 0 || containsShellMetacharacters(trimmed)) {\n return null;\n }\n\n const tokens = splitCommandLine(trimmed);\n if (tokens.length === 0) {\n return null;\n }\n\n const [executableName, ...args] = tokens;\n const executable = await resolveExecutableOutsideRoot(cwd, executableName);\n if (executable === null) {\n return null;\n }\n\n return {\n command: executable,\n args,\n displayCommand: trimmed\n };\n}\n\nexport async function runPackageScriptToTerminal(options: {\n cwd: string;\n packageManager: PackageManager | null;\n script: string;\n}): Promise<number> {\n const runCommand = await resolvePackageRunCommand(options);\n if (runCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(runCommand.command, runCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n\nexport async function runConfiguredCommandToTerminal(options: {\n cwd: string;\n command: string;\n}): Promise<number> {\n const resolvedCommand = await resolveConfiguredCommand(options.cwd, options.command);\n if (resolvedCommand === null) {\n return 1;\n }\n\n return await new Promise((resolve) => {\n const child = spawn(resolvedCommand.command, resolvedCommand.args, {\n cwd: options.cwd,\n stdio: 'inherit',\n windowsHide: true\n });\n\n child.on('error', () => {\n resolve(1);\n });\n\n child.on('close', (code) => {\n resolve(code ?? 1);\n });\n });\n}\n","const DANGEROUS_COMMAND =\n /\\b(rm\\s+-rf|docker\\s+volume\\s+rm|drop\\s+database|prisma\\s+migrate\\s+reset|git\\s+clean\\s+-fdx?)\\b/i;\n\nexport function isDangerousCommand(command: string): boolean {\n return DANGEROUS_COMMAND.test(command);\n}\n","import pc from 'picocolors';\nimport type { ScanResult } from '../../core/types.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { safeTerminalList, safeTerminalText } from '../terminal.js';\n\nfunction formatList(values: string[]): string {\n return safeTerminalList(values);\n}\n\nexport function printScanResult(scan: ScanResult): void {\n console.log(pc.bold(`Project: ${safeTerminalText(scan.projectName)}`));\n console.log(`Language: ${formatList(scan.language.detected) || 'unknown'}`);\n console.log(`Type: ${safeTerminalText(scan.framework?.type ?? 'Unknown')}`);\n console.log(`Manager: ${safeTerminalText(scan.packageManager ?? 'unknown')}`);\n console.log(`Scripts: ${formatList(Object.keys(scan.scripts))}`);\n console.log(`Presets: ${formatList(scan.presets.map((preset) => preset.label)) || 'none'}`);\n console.log(`Git: ${safeTerminalText(scan.git?.branch ?? 'not detected')}`);\n console.log(`README: ${scan.readme.exists ? 'found' : 'missing'}`);\n console.log(`LICENSE: ${scan.license.exists ? 'found' : 'missing'}`);\n\n if (scan.env !== null) {\n console.log(`Env: ${scan.env.hasLocal ? '.env found' : '.env missing'}`);\n }\n\n if (scan.ports.length > 0) {\n const ports = scan.ports.map((port) => `${port.port}${port.inUse ? ' in use' : ' free'}`);\n console.log(`Ports: ${ports.join(', ')}`);\n }\n\n if (scan.docker !== null) {\n console.log(\n `Docker: compose found (${formatList(scan.docker.services.map((service) => service.name))})`\n );\n }\n}\n\nexport async function scanCommand(cwd = process.cwd()): Promise<void> {\n printScanResult(await scanProject(cwd));\n}\n","import pc from 'picocolors';\nimport open from 'open';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isHubRunning, registerWorkspaceRemotely, dashboardUrl } from '../hub/client.js';\nimport { printScanResult } from './scan.js';\n\nexport async function startCommand(options: {\n cwd?: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n const cwd = options.cwd ?? process.cwd();\n const port = options.port ?? 4567;\n\n console.log(pc.bold(`DevSurface v${DEV_SURFACE_VERSION}`));\n console.log('Scanning project...\\n');\n\n const scan = await scanProject(cwd);\n printScanResult(scan);\n\n const warnings = await runDoctor(cwd, scan);\n if (warnings.length > 0) {\n console.log('\\nWarnings:');\n for (const item of warnings) {\n const marker = item.severity === 'error' ? pc.red('!') : pc.yellow('!');\n console.log(` ${marker} ${item.title}`);\n }\n }\n\n if (await isHubRunning(port)) {\n console.log('\\nHub already running. Registering workspace...');\n const registered = await registerWorkspaceRemotely(cwd, port);\n if (registered) {\n const url = dashboardUrl(registered.id, port);\n console.log(`Workspace ${pc.cyan(registered.name)} attached.`);\n console.log(`Dashboard -> ${pc.cyan(url)}`);\n if (options.openBrowser !== false) {\n await open(url);\n }\n return;\n }\n console.log('Could not register with running hub. Starting a new instance...');\n }\n\n const server = await startHubServer({\n port,\n openBrowser: options.openBrowser,\n initialWorkspace: cwd\n });\n\n console.log(`\\nDashboard running at -> ${pc.cyan(server.url)}`);\n}\n","import process from 'node:process';\nimport {Buffer} from 'node:buffer';\nimport path from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {promisify} from 'node:util';\nimport childProcess from 'node:child_process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport {isWsl, powerShellPath} from 'wsl-utils';\nimport defineLazyProperty from 'define-lazy-prop';\nimport defaultBrowser from 'default-browser';\nimport isInsideContainer from 'is-inside-container';\n\nconst execFile = promisify(childProcess.execFile);\n\n// Path to included `xdg-open`.\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst localXdgOpenPath = path.join(__dirname, 'xdg-open');\n\nconst {platform, arch} = process;\n\n/**\nGet the default browser name in Windows from WSL.\n\n@returns {Promise<string>} Browser name.\n*/\nasync function getWindowsDefaultBrowserFromWsl() {\n\tconst powershellPath = await powerShellPath();\n\tconst rawCommand = String.raw`(Get-ItemProperty -Path \"HKCU:\\Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice\").ProgId`;\n\tconst encodedCommand = Buffer.from(rawCommand, 'utf16le').toString('base64');\n\n\tconst {stdout} = await execFile(\n\t\tpowershellPath,\n\t\t[\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t\tencodedCommand,\n\t\t],\n\t\t{encoding: 'utf8'},\n\t);\n\n\tconst progId = stdout.trim();\n\n\t// Map ProgId to browser IDs\n\tconst browserMap = {\n\t\tChromeHTML: 'com.google.chrome',\n\t\tBraveHTML: 'com.brave.Browser',\n\t\tMSEdgeHTM: 'com.microsoft.edge',\n\t\tFirefoxURL: 'org.mozilla.firefox',\n\t};\n\n\treturn browserMap[progId] ? {id: browserMap[progId]} : {};\n}\n\nconst pTryEach = async (array, mapper) => {\n\tlet latestError;\n\n\tfor (const item of array) {\n\t\ttry {\n\t\t\treturn await mapper(item); // eslint-disable-line no-await-in-loop\n\t\t} catch (error) {\n\t\t\tlatestError = error;\n\t\t}\n\t}\n\n\tthrow latestError;\n};\n\n// eslint-disable-next-line complexity\nconst baseOpen = async options => {\n\toptions = {\n\t\twait: false,\n\t\tbackground: false,\n\t\tnewInstance: false,\n\t\tallowNonzeroExitCode: false,\n\t\t...options,\n\t};\n\n\tif (Array.isArray(options.app)) {\n\t\treturn pTryEach(options.app, singleApp => baseOpen({\n\t\t\t...options,\n\t\t\tapp: singleApp,\n\t\t}));\n\t}\n\n\tlet {name: app, arguments: appArguments = []} = options.app ?? {};\n\tappArguments = [...appArguments];\n\n\tif (Array.isArray(app)) {\n\t\treturn pTryEach(app, appName => baseOpen({\n\t\t\t...options,\n\t\t\tapp: {\n\t\t\t\tname: appName,\n\t\t\t\targuments: appArguments,\n\t\t\t},\n\t\t}));\n\t}\n\n\tif (app === 'browser' || app === 'browserPrivate') {\n\t\t// IDs from default-browser for macOS and windows are the same\n\t\tconst ids = {\n\t\t\t'com.google.chrome': 'chrome',\n\t\t\t'google-chrome.desktop': 'chrome',\n\t\t\t'com.brave.Browser': 'brave',\n\t\t\t'org.mozilla.firefox': 'firefox',\n\t\t\t'firefox.desktop': 'firefox',\n\t\t\t'com.microsoft.msedge': 'edge',\n\t\t\t'com.microsoft.edge': 'edge',\n\t\t\t'com.microsoft.edgemac': 'edge',\n\t\t\t'microsoft-edge.desktop': 'edge',\n\t\t};\n\n\t\t// Incognito flags for each browser in `apps`.\n\t\tconst flags = {\n\t\t\tchrome: '--incognito',\n\t\t\tbrave: '--incognito',\n\t\t\tfirefox: '--private-window',\n\t\t\tedge: '--inPrivate',\n\t\t};\n\n\t\tconst browser = isWsl ? await getWindowsDefaultBrowserFromWsl() : await defaultBrowser();\n\t\tif (browser.id in ids) {\n\t\t\tconst browserName = ids[browser.id];\n\n\t\t\tif (app === 'browserPrivate') {\n\t\t\t\tappArguments.push(flags[browserName]);\n\t\t\t}\n\n\t\t\treturn baseOpen({\n\t\t\t\t...options,\n\t\t\t\tapp: {\n\t\t\t\t\tname: apps[browserName],\n\t\t\t\t\targuments: appArguments,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tthrow new Error(`${browser.name} is not supported as a default browser`);\n\t}\n\n\tlet command;\n\tconst cliArguments = [];\n\tconst childProcessOptions = {};\n\n\tif (platform === 'darwin') {\n\t\tcommand = 'open';\n\n\t\tif (options.wait) {\n\t\t\tcliArguments.push('--wait-apps');\n\t\t}\n\n\t\tif (options.background) {\n\t\t\tcliArguments.push('--background');\n\t\t}\n\n\t\tif (options.newInstance) {\n\t\t\tcliArguments.push('--new');\n\t\t}\n\n\t\tif (app) {\n\t\t\tcliArguments.push('-a', app);\n\t\t}\n\t} else if (platform === 'win32' || (isWsl && !isInsideContainer() && !app)) {\n\t\tcommand = await powerShellPath();\n\n\t\tcliArguments.push(\n\t\t\t'-NoProfile',\n\t\t\t'-NonInteractive',\n\t\t\t'-ExecutionPolicy',\n\t\t\t'Bypass',\n\t\t\t'-EncodedCommand',\n\t\t);\n\n\t\tif (!isWsl) {\n\t\t\tchildProcessOptions.windowsVerbatimArguments = true;\n\t\t}\n\n\t\tconst encodedArguments = ['Start'];\n\n\t\tif (options.wait) {\n\t\t\tencodedArguments.push('-Wait');\n\t\t}\n\n\t\tif (app) {\n\t\t\t// Double quote with double quotes to ensure the inner quotes are passed through.\n\t\t\t// Inner quotes are delimited for PowerShell interpretation with backticks.\n\t\t\tencodedArguments.push(`\"\\`\"${app}\\`\"\"`);\n\t\t\tif (options.target) {\n\t\t\t\tappArguments.push(options.target);\n\t\t\t}\n\t\t} else if (options.target) {\n\t\t\tencodedArguments.push(`\"${options.target}\"`);\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tappArguments = appArguments.map(argument => `\"\\`\"${argument}\\`\"\"`);\n\t\t\tencodedArguments.push('-ArgumentList', appArguments.join(','));\n\t\t}\n\n\t\t// Using Base64-encoded command, accepted by PowerShell, to allow special characters.\n\t\toptions.target = Buffer.from(encodedArguments.join(' '), 'utf16le').toString('base64');\n\t} else {\n\t\tif (app) {\n\t\t\tcommand = app;\n\t\t} else {\n\t\t\t// When bundled by Webpack, there's no actual package file path and no local `xdg-open`.\n\t\t\tconst isBundled = !__dirname || __dirname === '/';\n\n\t\t\t// Check if local `xdg-open` exists and is executable.\n\t\t\tlet exeLocalXdgOpen = false;\n\t\t\ttry {\n\t\t\t\tawait fs.access(localXdgOpenPath, fsConstants.X_OK);\n\t\t\t\texeLocalXdgOpen = true;\n\t\t\t} catch {}\n\n\t\t\tconst useSystemXdgOpen = process.versions.electron\n\t\t\t\t?? (platform === 'android' || isBundled || !exeLocalXdgOpen);\n\t\t\tcommand = useSystemXdgOpen ? 'xdg-open' : localXdgOpenPath;\n\t\t}\n\n\t\tif (appArguments.length > 0) {\n\t\t\tcliArguments.push(...appArguments);\n\t\t}\n\n\t\tif (!options.wait) {\n\t\t\t// `xdg-open` will block the process unless stdio is ignored\n\t\t\t// and it's detached from the parent even if it's unref'd.\n\t\t\tchildProcessOptions.stdio = 'ignore';\n\t\t\tchildProcessOptions.detached = true;\n\t\t}\n\t}\n\n\tif (platform === 'darwin' && appArguments.length > 0) {\n\t\tcliArguments.push('--args', ...appArguments);\n\t}\n\n\t// This has to come after `--args`.\n\tif (options.target) {\n\t\tcliArguments.push(options.target);\n\t}\n\n\tconst subprocess = childProcess.spawn(command, cliArguments, childProcessOptions);\n\n\tif (options.wait) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tsubprocess.once('error', reject);\n\n\t\t\tsubprocess.once('close', exitCode => {\n\t\t\t\tif (!options.allowNonzeroExitCode && exitCode > 0) {\n\t\t\t\t\treject(new Error(`Exited with code ${exitCode}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresolve(subprocess);\n\t\t\t});\n\t\t});\n\t}\n\n\tsubprocess.unref();\n\n\treturn subprocess;\n};\n\nconst open = (target, options) => {\n\tif (typeof target !== 'string') {\n\t\tthrow new TypeError('Expected a `target`');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\ttarget,\n\t});\n};\n\nexport const openApp = (name, options) => {\n\tif (typeof name !== 'string' && !Array.isArray(name)) {\n\t\tthrow new TypeError('Expected a valid `name`');\n\t}\n\n\tconst {arguments: appArguments = []} = options ?? {};\n\tif (appArguments !== undefined && appArguments !== null && !Array.isArray(appArguments)) {\n\t\tthrow new TypeError('Expected `appArguments` as Array type');\n\t}\n\n\treturn baseOpen({\n\t\t...options,\n\t\tapp: {\n\t\t\tname,\n\t\t\targuments: appArguments,\n\t\t},\n\t});\n};\n\nfunction detectArchBinary(binary) {\n\tif (typeof binary === 'string' || Array.isArray(binary)) {\n\t\treturn binary;\n\t}\n\n\tconst {[arch]: archBinary} = binary;\n\n\tif (!archBinary) {\n\t\tthrow new Error(`${arch} is not supported`);\n\t}\n\n\treturn archBinary;\n}\n\nfunction detectPlatformBinary({[platform]: platformBinary}, {wsl}) {\n\tif (wsl && isWsl) {\n\t\treturn detectArchBinary(wsl);\n\t}\n\n\tif (!platformBinary) {\n\t\tthrow new Error(`${platform} is not supported`);\n\t}\n\n\treturn detectArchBinary(platformBinary);\n}\n\nexport const apps = {};\n\ndefineLazyProperty(apps, 'chrome', () => detectPlatformBinary({\n\tdarwin: 'google chrome',\n\twin32: 'chrome',\n\tlinux: ['google-chrome', 'google-chrome-stable', 'chromium'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe',\n\t\tx64: ['/mnt/c/Program Files/Google/Chrome/Application/chrome.exe', '/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'brave', () => detectPlatformBinary({\n\tdarwin: 'brave browser',\n\twin32: 'brave',\n\tlinux: ['brave-browser', 'brave'],\n}, {\n\twsl: {\n\t\tia32: '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe',\n\t\tx64: ['/mnt/c/Program Files/BraveSoftware/Brave-Browser/Application/brave.exe', '/mnt/c/Program Files (x86)/BraveSoftware/Brave-Browser/Application/brave.exe'],\n\t},\n}));\n\ndefineLazyProperty(apps, 'firefox', () => detectPlatformBinary({\n\tdarwin: 'firefox',\n\twin32: String.raw`C:\\Program Files\\Mozilla Firefox\\firefox.exe`,\n\tlinux: 'firefox',\n}, {\n\twsl: '/mnt/c/Program Files/Mozilla Firefox/firefox.exe',\n}));\n\ndefineLazyProperty(apps, 'edge', () => detectPlatformBinary({\n\tdarwin: 'microsoft edge',\n\twin32: 'msedge',\n\tlinux: ['microsoft-edge', 'microsoft-edge-dev'],\n}, {\n\twsl: '/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe',\n}));\n\ndefineLazyProperty(apps, 'browser', () => 'browser');\n\ndefineLazyProperty(apps, 'browserPrivate', () => 'browserPrivate');\n\nexport default open;\n","import process from 'node:process';\nimport fs, {constants as fsConstants} from 'node:fs/promises';\nimport isWsl from 'is-wsl';\n\nexport const wslDrivesMountPoint = (() => {\n\t// Default value for \"root\" param\n\t// according to https://docs.microsoft.com/en-us/windows/wsl/wsl-config\n\tconst defaultMountPoint = '/mnt/';\n\n\tlet mountPoint;\n\n\treturn async function () {\n\t\tif (mountPoint) {\n\t\t\t// Return memoized mount point value\n\t\t\treturn mountPoint;\n\t\t}\n\n\t\tconst configFilePath = '/etc/wsl.conf';\n\n\t\tlet isConfigFileExists = false;\n\t\ttry {\n\t\t\tawait fs.access(configFilePath, fsConstants.F_OK);\n\t\t\tisConfigFileExists = true;\n\t\t} catch {}\n\n\t\tif (!isConfigFileExists) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tconst configContent = await fs.readFile(configFilePath, {encoding: 'utf8'});\n\t\tconst configMountPoint = /(?<!#.*)root\\s*=\\s*(?<mountPoint>.*)/g.exec(configContent);\n\n\t\tif (!configMountPoint) {\n\t\t\treturn defaultMountPoint;\n\t\t}\n\n\t\tmountPoint = configMountPoint.groups.mountPoint.trim();\n\t\tmountPoint = mountPoint.endsWith('/') ? mountPoint : `${mountPoint}/`;\n\n\t\treturn mountPoint;\n\t};\n})();\n\nexport const powerShellPathFromWsl = async () => {\n\tconst mountPoint = await wslDrivesMountPoint();\n\treturn `${mountPoint}c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe`;\n};\n\nexport const powerShellPath = async () => {\n\tif (isWsl) {\n\t\treturn powerShellPathFromWsl();\n\t}\n\n\treturn `${process.env.SYSTEMROOT || process.env.windir || String.raw`C:\\Windows`}\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\powershell.exe`;\n};\n\nexport {default as isWsl} from 'is-wsl';\n","import process from 'node:process';\nimport os from 'node:os';\nimport fs from 'node:fs';\nimport isInsideContainer from 'is-inside-container';\n\nconst isWsl = () => {\n\tif (process.platform !== 'linux') {\n\t\treturn false;\n\t}\n\n\tif (os.release().toLowerCase().includes('microsoft')) {\n\t\tif (isInsideContainer()) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tif (fs.readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft')) {\n\t\t\treturn !isInsideContainer();\n\t\t}\n\t} catch {}\n\n\t// Fallback for custom kernels: check WSL-specific paths.\n\tif (\n\t\tfs.existsSync('/proc/sys/fs/binfmt_misc/WSLInterop')\n\t\t|| fs.existsSync('/run/WSL')\n\t) {\n\t\treturn !isInsideContainer();\n\t}\n\n\treturn false;\n};\n\nexport default process.env.__IS_WSL_TEST__ ? isWsl : isWsl();\n","import fs from 'node:fs';\nimport isDocker from 'is-docker';\n\nlet cachedResult;\n\n// Podman detection\nconst hasContainerEnv = () => {\n\ttry {\n\t\tfs.statSync('/run/.containerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n\nexport default function isInsideContainer() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (cachedResult === undefined) {\n\t\tcachedResult = hasContainerEnv() || isDocker();\n\t}\n\n\treturn cachedResult;\n}\n","import fs from 'node:fs';\n\nlet isDockerCached;\n\nfunction hasDockerEnv() {\n\ttry {\n\t\tfs.statSync('/.dockerenv');\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction hasDockerCGroup() {\n\ttry {\n\t\treturn fs.readFileSync('/proc/self/cgroup', 'utf8').includes('docker');\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nexport default function isDocker() {\n\t// TODO: Use `??=` when targeting Node.js 16.\n\tif (isDockerCached === undefined) {\n\t\tisDockerCached = hasDockerEnv() || hasDockerCGroup();\n\t}\n\n\treturn isDockerCached;\n}\n","export default function defineLazyProperty(object, propertyName, valueGetter) {\n\tconst define = value => Object.defineProperty(object, propertyName, {value, enumerable: true, writable: true});\n\n\tObject.defineProperty(object, propertyName, {\n\t\tconfigurable: true,\n\t\tenumerable: true,\n\t\tget() {\n\t\t\tconst result = valueGetter();\n\t\t\tdefine(result);\n\t\t\treturn result;\n\t\t},\n\t\tset(value) {\n\t\t\tdefine(value);\n\t\t}\n\t});\n\n\treturn object;\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\nimport defaultBrowserId from 'default-browser-id';\nimport bundleName from 'bundle-name';\nimport windows from './windows.js';\n\nexport {_windowsBrowserProgIdMap} from './windows.js';\n\nconst execFileAsync = promisify(execFile);\n\n// Inlined: https://github.com/sindresorhus/titleize/blob/main/index.js\nconst titleize = string => string.toLowerCase().replaceAll(/(?:^|\\s|-)\\S/g, x => x.toUpperCase());\n\nexport default async function defaultBrowser() {\n\tif (process.platform === 'darwin') {\n\t\tconst id = await defaultBrowserId();\n\t\tconst name = await bundleName(id);\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'linux') {\n\t\tconst {stdout} = await execFileAsync('xdg-mime', ['query', 'default', 'x-scheme-handler/http']);\n\t\tconst id = stdout.trim();\n\t\tconst name = titleize(id.replace(/.desktop$/, '').replace('-', ' '));\n\t\treturn {name, id};\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn windows();\n\t}\n\n\tthrow new Error('Only macOS, Linux, and Windows are supported');\n}\n","import {promisify} from 'node:util';\nimport process from 'node:process';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport default async function defaultBrowserId() {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst {stdout} = await execFileAsync('defaults', ['read', 'com.apple.LaunchServices/com.apple.launchservices.secure', 'LSHandlers']);\n\n\t// `(?!-)` is to prevent matching `LSHandlerRoleAll = \"-\";`.\n\tconst match = /LSHandlerRoleAll = \"(?!-)(?<id>[^\"]+?)\";\\s+?LSHandlerURLScheme = (?:http|https);/.exec(stdout);\n\n\tconst browserId = match?.groups.id ?? 'com.apple.Safari';\n\n\t// Correct the case for Safari's bundle identifier\n\tif (browserId === 'com.apple.safari') {\n\t\treturn 'com.apple.Safari';\n\t}\n\n\treturn browserId;\n}\n","import process from 'node:process';\nimport {promisify} from 'node:util';\nimport {execFile, execFileSync} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\nexport async function runAppleScript(script, {humanReadableOutput = true, signal} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst execOptions = {};\n\tif (signal) {\n\t\texecOptions.signal = signal;\n\t}\n\n\tconst {stdout} = await execFileAsync('osascript', ['-e', script, outputArguments], execOptions);\n\treturn stdout.trim();\n}\n\nexport function runAppleScriptSync(script, {humanReadableOutput = true} = {}) {\n\tif (process.platform !== 'darwin') {\n\t\tthrow new Error('macOS only');\n\t}\n\n\tconst outputArguments = humanReadableOutput ? [] : ['-ss'];\n\n\tconst stdout = execFileSync('osascript', ['-e', script, ...outputArguments], {\n\t\tencoding: 'utf8',\n\t\tstdio: ['ignore', 'pipe', 'ignore'],\n\t\ttimeout: 500,\n\t});\n\n\treturn stdout.trim();\n}\n","import {runAppleScript} from 'run-applescript';\n\nexport default async function bundleName(bundleId) {\n\treturn runAppleScript(`tell application \"Finder\" to set app_path to application file id \"${bundleId}\" as string\\ntell application \"System Events\" to get value of property list item \"CFBundleName\" of property list file (app_path & \":Contents:Info.plist\")`);\n}\n","import {promisify} from 'node:util';\nimport {execFile} from 'node:child_process';\n\nconst execFileAsync = promisify(execFile);\n\n// TODO: Fix the casing of bundle identifiers in the next major version.\n\n// Windows doesn't have browser IDs in the same way macOS/Linux does so we give fake\n// ones that look real and match the macOS/Linux versions for cross-platform apps.\nconst windowsBrowserProgIds = {\n\tMSEdgeHTM: {name: 'Edge', id: 'com.microsoft.edge'}, // The missing `L` is correct.\n\tMSEdgeBHTML: {name: 'Edge Beta', id: 'com.microsoft.edge.beta'},\n\tMSEdgeDHTML: {name: 'Edge Dev', id: 'com.microsoft.edge.dev'},\n\tAppXq0fevzme2pys62n3e0fbqa7peapykr8v: {name: 'Edge', id: 'com.microsoft.edge.old'},\n\tChromeHTML: {name: 'Chrome', id: 'com.google.chrome'},\n\tChromeBHTML: {name: 'Chrome Beta', id: 'com.google.chrome.beta'},\n\tChromeDHTML: {name: 'Chrome Dev', id: 'com.google.chrome.dev'},\n\tChromiumHTM: {name: 'Chromium', id: 'org.chromium.Chromium'},\n\tBraveHTML: {name: 'Brave', id: 'com.brave.Browser'},\n\tBraveBHTML: {name: 'Brave Beta', id: 'com.brave.Browser.beta'},\n\tBraveDHTML: {name: 'Brave Dev', id: 'com.brave.Browser.dev'},\n\tBraveSSHTM: {name: 'Brave Nightly', id: 'com.brave.Browser.nightly'},\n\tFirefoxURL: {name: 'Firefox', id: 'org.mozilla.firefox'},\n\tOperaStable: {name: 'Opera', id: 'com.operasoftware.Opera'},\n\tVivaldiHTM: {name: 'Vivaldi', id: 'com.vivaldi.Vivaldi'},\n\t'IE.HTTP': {name: 'Internet Explorer', id: 'com.microsoft.ie'},\n};\n\nexport const _windowsBrowserProgIdMap = new Map(Object.entries(windowsBrowserProgIds));\n\nexport class UnknownBrowserError extends Error {}\n\nexport default async function defaultBrowser(_execFileAsync = execFileAsync) {\n\tconst {stdout} = await _execFileAsync('reg', [\n\t\t'QUERY',\n\t\t' HKEY_CURRENT_USER\\\\Software\\\\Microsoft\\\\Windows\\\\Shell\\\\Associations\\\\UrlAssociations\\\\http\\\\UserChoice',\n\t\t'/v',\n\t\t'ProgId',\n\t]);\n\n\tconst match = /ProgId\\s*REG_SZ\\s*(?<id>\\S+)/.exec(stdout);\n\tif (!match) {\n\t\tthrow new UnknownBrowserError(`Cannot find Windows browser in stdout: ${JSON.stringify(stdout)}`);\n\t}\n\n\tconst {id} = match.groups;\n\n\t// Windows can append a hash suffix to ProgIds using a dot or hyphen\n\t// (e.g., `ChromeHTML.ABC123`, `FirefoxURL-6F193CCC56814779`).\n\t// Try exact match first, then try without the suffix.\n\tconst dotIndex = id.lastIndexOf('.');\n\tconst hyphenIndex = id.lastIndexOf('-');\n\tconst baseIdByDot = dotIndex === -1 ? undefined : id.slice(0, dotIndex);\n\tconst baseIdByHyphen = hyphenIndex === -1 ? undefined : id.slice(0, hyphenIndex);\n\n\treturn windowsBrowserProgIds[id] ?? windowsBrowserProgIds[baseIdByDot] ?? windowsBrowserProgIds[baseIdByHyphen] ?? {name: id, id};\n}\n","import { promises as fs } from 'node:fs';\nimport type { Server } from 'node:http';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { createAdaptorServer } from '@hono/node-server';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { Hono } from 'hono';\nimport open from 'open';\nimport type { DockerController } from '../core/docker/compose.js';\nimport { ProcessManager } from '../core/process/manager.js';\nimport { Hub } from '../core/hub/runtime.js';\nimport { registerApiRoutes, registerHubApiRoutes } from './routes/api.js';\nimport { setupWebSocket, setupHubWebSocket } from './routes/ws.js';\nimport { createMutationToken } from './mutationToken.js';\nimport { initializeListenHost, DEFAULT_PORT } from './listenConfig.js';\n\nfunction warnIfContainerRootsUnset(host: string): void {\n if (host !== '0.0.0.0' && host !== '::') {\n return;\n }\n if (process.env.DEVSURFACE_WORKSPACE_ROOTS?.trim()) {\n return;\n }\n console.warn(\n 'Warning: DEVSURFACE_WORKSPACE_ROOTS is unset in container mode. ' +\n 'Any loopback or private-network client can register arbitrary directories as workspaces. ' +\n 'Set DEVSURFACE_WORKSPACE_ROOTS to restrict workspace registration.'\n );\n}\n\nexport { DEFAULT_HOST, DEFAULT_PORT, resolveHost } from './listenConfig.js';\n\nexport interface DevSurfaceServer {\n url: string;\n port: number;\n host: string;\n hub: Hub;\n close: () => Promise<void>;\n processManager: ProcessManager;\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\nasync function findWebDistDir(): Promise<string | null> {\n const moduleDir = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.join(moduleDir, '..', 'web', 'dist'),\n path.join(moduleDir, '..', '..', 'src', 'web', 'dist'),\n path.join(moduleDir, 'web', 'dist')\n ];\n\n for (const candidate of candidates) {\n if (await fileExists(path.join(candidate, 'index.html'))) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toListenError(error: unknown, host: string, port: number): Error {\n const code = error instanceof Error ? (error as NodeJS.ErrnoException).code : undefined;\n\n if (code === 'EADDRINUSE') {\n return new Error(\n `Port ${port} is already in use on ${host}. Stop the other process or run DevSurface with --port ${port + 1}.`,\n { cause: error }\n );\n }\n\n if (code === 'EACCES') {\n return new Error(`DevSurface does not have permission to bind to ${host}:${port}.`, {\n cause: error\n });\n }\n\n return error instanceof Error ? error : new Error(String(error));\n}\n\nasync function listenOnHost(\n server: Server,\n wss: ReturnType<typeof setupWebSocket>,\n host: string,\n port: number\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let settled = false;\n\n const cleanup = () => {\n server.off('error', onError);\n server.off('listening', onListening);\n wss.off('error', onError);\n };\n\n const onError = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(toListenError(error, host, port));\n };\n\n const onListening = () => {\n if (settled) return;\n settled = true;\n cleanup();\n resolve();\n };\n\n wss.once('error', onError);\n server.once('error', onError);\n server.once('listening', onListening);\n server.listen(port, host);\n });\n}\n\nasync function closeWebSocketServer(wss: ReturnType<typeof setupWebSocket>): Promise<void> {\n await new Promise<void>((resolve) => {\n wss.close(() => resolve());\n });\n}\n\nasync function closeHttpServer(server: Server): Promise<void> {\n if (!server.listening) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n server.close((error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n}\n\nasync function mountWebUi(app: Hono): Promise<void> {\n const webDistDir = await findWebDistDir();\n if (webDistDir !== null) {\n app.use('/assets/*', serveStatic({ root: webDistDir }));\n app.get('/favicon.svg', serveStatic({ root: webDistDir }));\n app.get('*', async (context) => {\n const html = await fs.readFile(path.join(webDistDir, 'index.html'), 'utf8');\n return context.html(html);\n });\n } else {\n app.get('*', (context) =>\n context.html(\n '<!doctype html><title>DevSurface</title><main><h1>DevSurface</h1><p>Run npm run build:web to build the dashboard.</p></main>',\n 503\n )\n );\n }\n}\n\n// Legacy single-project createApp (backward compat with existing tests)\nexport async function createApp(options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken?: string;\n}): Promise<Hono> {\n const app = new Hono();\n registerApiRoutes(app, {\n ...options,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\n// Hub-mode createApp\nexport async function createHubApp(options: { hub: Hub; mutationToken?: string }): Promise<Hono> {\n const app = new Hono();\n registerHubApiRoutes(app, {\n hub: options.hub,\n mutationToken: options.mutationToken ?? createMutationToken()\n });\n await mountWebUi(app);\n return app;\n}\n\nexport async function startHubServer(options: {\n port?: number;\n openBrowser?: boolean;\n dataDir?: string;\n initialWorkspace?: string;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub({ dataDir: options.dataDir });\n hub.attachCleanupHandlers();\n warnIfContainerRootsUnset(host);\n\n if (options.initialWorkspace) {\n await hub.registry.add(options.initialWorkspace);\n }\n\n const mutationToken = createMutationToken();\n const app = await createHubApp({ hub, mutationToken });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupHubWebSocket(server, hub);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n const entries = await hub.registry.list();\n const deepLink = entries.length > 0 ? `${url}/?workspace=${entries[0].id}` : url;\n await open(deepLink);\n }\n\n const dummyProcessManager = new ProcessManager();\n\n return {\n url,\n port,\n host,\n hub,\n processManager: dummyProcessManager,\n close: async () => {\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n\n// Legacy single-project server (used by old tests)\nexport async function startDevSurfaceServer(options: {\n projectRoot: string;\n port?: number;\n openBrowser?: boolean;\n}): Promise<DevSurfaceServer> {\n const host = initializeListenHost();\n const port = options.port ?? DEFAULT_PORT;\n const hub = new Hub();\n hub.attachCleanupHandlers();\n\n await hub.registry.add(options.projectRoot);\n const processManager = new ProcessManager();\n processManager.attachCleanupHandlers();\n\n const app = await createApp({\n projectRoot: options.projectRoot,\n processManager\n });\n\n const server = createAdaptorServer({\n fetch: app.fetch,\n hostname: host\n }) as Server;\n const wss = setupWebSocket(server, processManager);\n await listenOnHost(server, wss, host, port);\n\n const url = `http://${host === '0.0.0.0' ? '127.0.0.1' : host}:${port}`;\n\n if (options.openBrowser !== false) {\n await open(url);\n }\n\n return {\n url,\n port,\n host,\n hub,\n processManager,\n close: async () => {\n processManager.killAll();\n hub.killAll();\n await closeWebSocketServer(wss);\n await closeHttpServer(server);\n }\n };\n}\n","import { EventEmitter } from 'node:events';\nimport type { ChildProcess } from 'node:child_process';\nimport spawn from 'cross-spawn';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../types.js';\n\nexport const LOG_MESSAGE_LIMIT = 16_384;\nconst LOG_ENTRY_LIMIT = 1000;\n\ninterface ProcessRecord extends ManagedProcessSnapshot {\n child: ChildProcess;\n}\n\nfunction killChildProcessTree(child: ChildProcess): void {\n if (child.pid === undefined) {\n child.kill();\n return;\n }\n\n if (process.platform === 'win32') {\n const result = spawn.sync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true\n });\n if (result.error) {\n child.kill();\n }\n return;\n }\n\n child.kill();\n}\n\nexport class ProcessManager extends EventEmitter {\n private readonly processes = new Map<string, ProcessRecord>();\n private readonly logs: ProcessLogEvent[] = [];\n private cleanupInstalled = false;\n\n start(options: {\n cwd: string;\n script: string;\n command: string;\n args: string[];\n displayCommand: string;\n }): ManagedProcessSnapshot {\n const child = spawn(options.command, options.args, {\n cwd: options.cwd,\n shell: false,\n windowsHide: true\n });\n\n const pid = String(child.pid ?? `${Date.now()}-${Math.random().toString(16).slice(2)}`);\n const record: ProcessRecord = {\n child,\n pid,\n script: options.script,\n command: options.displayCommand,\n status: 'running',\n startedAt: new Date().toISOString(),\n endedAt: null,\n exitCode: null\n };\n\n this.processes.set(pid, record);\n this.emitSystem(record, `Started ${options.displayCommand}`);\n\n child.stdout?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stdout', chunk.toString());\n });\n\n child.stderr?.on('data', (chunk: Buffer) => {\n this.emitLog(record, 'stderr', chunk.toString());\n });\n\n child.on('error', (error) => {\n record.status = 'failed';\n record.endedAt = new Date().toISOString();\n this.emitLog(record, 'system', error.message);\n this.emit('process', this.snapshot(record));\n });\n\n child.on('close', (code) => {\n if (record.status === 'stopped') {\n record.exitCode = code;\n } else {\n record.status = code === 0 ? 'exited' : 'failed';\n record.exitCode = code;\n }\n record.endedAt = new Date().toISOString();\n this.emitSystem(record, `Exited with code ${code ?? 'unknown'}`);\n this.emit('process', this.snapshot(record));\n });\n\n this.emit('process', this.snapshot(record));\n return this.snapshot(record);\n }\n\n stop(pid: string): boolean {\n const record = this.processes.get(pid);\n if (!record || record.status !== 'running') {\n return false;\n }\n\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n this.emitSystem(record, 'Stopped by DevSurface');\n this.emit('process', this.snapshot(record));\n return true;\n }\n\n list(): ManagedProcessSnapshot[] {\n return Array.from(this.processes.values()).map((record) => this.snapshot(record));\n }\n\n listLogs(): ProcessLogEvent[] {\n return [...this.logs];\n }\n\n killAll(): void {\n for (const record of this.processes.values()) {\n if (record.status === 'running') {\n record.status = 'stopped';\n record.endedAt = new Date().toISOString();\n killChildProcessTree(record.child);\n }\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n\n this.cleanupInstalled = true;\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n\n private emitLog(record: ProcessRecord, stream: ProcessLogEvent['stream'], message: string): void {\n const boundedMessage =\n message.length <= LOG_MESSAGE_LIMIT ? message : message.slice(-LOG_MESSAGE_LIMIT);\n const event: ProcessLogEvent = {\n pid: record.pid,\n script: record.script,\n stream,\n message: boundedMessage,\n timestamp: new Date().toISOString()\n };\n\n this.logs.push(event);\n if (this.logs.length > LOG_ENTRY_LIMIT) {\n this.logs.splice(0, this.logs.length - LOG_ENTRY_LIMIT);\n }\n\n this.emit('log', event);\n }\n\n private emitSystem(record: ProcessRecord, message: string): void {\n this.emitLog(record, 'system', message);\n }\n\n private snapshot(record: ProcessRecord): ManagedProcessSnapshot {\n return {\n pid: record.pid,\n script: record.script,\n command: record.command,\n status: record.status,\n startedAt: record.startedAt,\n endedAt: record.endedAt,\n exitCode: record.exitCode\n };\n }\n}\n","import { createHash } from 'node:crypto';\nimport { promises as fs } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport { assertWithinWorkspaceRoots } from './workspaceRoots.js';\n\nexport interface WorkspaceEntry {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n}\n\nfunction workspaceId(realPath: string): string {\n const base =\n path\n .basename(realPath)\n .replace(/[^a-zA-Z0-9_-]/g, '_')\n .slice(0, 32) || 'workspace';\n const hash = createHash('sha256').update(realPath).digest('hex').slice(0, 6);\n return `${base}-${hash}`;\n}\n\nfunction defaultDataDir(): string {\n return process.env.DEVSURFACE_DATA_DIR ?? path.join(os.homedir(), '.devsurface');\n}\n\nasync function readPackageName(dirPath: string): Promise<string | null> {\n try {\n const raw = JSON.parse(await fs.readFile(path.join(dirPath, 'package.json'), 'utf8'));\n return typeof raw?.name === 'string' && raw.name.length > 0 ? raw.name : null;\n } catch {\n return null;\n }\n}\n\nexport class WorkspaceRegistry {\n private readonly filePath: string;\n private seeded = false;\n\n constructor(dataDir?: string) {\n const dir = dataDir ?? defaultDataDir();\n this.filePath = path.join(dir, 'workspaces.json');\n }\n\n async list(): Promise<WorkspaceEntry[]> {\n await this.seedFromEnv();\n return await this.read();\n }\n\n async add(dirPath: string): Promise<WorkspaceEntry> {\n const realDir = await this.resolveDir(dirPath);\n await assertWithinWorkspaceRoots(realDir);\n const entries = await this.read();\n\n const existing = entries.find((entry) => entry.path === realDir);\n if (existing) {\n return existing;\n }\n\n const name = (await readPackageName(realDir)) ?? path.basename(realDir);\n const entry: WorkspaceEntry = {\n id: workspaceId(realDir),\n name,\n path: realDir,\n addedAt: new Date().toISOString()\n };\n entries.push(entry);\n await this.write(entries);\n return entry;\n }\n\n async remove(id: string): Promise<boolean> {\n const entries = await this.read();\n const filtered = entries.filter((entry) => entry.id !== id);\n if (filtered.length === entries.length) {\n return false;\n }\n await this.write(filtered);\n return true;\n }\n\n async findByPath(dirPath: string): Promise<WorkspaceEntry | null> {\n try {\n const realDir = await fs.realpath(path.resolve(dirPath));\n const entries = await this.read();\n return entries.find((entry) => entry.path === realDir) ?? null;\n } catch {\n return null;\n }\n }\n\n async resolve(id: string): Promise<WorkspaceEntry | null> {\n const entries = await this.read();\n const entry = entries.find((item) => item.id === id);\n if (!entry) {\n return null;\n }\n\n try {\n const realDir = await this.resolveDir(entry.path);\n await assertWithinWorkspaceRoots(realDir);\n if (realDir !== entry.path) {\n const updated: WorkspaceEntry = { ...entry, path: realDir };\n await this.write(entries.map((item) => (item.id === id ? updated : item)));\n return updated;\n }\n return entry;\n } catch {\n await this.remove(id);\n return null;\n }\n }\n\n private async resolveDir(dirPath: string): Promise<string> {\n const resolved = path.resolve(dirPath);\n const realDir = await fs.realpath(resolved);\n const stat = await fs.stat(realDir);\n if (!stat.isDirectory()) {\n throw new Error(`${dirPath} is not a directory.`);\n }\n return realDir;\n }\n\n private async read(): Promise<WorkspaceEntry[]> {\n try {\n const content = await fs.readFile(this.filePath, 'utf8');\n const parsed = JSON.parse(content);\n return Array.isArray(parsed) ? parsed : [];\n } catch {\n return [];\n }\n }\n\n private async write(entries: WorkspaceEntry[]): Promise<void> {\n await fs.mkdir(path.dirname(this.filePath), { recursive: true });\n await fs.writeFile(this.filePath, JSON.stringify(entries, null, 2) + '\\n', {\n encoding: 'utf8',\n mode: 0o600\n });\n }\n\n private async seedFromEnv(): Promise<void> {\n if (this.seeded) {\n return;\n }\n this.seeded = true;\n\n const seedValue = process.env.DEVSURFACE_WORKSPACES;\n if (!seedValue) {\n return;\n }\n\n const paths = seedValue\n .split(',')\n .map((p) => p.trim())\n .filter(Boolean);\n for (const p of paths) {\n try {\n await this.add(p);\n } catch {\n // Skip invalid seed paths.\n }\n }\n }\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(root, target);\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nexport async function configuredWorkspaceRoots(): Promise<string[]> {\n const raw = process.env.DEVSURFACE_WORKSPACE_ROOTS;\n if (!raw) {\n return [];\n }\n\n const roots: string[] = [];\n for (const entry of raw.split(',')) {\n const trimmed = entry.trim();\n if (!trimmed) {\n continue;\n }\n\n try {\n roots.push(await fs.realpath(path.resolve(trimmed)));\n } catch {\n // Skip invalid roots.\n }\n }\n\n return roots;\n}\n\nexport async function assertWithinWorkspaceRoots(targetPath: string): Promise<void> {\n const roots = await configuredWorkspaceRoots();\n if (roots.length === 0) {\n return;\n }\n\n for (const root of roots) {\n if (isWithinRoot(root, targetPath)) {\n return;\n }\n }\n\n throw new Error('Path must be inside a configured workspace root.');\n}\n","import { ProcessManager } from '../process/manager.js';\nimport { DockerComposeController, type DockerController } from '../docker/compose.js';\nimport { WorkspaceRegistry, type WorkspaceEntry } from './registry.js';\n\nexport interface WorkspaceRuntime {\n readonly id: string;\n readonly root: string;\n readonly processManager: ProcessManager;\n readonly dockerController: DockerController;\n}\n\nexport interface WorkspaceSummary {\n id: string;\n name: string;\n path: string;\n addedAt: string;\n runningProcesses: number;\n}\n\nexport class Hub {\n readonly registry: WorkspaceRegistry;\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private cleanupInstalled = false;\n\n constructor(options?: { dataDir?: string }) {\n this.registry = new WorkspaceRegistry(options?.dataDir);\n }\n\n get(id: string): WorkspaceRuntime | null {\n return this.runtimes.get(id) ?? null;\n }\n\n ensure(entry: WorkspaceEntry): WorkspaceRuntime {\n const existing = this.runtimes.get(entry.id);\n if (existing) {\n return existing;\n }\n\n const runtime: WorkspaceRuntime = {\n id: entry.id,\n root: entry.path,\n processManager: new ProcessManager(),\n dockerController: new DockerComposeController(entry.path)\n };\n this.runtimes.set(entry.id, runtime);\n return runtime;\n }\n\n async listSummaries(): Promise<WorkspaceSummary[]> {\n const entries = await this.registry.list();\n return entries.map((entry) => {\n const runtime = this.runtimes.get(entry.id);\n const running = runtime\n ? runtime.processManager.list().filter((p) => p.status === 'running').length\n : 0;\n return {\n id: entry.id,\n name: entry.name,\n path: entry.path,\n addedAt: entry.addedAt,\n runningProcesses: running\n };\n });\n }\n\n killAll(): void {\n for (const runtime of this.runtimes.values()) {\n runtime.processManager.killAll();\n }\n }\n\n attachCleanupHandlers(): void {\n if (this.cleanupInstalled) {\n return;\n }\n this.cleanupInstalled = true;\n\n process.once('exit', () => {\n this.killAll();\n });\n process.once('SIGINT', () => {\n this.killAll();\n process.exit(130);\n });\n }\n}\n","import { constants, existsSync } from 'node:fs';\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport spawn from 'cross-spawn';\nimport type { Hono } from 'hono';\nimport open from 'open';\nimport {\n DockerComposeController,\n DockerOperationError,\n type DockerController\n} from '../../core/docker/compose.js';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport {\n isDangerousCommand,\n resolveConfiguredCommand,\n resolvePackageInstallCommand,\n resolvePackageRunCommand\n} from '../../core/process/runner.js';\nimport { runDoctor } from '../../core/doctor/index.js';\nimport { buildOnboardingPlan } from '../../core/onboarding/index.js';\nimport { scanProject } from '../../core/scanner/index.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\nimport { isAllowedLocalOrigin, isSameOrigin } from '../localAccess.js';\nimport { createApiAccessMiddleware } from '../accessControl.js';\nimport { hasValidMutationToken } from '../mutationToken.js';\nimport { isAllowedTerminalCommand } from '../terminal.js';\n\nfunction isWithinRoot(root: string, target: string): boolean {\n const relative = path.relative(path.resolve(root), path.resolve(target));\n return relative === '' || (!relative.startsWith('..') && !path.isAbsolute(relative));\n}\n\nfunction isAllowedMutationOrigin(requestUrl: string, origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n return isAllowedLocalOrigin(origin) && isSameOrigin(requestUrl, origin);\n}\n\nfunction registerMutationGuard(app: Hono, mutationToken: string): void {\n app.use('/api/*', createApiAccessMiddleware());\n app.use('/api/*', async (context, next) => {\n if (context.req.method === 'GET' || context.req.method === 'HEAD') {\n await next();\n return;\n }\n\n const origin = context.req.header('origin') ?? null;\n const secFetchSite = context.req.header('sec-fetch-site') ?? null;\n const intent = context.req.header('x-devsurface-intent') ?? null;\n const token = context.req.header('x-devsurface-token') ?? null;\n if (\n !hasMutationIntent(intent) ||\n !hasValidMutationToken(token, mutationToken) ||\n isCrossSiteFetch(secFetchSite) ||\n !isAllowedMutationOrigin(context.req.url, origin)\n ) {\n return context.json({ error: 'Cross-origin mutation rejected.' }, 403);\n }\n\n await next();\n });\n}\n\nfunction isCrossSiteFetch(secFetchSite: string | null): boolean {\n return secFetchSite === 'cross-site';\n}\n\nfunction hasMutationIntent(intent: string | null): boolean {\n return intent === 'dashboard';\n}\n\nasync function realPathWithinRoot(root: string, target: string): Promise<boolean> {\n if (!isWithinRoot(root, target)) {\n return false;\n }\n try {\n const [realRoot, realTarget] = await Promise.all([fs.realpath(root), fs.realpath(target)]);\n return isWithinRoot(realRoot, realTarget);\n } catch {\n return false;\n }\n}\n\nasync function writableDestinationWithinRoot(root: string, destination: string): Promise<boolean> {\n if (!isWithinRoot(root, destination)) {\n return false;\n }\n try {\n const [realRoot, realParent] = await Promise.all([\n fs.realpath(root),\n fs.realpath(path.dirname(destination))\n ]);\n return isWithinRoot(realRoot, realParent);\n } catch {\n return false;\n }\n}\n\nasync function copyFileExclusive(\n source: string,\n destination: string\n): Promise<'copied' | 'exists'> {\n const content = await fs.readFile(source);\n let handle: fs.FileHandle | null = null;\n try {\n handle = await fs.open(\n destination,\n constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY,\n 0o600\n );\n await handle.writeFile(content);\n return 'copied';\n } catch (error) {\n const code =\n typeof error === 'object' && error !== null && 'code' in error ? error.code : undefined;\n if (code === 'EEXIST') {\n return 'exists';\n }\n throw error;\n } finally {\n await handle?.close();\n }\n}\n\nfunction quotePowerShellString(value: string): string {\n return `'${value.replace(/'/g, \"''\")}'`;\n}\n\nfunction quotePosixString(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction resolveCommandPromptExecutable(): string {\n return process.env.ComSpec ?? 'cmd.exe';\n}\n\nfunction findExecutable(command: string): string | null {\n if (path.isAbsolute(command)) {\n return existsSync(command) ? command : null;\n }\n const pathValue = process.env.PATH ?? '';\n for (const directory of pathValue.split(path.delimiter)) {\n if (directory.length === 0) {\n continue;\n }\n const candidate = path.join(directory, command);\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction launchDetached(command: string, args: string[], root: string): boolean {\n const child = spawn(command, args, {\n cwd: root,\n detached: true,\n stdio: 'ignore',\n windowsHide: process.platform === 'win32'\n });\n child.on('error', () => undefined);\n child.unref();\n return true;\n}\n\nfunction openTerminalAt(root: string): boolean {\n if (process.platform === 'win32') {\n return launchDetached(\n resolveCommandPromptExecutable(),\n [\n '/d',\n '/c',\n 'start',\n '\"\"',\n '/D',\n root,\n 'powershell.exe',\n '-NoExit',\n '-NoLogo',\n '-Command',\n `Set-Location -LiteralPath ${quotePowerShellString(root)}`\n ],\n root\n );\n }\n\n if (process.platform === 'darwin') {\n return launchDetached('open', ['-a', 'Terminal', root], root);\n }\n\n const configuredTerminal = process.env.TERMINAL?.trim();\n if (\n configuredTerminal !== undefined &&\n configuredTerminal.length > 0 &&\n isAllowedTerminalCommand(configuredTerminal) &&\n findExecutable(configuredTerminal) !== null\n ) {\n return launchDetached(configuredTerminal, [], root);\n }\n\n const linuxTerminals: Array<{ command: string; args: string[] }> = [\n { command: 'x-terminal-emulator', args: [] },\n { command: 'gnome-terminal', args: ['--working-directory', root] },\n { command: 'konsole', args: ['--workdir', root] },\n { command: 'xfce4-terminal', args: ['--working-directory', root] },\n {\n command: 'xterm',\n args: [\n '-e',\n 'sh',\n '-lc',\n `cd ${quotePosixString(root)} && exec ${quotePosixString(process.env.SHELL ?? 'sh')}`\n ]\n }\n ];\n\n const terminal = linuxTerminals.find((candidate) => findExecutable(candidate.command) !== null);\n if (terminal === undefined) {\n return false;\n }\n\n return launchDetached(terminal.command, terminal.args, root);\n}\n\nfunction handleDockerError(\n error: unknown,\n context: { json: (data: unknown, status: number) => Response }\n): Response {\n if (error instanceof DockerOperationError) {\n if (error.code === 'compose-not-found' || error.code === 'service-not-found') {\n return context.json({ error: error.message, code: error.code }, 404);\n }\n if (error.code === 'docker-not-installed' || error.code === 'docker-not-running') {\n return context.json({ error: error.message, code: error.code }, 503);\n }\n return context.json({ error: error.message, code: error.code }, 502);\n }\n throw error;\n}\n\nasync function onboardingForRoot(root: string) {\n const scan = await scanProject(root);\n const warnings = await runDoctor(root, scan);\n return buildOnboardingPlan(scan, warnings);\n}\n\nfunction registerWorkspaceRoutes(\n app: Hono,\n resolveWorkspace: (id: string) => Promise<{\n root: string;\n processManager: ProcessManager;\n dockerController: DockerController;\n } | null>\n): void {\n app.get('/api/workspaces/:id/project', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await scanProject(ws.root));\n });\n\n app.get('/api/workspaces/:id/health', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await runDoctor(ws.root));\n });\n\n app.get('/api/workspaces/:id/onboarding', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(await onboardingForRoot(ws.root));\n });\n\n app.get('/api/workspaces/:id/processes', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.list());\n });\n\n app.get('/api/workspaces/:id/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n return context.json(ws.processManager.listLogs());\n });\n\n app.get('/api/workspaces/:id/docker/:service/logs', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/start', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/docker/:service/stop', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await ws.dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/workspaces/:id/run/:script', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(ws.root);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: ws.root,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/workspaces/:id/install', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const command = await resolvePackageInstallCommand({\n cwd: ws.root,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/workspaces/:id/commands/:name', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(ws.root);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(ws.root, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = ws.processManager.start({\n cwd: ws.root,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/workspaces/:id/open/folder', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n await open(ws.root);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/workspaces/:id/open/package', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const packagePath = path.join(ws.root, 'package.json');\n if (!(await realPathWithinRoot(ws.root, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/workspaces/:id/open/terminal', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const opened = openTerminalAt(ws.root);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/workspaces/:id/env/copy', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const scan = await scanProject(ws.root);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination = localPath ?? path.join(ws.root, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(ws.root, examplePath)) ||\n !(await writableDestinationWithinRoot(ws.root, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/workspaces/:id/run/:pid', async (context) => {\n const ws = await resolveWorkspace(context.req.param('id'));\n if (!ws) return context.json({ error: 'Workspace not found.' }, 404);\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = ws.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n\nexport function registerHubApiRoutes(\n app: Hono,\n options: {\n hub: Hub;\n mutationToken: string;\n }\n): void {\n const { hub } = options;\n registerMutationGuard(app, options.mutationToken);\n\n async function resolveWorkspace(id: string) {\n const entry = await hub.registry.resolve(id);\n if (!entry) return null;\n const runtime = hub.ensure(entry);\n return {\n root: runtime.root,\n processManager: runtime.processManager,\n dockerController: runtime.dockerController\n };\n }\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/workspaces', async (context) => {\n return context.json(await hub.listSummaries());\n });\n\n app.post('/api/workspaces', async (context) => {\n const body = await context.req.json<{ path: string }>().catch(() => null);\n if (!body?.path) {\n return context.json({ error: 'path is required.' }, 400);\n }\n try {\n const entry = await hub.registry.add(body.path);\n return context.json(entry, 201);\n } catch (error) {\n return context.json({ error: error instanceof Error ? error.message : 'Invalid path.' }, 400);\n }\n });\n\n app.delete('/api/workspaces/:id', async (context) => {\n const id = context.req.param('id');\n const runtime = hub.get(id);\n if (runtime) {\n runtime.processManager.killAll();\n }\n const removed = await hub.registry.remove(id);\n return context.json({ removed }, removed ? 200 : 404);\n });\n\n registerWorkspaceRoutes(app, resolveWorkspace);\n\n // Backward-compatible single-project aliases: proxy to the first workspace\n app.get('/api/project', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await scanProject(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/health', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await runDoctor(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/onboarding', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json({ error: 'No workspaces registered.' }, 404);\n return context.json(await onboardingForRoot(hub.ensure(entries[0]).root));\n });\n\n app.get('/api/processes', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.list());\n });\n\n app.get('/api/logs', async (context) => {\n const entries = await hub.registry.list();\n if (entries.length === 0) return context.json([]);\n return context.json(hub.ensure(entries[0]).processManager.listLogs());\n });\n}\n\n// Legacy single-project API for backward compatibility with tests\nexport function registerApiRoutes(\n app: Hono,\n options: {\n projectRoot: string;\n processManager: ProcessManager;\n dockerController?: DockerController;\n mutationToken: string;\n }\n): void {\n const dockerController =\n options.dockerController ?? new DockerComposeController(options.projectRoot);\n registerMutationGuard(app, options.mutationToken);\n\n app.get('/api/session', (context) => {\n return context.json({ token: options.mutationToken });\n });\n\n app.get('/api/hub/status', (context) => {\n return context.json({ status: 'running', version: DEV_SURFACE_VERSION });\n });\n\n app.get('/api/project', async (context) => {\n return context.json(await scanProject(options.projectRoot));\n });\n\n app.get('/api/health', async (context) => {\n return context.json(await runDoctor(options.projectRoot));\n });\n\n app.get('/api/onboarding', async (context) => {\n return context.json(await onboardingForRoot(options.projectRoot));\n });\n\n app.get('/api/processes', (context) => {\n return context.json(options.processManager.list());\n });\n\n app.get('/api/logs', (context) => {\n return context.json(options.processManager.listLogs());\n });\n\n app.get('/api/docker/:service/logs', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.logs(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/start', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.start(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/docker/:service/stop', async (context) => {\n const service = decodeURIComponent(context.req.param('service'));\n try {\n return context.json(await dockerController.stop(service));\n } catch (error) {\n return handleDockerError(error, context);\n }\n });\n\n app.post('/api/run/:script', async (context) => {\n const script = decodeURIComponent(context.req.param('script'));\n const scan = await scanProject(options.projectRoot);\n const packageScript = scan.scripts[script];\n\n if (packageScript === undefined) {\n return context.json({ error: `Script \"${script}\" was not found.` }, 404);\n }\n if (isDangerousCommand(packageScript)) {\n return context.json({ error: 'Refusing to run dangerous script.' }, 403);\n }\n\n const command = await resolvePackageRunCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager,\n script\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script,\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json({ ...processInfo, packageScript });\n });\n\n app.post('/api/install', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const command = await resolvePackageInstallCommand({\n cwd: options.projectRoot,\n packageManager: scan.packageManager\n });\n if (command === null) {\n return context.json({ error: 'Package manager executable was not found.' }, 503);\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: 'install',\n command: command.command,\n args: command.args,\n displayCommand: command.displayCommand\n });\n return context.json(processInfo);\n });\n\n app.post('/api/commands/:name', async (context) => {\n const name = decodeURIComponent(context.req.param('name'));\n const scan = await scanProject(options.projectRoot);\n const configuredCommand =\n scan.config?.config.commands?.[name] ?? scan.presetCommands[name] ?? null;\n\n if (configuredCommand === null) {\n return context.json({ error: `Configured command \"${name}\" was not found.` }, 404);\n }\n if (isDangerousCommand(configuredCommand)) {\n return context.json({ error: 'Refusing to run dangerous command.' }, 403);\n }\n\n const resolvedCommand = await resolveConfiguredCommand(options.projectRoot, configuredCommand);\n if (resolvedCommand === null) {\n return context.json(\n {\n error:\n 'Configured command uses unsupported shell syntax. Use a simple executable with arguments, or move complex logic into a package.json script.'\n },\n 400\n );\n }\n\n const processInfo = options.processManager.start({\n cwd: options.projectRoot,\n script: name,\n command: resolvedCommand.command,\n args: resolvedCommand.args,\n displayCommand: resolvedCommand.displayCommand\n });\n return context.json({ ...processInfo, configuredCommand });\n });\n\n app.post('/api/open/folder', async (context) => {\n await open(options.projectRoot);\n return context.json({ opened: true, target: 'folder' });\n });\n\n app.post('/api/open/package', async (context) => {\n const packagePath = path.join(options.projectRoot, 'package.json');\n if (!(await realPathWithinRoot(options.projectRoot, packagePath))) {\n return context.json({ error: 'package.json was not found inside the project root.' }, 404);\n }\n await open(packagePath);\n return context.json({ opened: true, target: 'package' });\n });\n\n app.post('/api/open/terminal', (context) => {\n const opened = openTerminalAt(options.projectRoot);\n return context.json({ opened, target: 'terminal' }, opened ? 200 : 501);\n });\n\n app.post('/api/env/copy', async (context) => {\n const scan = await scanProject(options.projectRoot);\n const examplePath = scan.env?.examplePath ?? null;\n const localPath = scan.env?.localPath ?? null;\n\n if (examplePath === null) {\n return context.json({ error: '.env.example was not found.' }, 404);\n }\n\n const destination =\n localPath ?? path.join(options.projectRoot, scan.config?.config.env?.local ?? '.env');\n if (\n !(await realPathWithinRoot(options.projectRoot, examplePath)) ||\n !(await writableDestinationWithinRoot(options.projectRoot, destination))\n ) {\n return context.json({ error: 'Refusing to copy env files outside the project root.' }, 400);\n }\n\n const copyResult = await copyFileExclusive(examplePath, destination);\n if (copyResult === 'exists') {\n return context.json({ error: '.env already exists.' }, 409);\n }\n return context.json({ copied: true });\n });\n\n app.delete('/api/run/:pid', (context) => {\n const pid = decodeURIComponent(context.req.param('pid'));\n const stopped = options.processManager.stop(pid);\n return context.json({ stopped });\n });\n}\n","export const DEV_SURFACE_VERSION = '0.7.0';\n","const LOCAL_HOSTNAMES = new Set(['127.0.0.1', 'localhost', '::1']);\n\nfunction hostnameFromHostHeader(host: string): string | null {\n const trimmed = host.trim().toLowerCase();\n if (trimmed.length === 0) {\n return null;\n }\n\n if (trimmed.startsWith('[')) {\n const end = trimmed.indexOf(']');\n return end > 0 ? trimmed.slice(1, end) : null;\n }\n\n return trimmed.split(':')[0] ?? null;\n}\n\nexport function isAllowedLocalHostHeader(host: string | null | undefined): boolean {\n if (typeof host !== 'string') {\n return false;\n }\n\n const hostname = hostnameFromHostHeader(host);\n return hostname !== null && LOCAL_HOSTNAMES.has(hostname);\n}\n\nexport function isAllowedLocalOrigin(origin: string | null): boolean {\n if (origin === null) {\n return true;\n }\n\n try {\n const url = new URL(origin);\n return (\n (url.protocol === 'http:' || url.protocol === 'https:') &&\n LOCAL_HOSTNAMES.has(url.hostname.toLowerCase())\n );\n } catch {\n return false;\n }\n}\n\nexport function isSameOrigin(requestUrl: string, origin: string): boolean {\n try {\n return new URL(requestUrl).origin === new URL(origin).origin;\n } catch {\n return false;\n }\n}\n","export const DEFAULT_HOST = '127.0.0.1';\nexport const DEFAULT_PORT = 4567;\n\nconst LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '::1']);\nconst CONTAINER_HOSTS = new Set(['0.0.0.0', '::']);\n\nexport function resolveHost(): string {\n const envHost = process.env.DEVSURFACE_HOST;\n if (!envHost) {\n return DEFAULT_HOST;\n }\n\n if (LOOPBACK_HOSTS.has(envHost)) {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost) && process.env.DEVSURFACE_CONTAINER === 'true') {\n return envHost;\n }\n\n if (CONTAINER_HOSTS.has(envHost)) {\n throw new Error(\n 'All-interface DevSurface binding is only allowed when DEVSURFACE_CONTAINER=true. DevSurface binds to 127.0.0.1 on bare metal.'\n );\n }\n\n throw new Error('DEVSURFACE_HOST must be a loopback host, or 0.0.0.0 inside a container.');\n}\n\nlet listenHost = DEFAULT_HOST;\n\nexport function setListenHost(host: string): void {\n listenHost = host;\n}\n\nexport function getListenHost(): string {\n return listenHost;\n}\n\nexport function resetListenHost(): void {\n listenHost = DEFAULT_HOST;\n}\n\nexport function normalizeRemoteAddress(raw: string | undefined): string | null {\n if (typeof raw !== 'string' || raw.length === 0) {\n return null;\n }\n\n if (raw.startsWith('::ffff:')) {\n return raw.slice('::ffff:'.length);\n }\n\n return raw;\n}\n\nexport function isLoopbackRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (address === '::1' || address === '127.0.0.1') {\n return true;\n }\n\n return address.startsWith('127.');\n}\n\nfunction parseIpv4(address: string): [number, number, number, number] | null {\n const parts = address.split('.');\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nexport function isPrivateRemoteAddress(raw: string | undefined): boolean {\n const address = normalizeRemoteAddress(raw);\n if (!address) {\n return false;\n }\n\n if (isLoopbackRemoteAddress(address)) {\n return true;\n }\n\n if (address.startsWith('fe80:')) {\n return true;\n }\n\n const ipv4 = parseIpv4(address);\n if (!ipv4) {\n return false;\n }\n\n const [a, b] = ipv4;\n if (a === 10) {\n return true;\n }\n if (a === 192 && b === 168) {\n return true;\n }\n if (a === 172 && b >= 16 && b <= 31) {\n return true;\n }\n\n return false;\n}\n\nexport function isAllowedRemoteAddress(raw: string | undefined, host: string): boolean {\n if (host === '0.0.0.0' || host === '::') {\n return isPrivateRemoteAddress(raw);\n }\n\n return isLoopbackRemoteAddress(raw);\n}\n\nexport function isAllowedClientConnection(\n raw: string | undefined,\n host: string = getListenHost()\n): boolean {\n if (raw === undefined) {\n return true;\n }\n\n return isAllowedRemoteAddress(raw, host);\n}\n\nexport function initializeListenHost(): string {\n const host = resolveHost();\n setListenHost(host);\n return host;\n}\n","import type { IncomingMessage } from 'node:http';\nimport type { Context, Next } from 'hono';\nimport { isAllowedLocalHostHeader } from './localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from './listenConfig.js';\n\nexport function remoteAddressFromRequest(request: IncomingMessage | undefined): string | undefined {\n return request?.socket?.remoteAddress;\n}\n\nexport function createRemoteAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n await next();\n };\n}\n\nexport function createApiAccessMiddleware() {\n return async (context: Context, next: Next) => {\n const host = context.req.header('host') ?? new URL(context.req.url).host;\n if (!isAllowedLocalHostHeader(host)) {\n return context.json({ error: 'Non-local host rejected.' }, 403);\n }\n\n const env = context.env as { incoming?: IncomingMessage } | undefined;\n const remoteAddress = remoteAddressFromRequest(env?.incoming);\n if (!isAllowedClientConnection(remoteAddress, getListenHost())) {\n return context.json({ error: 'Remote client rejected.' }, 403);\n }\n\n await next();\n };\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto';\n\nexport function createMutationToken(): string {\n return randomBytes(32).toString('hex');\n}\n\nexport function hasValidMutationToken(\n provided: string | null | undefined,\n expected: string\n): boolean {\n if (typeof provided !== 'string' || provided.length === 0) {\n return false;\n }\n\n if (provided.length !== expected.length) {\n return false;\n }\n\n return timingSafeEqual(Buffer.from(provided, 'utf8'), Buffer.from(expected, 'utf8'));\n}\n","export function isAllowedTerminalCommand(command: string): boolean {\n return /^[A-Za-z0-9._+-]+$/.test(command);\n}\n","import type { Server } from 'node:http';\nimport type { IncomingMessage } from 'node:http';\nimport { WebSocket, WebSocketServer } from 'ws';\nimport type { ProcessManager } from '../../core/process/manager.js';\nimport type { Hub } from '../../core/hub/runtime.js';\nimport type { ManagedProcessSnapshot, ProcessLogEvent } from '../../core/types.js';\nimport { isAllowedLocalHostHeader, isAllowedLocalOrigin } from '../localAccess.js';\nimport { getListenHost, isAllowedClientConnection } from '../listenConfig.js';\nimport { remoteAddressFromRequest } from '../accessControl.js';\n\nfunction isAllowedWebSocketRequest(request: IncomingMessage): boolean {\n const origin = request.headers.origin;\n const host = request.headers.host;\n const secFetchSite = request.headers['sec-fetch-site'];\n\n if (!isAllowedClientConnection(remoteAddressFromRequest(request), getListenHost())) {\n return false;\n }\n\n if (typeof host !== 'string' || !isAllowedLocalHostHeader(host)) {\n return false;\n }\n\n if (secFetchSite === 'cross-site') {\n return false;\n }\n\n if (typeof origin !== 'string') {\n return true;\n }\n\n if (!isAllowedLocalOrigin(origin)) {\n return false;\n }\n\n try {\n return new URL(origin).host.toLowerCase() === host.toLowerCase();\n } catch {\n return false;\n }\n}\n\nfunction workspaceIdFromUrl(url: string | undefined): string | null {\n if (!url) return null;\n try {\n const parsed = new URL(url, 'http://localhost');\n return parsed.searchParams.get('workspace');\n } catch {\n return null;\n }\n}\n\n// Legacy single-ProcessManager WebSocket (backward compat with tests)\nexport function setupWebSocket(server: Server, processManager: ProcessManager): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n function broadcast(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN) {\n client.send(serialized);\n }\n }\n }\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcast({ type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcast({ type: 'process', process: processInfo });\n });\n\n wss.on('connection', (socket) => {\n socket.send(\n JSON.stringify({\n type: 'hello',\n processes: processManager.list(),\n logs: processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n\n// Hub-aware WebSocket: each connection is scoped to a workspace via ?workspace=<id>\nexport function setupHubWebSocket(server: Server, hub: Hub): WebSocketServer {\n const wss = new WebSocketServer({\n server,\n path: '/ws',\n verifyClient: (info: { req: IncomingMessage }) => isAllowedWebSocketRequest(info.req)\n });\n\n const clientWorkspaces = new WeakMap<WebSocket, string>();\n const attachedManagers = new Set<string>();\n\n function attachManager(workspaceId: string, processManager: ProcessManager): void {\n if (attachedManagers.has(workspaceId)) {\n return;\n }\n attachedManagers.add(workspaceId);\n\n processManager.on('log', (event: ProcessLogEvent) => {\n broadcastToWorkspace(workspaceId, { type: 'log', event });\n });\n\n processManager.on('process', (processInfo: ManagedProcessSnapshot) => {\n broadcastToWorkspace(workspaceId, { type: 'process', process: processInfo });\n });\n }\n\n function broadcastToWorkspace(workspaceId: string, payload: unknown): void {\n const serialized = JSON.stringify(payload);\n for (const client of wss.clients) {\n if (client.readyState === WebSocket.OPEN && clientWorkspaces.get(client) === workspaceId) {\n client.send(serialized);\n }\n }\n }\n\n wss.on('connection', async (socket, request) => {\n const workspaceId = workspaceIdFromUrl(request.url);\n if (!workspaceId) {\n socket.close(4000, 'Missing workspace query parameter.');\n return;\n }\n\n const entry = await hub.registry.resolve(workspaceId);\n if (!entry) {\n socket.close(4004, 'Workspace not found.');\n return;\n }\n\n const runtime = hub.ensure(entry);\n clientWorkspaces.set(socket, workspaceId);\n attachManager(workspaceId, runtime.processManager);\n\n socket.send(\n JSON.stringify({\n type: 'hello',\n workspace: workspaceId,\n processes: runtime.processManager.list(),\n logs: runtime.processManager.listLogs()\n })\n );\n });\n\n return wss;\n}\n","import { DEFAULT_HOST, DEFAULT_PORT } from '../../server/index.js';\n\nexport async function isHubRunning(port: number = DEFAULT_PORT): Promise<boolean> {\n try {\n const response = await fetch(`http://127.0.0.1:${port}/api/hub/status`, {\n signal: AbortSignal.timeout(2000)\n });\n return response.ok;\n } catch {\n return false;\n }\n}\n\nexport async function registerWorkspaceRemotely(\n dirPath: string,\n port: number = DEFAULT_PORT\n): Promise<{ id: string; name: string } | null> {\n try {\n const sessionResponse = await fetch(`http://127.0.0.1:${port}/api/session`, {\n signal: AbortSignal.timeout(2000)\n });\n if (!sessionResponse.ok) return null;\n const session = (await sessionResponse.json()) as { token: string };\n\n const response = await fetch(`http://127.0.0.1:${port}/api/workspaces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-DevSurface-Intent': 'dashboard',\n 'X-DevSurface-Token': session.token\n },\n body: JSON.stringify({ path: dirPath }),\n signal: AbortSignal.timeout(5000)\n });\n if (!response.ok) return null;\n return (await response.json()) as { id: string; name: string };\n } catch {\n return null;\n }\n}\n\nexport function dashboardUrl(\n workspaceId: string,\n port: number = DEFAULT_PORT,\n host: string = DEFAULT_HOST\n): string {\n const displayHost = host === '0.0.0.0' ? '127.0.0.1' : host;\n return `http://${displayHost}:${port}/?workspace=${workspaceId}`;\n}\n","import pc from 'picocolors';\nimport { startHubServer } from '../../server/index.js';\nimport { DEV_SURFACE_VERSION } from '../../version.js';\n\nexport async function serveCommand(options: {\n port?: number;\n openBrowser?: boolean;\n}): Promise<void> {\n console.log(pc.bold(`DevSurface Hub v${DEV_SURFACE_VERSION}`));\n console.log('Starting hub server...\\n');\n\n const server = await startHubServer({\n port: options.port,\n openBrowser: options.openBrowser\n });\n\n const summaries = await server.hub.listSummaries();\n if (summaries.length > 0) {\n console.log(`Registered workspaces: ${summaries.length}`);\n for (const ws of summaries) {\n console.log(` ${pc.cyan(ws.name)} -> ${ws.path}`);\n }\n } else {\n console.log(\n 'No workspaces registered yet. Use `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n }\n\n console.log(`\\nHub running at -> ${pc.cyan(server.url)}`);\n}\n","import path from 'node:path';\nimport pc from 'picocolors';\nimport { WorkspaceRegistry } from '../../core/hub/registry.js';\n\nexport async function workspaceAddCommand(dirPath?: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const target = path.resolve(dirPath ?? process.cwd());\n const entry = await registry.add(target);\n console.log(`Added workspace ${pc.cyan(entry.name)} (${entry.id}) -> ${entry.path}`);\n}\n\nexport async function workspaceListCommand(): Promise<void> {\n const registry = new WorkspaceRegistry();\n const entries = await registry.list();\n\n if (entries.length === 0) {\n console.log(\n 'No workspaces registered. Run `devsurface workspace add` or `npx devsurface` inside a project.'\n );\n return;\n }\n\n console.log(`${entries.length} workspace${entries.length === 1 ? '' : 's'}:\\n`);\n for (const entry of entries) {\n console.log(` ${pc.cyan(entry.name)} (${entry.id})`);\n console.log(` ${entry.path}`);\n }\n}\n\nexport async function workspaceRemoveCommand(id: string): Promise<void> {\n const registry = new WorkspaceRegistry();\n const removed = await registry.remove(id);\n if (removed) {\n console.log(`Removed workspace ${pc.cyan(id)}.`);\n } else {\n console.error(`Workspace \"${id}\" not found.`);\n process.exitCode = 1;\n }\n}\n","const REGISTRY_LATEST_URL = 'https://registry.npmjs.org/devsurface/latest';\nconst UPDATE_CHECK_TIMEOUT_MS = 900;\n\nexport interface UpdateInfo {\n currentVersion: string;\n latestVersion: string;\n}\n\nfunction parseVersion(version: string): [number, number, number] | null {\n const match = version.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:[-+].*)?$/);\n if (!match) {\n return null;\n }\n\n return [Number(match[1]), Number(match[2]), Number(match[3])];\n}\n\nexport function isNewerVersion(latestVersion: string, currentVersion: string): boolean {\n const latest = parseVersion(latestVersion);\n const current = parseVersion(currentVersion);\n if (latest === null || current === null) {\n return false;\n }\n\n for (let index = 0; index < latest.length; index += 1) {\n if (latest[index] > current[index]) {\n return true;\n }\n if (latest[index] < current[index]) {\n return false;\n }\n }\n\n return false;\n}\n\nexport function formatUpdateNotice(info: UpdateInfo): string {\n return `Update available: v${info.latestVersion}\\nRun: npx devsurface@latest`;\n}\n\nfunction shouldCheckForUpdates(): boolean {\n return process.env.DEVSURFACE_UPDATE_CHECK !== '0' && process.env.CI !== 'true';\n}\n\nexport async function checkForUpdate(\n currentVersion: string,\n fetchImpl: typeof fetch = fetch\n): Promise<UpdateInfo | null> {\n if (!shouldCheckForUpdates()) {\n return null;\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), UPDATE_CHECK_TIMEOUT_MS);\n\n try {\n const response = await fetchImpl(REGISTRY_LATEST_URL, {\n headers: {\n accept: 'application/json'\n },\n signal: controller.signal\n });\n if (!response.ok) {\n return null;\n }\n\n const body = (await response.json()) as { version?: unknown };\n const latestVersion = typeof body.version === 'string' ? body.version : null;\n if (latestVersion === null || !isNewerVersion(latestVersion, currentVersion)) {\n return null;\n }\n\n return {\n currentVersion,\n latestVersion\n };\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport async function printUpdateNotice(currentVersion: string): Promise<void> {\n const update = await checkForUpdate(currentVersion);\n if (update !== null) {\n console.log(`\\n${formatUpdateNotice(update)}`);\n }\n}\n"],"mappings":";;;AACA,SAAS,eAAe;;;ACDxB,OAAO,QAAQ;;;ACAf,SAAS,YAAYA,YAAU;AAC/B,OAAOC,YAAU;;;ACDV,SAAS,wBAAwB,SAA2B;AACjE,QAAM,aAAa,oBAAI,IAAY;AACnC,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,SAAS,gBAAgB;AAClC,eAAW,SAAS,QAAQ,SAAS,KAAK,GAAG;AAC3C,iBAAW,IAAI,MAAM,CAAC,CAAC;AAAA,IACzB;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,UAAU;AAC9B;;;ACpBA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;;;ACDjB,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;;;ACDV,SAAS,cAAc,OAAwB;AACpD,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,KAAK;AACzB,WAAO,IAAI,aAAa,WAAW,IAAI,aAAa;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACLO,IAAM,mBAAmB;AAEzB,IAAM,gBAAkC;AAAA,EAC7C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,UAAU;AAAA,IACR,SAAS;AAAA,IACT,SAAS;AAAA,IACT,MAAM;AAAA,IACN,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,oBAAoB,CAAC,WAAW,WAAW,MAAM;AAAA,IACjD,qBAAqB,CAAC,KAAK;AAAA,IAC3B,qBAAqB,CAAC,QAAQ,MAAM;AAAA,IACpC,OAAO,CAAC,OAAO;AAAA,EACjB;AAAA,EACA,OAAO,CAAC,GAAI;AAAA,EACZ,KAAK;AAAA,IACH,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,YAAY;AAAA,IACV;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM;AACR;;;AF5CO,IAAM,uBAAuB;AAEpC,SAAS,aAAa,MAAc,QAAyB;AAC3D,QAAM,WAAW,KAAK,SAAS,MAAM,MAAM;AAC3C,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,eACP,OACA,UACA,OACoC;AACpC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAS,KAAK,GAAG,KAAK,qBAAqB;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,SAAiC,CAAC;AACxC,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,QAAI,OAAO,QAAQ,UAAU;AAC3B,aAAO,GAAG,IAAI;AAAA,IAChB,OAAO;AACL,eAAS,KAAK,GAAG,KAAK,IAAI,GAAG,oBAAoB;AAAA,IACnD;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAgB,UAA0D;AAC1F,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,KAAK,GAAG;AACpB,aAAS,KAAK,2BAA2B;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,SAAmC,CAAC;AAC1C,aAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,QAAI,MAAM,QAAQ,GAAG,KAAK,IAAI,MAAM,CAAC,UAAU,OAAO,UAAU,QAAQ,GAAG;AACzE,aAAO,GAAG,IAAI;AAAA,IAChB,OAAO;AACL,eAAS,KAAK,UAAU,GAAG,qCAAqC;AAAA,IAClE;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,wBAAwB;AACrC,IAAM,8BAA8B;AAEpC,SAAS,aACP,OACA,UAC4C;AAC5C,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,aAAS,KAAK,yDAAyD;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,QAAwC,CAAC;AAC/C,aAAW,SAAS,OAAO;AACzB,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,QAAQ,SAAS,GAAG;AACtB,cAAM,KAAK,QAAQ,MAAM,GAAG,2BAA2B,CAAC;AAAA,MAC1D;AAAA,IACF,WAAW,SAAS,KAAK,GAAG;AAC1B,UAAI,OAAO,MAAM,UAAU,YAAY,MAAM,MAAM,KAAK,EAAE,WAAW,GAAG;AACtE,iBAAS,KAAK,6DAA6D;AAC3E;AAAA,MACF;AACA,YAAM,OAAuB;AAAA,QAC3B,OAAO,MAAM,MAAM,KAAK,EAAE,MAAM,GAAG,2BAA2B;AAAA,MAChE;AACA,UAAI,OAAO,MAAM,gBAAgB,YAAY,MAAM,YAAY,KAAK,EAAE,SAAS,GAAG;AAChF,aAAK,cAAc,MAAM,YAAY,KAAK,EAAE,MAAM,GAAG,2BAA2B;AAAA,MAClF;AACA,UAAI,OAAO,MAAM,YAAY,YAAY,MAAM,QAAQ,KAAK,EAAE,SAAS,GAAG;AACxE,aAAK,UAAU,MAAM,QAAQ,KAAK;AAAA,MACpC;AACA,UAAI,OAAO,MAAM,WAAW,YAAY,MAAM,OAAO,KAAK,EAAE,SAAS,GAAG;AACtE,aAAK,SAAS,MAAM,OAAO,KAAK;AAAA,MAClC;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,eAAS,KAAK,qDAAqD;AAAA,IACrE;AAAA,EACF;AAEA,MAAI,MAAM,SAAS,uBAAuB;AACxC,aAAS,KAAK,kCAAkC,qBAAqB,SAAS;AAAA,EAChF;AAEA,SAAO,MAAM,MAAM,GAAG,qBAAqB;AAC7C;AAEA,SAAS,QAAQ,OAAgB,UAA0C;AACzE,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,aAAS,KAAK,oCAAoC;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM;AAAA,IAClB,CAAC,SAAyB,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO;AAAA,EACzE;AACA,MAAI,MAAM,WAAW,MAAM,QAAQ;AACjC,aAAS,KAAK,sDAAsD;AAAA,EACtE;AAEA,MAAI,MAAM,SAAS,sBAAsB;AACvC,aAAS,KAAK,6BAA6B,oBAAoB,WAAW;AAAA,EAC5E;AAEA,SAAO,MAAM,MAAM,GAAG,oBAAoB;AAC5C;AAEO,SAAS,eAAe,KAAgE;AAC7F,QAAM,WAAqB,CAAC;AAC5B,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO,EAAE,QAAQ,CAAC,GAAG,UAAU,CAAC,oDAAoD,EAAE;AAAA,EACxF;AAEA,QAAM,MAAM,SAAS,IAAI,GAAG,IACxB;AAAA,IACE,SAAS,OAAO,IAAI,IAAI,YAAY,WAAW,IAAI,IAAI,UAAU;AAAA,IACjE,OAAO,OAAO,IAAI,IAAI,UAAU,WAAW,IAAI,IAAI,QAAQ;AAAA,EAC7D,IACA;AAEJ,MAAI,IAAI,QAAQ,UAAa,CAAC,SAAS,IAAI,GAAG,GAAG;AAC/C,aAAS,KAAK,wBAAwB;AAAA,EACxC;AAEA,QAAM,WAAW,SAAS,IAAI,QAAQ,IAClC;AAAA,IACE,QAAQ,OAAO,IAAI,SAAS,WAAW,YAAY,IAAI,SAAS,SAAS;AAAA,EAC3E,IACA;AAEJ,MAAI,IAAI,aAAa,UAAa,CAAC,SAAS,IAAI,QAAQ,GAAG;AACzD,aAAS,KAAK,6BAA6B;AAAA,EAC7C;AAEA,MAAI;AACJ,MAAI,OAAO,IAAI,SAAS,YAAY,IAAI,KAAK,SAAS,GAAG;AACvD,QAAI,cAAc,IAAI,IAAI,GAAG;AAC3B,aAAO,IAAI;AAAA,IACb,OAAO;AACL,eAAS,KAAK,oCAAoC;AAAA,IACpD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,MACN,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,OAAO;AAAA,MAChD,aAAa,OAAO,IAAI,gBAAgB,WAAW,IAAI,cAAc;AAAA,MACrE,UAAU,eAAe,IAAI,UAAU,UAAU,UAAU;AAAA,MAC3D,QAAQ,SAAS,IAAI,QAAQ,QAAQ;AAAA,MACrC,OAAO,QAAQ,IAAI,OAAO,QAAQ;AAAA,MAClC;AAAA,MACA;AAAA,MACA,YAAY,aAAa,IAAI,cAAc,IAAI,aAAa,QAAQ;AAAA,MACpE;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,WAAW,MAAgD;AAC/E,QAAM,aAAa,KAAK,KAAK,MAAM,gBAAgB;AAEnD,MAAI;AACF,UAAM,CAAC,UAAU,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD,GAAG,SAAS,IAAI;AAAA,MAChB,GAAG,SAAS,UAAU;AAAA,IACxB,CAAC;AACD,QAAI,CAAC,aAAa,UAAU,cAAc,GAAG;AAC3C,aAAO;AAAA,IACT;AACA,UAAM,UAAU,MAAM,GAAG,SAAS,gBAAgB,MAAM;AACxD,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,UAAM,EAAE,QAAQ,SAAS,IAAI,eAAe,MAAM;AAClD,WAAO,EAAE,MAAM,gBAAgB,QAAQ,SAAS;AAAA,EAClD,SAAS,OAAO;AACd,UAAM,OACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QAAQ,MAAM,OAAO;AAChF,QAAI,SAAS,UAAU;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,aAAa;AAChC,aAAO;AAAA,QACL,MAAM;AAAA,QACN,QAAQ,CAAC;AAAA,QACT,UAAU,CAAC,GAAG,gBAAgB,yBAAyB;AAAA,MACzD;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AGlOA,SAAS,YAAYC,WAAU;AAC/B,OAAO,QAAQ;AACf,OAAOC,WAAU;AACjB,OAAO,WAAW;AAClB,SAAS,SAAS,iBAAiB;;;ACJnC,SAAS,iBAAiB;AAC1B,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AAEjB,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,eAAeD,MAAK,QAAQ,IAAI;AACtC,QAAM,iBAAiBA,MAAK,QAAQ,MAAM;AAC1C,QAAM,WAAWA,MAAK,SAAS,cAAc,cAAc;AAC3D,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,YAAY,WAA6B;AAChD,SAAO,UACJ,MAAMA,MAAK,SAAS,EACpB,IAAI,CAAC,UAAU,MAAM,KAAK,EAAE,QAAQ,UAAU,EAAE,CAAC,EACjD,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC;AACvC;AAEA,SAAS,iBAAiB,SAA0B;AAClD,SAAO,QAAQ,SAAS,GAAG,KAAK,QAAQ,SAAS,IAAI;AACvD;AAEA,SAAS,gBAAgB,SAA2B;AAClD,MAAI,QAAQ,aAAa,WAAWA,MAAK,QAAQ,OAAO,GAAG;AACzD,WAAO,CAAC,OAAO;AAAA,EACjB;AAEA,QAAM,cAAc,QAAQ,IAAI,WAAW,uBACxC,MAAM,GAAG,EACT,IAAI,CAAC,cAAc,UAAU,KAAK,EAAE,YAAY,CAAC,EACjD,OAAO,OAAO;AACjB,SAAO,WAAW,IAAI,CAAC,cAAc,GAAG,OAAO,GAAG,SAAS,EAAE;AAC/D;AAEA,eAAe,sBAAsB,MAAc,WAA2C;AAC5F,MAAIC,cAAa,MAAM,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,CAAC,UAAU,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClDF,IAAG,SAAS,IAAI;AAAA,MAChBA,IAAG,SAAS,SAAS;AAAA,IACvB,CAAC;AACD,QAAIE,cAAa,UAAU,aAAa,GAAG;AACzC,aAAO;AAAA,IACT;AAEA,UAAMF,IAAG,OAAO,eAAe,UAAU,IAAI;AAC7C,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,6BACpB,MACA,SACwB;AACxB,MAAIC,MAAK,WAAW,OAAO,KAAK,iBAAiB,OAAO,GAAG;AACzD,WAAO,MAAM,sBAAsB,MAAMA,MAAK,QAAQ,OAAO,CAAC;AAAA,EAChE;AAEA,aAAW,SAAS,YAAY,QAAQ,IAAI,QAAQ,EAAE,GAAG;AACvD,UAAM,YAAYA,MAAK,QAAQ,KAAK;AACpC,QAAIC,cAAa,MAAM,SAAS,GAAG;AACjC;AAAA,IACF;AAEA,eAAW,kBAAkB,gBAAgB,OAAO,GAAG;AACrD,YAAM,aAAa,MAAM,sBAAsB,MAAMD,MAAK,KAAK,WAAW,cAAc,CAAC;AACzF,UAAI,eAAe,MAAM;AACvB,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ADjEA,IAAM,gBAAgB,CAAC,sBAAsB,uBAAuB,eAAe,cAAc;AACjG,IAAM,uBAAuB;AAC7B,IAAM,MAAM,OAAO,aAAa,EAAE;AAClC,IAAM,oBAAoB,IAAI,OAAO,GAAG,GAAG,wBAAwB,GAAG;AA6C/D,IAAM,uBAAN,cAAmC,MAAM;AAAA,EAC9C,YACkB,MAChB,SACA;AACA,UAAM,OAAO;AAHG;AAIhB,SAAK,OAAO;AAAA,EACd;AAAA,EALkB;AAMpB;AAEA,SAASE,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWC,MAAK,SAASA,MAAK,QAAQ,IAAI,GAAGA,MAAK,QAAQ,MAAM,CAAC;AACvE,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,aAAa,CAAC,GAAG,QAAQ,GAAG,GAAG,OAAO,GAAGA,MAAK,MAAMA,MAAK,QAAQ,IAAI,CAAC,EAAE,IAAI;AAClF,SAAO,WAAW,KAAK,CAAC,cAAc,CAACD,cAAa,MAAM,SAAS,CAAC,KAAK,GAAG,QAAQ;AACtF;AAEA,SAAS,cAAc,SAAiB,OAAe,OAAuB;AAC5E,QAAM,WAAW,UAAU;AAC3B,SAAO,SAAS,UAAU,QAAQ,WAAW,SAAS,MAAM,CAAC,KAAK;AACpE;AAEO,IAAM,mBAAwC,OAAO,MAAM,MAAM,UAAU,CAAC,MAAM;AACvF,QAAM,mBAAmB,MAAM,6BAA6B,MAAM,QAAQ;AAC1E,MAAI,qBAAqB,MAAM;AAC7B,WAAO,EAAE,MAAM,MAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,YAAY;AAAA,EAClE;AAEA,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,cAAc,QAAQ,eAAe;AAE3C,SAAO,MAAM,IAAI,QAAQ,CAAC,YAAY;AACpC,UAAM,QAAQ,MAAM,kBAAkB,MAAM;AAAA,MAC1C,KAAK,iBAAiB,IAAI;AAAA,MAC1B,aAAa;AAAA,IACf,CAAC;AACD,QAAI,UAAU;AACd,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,UAAM,SAAS,CAAC,WAAgC;AAC9C,UAAI,SAAS;AACX;AAAA,MACF;AACA,gBAAU;AACV,mBAAa,OAAO;AACpB,cAAQ,MAAM;AAAA,IAChB;AAEA,UAAM,UAAU,WAAW,MAAM;AAC/B,YAAM,KAAK;AACX,aAAO,EAAE,MAAM,MAAM,QAAQ,QAAQ,OAAO,UAAU,CAAC;AAAA,IACzD,GAAG,SAAS;AAEZ,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,eAAS,cAAc,QAAQ,MAAM,SAAS,GAAG,WAAW;AAAA,IAC9D,CAAC;AACD,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,eAAS,cAAc,QAAQ,MAAM,SAAS,GAAG,WAAW;AAAA,IAC9D,CAAC;AACD,UAAM,GAAG,SAAS,MAAM;AACtB,aAAO,EAAE,MAAM,MAAM,QAAQ,QAAQ,OAAO,QAAQ,CAAC;AAAA,IACvD,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,aAAO,EAAE,MAAM,QAAQ,QAAQ,OAAO,KAAK,CAAC;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,iBAAiB,MAAiC;AAC/D,QAAM,eAAe,MAAME,IAAG,SAAS,IAAI,EAAE,MAAM,MAAMD,MAAK,QAAQ,IAAI,CAAC;AAC3E,QAAM,UAAoB,CAAC;AAE3B,aAAW,QAAQ,eAAe;AAChC,UAAM,YAAYA,MAAK,KAAK,MAAM,IAAI;AACtC,QAAI;AACF,YAAM,CAAC,MAAM,aAAa,IAAI,MAAM,QAAQ,IAAI,CAACC,IAAG,KAAK,SAAS,GAAGA,IAAG,SAAS,SAAS,CAAC,CAAC;AAC5F,UAAI,KAAK,OAAO,KAAKF,cAAa,cAAc,aAAa,GAAG;AAC9D,gBAAQ,KAAK,aAAa;AAAA,MAC5B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,cAA2C;AAC9E,QAAM,QAAQ,oBAAI,IAAY;AAE9B,aAAW,eAAe,cAAc;AACtC,QAAI;AACF,YAAM,SAAS,UAAU,MAAME,IAAG,SAAS,aAAa,MAAM,CAAC;AAC/D,UACE,OAAO,WAAW,YAClB,WAAW,QACX,EAAE,cAAc,WAChB,OAAO,OAAO,aAAa,YAC3B,OAAO,aAAa,QACpB,MAAM,QAAQ,OAAO,QAAQ,GAC7B;AACA;AAAA,MACF;AAEA,iBAAW,QAAQ,OAAO,KAAK,OAAO,QAAQ,GAAG;AAC/C,YAAI,KAAK,SAAS,GAAG;AACnB,gBAAM,IAAI,IAAI;AAAA,QAChB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,SAAS,YAAY,MAAc,cAAwB,MAA0B;AACnF,SAAO;AAAA,IACL;AAAA,IACA,GAAG,aAAa,QAAQ,CAAC,gBAAgB,CAAC,MAAM,WAAW,CAAC;AAAA,IAC5D;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,mBAAmB,EAAE,EAAE,KAAK,EAAE,MAAM,IAAK;AAChE;AAEA,SAAS,cAAc,QAAqC;AAC1D,SAAO,aAAa,OAAO,UAAU,OAAO,MAAM;AACpD;AAEA,SAAS,aACP,QACAC,WAKA;AACA,MAAI,OAAO,UAAU,aAAa;AAChC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO,EAAE,QAAQ,WAAW,SAAS,MAAM,SAAS,KAAK;AAAA,EAC3D;AAEA,MAAIA,cAAa,WAAWA,cAAa,UAAU;AACjD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,SACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,SAAS,cAAc,MAAM;AACnC,SAAO;AAAA,IACL,QAAQ,OAAO,UAAU,YAAY,YAAY;AAAA,IACjD,SAAS;AAAA,IACT,SAAS,SACL,0DAA0D,MAAM,KAChE;AAAA,EACN;AACF;AAEA,SAAS,gBAAgB,QAAgD;AACvE,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,OAAO,aAAa,YAAY,QAAQ,KAAK,OAAO,QAAQ,GAAG;AACxE,WAAO,OAAO,OAAO,QAAQ;AAAA,EAC/B;AACA,MAAI,OAAO,OAAO,WAAW,UAAU;AACrC,UAAM,QAAQ,wBAAwB,KAAK,OAAO,MAAM;AACxD,QAAI,QAAQ,CAAC,GAAG;AACd,aAAO,OAAO,MAAM,CAAC,CAAC;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,QAAsD;AAClF,QAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM,YAAY,IAAI;AAC9E,QAAM,WAAW,gBAAgB,MAAM;AAEvC,MAAI,UAAU,WAAW;AACvB,WAAO;AAAA,EACT;AACA,MAAI,aAAa,QAAQ,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,aAAa,UAAU,YAAY,UAAU,WAAW;AACpE,WAAO;AAAA,EACT;AACA,MAAI,UAAU,UAAU,UAAU,gBAAgB,UAAU,UAAU;AACpE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,UAA0C,KAAoB;AACzF,MAAI,OAAO,QAAQ,YAAY,QAAQ,MAAM;AAC3C;AAAA,EACF;AAEA,QAAM,SAAS;AACf,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC;AAAA,EACF;AAEA,QAAM,SACJ,OAAO,OAAO,WAAW,YAAY,OAAO,OAAO,KAAK,IACpD,OAAO,OAAO,KAAK,IACnB,OAAO,OAAO,UAAU,YAAY,OAAO,MAAM,KAAK,IACpD,OAAO,MAAM,KAAK,IAClB;AAER,WAAS,IAAI,OAAO,SAAS;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,QAAQ,qBAAqB,MAAM;AAAA,IACnC,cAAc;AAAA,IACd,aAAa,OAAO,OAAO,OAAO,YAAY,OAAO,GAAG,SAAS,IAAI,OAAO,KAAK;AAAA,EACnF,CAAC;AACH;AAEA,SAAS,eAAe,QAAgD;AACtE,QAAM,WAAW,oBAAI,IAA+B;AACpD,QAAM,gBAAgB,OAAO,KAAK;AAClC,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,aAAa;AACvC,eAAW,OAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG;AAC3D,0BAAoB,UAAU,GAAG;AAAA,IACnC;AACA,WAAO;AAAA,EACT,QAAQ;AAAA,EAER;AAEA,aAAW,QAAQ,cAAc,MAAM,OAAO,GAAG;AAC/C,QAAI;AACF,0BAAoB,UAAU,KAAK,MAAM,IAAI,CAAY;AAAA,IAC3D,QAAQ;AACN,aAAO,oBAAI,IAAI;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,cAA6C;AACpE,SAAO,aAAa,IAAI,CAAC,UAAU;AAAA,IACjC;AAAA,IACA,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,aAAa;AAAA,EACf,EAAE;AACJ;AAEA,SAAS,sBAAsB,QAAgB,QAAqC;AAClF,QAAM,SAAS,cAAc,MAAM;AACnC,SAAO,SAAS,kBAAkB,MAAM,YAAY,MAAM,KAAK,kBAAkB,MAAM;AACzF;AAEO,IAAM,0BAAN,MAA0D;AAAA,EAI/D,YACmB,MACjB,UAGI,CAAC,GACL;AALiB;AAMjB,SAAK,SAAS,QAAQ,UAAU;AAChC,SAAK,WAAW,QAAQ,YAAY,QAAQ;AAAA,EAC9C;AAAA,EARmB;AAAA,EAJF;AAAA,EACA;AAAA,EAajB,MAAc,aAGJ;AACR,UAAM,eAAe,MAAM,iBAAiB,KAAK,IAAI;AACrD,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,MAAM,sBAAsB,YAAY;AAAA,IACxD;AAAA,EACF;AAAA,EAEA,MAAc,eAAe,SAG1B;AACD,UAAM,aAAa,MAAM,KAAK,WAAW;AACzC,QAAI,eAAe,MAAM;AACvB,YAAM,IAAI,qBAAqB,qBAAqB,mCAAmC;AAAA,IACzF;AACA,QAAI,CAAC,WAAW,aAAa,SAAS,OAAO,GAAG;AAC9C,YAAM,IAAI;AAAA,QACR;AAAA,QACA,2BAA2B,OAAO;AAAA,MACpC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,gBAA+B;AAC3C,UAAM,SAAS,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC,MAAM,GAAG,EAAE,WAAW,IAAK,CAAC;AACzE,UAAM,SAAS,aAAa,QAAQ,KAAK,QAAQ;AACjD,QAAI,OAAO,WAAW,iBAAiB;AACrC,YAAM,IAAI,qBAAqB,wBAAwB,OAAO,WAAW,mBAAmB;AAAA,IAC9F;AACA,QAAI,CAAC,OAAO,SAAS;AACnB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,OAAO,WAAW;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAsC;AAC1C,UAAM,aAAa,MAAM,KAAK,WAAW;AACzC,QAAI,eAAe,MAAM;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM,KAAK,OAAO,KAAK,MAAM,CAAC,MAAM,GAAG,EAAE,WAAW,IAAK,CAAC;AAC7E,UAAM,SAAS,aAAa,YAAY,KAAK,QAAQ;AACrD,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO;AAAA,QACL,cAAc,WAAW;AAAA,QACzB,UAAU,gBAAgB,WAAW,YAAY;AAAA,QACjD,eAAe;AAAA,QACf,cAAc,OAAO;AAAA,QACrB,SAAS,OAAO;AAAA,MAClB;AAAA,IACF;AAEA,UAAM,KAAK,MAAM,KAAK;AAAA,MACpB,KAAK;AAAA,MACL,YAAY,KAAK,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,YAAY,MAAM,CAAC;AAAA,MACnF,EAAE,WAAW,IAAK;AAAA,IACpB;AACA,QAAI,GAAG,SAAS,KAAK,GAAG,UAAU,MAAM;AACtC,aAAO;AAAA,QACL,cAAc,WAAW;AAAA,QACzB,UAAU,WAAW,aAAa,IAAI,CAAC,UAAU;AAAA,UAC/C;AAAA,UACA,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,aAAa;AAAA,QACf,EAAE;AAAA,QACF,eAAe;AAAA,QACf,cAAc;AAAA,QACd,SAAS,sBAAsB,gBAAgB,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,WAAW,eAAe,GAAG,MAAM;AACzC,WAAO;AAAA,MACL,cAAc,WAAW;AAAA,MACzB,UAAU,WAAW,aAAa;AAAA,QAChC,CAAC,SACC,SAAS,IAAI,IAAI,KAAK;AAAA,UACpB;AAAA,UACA,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,aAAa;AAAA,QACf;AAAA,MACJ;AAAA,MACA,eAAe;AAAA,MACf,cAAc;AAAA,MACd,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,SAAiB,QAAuD;AAC3F,UAAM,aAAa,MAAM,KAAK,eAAe,OAAO;AACpD,UAAM,KAAK,cAAc;AACzB,UAAM,iBACJ,WAAW,UAAU,CAAC,MAAM,MAAM,MAAM,OAAO,IAAI,CAAC,QAAQ,MAAM,OAAO;AAC3E,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,KAAK;AAAA,MACL,YAAY,KAAK,MAAM,WAAW,cAAc,cAAc;AAAA,MAC9D,EAAE,WAAW,IAAO;AAAA,IACtB;AACA,QAAI,OAAO,SAAS,KAAK,OAAO,UAAU,MAAM;AAC9C,YAAM,IAAI,qBAAqB,kBAAkB,sBAAsB,QAAQ,MAAM,CAAC;AAAA,IACxF;AACA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,QAAQ,aAAa,OAAO,UAAU,OAAO,MAAM;AAAA,IACrD;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,SAA8C;AACxD,WAAO,MAAM,KAAK,OAAO,SAAS,OAAO;AAAA,EAC3C;AAAA,EAEA,MAAM,KAAK,SAA8C;AACvD,WAAO,MAAM,KAAK,OAAO,SAAS,MAAM;AAAA,EAC1C;AAAA,EAEA,MAAM,KAAK,SAA4C;AACrD,UAAM,aAAa,MAAM,KAAK,eAAe,OAAO;AACpD,UAAM,KAAK,cAAc;AACzB,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB,KAAK;AAAA,MACL,YAAY,KAAK,MAAM,WAAW,cAAc;AAAA,QAC9C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,EAAE,WAAW,MAAQ,aAAa,qBAAqB;AAAA,IACzD;AACA,QAAI,OAAO,SAAS,KAAK,OAAO,UAAU,MAAM;AAC9C,YAAM,IAAI,qBAAqB,kBAAkB,sBAAsB,QAAQ,MAAM,CAAC;AAAA,IACxF;AACA,WAAO;AAAA,MACL;AAAA,MACA,MAAM,cAAc,IAAI,GAAG,OAAO,MAAM,GAAG,OAAO,MAAM,IAAI,oBAAoB;AAAA,IAClF;AAAA,EACF;AACF;;;AEzfA,eAAsB,aAAa,MAA0C;AAC3E,SAAO,MAAM,IAAI,wBAAwB,IAAI,EAAE,QAAQ;AACzD;;;ACLA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AAQjB,eAAe,cAAc,UAA0C;AACrE,MAAI;AACF,WAAO,MAAMD,IAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,MAAc,gBAAuC;AAC9E,QAAM,eAAeC,MAAK,QAAQ,IAAI;AACtC,QAAM,eAAeA,MAAK,QAAQ,cAAc,cAAc;AAC9D,QAAM,WAAWA,MAAK,SAAS,cAAc,YAAY;AACzD,QAAM,aAAa,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AAC9F,SAAO,aAAa,eAAe;AACrC;AAEA,eAAe,0BACb,MACA,gBACwB;AACxB,QAAM,YAAY,kBAAkB,MAAM,cAAc;AACxD,MAAI,cAAc,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,CAAC,UAAU,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA,MAClDD,IAAG,SAAS,IAAI;AAAA,MAChBA,IAAG,SAAS,SAAS;AAAA,IACvB,CAAC;AACD,UAAM,WAAWC,MAAK,SAAS,UAAU,aAAa;AACtD,UAAM,aACJ,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AAC7E,WAAO,aAAa,YAAY;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,SAA4B;AACvD,QAAM,OAAiB,CAAC;AACxB,QAAM,YAAsB,CAAC;AAE7B,aAAW,WAAW,QAAQ,MAAM,OAAO,GAAG;AAC5C,UAAM,OAAO,QAAQ,KAAK;AAC1B,QAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,GAAG;AACjC;AAAA,IACF;AAEA,UAAM,aAAa,KAAK,WAAW,SAAS,IAAI,KAAK,MAAM,UAAU,MAAM,EAAE,KAAK,IAAI;AACtF,UAAM,YAAY,WAAW,QAAQ,GAAG;AACxC,QAAI,aAAa,GAAG;AAClB;AAAA,IACF;AAEA,UAAM,MAAM,WAAW,MAAM,GAAG,SAAS,EAAE,KAAK;AAChD,UAAM,QAAQ,WAAW,MAAM,YAAY,CAAC,EAAE,KAAK;AACnD,QAAI,2BAA2B,KAAK,GAAG,GAAG;AACxC,WAAK,KAAK,GAAG;AACb,UAAI,MAAM,WAAW,KAAK,UAAU,QAAQ,UAAU,MAAM;AAC1D,kBAAU,KAAK,GAAG;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,WAAW,MAAM,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE;AACtF;AAEA,eAAsB,UACpB,MACA,QACyB;AACzB,QAAM,cAAc,QAAQ,KAAK,WAAW;AAC5C,QAAM,YAAY,QAAQ,KAAK,SAAS;AACxC,QAAM,CAAC,aAAa,SAAS,IAAI,MAAM,QAAQ,IAAI;AAAA,IACjD,0BAA0B,MAAM,WAAW;AAAA,IAC3C,0BAA0B,MAAM,SAAS;AAAA,EAC3C,CAAC;AACD,QAAM,CAAC,gBAAgB,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,gBAAgB,OAAO,OAAO,cAAc,WAAW;AAAA,IACvD,cAAc,OAAO,OAAO,cAAc,SAAS;AAAA,EACrD,CAAC;AAED,MAAI,mBAAmB,QAAQ,iBAAiB,MAAM;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,UACJ,mBAAmB,OAAO,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,IAAI,aAAa,cAAc;AACrF,QAAM,QAAQ,iBAAiB,OAAO,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,IAAI,aAAa,YAAY;AAC7F,QAAM,cAAc,IAAI,IAAI,MAAM,IAAI;AACtC,QAAM,gBAAgB,IAAI,IAAI,MAAM,SAAS;AAC7C,QAAM,cAAc,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG,CAAC;AACtE,QAAM,YAAY,MAAM,KAAK,OAAO,CAAC,QAAQ,cAAc,IAAI,GAAG,CAAC;AAEnE,SAAO;AAAA,IACL,aAAa,mBAAmB,OAAO,OAAO;AAAA,IAC9C,WAAW,iBAAiB,OAAO,OAAO;AAAA,IAC1C,YAAY,mBAAmB;AAAA,IAC/B,UAAU,iBAAiB;AAAA,IAC3B,aAAa,QAAQ;AAAA,IACrB,WAAW,MAAM;AAAA,IACjB;AAAA,IACA;AAAA,IACA,MAAM,QAAQ,KAAK,IAAI,CAAC,SAAS;AAAA,MAC/B;AAAA,MACA,SAAS,YAAY,IAAI,GAAG;AAAA,MAC5B,OAAO,cAAc,IAAI,GAAG;AAAA,IAC9B,EAAE;AAAA,EACJ;AACF;;;ACrHA,IAAM,oBAAmE;AAAA,EACvE,EAAE,aAAa,QAAQ,OAAO,UAAU;AAAA,EACxC,EAAE,aAAa,QAAQ,OAAO,OAAO;AAAA,EACrC,EAAE,aAAa,WAAW,OAAO,UAAU;AAAA,EAC3C,EAAE,aAAa,WAAW,OAAO,UAAU;AAAA,EAC3C,EAAE,aAAa,gBAAgB,OAAO,SAAS;AAAA,EAC/C,EAAE,aAAa,oBAAoB,OAAO,QAAQ;AAAA,EAClD,EAAE,aAAa,UAAU,OAAO,SAAS;AAC3C;AAEO,SAAS,gBAAgB,aAA2D;AACzF,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,eAAe;AAAA,IACnB,GAAG,YAAY,KAAK;AAAA,IACpB,GAAG,YAAY,KAAK;AAAA,IACpB,GAAG,YAAY,KAAK;AAAA,IACpB,GAAG,YAAY,KAAK;AAAA,EACtB;AAEA,QAAM,WAAW,kBACd,OAAO,CAAC,cAAc,aAAa,UAAU,WAAW,MAAM,MAAS,EACvE,IAAI,CAAC,cAAc,UAAU,KAAK;AAErC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,CAAC,SAAS;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,CAAC,WAAW,GAAG,QAAQ,EAAE,KAAK,KAAK;AAAA,IACzC;AAAA,EACF;AACF;;;ACvCA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AAGjB,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,eAAeD,MAAK,QAAQ,IAAI;AACtC,QAAM,iBAAiBA,MAAK,QAAQ,MAAM;AAC1C,QAAM,WAAWA,MAAK,SAAS,cAAc,cAAc;AAC3D,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AACpF;AAEA,eAAe,oBAAoB,MAAsC;AACvE,QAAM,UAAUA,MAAK,KAAK,MAAM,MAAM;AAEtC,MAAI;AACF,UAAM,OAAO,MAAMD,IAAG,KAAK,OAAO;AAClC,QAAI,KAAK,YAAY,GAAG;AACtB,aAAO;AAAA,IACT;AAEA,QAAI,KAAK,OAAO,GAAG;AACjB,YAAM,UAAU,MAAMA,IAAG,SAAS,SAAS,MAAM;AACjD,YAAM,QAAQ,QAAQ,MAAM,sBAAsB;AAClD,UAAI,OAAO;AACT,cAAM,SAAS,MAAM,CAAC,EAAE,KAAK;AAC7B,cAAM,iBAAiBC,MAAK,WAAW,MAAM,IACzCA,MAAK,QAAQ,MAAM,IACnBA,MAAK,QAAQ,MAAM,MAAM;AAC7B,YAAI,CAACC,cAAa,MAAM,cAAc,GAAG;AACvC,iBAAO;AAAA,QACT;AAEA,cAAM,CAAC,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC/CF,IAAG,SAAS,IAAI;AAAA,UAChBA,IAAG,SAAS,cAAc;AAAA,QAC5B,CAAC;AACD,eAAOE,cAAa,UAAU,UAAU,IAAI,iBAAiB;AAAA,MAC/D;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,UAAU,MAAuC;AACrE,QAAM,UAAU,MAAM,oBAAoB,IAAI;AAC9C,MAAI,YAAY,MAAM;AACpB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,OAAO,MAAMF,IAAG,SAASC,MAAK,KAAK,SAAS,MAAM,GAAG,MAAM;AACjE,UAAM,WAAW,KAAK,MAAM,+BAA+B;AAC3D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,WAAW,SAAS,CAAC,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE;AAAA,IAC1D;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACF;;;ACjEA,SAAS,YAAYE,WAAU;AAC/B,OAAOC,WAAU;AAGjB,IAAM,gBAA4E;AAAA,EAChF,EAAE,UAAU,UAAU,YAAY,CAAC,oBAAoB,kBAAkB,SAAS,EAAE;AAAA,EACpF,EAAE,UAAU,MAAM,YAAY,CAAC,QAAQ,EAAE;AAAA,EACzC,EAAE,UAAU,QAAQ,YAAY,CAAC,WAAW,gBAAgB,kBAAkB,EAAE;AAClF;AAEA,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWD,MAAK,SAASA,MAAK,QAAQ,IAAI,GAAGA,MAAK,QAAQ,MAAM,CAAC;AACvE,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AACpF;AAEA,eAAe,SAAS,MAAc,WAA2C;AAC/E,QAAM,WAAWA,MAAK,KAAK,MAAM,SAAS;AAC1C,MAAI;AACF,UAAM,CAAC,UAAU,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnDD,IAAG,SAAS,IAAI;AAAA,MAChBA,IAAG,KAAK,QAAQ;AAAA,MAChBA,IAAG,SAAS,QAAQ;AAAA,IACtB,CAAC;AACD,QAAI,KAAK,OAAO,KAAKE,cAAa,UAAU,QAAQ,GAAG;AACrD,aAAO;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAsB,sBACpB,MACA,aAC8B;AAC9B,QAAM,WAA8B,CAAC;AACrC,QAAM,QAAkB,CAAC;AAEzB,MAAI,gBAAgB,MAAM;AACxB,aAAS,KAAK,MAAM;AACpB,UAAM,KAAK,YAAY,IAAI;AAAA,EAC7B;AAEA,aAAW,cAAc,eAAe;AACtC,QAAI,QAAQ;AACZ,eAAW,aAAa,WAAW,YAAY;AAC7C,YAAM,OAAO,MAAM,SAAS,MAAM,SAAS;AAC3C,UAAI,SAAS,MAAM;AACjB,gBAAQ;AACR,cAAM,KAAK,IAAI;AAAA,MACjB;AAAA,IACF;AACA,QAAI,OAAO;AACT,eAAS,KAAK,WAAW,QAAQ;AAAA,IACnC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS,SAAS,CAAC,KAAK;AAAA,IACxB;AAAA,IACA;AAAA,EACF;AACF;;;AC/DA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AAGjB,IAAM,YAA8D;AAAA,EAClE,EAAE,MAAM,kBAAkB,SAAS,OAAO;AAAA,EAC1C,EAAE,MAAM,aAAa,SAAS,OAAO;AAAA,EACrC,EAAE,MAAM,aAAa,SAAS,MAAM;AAAA,EACpC,EAAE,MAAM,YAAY,SAAS,MAAM;AAAA,EACnC,EAAE,MAAM,qBAAqB,SAAS,MAAM;AAC9C;AAEA,eAAe,OAAO,UAAoC;AACxD,MAAI;AACF,UAAMD,IAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,qBAAqB,MAA8C;AACvF,aAAW,YAAY,WAAW;AAChC,QAAI,MAAM,OAAOC,MAAK,KAAK,MAAM,SAAS,IAAI,CAAC,GAAG;AAChD,aAAO,SAAS;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;;;AC7BA,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AAGjB,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWD,MAAK,SAAS,MAAM,MAAM;AAC3C,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,MAAK,WAAW,QAAQ;AACpF;AAEA,eAAsB,gBAAgB,MAA+C;AACnF,QAAM,kBAAkBA,MAAK,KAAK,MAAM,cAAc;AAEtD,MAAI;AACF,UAAM,CAAC,UAAU,mBAAmB,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxDD,IAAG,SAAS,IAAI;AAAA,MAChBA,IAAG,SAAS,eAAe;AAAA,IAC7B,CAAC;AACD,QAAI,CAACE,cAAa,UAAU,mBAAmB,GAAG;AAChD,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,MAAMF,IAAG,SAAS,qBAAqB,MAAM;AAC7D,UAAM,OAAO,KAAK,MAAM,OAAO;AAC/B,WAAO,EAAE,MAAM,qBAAqB,KAAK;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC3BA,OAAO,SAAS;AAIT,IAAM,kBAAkB;AACxB,IAAM,yBAAyB;AAEtC,SAAS,YAAY,OAA2B;AAC9C,SAAO,MAAM;AAAA,IACX,IAAI,IAAI,MAAM,OAAO,CAAC,SAAS,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,EACpF;AACF;AAEO,SAAS,sBAAsB,SAA2C;AAC/E,QAAM,QAAkB,CAAC;AAEzB,aAAW,WAAW,OAAO,OAAO,OAAO,GAAG;AAC5C,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,eAAW,WAAW,UAAU;AAC9B,iBAAW,SAAS,QAAQ,SAAS,OAAO,GAAG;AAC7C,cAAM,KAAK,OAAO,MAAM,CAAC,CAAC,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,YAAY,KAAK;AAC1B;AAEO,SAAS,yBAAyB,WAA2C;AAClF,MAAI,cAAc,MAAM;AACtB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU,SAAS,SAAS,SAAS,KAAK,UAAU,SAAS,SAAS,SAAS,GAAG;AACpF,UAAM,KAAK,GAAI;AAAA,EACjB;AAEA,MAAI,UAAU,SAAS,SAAS,MAAM,GAAG;AACvC,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,MAAI,UAAU,SAAS,SAAS,QAAQ,GAAG;AACzC,UAAM,KAAK,IAAI;AAAA,EACjB;AAEA,SAAO,YAAY,KAAK;AAC1B;AAEA,eAAsB,UAAU,MAAkC;AAChE,SAAO,MAAM,IAAI,QAAQ,CAAC,YAAY;AACpC,UAAM,SAAS,IAAI,aAAa;AAEhC,WAAO,KAAK,SAAS,MAAM;AACzB,cAAQ,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,IAC/B,CAAC;AAED,WAAO,KAAK,aAAa,MAAM;AAC7B,aAAO,MAAM,MAAM;AACjB,gBAAQ,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,MAChC,CAAC;AAAA,IACH,CAAC;AAED,WAAO,OAAO,MAAM,WAAW;AAAA,EACjC,CAAC;AACH;AAEA,eAAsB,YAAY,OAA8C;AAC9E,QAAM,aAAa,YAAY,KAAK,EAAE,MAAM,GAAG,eAAe;AAC9D,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,QAAM,UAAuB,CAAC;AAC9B,MAAI,YAAY;AAEhB,iBAAe,SAAwB;AACrC,WAAO,YAAY,WAAW,QAAQ;AACpC,YAAM,OAAO,WAAW,SAAS;AACjC,mBAAa;AACb,cAAQ,KAAK,MAAM,UAAU,IAAI,CAAC;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,QAAQ;AAAA,IACZ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,wBAAwB,WAAW,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC;AAAA,EAC5F;AAEA,SAAO,QAAQ;AAAA,IACb,CAAC,MAAM,UAAU,WAAW,QAAQ,KAAK,IAAI,IAAI,WAAW,QAAQ,MAAM,IAAI;AAAA,EAChF;AACF;;;ACjGA,SAAS,YAAYG,WAAU;AAC/B,OAAOC,WAAU;AASjB,SAAS,gBAAgB,aAAkD;AACzE,QAAM,OAAO,aAAa;AAC1B,SAAO,IAAI;AAAA,IACT,OAAO,KAAK;AAAA,MACV,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,MACT,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,EACH;AACF;AAEA,SAAS,iBAAiB,cAA2B,OAA0B;AAC7E,SAAO,MAAM,KAAK,CAAC,SAAS,aAAa,IAAI,IAAI,CAAC;AACpD;AAEA,eAAeC,eAAc,MAAc,WAA2C;AACpF,QAAM,WAAWD,MAAK,KAAK,MAAM,SAAS;AAC1C,MAAI;AACF,UAAM,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI,CAACD,IAAG,SAAS,IAAI,GAAGA,IAAG,SAAS,QAAQ,CAAC,CAAC;AACzF,UAAM,WAAWC,MAAK,SAAS,UAAU,QAAQ;AACjD,QAAI,SAAS,WAAW,IAAI,KAAKA,MAAK,WAAW,QAAQ,GAAG;AAC1D,aAAO;AAAA,IACT;AACA,WAAO,MAAMD,IAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,OAAgC;AACtD,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,UAAU,MAAM,YAAY,CAAC;AAAA,IAC7B,QAAQ,MAAM,UAAU,CAAC;AAAA,IACzB,OAAO,MAAM,SAAS,CAAC;AAAA,EACzB;AACF;AAEA,SAAS,YACP,WACA,aACc;AACd,QAAM,WAAW,IAAI,IAAI,WAAW,YAAY,CAAC,CAAC;AAClD,QAAM,eAAe,gBAAgB,WAAW;AAChD,QAAM,UAAyB,CAAC;AAEhC,MAAI,SAAS,IAAI,SAAS,GAAG;AAC3B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,cAAc;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,QACN,WAAW,CAAC,YAAY,cAAc,YAAY;AAAA,MACpD;AAAA,MACA,OAAO,CAAC,GAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,IAAI,MAAM,GAAG;AACxB,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,gBAAgB;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,QACN,MAAM,CAAC,YAAY,cAAc,cAAc;AAAA,MACjD;AAAA,MACA,OAAO,CAAC,MAAM,IAAI;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,IAAI,QAAQ,GAAG;AAC1B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,cAAc;AAAA,QACd,cAAc;AAAA,MAChB;AAAA,MACA,QAAQ;AAAA,QACN,QAAQ,CAAC,cAAc,YAAY;AAAA,MACrC;AAAA,MACA,OAAO,CAAC,GAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,IAAI,OAAO,GAAG;AACzB,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,aAAa;AAAA,QACb,eAAe;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,QACN,OAAO,CAAC,aAAa,aAAa;AAAA,MACpC;AAAA,MACA,OAAO,CAAC,IAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG;AACtD,YAAQ,KAAK;AAAA,MACX,MAAM,SAAS,IAAI,SAAS,IAAI,YAAY;AAAA,MAC5C,OAAO,SAAS,IAAI,SAAS,IAAI,YAAY;AAAA,MAC7C,OAAO,CAAC,GAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,IAAI,QAAQ,KAAK,iBAAiB,cAAc,CAAC,UAAU,gBAAgB,CAAC,GAAG;AAC1F,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,kBAAkB;AAAA,QAClB,iBAAiB;AAAA,MACnB;AAAA,MACA,QAAQ;AAAA,QACN,UAAU,CAAC,kBAAkB,eAAe;AAAA,MAC9C;AAAA,MACA,OAAO,CAAC,IAAI;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,IAAI,cAAc;AACnC;AAEA,eAAe,cAAc,MAAc,UAAsD;AAC/F,MAAI,CAAC,SAAS,SAAS,SAAS,QAAQ,GAAG;AACzC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,CAAC,cAAc,WAAW,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC3DE,eAAc,MAAM,kBAAkB;AAAA,IACtCA,eAAc,MAAM,gBAAgB;AAAA,IACpCA,eAAc,MAAM,SAAS;AAAA,EAC/B,CAAC;AACD,QAAM,WAAW,CAAC,cAAc,WAAW,OAAO,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI,EAAE,YAAY;AAC3F,QAAM,WAAmC,CAAC;AAC1C,QAAM,SAAmC,CAAC;AAC1C,QAAM,QAAkB,CAAC;AAEzB,MAAI,iBAAiB,MAAM;AACzB,aAAS,gBAAgB,IAAI;AAC7B,WAAO,QAAQ,CAAC,gBAAgB;AAAA,EAClC;AAEA,MAAI,SAAS,SAAS,SAAS,KAAK,SAAS,SAAS,SAAS,GAAG;AAChE,aAAS,YAAY,IAAI;AACzB,WAAO,SAAS,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,YAAY;AACvD,UAAM,KAAK,GAAI;AAAA,EACjB;AAEA,MAAI,SAAS,SAAS,OAAO,GAAG;AAC9B,aAAS,WAAW,IAAI;AACxB,WAAO,SAAS,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,WAAW;AACtD,UAAM,KAAK,GAAI;AAAA,EACjB;AAEA,MAAI,SAAS,SAAS,QAAQ,KAAM,MAAMA,eAAc,MAAM,WAAW,MAAO,MAAM;AACpF,aAAS,YAAY,IAAI;AACzB,aAAS,gBAAgB,IAAI;AAC7B,WAAO,SAAS,CAAC,GAAI,OAAO,UAAU,CAAC,GAAI,cAAc,gBAAgB;AACzE,UAAM,KAAK,GAAI;AAAA,EACjB;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,UAAU,UAA6C;AAC9D,MAAI,CAAC,SAAS,SAAS,SAAS,IAAI,GAAG;AACrC,WAAO,CAAC;AAAA,EACV;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,MACP,UAAU;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,QACN,IAAI,CAAC,UAAU,YAAY,SAAS;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,eAAe,YAAY,UAAsD;AAC/E,MAAI,CAAC,SAAS,SAAS,SAAS,MAAM,GAAG;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,SAAS,MAAM,KAAK,CAAC,SAASD,MAAK,SAAS,IAAI,MAAM,SAAS;AAChF,QAAM,YAAY,SAAS,MAAM,KAAK,CAAC,SAASA,MAAK,SAAS,IAAI,EAAE,WAAW,cAAc,CAAC;AAC9F,QAAM,WAAmC,CAAC;AAC1C,QAAM,SAAmC,CAAC;AAE1C,MAAI,UAAU;AACZ,aAAS,YAAY,IAAI;AACzB,aAAS,eAAe,IAAI;AAC5B,WAAO,QAAQ,CAAC,cAAc,eAAe;AAAA,EAC/C;AAEA,MAAI,WAAW;AACb,aAAS,aAAa,IAAI;AAC1B,aAAS,cAAc,IAAI;AAC3B,WAAO,SAAS,CAAC,eAAe,cAAc;AAAA,EAChD;AAEA,SAAO,CAAC,eAAe,EAAE,MAAM,QAAQ,OAAO,QAAQ,UAAU,OAAO,CAAC,CAAC;AAC3E;AAEA,eAAsB,cAAc,SAKV;AACxB,SAAO;AAAA,IACL,GAAG,YAAY,QAAQ,WAAW,QAAQ,WAAW;AAAA,IACrD,GAAI,MAAM,cAAc,QAAQ,MAAM,QAAQ,QAAQ;AAAA,IACtD,GAAG,UAAU,QAAQ,QAAQ;AAAA,IAC7B,GAAI,MAAM,YAAY,QAAQ,QAAQ;AAAA,EACxC,EAAE;AAAA,IACA,CAAC,WACC,OAAO,KAAK,OAAO,QAAQ,EAAE,SAAS,KACtC,OAAO,KAAK,OAAO,MAAM,EAAE,SAAS,KACpC,OAAO,MAAM,SAAS;AAAA,EAC1B;AACF;AAEO,SAAS,oBAAoB,SAA+C;AACjF,SAAO,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,QAAQ,CAAC;AACtE;AAEO,SAAS,kBAAkB,SAAiD;AACjF,QAAM,SAAmC,CAAC;AAC1C,aAAW,UAAU,SAAS;AAC5B,eAAW,CAAC,OAAO,QAAQ,KAAK,OAAO,QAAQ,OAAO,MAAM,GAAG;AAC7D,aAAO,KAAK,IAAI,CAAC,GAAI,OAAO,KAAK,KAAK,CAAC,GAAI,GAAG,QAAQ;AAAA,IACxD;AAAA,EACF;AACA,SAAO;AACT;;;AC/QO,SAAS,eAAe,aAAoE;AACjG,MACE,CAAC,aAAa,KAAK,WACnB,OAAO,YAAY,KAAK,YAAY,YACpC,MAAM,QAAQ,YAAY,KAAK,OAAO,GACtC;AACA,WAAO;AAAA,EACT;AAEA,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,YAAY,KAAK,OAAO,EAAE,OAAO,CAAC,UAAqC;AACpF,YAAM,CAAC,EAAE,OAAO,IAAI;AACpB,aAAO,OAAO,YAAY;AAAA,IAC5B,CAAC;AAAA,EACH;AACF;;;AfFA,SAASE,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWC,OAAK,SAASA,OAAK,QAAQ,IAAI,GAAGA,OAAK,QAAQ,MAAM,CAAC;AACvE,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,QAAQ;AACpF;AAEA,eAAe,cAAc,MAAc,YAA6C;AACtF,QAAM,eAAe,MAAMC,KAAG,SAAS,IAAI,EAAE,MAAM,MAAMD,OAAK,QAAQ,IAAI,CAAC;AAE3E,aAAW,aAAa,YAAY;AAClC,UAAM,WAAWA,OAAK,KAAK,MAAM,SAAS;AAC1C,QAAI;AACF,YAAM,CAAC,MAAM,QAAQ,IAAI,MAAM,QAAQ,IAAI,CAACC,KAAG,KAAK,QAAQ,GAAGA,KAAG,SAAS,QAAQ,CAAC,CAAC;AACrF,UAAI,KAAK,OAAO,KAAKF,cAAa,cAAc,QAAQ,GAAG;AACzD,eAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,MACxC;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,MAAM,QAAQ,MAAM;AACrC;AAEA,SAAS,gBAAgB,aAA6C;AACpE,SAAO,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC;AACrD;AAEA,eAAsB,YAAY,OAAO,QAAQ,IAAI,GAAwB;AAC3E,QAAM,eAAe,MAAME,KAAG,SAAS,IAAI,EAAE,MAAM,MAAMD,OAAK,QAAQ,IAAI,CAAC;AAC3E,QAAM,SAAS,MAAM,WAAW,YAAY;AAC5C,QAAM,cAAc,MAAM,gBAAgB,YAAY;AACtD,QAAM,UAAU,eAAe,WAAW,KAAK,CAAC;AAChD,QAAM,YAAY,gBAAgB,WAAW;AAC7C,QAAM,WAAW,MAAM,sBAAsB,cAAc,WAAW;AACtE,QAAM,UAAU,MAAM,cAAc;AAAA,IAClC,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,iBAAiB,oBAAoB,OAAO;AAClD,QAAM,eAAe,kBAAkB,OAAO;AAC9C,QAAM,eAAe;AAAA,IACnB,GAAG,gBAAgB,QAAQ,OAAO,KAAK;AAAA,IACvC,GAAG,sBAAsB,OAAO;AAAA,IAChC,GAAG,yBAAyB,SAAS;AAAA,IACrC,GAAG,QAAQ,QAAQ,CAAC,WAAW,OAAO,KAAK;AAAA,EAC7C;AAEA,QAAM,CAAC,gBAAgB,KAAK,QAAQ,KAAK,OAAO,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,IACnF,qBAAqB,YAAY;AAAA,IACjC,UAAU,cAAc,QAAQ,MAAM;AAAA,IACtC,aAAa,YAAY;AAAA,IACzB,UAAU,YAAY;AAAA,IACtB,YAAY,YAAY;AAAA,IACxB,cAAc,cAAc,CAAC,aAAa,QAAQ,CAAC;AAAA,IACnD,cAAc,cAAc,CAAC,WAAW,cAAc,SAAS,CAAC;AAAA,EAClE,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa,QAAQ,OAAO,QAAQ,aAAa,KAAK,QAAQA,OAAK,SAAS,YAAY;AAAA,IACxF;AAAA,IACA,gBAAgB,mBAAmB,cAAc,QAAQ;AAAA,IACzD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,SAAS,CAAC;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AFvFA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAME,KAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAeC,eAAc,UAAiD;AAC5E,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,MAAMD,KAAG,SAAS,UAAU,MAAM;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,QACP,IACA,UACA,OACA,SACA,QACe;AACf,SAAO,EAAE,IAAI,UAAU,OAAO,SAAS,OAAO;AAChD;AAEA,eAAsB,UAAU,OAAO,QAAQ,IAAI,GAAG,MAA6C;AACjG,QAAM,SAAS,QAAS,MAAM,YAAY,IAAI;AAC9C,QAAM,WAA4B,CAAC;AAEnC,aAAW,iBAAiB,OAAO,QAAQ,YAAY,CAAC,GAAG;AACzD,aAAS;AAAA,MACP,QAAQ,kBAAkB,WAAW,kBAAkB,eAAe,OAAO,QAAQ,IAAI;AAAA,IAC3F;AAAA,EACF;AAEA,QAAM,gBAAgB,OAAO,SAAS,SAAS,SAAS,MAAM;AAC9D,QAAM,0BAA0B,OAAO,SAAS,SAAS,SAAS;AAElE,MAAI,OAAO,gBAAgB,QAAQ,CAAC,yBAAyB;AAC3D,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,CAAE,MAAM,WAAWE,OAAK,KAAK,MAAM,gBAAgB,MAAM,CAAC,GAAI;AACjF,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,KAAK,cAAc,CAAC,OAAO,IAAI,UAAU;AAClD,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,IAAI,eAAe;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,OAAO,IAAI,YAAY,SAAS,KAAK,OAAO,IAAI,UAAU;AAC1E,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,iBAAiB,OAAO,IAAI,YAAY,KAAK,IAAI,CAAC;AAAA,MACpD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,OAAO,IAAI,UAAU,SAAS,GAAG;AACjD,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,eAAe,OAAO,IAAI,UAAU,KAAK,IAAI,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,OAAO,OAAO;AACrC,MAAI,eAAe;AACjB,aAAS;AAAA,MACP,QAAQ,kBAAkB,WAAW,aAAa,wCAAwC;AAAA,IAC5F;AAAA,EACF,OAAO;AACL,UAAM,SAAS,MAAMD,eAAc,OAAO,OAAO,IAAI;AACrD,QAAI,WAAW,MAAM;AACnB,YAAM,aAAa,wBAAwB,MAAM;AACjD,YAAM,iBAAiB,WAAW,OAAO,CAAC,WAAW,OAAO,QAAQ,MAAM,MAAM,MAAS;AACzF,UAAI,eAAe,SAAS,GAAG;AAC7B,iBAAS;AAAA,UACP;AAAA,YACE;AAAA,YACA;AAAA,YACA;AAAA,YACA,wDAAwD,eAAe,KAAK,IAAI,CAAC;AAAA,UACnF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO,MAAM,OAAO,CAAC,UAAU,MAAM,KAAK,GAAG;AAC9D,aAAS;AAAA,MACP;AAAA,QACE,QAAQ,KAAK,IAAI;AAAA,QACjB;AAAA,QACA,QAAQ,KAAK,IAAI;AAAA,QACjB,2CAA2C,KAAK,IAAI;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,OAAO,OAAO,kBAAkB,OAAO;AAC1D,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,OAAO,OAAO,WAAW;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,OAAO,QAAQ,SAAS,QAAW;AACtD,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,iBAAiB,OAAO,QAAQ,UAAU,QAAW;AACvD,aAAS;AAAA,MACP;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AkB/KA,IAAME,OAAM,OAAO,aAAa,EAAE;AAClC,IAAM,MAAM,OAAO,aAAa,CAAC;AAEjC,IAAM,eAAe,IAAI,OAAO,GAAGA,IAAG,mBAAmB,GAAG,IAAIA,IAAG,SAAS,GAAG;AAC/E,IAAM,eAAe,IAAI,OAAO,GAAGA,IAAG,wBAAwB,GAAG;AACjE,IAAM,kBAAkB,IAAI,OAAO,GAAGA,IAAG,eAAe,GAAG;AAE3D,SAAS,uBAAuB,OAAuB;AACrD,MAAI,SAAS;AACb,aAAW,aAAa,OAAO;AAC7B,UAAM,OAAO,UAAU,WAAW,CAAC;AACnC,QAAK,OAAO,MAAM,OAAO,OAAQ,OAAO,KAAK;AAC3C,gBAAU;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAAwB;AACtD,SAAO;AAAA,IACL,OAAO,KAAK,EAAE,QAAQ,cAAc,EAAE,EAAE,QAAQ,cAAc,EAAE,EAAE,QAAQ,iBAAiB,EAAE;AAAA,EAC/F;AACF;AAEO,SAAS,gBAAgB,QAA0B;AACxD,SAAO,OAAO,SAAS,IAAI,OAAO,IAAI,CAAC,UAAU,gBAAgB,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI;AACxF;;;AnBtBA,SAAS,cAAc,UAAgD;AACrE,MAAI,aAAa,SAAS;AACxB,WAAO,GAAG,IAAI,OAAO;AAAA,EACvB;AAEA,MAAI,aAAa,WAAW;AAC1B,WAAO,GAAG,OAAO,SAAS;AAAA,EAC5B;AAEA,SAAO,GAAG,KAAK,MAAM;AACvB;AAEA,eAAsB,cAAc,MAAM,QAAQ,IAAI,GAAkB;AACtE,QAAM,WAAW,MAAM,UAAU,GAAG;AAEpC,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,GAAG,MAAM,2BAA2B,CAAC;AACjD;AAAA,EACF;AAEA,aAAW,QAAQ,UAAU;AAC3B,YAAQ,IAAI,GAAG,cAAc,KAAK,QAAQ,CAAC,IAAI,GAAG,KAAK,gBAAiB,KAAK,KAAK,CAAC,CAAC,EAAE;AACtF,YAAQ,IAAI,KAAK,gBAAiB,KAAK,OAAO,CAAC,EAAE;AAAA,EACnD;AACF;;;AoB5BA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAGf,eAAsB,YAAY,MAAM,QAAQ,IAAI,GAAkB;AACpE,QAAM,aAAaC,OAAK,KAAK,KAAK,gBAAgB;AAElD,MAAI;AACF,UAAMC,KAAG,OAAO,UAAU;AAC1B,YAAQ,IAAIC,IAAG,OAAO,GAAG,gBAAgB,kBAAkB,CAAC;AAC5D;AAAA,EACF,QAAQ;AACN,UAAMD,KAAG,UAAU,YAAY,GAAG,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACpF,YAAQ,IAAIC,IAAG,MAAM,WAAW,gBAAgB,GAAG,CAAC;AAAA,EACtD;AACF;;;AChBA,OAAOC,SAAQ;;;ACUf,SAAS,WAAW,UAA2B,IAAqB;AAClE,SAAO,SAAS,KAAK,CAACC,aAAYA,SAAQ,OAAO,EAAE;AACrD;AAMA,SAAS,gBAAgB,MAA2C;AAClE,MAAI,KAAK,QAAQ,QAAQ,QAAW;AAClC,WAAO,EAAE,MAAM,cAAc,OAAO,oBAAoB,QAAQ,MAAM;AAAA,EACxE;AACA,MAAI,KAAK,QAAQ,UAAU,QAAW;AACpC,WAAO,EAAE,MAAM,cAAc,OAAO,aAAa,QAAQ,QAAQ;AAAA,EACnE;AAEA,QAAM,qBAAqB;AAAA,IACzB,GAAG,KAAK;AAAA,IACR,GAAG,KAAK,QAAQ,OAAO;AAAA,EACzB;AACA,aAAW,QAAQ,CAAC,OAAO,SAAS,OAAO,GAAG;AAC5C,QAAI,mBAAmB,IAAI,MAAM,QAAW;AAC1C,aAAO,EAAE,MAAM,eAAe,OAAO,OAAO,IAAI,IAAI,QAAQ,KAAK;AAAA,IACnE;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,MAAyC;AAC3D,QAAM,SAAS,KAAK;AACpB,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,OAAO,SAAS,OAAO,CAAC,YAAY,QAAQ,WAAW,SAAS;AACxF,QAAM,aACJ,OAAO,SAAS,SAAS,KAAK,gBAAgB,WAAW,OAAO,SAAS;AAE3E,MAAI,OAAO,iBAAiB,WAAW;AACrC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE,OAAO,WAAW;AAAA,MACpB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,EAAE,MAAM,UAAU,OAAO,gBAAgB;AAAA,IACnD;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,WAAW,KAAK,YAAY;AAC9C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aACE,OAAO,SAAS,WAAW,IACvB,+DACA;AAAA,MACN,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,aAAa,GAAG,gBAAgB,MAAM,IAAI,OAAO,SAAS,MAAM;AAAA,IAChE,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,QAAQ,EAAE,MAAM,UAAU,OAAO,gBAAgB;AAAA,EACnD;AACF;AASO,SAAS,oBAAoB,MAAkB,UAA2C;AAC/F,QAAM,QAA0B,CAAC;AACjC,QAAM,gBAAgB,KAAK,SAAS,SAAS,SAAS,MAAM;AAG5D,MAAI,iBAAiB,KAAK,gBAAgB,MAAM;AAC9C,UAAM,eAAe,WAAW,UAAU,sBAAsB;AAChE,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa,eACT,0EACA;AAAA,MACJ,QAAQ,eAAe,SAAS;AAAA,MAChC,UAAU;AAAA,MACV,QAAQ,eAAe,EAAE,MAAM,WAAW,OAAO,UAAU,IAAI;AAAA,IACjE,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,KAAK,YAAY;AACxB,UAAM,eAAe,CAAC,KAAK,IAAI;AAC/B,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa,eACT,4DACA;AAAA,MACJ,QAAQ,eAAe,SAAS;AAAA,MAChC,UAAU;AAAA,MACV,QAAQ,eAAe,EAAE,MAAM,YAAY,OAAO,YAAY,IAAI;AAAA,IACpE,CAAC;AAGD,QAAI,KAAK,IAAI,UAAU;AACrB,YAAM,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,IAAI,aAAa,GAAG,KAAK,IAAI,SAAS,CAAC,CAAC;AAC3E,YAAM,KAAK;AAAA,QACT,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,aACE,MAAM,SAAS,IACX,mBAAmB,MAAM,KAAK,IAAI,CAAC,uCACnC;AAAA,QACN,QAAQ,MAAM,SAAS,IAAI,WAAW;AAAA,QACtC,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,SAAS,WAAW,IAAI;AAC9B,MAAI,WAAW,MAAM;AACnB,UAAM,KAAK,MAAM;AAAA,EACnB;AAGA,QAAM,aAAa,KAAK,MAAM,OAAO,CAAC,UAAU,MAAM,KAAK;AAC3D,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa,mBAAmB,WAAW,IAAI,CAAC,UAAU,MAAM,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAChF,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,EAAE,GAAG,KAAK,gBAAgB,GAAI,KAAK,QAAQ,OAAO,YAAY,CAAC,EAAG;AACtF,aAAW,CAAC,OAAO,KAAK,MAAM,KAAK,QAAQ,OAAO,cAAc,CAAC,GAAG,QAAQ,GAAG;AAC7E,QAAI,OAAO,UAAU,UAAU;AAC7B,YAAM,KAAK;AAAA,QACT,IAAI,SAAS,KAAK;AAAA,QAClB,OAAO;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,UAAU;AAAA,MACZ,CAAC;AAAA,IACH,OAAO;AACL,YAAM,OAAO;AACb,UAAI;AACJ,UAAI,KAAK,YAAY,UAAa,KAAK,WAAW,aAAa;AAC7D,iBAAS,EAAE,MAAM,eAAe,OAAO,OAAO,QAAQ,KAAK,QAAQ;AAAA,MACrE,WAAW,KAAK,WAAW,QAAW;AACpC,iBAAS,EAAE,MAAM,cAAc,OAAO,OAAO,QAAQ,KAAK,OAAO;AAAA,MACnE;AACA,YAAM,KAAK;AAAA,QACT,IAAI,SAAS,KAAK;AAAA,QAClB,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK,eAAe;AAAA,QACjC,QAAQ,WAAW,SAAY,SAAS;AAAA,QACxC,UAAU;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,OAAO,KAAK,QAAQ,OAAO;AACjC,MAAI,OAAO,SAAS,YAAY,KAAK,SAAS,KAAK,cAAc,IAAI,GAAG;AACtE,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,EAAE,MAAM,aAAa,OAAO,aAAa,QAAQ,KAAK;AAAA,IAChE,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,gBAAgB,IAAI;AACxC,MAAI,gBAAgB,MAAM;AACxB,UAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,QAAM,WAAW,MAAM,OAAO,CAAC,SAAS,KAAK,QAAQ;AACrD,QAAM,eAAe,SAAS,OAAO,CAAC,SAAS,KAAK,WAAW,MAAM;AACrE,QAAM,YACJ,SAAS,WAAW,IAAI,MAAM,KAAK,MAAO,aAAa,SAAS,SAAS,SAAU,GAAG;AACxF,QAAM,QAAQ,cAAc;AAC5B,QAAM,YAAY,SAAS,SAAS,aAAa;AACjD,QAAM,UAAU,QACZ,6BACA,GAAG,SAAS,cAAc,cAAc,IAAI,KAAK,GAAG;AAExD,SAAO,EAAE,OAAO,WAAW,OAAO,QAAQ;AAC5C;;;AD1NA,SAAS,YAAY,QAA0C;AAC7D,MAAI,WAAW,QAAQ;AACrB,WAAOC,IAAG,MAAM,KAAK;AAAA,EACvB;AAEA,MAAI,WAAW,QAAQ;AACrB,WAAOA,IAAG,OAAO,KAAK;AAAA,EACxB;AAEA,SAAOA,IAAG,KAAK,KAAK;AACtB;AAEA,eAAsB,eAAe,MAAM,QAAQ,IAAI,GAAkB;AACvE,QAAM,OAAO,MAAM,YAAY,GAAG;AAClC,QAAM,WAAW,MAAM,UAAU,KAAK,IAAI;AAC1C,QAAM,OAAO,oBAAoB,MAAM,QAAQ;AAE/C,UAAQ,IAAIA,IAAG,KAAK,cAAc,gBAAiB,KAAK,WAAW,CAAC,EAAE,CAAC;AACvE,UAAQ,IAAI,GAAG,KAAK,SAAS,kBAAa,gBAAiB,KAAK,OAAO,CAAC,EAAE;AAC1E,UAAQ,IAAI,EAAE;AAEd,MAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,YAAQ,IAAIA,IAAG,MAAM,+BAA+B,CAAC;AACrD;AAAA,EACF;AAEA,aAAW,QAAQ,KAAK,OAAO;AAC7B,YAAQ,IAAI,GAAG,YAAY,KAAK,MAAM,CAAC,IAAIA,IAAG,KAAK,gBAAiB,KAAK,KAAK,CAAC,CAAC,EAAE;AAClF,YAAQ,IAAI,OAAO,gBAAiB,KAAK,WAAW,CAAC,EAAE;AACvD,QAAI,KAAK,UAAU,KAAK,WAAW,QAAQ;AACzC,cAAQ,IAAIA,IAAG,IAAI,cAAS,gBAAiB,KAAK,OAAO,KAAK,CAAC,EAAE,CAAC;AAAA,IACpE;AAAA,EACF;AACF;;;AExCA,OAAOC,SAAQ;;;ACAf,OAAOC,YAAW;;;ACAlB,IAAM,oBACJ;AAEK,SAAS,mBAAmB,SAA0B;AAC3D,SAAO,kBAAkB,KAAK,OAAO;AACvC;;;ADQO,SAAS,qBACd,gBACA,QACmB;AACnB,QAAM,UAAU,kBAAkB;AAClC,QAAM,OAAO,CAAC,OAAO,MAAM;AAC3B,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,gBAAgB,GAAG,OAAO,IAAI,KAAK,KAAK,GAAG,CAAC;AAAA,EAC9C;AACF;AAEA,eAAsB,yBAAyB,SAIT;AACpC,QAAMC,cAAa,qBAAqB,QAAQ,gBAAgB,QAAQ,MAAM;AAC9E,QAAM,aAAa,MAAM,6BAA6B,QAAQ,KAAKA,YAAW,OAAO;AACrF,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAGA;AAAA,IACH,SAAS;AAAA,EACX;AACF;AAEO,SAAS,yBAAyB,gBAA0D;AACjG,QAAM,UAAU,kBAAkB;AAClC,MAAI,YAAY,OAAO;AACrB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAC,IAAI;AAAA,MACX,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAC,WAAW,mBAAmB;AAAA,MACrC,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,YAAY,QAAQ;AACtB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,CAAC,WAAW,mBAAmB;AAAA,MACrC,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,CAAC,SAAS;AAAA,IAChB,gBAAgB;AAAA,EAClB;AACF;AAEA,eAAsB,6BAA6B,SAGb;AACpC,QAAM,iBAAiB,yBAAyB,QAAQ,cAAc;AACtE,QAAM,aAAa,MAAM,6BAA6B,QAAQ,KAAK,eAAe,OAAO;AACzF,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,SAAS;AAAA,EACX;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,QAAM,SAAmB,CAAC;AAC1B,MAAI,UAAU;AACd,MAAI,QAA0B;AAE9B,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,YAAY,QAAQ,KAAK,KAAK;AACpC,QAAI,UAAU,MAAM;AAClB,UAAI,cAAc,OAAO;AACvB,gBAAQ;AAAA,MACV,WAAW,cAAc,QAAQ,UAAU,KAAK;AAC9C,cAAM,OAAO,QAAQ,QAAQ,CAAC;AAC9B,YAAI,SAAS,OAAO,SAAS,MAAM;AACjC,mBAAS;AACT,qBAAW,QAAQ;AAAA,QACrB,OAAO;AACL,qBAAW;AAAA,QACb;AAAA,MACF,OAAO;AACL,mBAAW;AAAA,MACb;AACA;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,cAAc,KAAK;AAC1C,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,SAAS,GAAG;AACxB,UAAI,QAAQ,SAAS,GAAG;AACtB,eAAO,KAAK,OAAO;AACnB,kBAAU;AAAA,MACZ;AACA;AAAA,IACF;AAEA,eAAW;AAAA,EACb;AAEA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;AAEO,SAAS,4BAA4B,SAA0B;AACpE,MAAI,QAA0B;AAE9B,WAAS,QAAQ,GAAG,QAAQ,QAAQ,QAAQ,SAAS,GAAG;AACtD,UAAM,YAAY,QAAQ,KAAK,KAAK;AACpC,QAAI,UAAU,MAAM;AAClB,UAAI,cAAc,OAAO;AACvB,gBAAQ;AAAA,MACV;AACA;AAAA,IACF;AAEA,QAAI,cAAc,OAAO,cAAc,KAAK;AAC1C,cAAQ;AACR;AAAA,IACF;AAEA,QAAI,cAAc,QAAQ,cAAc,MAAM;AAC5C,aAAO;AAAA,IACT;AAEA,QAAI,QAAQ,SAAS,SAAS,GAAG;AAC/B,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,KAAK;AACrB,aAAO;AAAA,IACT;AAEA,QAAI,cAAc,QAAQ,QAAQ,QAAQ,CAAC,MAAM,OAAO,QAAQ,QAAQ,CAAC,MAAM,MAAM;AACnF,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,yBACpB,KACA,SACmC;AACnC,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,KAAK,4BAA4B,OAAO,GAAG;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,iBAAiB,OAAO;AACvC,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,gBAAgB,GAAG,IAAI,IAAI;AAClC,QAAM,aAAa,MAAM,6BAA6B,KAAK,cAAc;AACzE,MAAI,eAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,gBAAgB;AAAA,EAClB;AACF;AAEA,eAAsB,2BAA2B,SAI7B;AAClB,QAAMA,cAAa,MAAM,yBAAyB,OAAO;AACzD,MAAIA,gBAAe,MAAM;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,QAAQ,CAAC,YAAY;AACpC,UAAM,QAAQC,OAAMD,YAAW,SAASA,YAAW,MAAM;AAAA,MACvD,KAAK,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED,UAAM,GAAG,SAAS,MAAM;AACtB,cAAQ,CAAC;AAAA,IACX,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ,QAAQ,CAAC;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,+BAA+B,SAGjC;AAClB,QAAM,kBAAkB,MAAM,yBAAyB,QAAQ,KAAK,QAAQ,OAAO;AACnF,MAAI,oBAAoB,MAAM;AAC5B,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,IAAI,QAAQ,CAAC,YAAY;AACpC,UAAM,QAAQC,OAAM,gBAAgB,SAAS,gBAAgB,MAAM;AAAA,MACjE,KAAK,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED,UAAM,GAAG,SAAS,MAAM;AACtB,cAAQ,CAAC;AAAA,IACX,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,cAAQ,QAAQ,CAAC;AAAA,IACnB,CAAC;AAAA,EACH,CAAC;AACH;;;ADrPA,eAAsB,WAAW,QAAgB,MAAM,QAAQ,IAAI,GAAkB;AACnF,QAAM,OAAO,MAAM,YAAY,GAAG;AAElC,MAAI,KAAK,QAAQ,MAAM,MAAM,QAAW;AACtC,UAAM,WAAW,MAAM,2BAA2B;AAAA,MAChD;AAAA,MACA,gBAAgB,KAAK;AAAA,MACrB;AAAA,IACF,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,oBAAoB,KAAK,QAAQ,OAAO,WAAW,MAAM,KAAK,KAAK,eAAe,MAAM;AAC9F,MAAI,sBAAsB,QAAW;AACnC,QAAI,mBAAmB,iBAAiB,GAAG;AACzC,cAAQ,MAAMC,IAAG,IAAI,sCAAsC,gBAAiB,MAAM,CAAC,IAAI,CAAC;AACxF,cAAQ,WAAW;AACnB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,+BAA+B;AAAA,MACpD;AAAA,MACA,SAAS;AAAA,IACX,CAAC;AACD,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,YAAY;AAAA,IAChB,GAAG,OAAO,KAAK,KAAK,OAAO;AAAA,IAC3B,GAAG,OAAO,KAAK,KAAK,QAAQ,OAAO,YAAY,CAAC,CAAC;AAAA,IACjD,GAAG,OAAO,KAAK,KAAK,cAAc;AAAA,EACpC;AACA,QAAM,OAAO,UAAU,SAAS,IAAI,wBAAwB,gBAAiB,SAAS,CAAC,MAAM;AAC7F,UAAQ,MAAMA,IAAG,IAAI,YAAY,gBAAiB,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC;AACnF,UAAQ,WAAW;AACrB;;;AG9CA,OAAOC,SAAQ;AAKf,SAAS,WAAW,QAA0B;AAC5C,SAAO,gBAAiB,MAAM;AAChC;AAEO,SAAS,gBAAgB,MAAwB;AACtD,UAAQ,IAAIC,IAAG,KAAK,cAAc,gBAAiB,KAAK,WAAW,CAAC,EAAE,CAAC;AACvE,UAAQ,IAAI,cAAc,WAAW,KAAK,SAAS,QAAQ,KAAK,SAAS,EAAE;AAC3E,UAAQ,IAAI,cAAc,gBAAiB,KAAK,WAAW,QAAQ,SAAS,CAAC,EAAE;AAC/E,UAAQ,IAAI,cAAc,gBAAiB,KAAK,kBAAkB,SAAS,CAAC,EAAE;AAC9E,UAAQ,IAAI,cAAc,WAAW,OAAO,KAAK,KAAK,OAAO,CAAC,CAAC,EAAE;AACjE,UAAQ,IAAI,cAAc,WAAW,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,KAAK,MAAM,EAAE;AAC5F,UAAQ,IAAI,cAAc,gBAAiB,KAAK,KAAK,UAAU,cAAc,CAAC,EAAE;AAChF,UAAQ,IAAI,cAAc,KAAK,OAAO,SAAS,UAAU,SAAS,EAAE;AACpE,UAAQ,IAAI,cAAc,KAAK,QAAQ,SAAS,UAAU,SAAS,EAAE;AAErE,MAAI,KAAK,QAAQ,MAAM;AACrB,YAAQ,IAAI,cAAc,KAAK,IAAI,WAAW,eAAe,cAAc,EAAE;AAAA,EAC/E;AAEA,MAAI,KAAK,MAAM,SAAS,GAAG;AACzB,UAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,QAAQ,YAAY,OAAO,EAAE;AACxF,YAAQ,IAAI,cAAc,MAAM,KAAK,IAAI,CAAC,EAAE;AAAA,EAC9C;AAEA,MAAI,KAAK,WAAW,MAAM;AACxB,YAAQ;AAAA,MACN,6BAA6B,WAAW,KAAK,OAAO,SAAS,IAAI,CAAC,YAAY,QAAQ,IAAI,CAAC,CAAC;AAAA,IAC9F;AAAA,EACF;AACF;AAEA,eAAsB,YAAY,MAAM,QAAQ,IAAI,GAAkB;AACpE,kBAAgB,MAAM,YAAY,GAAG,CAAC;AACxC;;;ACtCA,OAAOC,SAAQ;;;ACAf,OAAOC,cAAa;AACpB,SAAQ,UAAAC,eAAa;AACrB,OAAOC,YAAU;AACjB,SAAQ,qBAAoB;AAC5B,SAAQ,aAAAC,kBAAgB;AACxB,OAAO,kBAAkB;AACzB,OAAOC,QAAK,aAAaC,oBAAkB;;;ACN3C,OAAOC,cAAa;AACpB,OAAOC,QAAK,aAAa,mBAAkB;;;ACD3C,OAAOC,cAAa;AACpB,OAAOC,SAAQ;AACf,OAAOC,UAAQ;;;ACFf,OAAOC,UAAQ;;;ACAf,OAAOC,UAAQ;AAEf,IAAI;AAEJ,SAAS,eAAe;AACvB,MAAI;AACH,IAAAA,KAAG,SAAS,aAAa;AACzB,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,kBAAkB;AAC1B,MAAI;AACH,WAAOA,KAAG,aAAa,qBAAqB,MAAM,EAAE,SAAS,QAAQ;AAAA,EACtE,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEe,SAAR,WAA4B;AAElC,MAAI,mBAAmB,QAAW;AACjC,qBAAiB,aAAa,KAAK,gBAAgB;AAAA,EACpD;AAEA,SAAO;AACR;;;ADzBA,IAAI;AAGJ,IAAM,kBAAkB,MAAM;AAC7B,MAAI;AACH,IAAAC,KAAG,SAAS,oBAAoB;AAChC,WAAO;AAAA,EACR,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEe,SAAR,oBAAqC;AAE3C,MAAI,iBAAiB,QAAW;AAC/B,mBAAe,gBAAgB,KAAK,SAAS;AAAA,EAC9C;AAEA,SAAO;AACR;;;ADjBA,IAAM,QAAQ,MAAM;AACnB,MAAIC,SAAQ,aAAa,SAAS;AACjC,WAAO;AAAA,EACR;AAEA,MAAIC,IAAG,QAAQ,EAAE,YAAY,EAAE,SAAS,WAAW,GAAG;AACrD,QAAI,kBAAkB,GAAG;AACxB,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AAEA,MAAI;AACH,QAAIC,KAAG,aAAa,iBAAiB,MAAM,EAAE,YAAY,EAAE,SAAS,WAAW,GAAG;AACjF,aAAO,CAAC,kBAAkB;AAAA,IAC3B;AAAA,EACD,QAAQ;AAAA,EAAC;AAGT,MACCA,KAAG,WAAW,qCAAqC,KAChDA,KAAG,WAAW,UAAU,GAC1B;AACD,WAAO,CAAC,kBAAkB;AAAA,EAC3B;AAEA,SAAO;AACR;AAEA,IAAO,iBAAQF,SAAQ,IAAI,kBAAkB,QAAQ,MAAM;;;AD/BpD,IAAM,sBAAuB,uBAAM;AAGzC,QAAM,oBAAoB;AAE1B,MAAI;AAEJ,SAAO,iBAAkB;AACxB,QAAI,YAAY;AAEf,aAAO;AAAA,IACR;AAEA,UAAM,iBAAiB;AAEvB,QAAI,qBAAqB;AACzB,QAAI;AACH,YAAMG,KAAG,OAAO,gBAAgB,YAAY,IAAI;AAChD,2BAAqB;AAAA,IACtB,QAAQ;AAAA,IAAC;AAET,QAAI,CAAC,oBAAoB;AACxB,aAAO;AAAA,IACR;AAEA,UAAM,gBAAgB,MAAMA,KAAG,SAAS,gBAAgB,EAAC,UAAU,OAAM,CAAC;AAC1E,UAAM,mBAAmB,wCAAwC,KAAK,aAAa;AAEnF,QAAI,CAAC,kBAAkB;AACtB,aAAO;AAAA,IACR;AAEA,iBAAa,iBAAiB,OAAO,WAAW,KAAK;AACrD,iBAAa,WAAW,SAAS,GAAG,IAAI,aAAa,GAAG,UAAU;AAElE,WAAO;AAAA,EACR;AACD,GAAG;AAEI,IAAM,wBAAwB,YAAY;AAChD,QAAM,aAAa,MAAM,oBAAoB;AAC7C,SAAO,GAAG,UAAU;AACrB;AAEO,IAAM,iBAAiB,YAAY;AACzC,MAAI,gBAAO;AACV,WAAO,sBAAsB;AAAA,EAC9B;AAEA,SAAO,GAAGC,SAAQ,IAAI,cAAcA,SAAQ,IAAI,UAAU,OAAO,eAAe;AACjF;;;AItDe,SAAR,mBAAoC,QAAQ,cAAc,aAAa;AAC7E,QAAM,SAAS,WAAS,OAAO,eAAe,QAAQ,cAAc,EAAC,OAAO,YAAY,MAAM,UAAU,KAAI,CAAC;AAE7G,SAAO,eAAe,QAAQ,cAAc;AAAA,IAC3C,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,MAAM;AACL,YAAM,SAAS,YAAY;AAC3B,aAAO,MAAM;AACb,aAAO;AAAA,IACR;AAAA,IACA,IAAI,OAAO;AACV,aAAO,KAAK;AAAA,IACb;AAAA,EACD,CAAC;AAED,SAAO;AACR;;;ACjBA,SAAQ,aAAAC,kBAAgB;AACxB,OAAOC,cAAa;AACpB,SAAQ,YAAAC,iBAAe;;;ACFvB,SAAQ,iBAAgB;AACxB,OAAOC,cAAa;AACpB,SAAQ,gBAAe;AAEvB,IAAM,gBAAgB,UAAU,QAAQ;AAExC,eAAO,mBAA0C;AAChD,MAAIA,SAAQ,aAAa,UAAU;AAClC,UAAM,IAAI,MAAM,YAAY;AAAA,EAC7B;AAEA,QAAM,EAAC,OAAM,IAAI,MAAM,cAAc,YAAY,CAAC,QAAQ,4DAA4D,YAAY,CAAC;AAGnI,QAAM,QAAQ,mFAAmF,KAAK,MAAM;AAE5G,QAAM,YAAY,OAAO,OAAO,MAAM;AAGtC,MAAI,cAAc,oBAAoB;AACrC,WAAO;AAAA,EACR;AAEA,SAAO;AACR;;;ACxBA,OAAOC,cAAa;AACpB,SAAQ,aAAAC,kBAAgB;AACxB,SAAQ,YAAAC,WAAU,oBAAmB;AAErC,IAAMC,iBAAgBF,WAAUC,SAAQ;AAExC,eAAsB,eAAe,QAAQ,EAAC,sBAAsB,MAAM,OAAM,IAAI,CAAC,GAAG;AACvF,MAAIF,SAAQ,aAAa,UAAU;AAClC,UAAM,IAAI,MAAM,YAAY;AAAA,EAC7B;AAEA,QAAM,kBAAkB,sBAAsB,CAAC,IAAI,CAAC,KAAK;AAEzD,QAAM,cAAc,CAAC;AACrB,MAAI,QAAQ;AACX,gBAAY,SAAS;AAAA,EACtB;AAEA,QAAM,EAAC,OAAM,IAAI,MAAMG,eAAc,aAAa,CAAC,MAAM,QAAQ,eAAe,GAAG,WAAW;AAC9F,SAAO,OAAO,KAAK;AACpB;;;AClBA,eAAO,WAAkC,UAAU;AAClD,SAAO,eAAe,qEAAqE,QAAQ;AAAA,6IAA2J;AAC/P;;;ACJA,SAAQ,aAAAC,kBAAgB;AACxB,SAAQ,YAAAC,iBAAe;AAEvB,IAAMC,iBAAgBF,WAAUC,SAAQ;AAMxC,IAAM,wBAAwB;AAAA,EAC7B,WAAW,EAAC,MAAM,QAAQ,IAAI,qBAAoB;AAAA;AAAA,EAClD,aAAa,EAAC,MAAM,aAAa,IAAI,0BAAyB;AAAA,EAC9D,aAAa,EAAC,MAAM,YAAY,IAAI,yBAAwB;AAAA,EAC5D,sCAAsC,EAAC,MAAM,QAAQ,IAAI,yBAAwB;AAAA,EACjF,YAAY,EAAC,MAAM,UAAU,IAAI,oBAAmB;AAAA,EACpD,aAAa,EAAC,MAAM,eAAe,IAAI,yBAAwB;AAAA,EAC/D,aAAa,EAAC,MAAM,cAAc,IAAI,wBAAuB;AAAA,EAC7D,aAAa,EAAC,MAAM,YAAY,IAAI,wBAAuB;AAAA,EAC3D,WAAW,EAAC,MAAM,SAAS,IAAI,oBAAmB;AAAA,EAClD,YAAY,EAAC,MAAM,cAAc,IAAI,yBAAwB;AAAA,EAC7D,YAAY,EAAC,MAAM,aAAa,IAAI,wBAAuB;AAAA,EAC3D,YAAY,EAAC,MAAM,iBAAiB,IAAI,4BAA2B;AAAA,EACnE,YAAY,EAAC,MAAM,WAAW,IAAI,sBAAqB;AAAA,EACvD,aAAa,EAAC,MAAM,SAAS,IAAI,0BAAyB;AAAA,EAC1D,YAAY,EAAC,MAAM,WAAW,IAAI,sBAAqB;AAAA,EACvD,WAAW,EAAC,MAAM,qBAAqB,IAAI,mBAAkB;AAC9D;AAEO,IAAM,2BAA2B,IAAI,IAAI,OAAO,QAAQ,qBAAqB,CAAC;AAE9E,IAAM,sBAAN,cAAkC,MAAM;AAAC;AAEhD,eAAO,eAAsC,iBAAiBC,gBAAe;AAC5E,QAAM,EAAC,OAAM,IAAI,MAAM,eAAe,OAAO;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACD,CAAC;AAED,QAAM,QAAQ,+BAA+B,KAAK,MAAM;AACxD,MAAI,CAAC,OAAO;AACX,UAAM,IAAI,oBAAoB,0CAA0C,KAAK,UAAU,MAAM,CAAC,EAAE;AAAA,EACjG;AAEA,QAAM,EAAC,GAAE,IAAI,MAAM;AAKnB,QAAM,WAAW,GAAG,YAAY,GAAG;AACnC,QAAM,cAAc,GAAG,YAAY,GAAG;AACtC,QAAM,cAAc,aAAa,KAAK,SAAY,GAAG,MAAM,GAAG,QAAQ;AACtE,QAAM,iBAAiB,gBAAgB,KAAK,SAAY,GAAG,MAAM,GAAG,WAAW;AAE/E,SAAO,sBAAsB,EAAE,KAAK,sBAAsB,WAAW,KAAK,sBAAsB,cAAc,KAAK,EAAC,MAAM,IAAI,GAAE;AACjI;;;AJ/CA,IAAMC,iBAAgBC,WAAUC,SAAQ;AAGxC,IAAM,WAAW,YAAU,OAAO,YAAY,EAAE,WAAW,iBAAiB,OAAK,EAAE,YAAY,CAAC;AAEhG,eAAOC,kBAAwC;AAC9C,MAAIC,SAAQ,aAAa,UAAU;AAClC,UAAM,KAAK,MAAM,iBAAiB;AAClC,UAAM,OAAO,MAAM,WAAW,EAAE;AAChC,WAAO,EAAC,MAAM,GAAE;AAAA,EACjB;AAEA,MAAIA,SAAQ,aAAa,SAAS;AACjC,UAAM,EAAC,OAAM,IAAI,MAAMJ,eAAc,YAAY,CAAC,SAAS,WAAW,uBAAuB,CAAC;AAC9F,UAAM,KAAK,OAAO,KAAK;AACvB,UAAM,OAAO,SAAS,GAAG,QAAQ,aAAa,EAAE,EAAE,QAAQ,KAAK,GAAG,CAAC;AACnE,WAAO,EAAC,MAAM,GAAE;AAAA,EACjB;AAEA,MAAII,SAAQ,aAAa,SAAS;AACjC,WAAO,eAAQ;AAAA,EAChB;AAEA,QAAM,IAAI,MAAM,8CAA8C;AAC/D;;;ANrBA,IAAMC,YAAWC,WAAU,aAAa,QAAQ;AAGhD,IAAM,YAAYC,OAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAC7D,IAAM,mBAAmBA,OAAK,KAAK,WAAW,UAAU;AAExD,IAAM,EAAC,UAAU,KAAI,IAAIC;AAOzB,eAAe,kCAAkC;AAChD,QAAM,iBAAiB,MAAM,eAAe;AAC5C,QAAM,aAAa,OAAO;AAC1B,QAAM,iBAAiBC,QAAO,KAAK,YAAY,SAAS,EAAE,SAAS,QAAQ;AAE3E,QAAM,EAAC,OAAM,IAAI,MAAMJ;AAAA,IACtB;AAAA,IACA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,IACA,EAAC,UAAU,OAAM;AAAA,EAClB;AAEA,QAAM,SAAS,OAAO,KAAK;AAG3B,QAAM,aAAa;AAAA,IAClB,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,WAAW;AAAA,IACX,YAAY;AAAA,EACb;AAEA,SAAO,WAAW,MAAM,IAAI,EAAC,IAAI,WAAW,MAAM,EAAC,IAAI,CAAC;AACzD;AAEA,IAAM,WAAW,OAAO,OAAO,WAAW;AACzC,MAAI;AAEJ,aAAW,QAAQ,OAAO;AACzB,QAAI;AACH,aAAO,MAAM,OAAO,IAAI;AAAA,IACzB,SAAS,OAAO;AACf,oBAAc;AAAA,IACf;AAAA,EACD;AAEA,QAAM;AACP;AAGA,IAAM,WAAW,OAAM,YAAW;AACjC,YAAU;AAAA,IACT,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,GAAG;AAAA,EACJ;AAEA,MAAI,MAAM,QAAQ,QAAQ,GAAG,GAAG;AAC/B,WAAO,SAAS,QAAQ,KAAK,eAAa,SAAS;AAAA,MAClD,GAAG;AAAA,MACH,KAAK;AAAA,IACN,CAAC,CAAC;AAAA,EACH;AAEA,MAAI,EAAC,MAAM,KAAK,WAAW,eAAe,CAAC,EAAC,IAAI,QAAQ,OAAO,CAAC;AAChE,iBAAe,CAAC,GAAG,YAAY;AAE/B,MAAI,MAAM,QAAQ,GAAG,GAAG;AACvB,WAAO,SAAS,KAAK,aAAW,SAAS;AAAA,MACxC,GAAG;AAAA,MACH,KAAK;AAAA,QACJ,MAAM;AAAA,QACN,WAAW;AAAA,MACZ;AAAA,IACD,CAAC,CAAC;AAAA,EACH;AAEA,MAAI,QAAQ,aAAa,QAAQ,kBAAkB;AAElD,UAAM,MAAM;AAAA,MACX,qBAAqB;AAAA,MACrB,yBAAyB;AAAA,MACzB,qBAAqB;AAAA,MACrB,uBAAuB;AAAA,MACvB,mBAAmB;AAAA,MACnB,wBAAwB;AAAA,MACxB,sBAAsB;AAAA,MACtB,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,IAC3B;AAGA,UAAM,QAAQ;AAAA,MACb,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,IACP;AAEA,UAAM,UAAU,iBAAQ,MAAM,gCAAgC,IAAI,MAAMK,gBAAe;AACvF,QAAI,QAAQ,MAAM,KAAK;AACtB,YAAM,cAAc,IAAI,QAAQ,EAAE;AAElC,UAAI,QAAQ,kBAAkB;AAC7B,qBAAa,KAAK,MAAM,WAAW,CAAC;AAAA,MACrC;AAEA,aAAO,SAAS;AAAA,QACf,GAAG;AAAA,QACH,KAAK;AAAA,UACJ,MAAM,KAAK,WAAW;AAAA,UACtB,WAAW;AAAA,QACZ;AAAA,MACD,CAAC;AAAA,IACF;AAEA,UAAM,IAAI,MAAM,GAAG,QAAQ,IAAI,wCAAwC;AAAA,EACxE;AAEA,MAAI;AACJ,QAAM,eAAe,CAAC;AACtB,QAAM,sBAAsB,CAAC;AAE7B,MAAI,aAAa,UAAU;AAC1B,cAAU;AAEV,QAAI,QAAQ,MAAM;AACjB,mBAAa,KAAK,aAAa;AAAA,IAChC;AAEA,QAAI,QAAQ,YAAY;AACvB,mBAAa,KAAK,cAAc;AAAA,IACjC;AAEA,QAAI,QAAQ,aAAa;AACxB,mBAAa,KAAK,OAAO;AAAA,IAC1B;AAEA,QAAI,KAAK;AACR,mBAAa,KAAK,MAAM,GAAG;AAAA,IAC5B;AAAA,EACD,WAAW,aAAa,WAAY,kBAAS,CAAC,kBAAkB,KAAK,CAAC,KAAM;AAC3E,cAAU,MAAM,eAAe;AAE/B,iBAAa;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,QAAI,CAAC,gBAAO;AACX,0BAAoB,2BAA2B;AAAA,IAChD;AAEA,UAAM,mBAAmB,CAAC,OAAO;AAEjC,QAAI,QAAQ,MAAM;AACjB,uBAAiB,KAAK,OAAO;AAAA,IAC9B;AAEA,QAAI,KAAK;AAGR,uBAAiB,KAAK,OAAO,GAAG,MAAM;AACtC,UAAI,QAAQ,QAAQ;AACnB,qBAAa,KAAK,QAAQ,MAAM;AAAA,MACjC;AAAA,IACD,WAAW,QAAQ,QAAQ;AAC1B,uBAAiB,KAAK,IAAI,QAAQ,MAAM,GAAG;AAAA,IAC5C;AAEA,QAAI,aAAa,SAAS,GAAG;AAC5B,qBAAe,aAAa,IAAI,cAAY,OAAO,QAAQ,MAAM;AACjE,uBAAiB,KAAK,iBAAiB,aAAa,KAAK,GAAG,CAAC;AAAA,IAC9D;AAGA,YAAQ,SAASD,QAAO,KAAK,iBAAiB,KAAK,GAAG,GAAG,SAAS,EAAE,SAAS,QAAQ;AAAA,EACtF,OAAO;AACN,QAAI,KAAK;AACR,gBAAU;AAAA,IACX,OAAO;AAEN,YAAM,YAAY,CAAC,aAAa,cAAc;AAG9C,UAAI,kBAAkB;AACtB,UAAI;AACH,cAAME,KAAG,OAAO,kBAAkBC,aAAY,IAAI;AAClD,0BAAkB;AAAA,MACnB,QAAQ;AAAA,MAAC;AAET,YAAM,mBAAmBJ,SAAQ,SAAS,aACrC,aAAa,aAAa,aAAa,CAAC;AAC7C,gBAAU,mBAAmB,aAAa;AAAA,IAC3C;AAEA,QAAI,aAAa,SAAS,GAAG;AAC5B,mBAAa,KAAK,GAAG,YAAY;AAAA,IAClC;AAEA,QAAI,CAAC,QAAQ,MAAM;AAGlB,0BAAoB,QAAQ;AAC5B,0BAAoB,WAAW;AAAA,IAChC;AAAA,EACD;AAEA,MAAI,aAAa,YAAY,aAAa,SAAS,GAAG;AACrD,iBAAa,KAAK,UAAU,GAAG,YAAY;AAAA,EAC5C;AAGA,MAAI,QAAQ,QAAQ;AACnB,iBAAa,KAAK,QAAQ,MAAM;AAAA,EACjC;AAEA,QAAM,aAAa,aAAa,MAAM,SAAS,cAAc,mBAAmB;AAEhF,MAAI,QAAQ,MAAM;AACjB,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,iBAAW,KAAK,SAAS,MAAM;AAE/B,iBAAW,KAAK,SAAS,cAAY;AACpC,YAAI,CAAC,QAAQ,wBAAwB,WAAW,GAAG;AAClD,iBAAO,IAAI,MAAM,oBAAoB,QAAQ,EAAE,CAAC;AAChD;AAAA,QACD;AAEA,gBAAQ,UAAU;AAAA,MACnB,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAEA,aAAW,MAAM;AAEjB,SAAO;AACR;AAEA,IAAM,OAAO,CAAC,QAAQ,YAAY;AACjC,MAAI,OAAO,WAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,qBAAqB;AAAA,EAC1C;AAEA,SAAO,SAAS;AAAA,IACf,GAAG;AAAA,IACH;AAAA,EACD,CAAC;AACF;AAqBA,SAAS,iBAAiB,QAAQ;AACjC,MAAI,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AACxD,WAAO;AAAA,EACR;AAEA,QAAM,EAAC,CAAC,IAAI,GAAG,WAAU,IAAI;AAE7B,MAAI,CAAC,YAAY;AAChB,UAAM,IAAI,MAAM,GAAG,IAAI,mBAAmB;AAAA,EAC3C;AAEA,SAAO;AACR;AAEA,SAAS,qBAAqB,EAAC,CAAC,QAAQ,GAAG,eAAc,GAAG,EAAC,IAAG,GAAG;AAClE,MAAI,OAAO,gBAAO;AACjB,WAAO,iBAAiB,GAAG;AAAA,EAC5B;AAEA,MAAI,CAAC,gBAAgB;AACpB,UAAM,IAAI,MAAM,GAAG,QAAQ,mBAAmB;AAAA,EAC/C;AAEA,SAAO,iBAAiB,cAAc;AACvC;AAEO,IAAM,OAAO,CAAC;AAErB,mBAAmB,MAAM,UAAU,MAAM,qBAAqB;AAAA,EAC7D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO,CAAC,iBAAiB,wBAAwB,UAAU;AAC5D,GAAG;AAAA,EACF,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,KAAK,CAAC,6DAA6D,iEAAiE;AAAA,EACrI;AACD,CAAC,CAAC;AAEF,mBAAmB,MAAM,SAAS,MAAM,qBAAqB;AAAA,EAC5D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO,CAAC,iBAAiB,OAAO;AACjC,GAAG;AAAA,EACF,KAAK;AAAA,IACJ,MAAM;AAAA,IACN,KAAK,CAAC,0EAA0E,8EAA8E;AAAA,EAC/J;AACD,CAAC,CAAC;AAEF,mBAAmB,MAAM,WAAW,MAAM,qBAAqB;AAAA,EAC9D,QAAQ;AAAA,EACR,OAAO,OAAO;AAAA,EACd,OAAO;AACR,GAAG;AAAA,EACF,KAAK;AACN,CAAC,CAAC;AAEF,mBAAmB,MAAM,QAAQ,MAAM,qBAAqB;AAAA,EAC3D,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO,CAAC,kBAAkB,oBAAoB;AAC/C,GAAG;AAAA,EACF,KAAK;AACN,CAAC,CAAC;AAEF,mBAAmB,MAAM,WAAW,MAAM,SAAS;AAEnD,mBAAmB,MAAM,kBAAkB,MAAM,gBAAgB;AAEjE,IAAO,eAAQ;;;AW7Wf,SAAS,YAAYK,YAAU;AAE/B,OAAOC,YAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,2BAA2B;AACpC,SAAS,mBAAmB;AAC5B,SAAS,YAAY;;;ACNrB,SAAS,oBAAoB;AAE7B,OAAOC,YAAW;AAGX,IAAM,oBAAoB;AACjC,IAAM,kBAAkB;AAMxB,SAAS,qBAAqB,OAA2B;AACvD,MAAI,MAAM,QAAQ,QAAW;AAC3B,UAAM,KAAK;AACX;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa,SAAS;AAChC,UAAM,SAASA,OAAM,KAAK,YAAY,CAAC,QAAQ,OAAO,MAAM,GAAG,GAAG,MAAM,IAAI,GAAG;AAAA,MAC7E,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AACD,QAAI,OAAO,OAAO;AAChB,YAAM,KAAK;AAAA,IACb;AACA;AAAA,EACF;AAEA,QAAM,KAAK;AACb;AAEO,IAAM,iBAAN,cAA6B,aAAa;AAAA,EAC9B,YAAY,oBAAI,IAA2B;AAAA,EAC3C,OAA0B,CAAC;AAAA,EACpC,mBAAmB;AAAA,EAE3B,MAAM,SAMqB;AACzB,UAAM,QAAQA,OAAM,QAAQ,SAAS,QAAQ,MAAM;AAAA,MACjD,KAAK,QAAQ;AAAA,MACb,OAAO;AAAA,MACP,aAAa;AAAA,IACf,CAAC;AAED,UAAM,MAAM,OAAO,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE;AACtF,UAAM,SAAwB;AAAA,MAC5B;AAAA,MACA;AAAA,MACA,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,MACjB,QAAQ;AAAA,MACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,SAAS;AAAA,MACT,UAAU;AAAA,IACZ;AAEA,SAAK,UAAU,IAAI,KAAK,MAAM;AAC9B,SAAK,WAAW,QAAQ,WAAW,QAAQ,cAAc,EAAE;AAE3D,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,WAAK,QAAQ,QAAQ,UAAU,MAAM,SAAS,CAAC;AAAA,IACjD,CAAC;AAED,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB;AAC1C,WAAK,QAAQ,QAAQ,UAAU,MAAM,SAAS,CAAC;AAAA,IACjD,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,aAAO,SAAS;AAChB,aAAO,WAAU,oBAAI,KAAK,GAAE,YAAY;AACxC,WAAK,QAAQ,QAAQ,UAAU,MAAM,OAAO;AAC5C,WAAK,KAAK,WAAW,KAAK,SAAS,MAAM,CAAC;AAAA,IAC5C,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,OAAO,WAAW,WAAW;AAC/B,eAAO,WAAW;AAAA,MACpB,OAAO;AACL,eAAO,SAAS,SAAS,IAAI,WAAW;AACxC,eAAO,WAAW;AAAA,MACpB;AACA,aAAO,WAAU,oBAAI,KAAK,GAAE,YAAY;AACxC,WAAK,WAAW,QAAQ,oBAAoB,QAAQ,SAAS,EAAE;AAC/D,WAAK,KAAK,WAAW,KAAK,SAAS,MAAM,CAAC;AAAA,IAC5C,CAAC;AAED,SAAK,KAAK,WAAW,KAAK,SAAS,MAAM,CAAC;AAC1C,WAAO,KAAK,SAAS,MAAM;AAAA,EAC7B;AAAA,EAEA,KAAK,KAAsB;AACzB,UAAM,SAAS,KAAK,UAAU,IAAI,GAAG;AACrC,QAAI,CAAC,UAAU,OAAO,WAAW,WAAW;AAC1C,aAAO;AAAA,IACT;AAEA,WAAO,SAAS;AAChB,WAAO,WAAU,oBAAI,KAAK,GAAE,YAAY;AACxC,yBAAqB,OAAO,KAAK;AACjC,SAAK,WAAW,QAAQ,uBAAuB;AAC/C,SAAK,KAAK,WAAW,KAAK,SAAS,MAAM,CAAC;AAC1C,WAAO;AAAA,EACT;AAAA,EAEA,OAAiC;AAC/B,WAAO,MAAM,KAAK,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,KAAK,SAAS,MAAM,CAAC;AAAA,EAClF;AAAA,EAEA,WAA8B;AAC5B,WAAO,CAAC,GAAG,KAAK,IAAI;AAAA,EACtB;AAAA,EAEA,UAAgB;AACd,eAAW,UAAU,KAAK,UAAU,OAAO,GAAG;AAC5C,UAAI,OAAO,WAAW,WAAW;AAC/B,eAAO,SAAS;AAChB,eAAO,WAAU,oBAAI,KAAK,GAAE,YAAY;AACxC,6BAAqB,OAAO,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAA8B;AAC5B,QAAI,KAAK,kBAAkB;AACzB;AAAA,IACF;AAEA,SAAK,mBAAmB;AACxB,YAAQ,KAAK,QAAQ,MAAM;AACzB,WAAK,QAAQ;AAAA,IACf,CAAC;AACD,YAAQ,KAAK,UAAU,MAAM;AAC3B,WAAK,QAAQ;AACb,cAAQ,KAAK,GAAG;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEQ,QAAQ,QAAuB,QAAmC,SAAuB;AAC/F,UAAM,iBACJ,QAAQ,UAAU,oBAAoB,UAAU,QAAQ,MAAM,CAAC,iBAAiB;AAClF,UAAM,QAAyB;AAAA,MAC7B,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf;AAAA,MACA,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,SAAK,KAAK,KAAK,KAAK;AACpB,QAAI,KAAK,KAAK,SAAS,iBAAiB;AACtC,WAAK,KAAK,OAAO,GAAG,KAAK,KAAK,SAAS,eAAe;AAAA,IACxD;AAEA,SAAK,KAAK,OAAO,KAAK;AAAA,EACxB;AAAA,EAEQ,WAAW,QAAuB,SAAuB;AAC/D,SAAK,QAAQ,QAAQ,UAAU,OAAO;AAAA,EACxC;AAAA,EAEQ,SAAS,QAA+C;AAC9D,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,IACnB;AAAA,EACF;AACF;;;ACjLA,SAAS,kBAAkB;AAC3B,SAAS,YAAYC,YAAU;AAC/B,OAAOC,SAAQ;AACf,OAAOC,YAAU;;;ACHjB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AAEjB,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWD,OAAK,SAAS,MAAM,MAAM;AAC3C,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,QAAQ;AACpF;AAEA,eAAsB,2BAA8C;AAClE,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,KAAK;AACR,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,IAAI,MAAM,GAAG,GAAG;AAClC,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,QAAI;AACF,YAAM,KAAK,MAAMD,KAAG,SAASC,OAAK,QAAQ,OAAO,CAAC,CAAC;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,2BAA2B,YAAmC;AAClF,QAAM,QAAQ,MAAM,yBAAyB;AAC7C,MAAI,MAAM,WAAW,GAAG;AACtB;AAAA,EACF;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAIC,cAAa,MAAM,UAAU,GAAG;AAClC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kDAAkD;AACpE;;;AD/BA,SAAS,YAAY,UAA0B;AAC7C,QAAM,OACJC,OACG,SAAS,QAAQ,EACjB,QAAQ,mBAAmB,GAAG,EAC9B,MAAM,GAAG,EAAE,KAAK;AACrB,QAAM,OAAO,WAAW,QAAQ,EAAE,OAAO,QAAQ,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AAC3E,SAAO,GAAG,IAAI,IAAI,IAAI;AACxB;AAEA,SAAS,iBAAyB;AAChC,SAAO,QAAQ,IAAI,uBAAuBA,OAAK,KAAKC,IAAG,QAAQ,GAAG,aAAa;AACjF;AAEA,eAAe,gBAAgB,SAAyC;AACtE,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,MAAMC,KAAG,SAASF,OAAK,KAAK,SAAS,cAAc,GAAG,MAAM,CAAC;AACpF,WAAO,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,SAAS,IAAI,IAAI,OAAO;AAAA,EAC3E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,IAAM,oBAAN,MAAwB;AAAA,EACZ;AAAA,EACT,SAAS;AAAA,EAEjB,YAAY,SAAkB;AAC5B,UAAM,MAAM,WAAW,eAAe;AACtC,SAAK,WAAWA,OAAK,KAAK,KAAK,iBAAiB;AAAA,EAClD;AAAA,EAEA,MAAM,OAAkC;AACtC,UAAM,KAAK,YAAY;AACvB,WAAO,MAAM,KAAK,KAAK;AAAA,EACzB;AAAA,EAEA,MAAM,IAAI,SAA0C;AAClD,UAAM,UAAU,MAAM,KAAK,WAAW,OAAO;AAC7C,UAAM,2BAA2B,OAAO;AACxC,UAAM,UAAU,MAAM,KAAK,KAAK;AAEhC,UAAM,WAAW,QAAQ,KAAK,CAACG,WAAUA,OAAM,SAAS,OAAO;AAC/D,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,OAAQ,MAAM,gBAAgB,OAAO,KAAMH,OAAK,SAAS,OAAO;AACtE,UAAM,QAAwB;AAAA,MAC5B,IAAI,YAAY,OAAO;AAAA,MACvB;AAAA,MACA,MAAM;AAAA,MACN,UAAS,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AACA,YAAQ,KAAK,KAAK;AAClB,UAAM,KAAK,MAAM,OAAO;AACxB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,IAA8B;AACzC,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,WAAW,QAAQ,OAAO,CAAC,UAAU,MAAM,OAAO,EAAE;AAC1D,QAAI,SAAS,WAAW,QAAQ,QAAQ;AACtC,aAAO;AAAA,IACT;AACA,UAAM,KAAK,MAAM,QAAQ;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,SAAiD;AAChE,QAAI;AACF,YAAM,UAAU,MAAME,KAAG,SAASF,OAAK,QAAQ,OAAO,CAAC;AACvD,YAAM,UAAU,MAAM,KAAK,KAAK;AAChC,aAAO,QAAQ,KAAK,CAAC,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,IAC5D,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,IAA4C;AACxD,UAAM,UAAU,MAAM,KAAK,KAAK;AAChC,UAAM,QAAQ,QAAQ,KAAK,CAAC,SAAS,KAAK,OAAO,EAAE;AACnD,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,WAAW,MAAM,IAAI;AAChD,YAAM,2BAA2B,OAAO;AACxC,UAAI,YAAY,MAAM,MAAM;AAC1B,cAAM,UAA0B,EAAE,GAAG,OAAO,MAAM,QAAQ;AAC1D,cAAM,KAAK,MAAM,QAAQ,IAAI,CAAC,SAAU,KAAK,OAAO,KAAK,UAAU,IAAK,CAAC;AACzE,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,QAAQ;AACN,YAAM,KAAK,OAAO,EAAE;AACpB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,SAAkC;AACzD,UAAM,WAAWA,OAAK,QAAQ,OAAO;AACrC,UAAM,UAAU,MAAME,KAAG,SAAS,QAAQ;AAC1C,UAAM,OAAO,MAAMA,KAAG,KAAK,OAAO;AAClC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAM,IAAI,MAAM,GAAG,OAAO,sBAAsB;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OAAkC;AAC9C,QAAI;AACF,YAAM,UAAU,MAAMA,KAAG,SAAS,KAAK,UAAU,MAAM;AACvD,YAAM,SAAS,KAAK,MAAM,OAAO;AACjC,aAAO,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC;AAAA,IAC3C,QAAQ;AACN,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAc,MAAM,SAA0C;AAC5D,UAAMA,KAAG,MAAMF,OAAK,QAAQ,KAAK,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAME,KAAG,UAAU,KAAK,UAAU,KAAK,UAAU,SAAS,MAAM,CAAC,IAAI,MAAM;AAAA,MACzE,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,cAA6B;AACzC,QAAI,KAAK,QAAQ;AACf;AAAA,IACF;AACA,SAAK,SAAS;AAEd,UAAM,YAAY,QAAQ,IAAI;AAC9B,QAAI,CAAC,WAAW;AACd;AAAA,IACF;AAEA,UAAM,QAAQ,UACX,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AACjB,eAAW,KAAK,OAAO;AACrB,UAAI;AACF,cAAM,KAAK,IAAI,CAAC;AAAA,MAClB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;;;AElJO,IAAM,MAAN,MAAU;AAAA,EACN;AAAA,EACQ,WAAW,oBAAI,IAA8B;AAAA,EACtD,mBAAmB;AAAA,EAE3B,YAAY,SAAgC;AAC1C,SAAK,WAAW,IAAI,kBAAkB,SAAS,OAAO;AAAA,EACxD;AAAA,EAEA,IAAI,IAAqC;AACvC,WAAO,KAAK,SAAS,IAAI,EAAE,KAAK;AAAA,EAClC;AAAA,EAEA,OAAO,OAAyC;AAC9C,UAAM,WAAW,KAAK,SAAS,IAAI,MAAM,EAAE;AAC3C,QAAI,UAAU;AACZ,aAAO;AAAA,IACT;AAEA,UAAM,UAA4B;AAAA,MAChC,IAAI,MAAM;AAAA,MACV,MAAM,MAAM;AAAA,MACZ,gBAAgB,IAAI,eAAe;AAAA,MACnC,kBAAkB,IAAI,wBAAwB,MAAM,IAAI;AAAA,IAC1D;AACA,SAAK,SAAS,IAAI,MAAM,IAAI,OAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,gBAA6C;AACjD,UAAM,UAAU,MAAM,KAAK,SAAS,KAAK;AACzC,WAAO,QAAQ,IAAI,CAAC,UAAU;AAC5B,YAAM,UAAU,KAAK,SAAS,IAAI,MAAM,EAAE;AAC1C,YAAM,UAAU,UACZ,QAAQ,eAAe,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS,EAAE,SACpE;AACJ,aAAO;AAAA,QACL,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,UAAgB;AACd,eAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAC5C,cAAQ,eAAe,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,wBAA8B;AAC5B,QAAI,KAAK,kBAAkB;AACzB;AAAA,IACF;AACA,SAAK,mBAAmB;AAExB,YAAQ,KAAK,QAAQ,MAAM;AACzB,WAAK,QAAQ;AAAA,IACf,CAAC;AACD,YAAQ,KAAK,UAAU,MAAM;AAC3B,WAAK,QAAQ;AACb,cAAQ,KAAK,GAAG;AAAA,IAClB,CAAC;AAAA,EACH;AACF;;;ACrFA,SAAS,aAAAE,YAAW,kBAAkB;AACtC,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,OAAOC,YAAW;;;ACHX,IAAM,sBAAsB;;;ACAnC,IAAM,kBAAkB,oBAAI,IAAI,CAAC,aAAa,aAAa,KAAK,CAAC;AAEjE,SAAS,uBAAuB,MAA6B;AAC3D,QAAM,UAAU,KAAK,KAAK,EAAE,YAAY;AACxC,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,UAAM,MAAM,QAAQ,QAAQ,GAAG;AAC/B,WAAO,MAAM,IAAI,QAAQ,MAAM,GAAG,GAAG,IAAI;AAAA,EAC3C;AAEA,SAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,KAAK;AAClC;AAEO,SAAS,yBAAyB,MAA0C;AACjF,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,uBAAuB,IAAI;AAC5C,SAAO,aAAa,QAAQ,gBAAgB,IAAI,QAAQ;AAC1D;AAEO,SAAS,qBAAqB,QAAgC;AACnE,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,YACG,IAAI,aAAa,WAAW,IAAI,aAAa,aAC9C,gBAAgB,IAAI,IAAI,SAAS,YAAY,CAAC;AAAA,EAElD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,YAAoB,QAAyB;AACxE,MAAI;AACF,WAAO,IAAI,IAAI,UAAU,EAAE,WAAW,IAAI,IAAI,MAAM,EAAE;AAAA,EACxD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC/CO,IAAM,eAAe;AACrB,IAAM,eAAe;AAE5B,IAAM,iBAAiB,oBAAI,IAAI,CAAC,aAAa,aAAa,KAAK,CAAC;AAChE,IAAM,kBAAkB,oBAAI,IAAI,CAAC,WAAW,IAAI,CAAC;AAE1C,SAAS,cAAsB;AACpC,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,IAAI,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,IAAI,OAAO,KAAK,QAAQ,IAAI,yBAAyB,QAAQ;AAC/E,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,IAAI,OAAO,GAAG;AAChC,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,yEAAyE;AAC3F;AAEA,IAAI,aAAa;AAEV,SAAS,cAAc,MAAoB;AAChD,eAAa;AACf;AAEO,SAAS,gBAAwB;AACtC,SAAO;AACT;AAMO,SAAS,uBAAuB,KAAwC;AAC7E,MAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,IAAI,WAAW,SAAS,GAAG;AAC7B,WAAO,IAAI,MAAM,UAAU,MAAM;AAAA,EACnC;AAEA,SAAO;AACT;AAEO,SAAS,wBAAwB,KAAkC;AACxE,QAAM,UAAU,uBAAuB,GAAG;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,SAAS,YAAY,aAAa;AAChD,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,WAAW,MAAM;AAClC;AAEA,SAAS,UAAU,SAA0D;AAC3E,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAC/C,MAAI,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,GAAG,GAAG;AAChF,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,KAAkC;AACvE,QAAM,UAAU,uBAAuB,GAAG;AAC1C,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,MAAI,wBAAwB,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW,OAAO,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,UAAU,OAAO;AAC9B,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,CAAC,GAAG,CAAC,IAAI;AACf,MAAI,MAAM,IAAI;AACZ,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,MAAM,KAAK;AAC1B,WAAO;AAAA,EACT;AACA,MAAI,MAAM,OAAO,KAAK,MAAM,KAAK,IAAI;AACnC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,KAAyB,MAAuB;AACrF,MAAI,SAAS,aAAa,SAAS,MAAM;AACvC,WAAO,uBAAuB,GAAG;AAAA,EACnC;AAEA,SAAO,wBAAwB,GAAG;AACpC;AAEO,SAAS,0BACd,KACA,OAAe,cAAc,GACpB;AACT,MAAI,QAAQ,QAAW;AACrB,WAAO;AAAA,EACT;AAEA,SAAO,uBAAuB,KAAK,IAAI;AACzC;AAEO,SAAS,uBAA+B;AAC7C,QAAM,OAAO,YAAY;AACzB,gBAAc,IAAI;AAClB,SAAO;AACT;;;ACrIO,SAAS,yBAAyB,SAA0D;AACjG,SAAO,SAAS,QAAQ;AAC1B;AAaO,SAAS,4BAA4B;AAC1C,SAAO,OAAO,SAAkB,SAAe;AAC7C,UAAM,OAAO,QAAQ,IAAI,OAAO,MAAM,KAAK,IAAI,IAAI,QAAQ,IAAI,GAAG,EAAE;AACpE,QAAI,CAAC,yBAAyB,IAAI,GAAG;AACnC,aAAO,QAAQ,KAAK,EAAE,OAAO,2BAA2B,GAAG,GAAG;AAAA,IAChE;AAEA,UAAM,MAAM,QAAQ;AACpB,UAAM,gBAAgB,yBAAyB,KAAK,QAAQ;AAC5D,QAAI,CAAC,0BAA0B,eAAe,cAAc,CAAC,GAAG;AAC9D,aAAO,QAAQ,KAAK,EAAE,OAAO,0BAA0B,GAAG,GAAG;AAAA,IAC/D;AAEA,UAAM,KAAK;AAAA,EACb;AACF;;;ACnCA,SAAS,aAAa,uBAAuB;AAEtC,SAAS,sBAA8B;AAC5C,SAAO,YAAY,EAAE,EAAE,SAAS,KAAK;AACvC;AAEO,SAAS,sBACd,UACA,UACS;AACT,MAAI,OAAO,aAAa,YAAY,SAAS,WAAW,GAAG;AACzD,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,WAAW,SAAS,QAAQ;AACvC,WAAO;AAAA,EACT;AAEA,SAAO,gBAAgB,OAAO,KAAK,UAAU,MAAM,GAAG,OAAO,KAAK,UAAU,MAAM,CAAC;AACrF;;;ACnBO,SAAS,yBAAyB,SAA0B;AACjE,SAAO,qBAAqB,KAAK,OAAO;AAC1C;;;AN0BA,SAASC,cAAa,MAAc,QAAyB;AAC3D,QAAM,WAAWC,OAAK,SAASA,OAAK,QAAQ,IAAI,GAAGA,OAAK,QAAQ,MAAM,CAAC;AACvE,SAAO,aAAa,MAAO,CAAC,SAAS,WAAW,IAAI,KAAK,CAACA,OAAK,WAAW,QAAQ;AACpF;AAEA,SAAS,wBAAwB,YAAoB,QAAgC;AACnF,MAAI,WAAW,MAAM;AACnB,WAAO;AAAA,EACT;AACA,SAAO,qBAAqB,MAAM,KAAK,aAAa,YAAY,MAAM;AACxE;AAEA,SAAS,sBAAsB,KAAW,eAA6B;AACrE,MAAI,IAAI,UAAU,0BAA0B,CAAC;AAC7C,MAAI,IAAI,UAAU,OAAO,SAAS,SAAS;AACzC,QAAI,QAAQ,IAAI,WAAW,SAAS,QAAQ,IAAI,WAAW,QAAQ;AACjE,YAAM,KAAK;AACX;AAAA,IACF;AAEA,UAAM,SAAS,QAAQ,IAAI,OAAO,QAAQ,KAAK;AAC/C,UAAM,eAAe,QAAQ,IAAI,OAAO,gBAAgB,KAAK;AAC7D,UAAM,SAAS,QAAQ,IAAI,OAAO,qBAAqB,KAAK;AAC5D,UAAM,QAAQ,QAAQ,IAAI,OAAO,oBAAoB,KAAK;AAC1D,QACE,CAAC,kBAAkB,MAAM,KACzB,CAAC,sBAAsB,OAAO,aAAa,KAC3C,iBAAiB,YAAY,KAC7B,CAAC,wBAAwB,QAAQ,IAAI,KAAK,MAAM,GAChD;AACA,aAAO,QAAQ,KAAK,EAAE,OAAO,kCAAkC,GAAG,GAAG;AAAA,IACvE;AAEA,UAAM,KAAK;AAAA,EACb,CAAC;AACH;AAEA,SAAS,iBAAiB,cAAsC;AAC9D,SAAO,iBAAiB;AAC1B;AAEA,SAAS,kBAAkB,QAAgC;AACzD,SAAO,WAAW;AACpB;AAEA,eAAe,mBAAmB,MAAc,QAAkC;AAChF,MAAI,CAACD,cAAa,MAAM,MAAM,GAAG;AAC/B,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,CAAC,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI,CAACE,KAAG,SAAS,IAAI,GAAGA,KAAG,SAAS,MAAM,CAAC,CAAC;AACzF,WAAOF,cAAa,UAAU,UAAU;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,8BAA8B,MAAc,aAAuC;AAChG,MAAI,CAACA,cAAa,MAAM,WAAW,GAAG;AACpC,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,CAAC,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/CE,KAAG,SAAS,IAAI;AAAA,MAChBA,KAAG,SAASD,OAAK,QAAQ,WAAW,CAAC;AAAA,IACvC,CAAC;AACD,WAAOD,cAAa,UAAU,UAAU;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBACb,QACA,aAC8B;AAC9B,QAAM,UAAU,MAAME,KAAG,SAAS,MAAM;AACxC,MAAIC,UAA+B;AACnC,MAAI;AACF,IAAAA,UAAS,MAAMD,KAAG;AAAA,MAChB;AAAA,MACAE,WAAU,UAAUA,WAAU,SAASA,WAAU;AAAA,MACjD;AAAA,IACF;AACA,UAAMD,QAAO,UAAU,OAAO;AAC9B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,OACJ,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,QAAQ,MAAM,OAAO;AAChF,QAAI,SAAS,UAAU;AACrB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR,UAAE;AACA,UAAMA,SAAQ,MAAM;AAAA,EACtB;AACF;AAEA,SAAS,sBAAsB,OAAuB;AACpD,SAAO,IAAI,MAAM,QAAQ,MAAM,IAAI,CAAC;AACtC;AAEA,SAAS,iBAAiB,OAAuB;AAC/C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,iCAAyC;AAChD,SAAO,QAAQ,IAAI,WAAW;AAChC;AAEA,SAAS,eAAe,SAAgC;AACtD,MAAIF,OAAK,WAAW,OAAO,GAAG;AAC5B,WAAO,WAAW,OAAO,IAAI,UAAU;AAAA,EACzC;AACA,QAAM,YAAY,QAAQ,IAAI,QAAQ;AACtC,aAAW,aAAa,UAAU,MAAMA,OAAK,SAAS,GAAG;AACvD,QAAI,UAAU,WAAW,GAAG;AAC1B;AAAA,IACF;AACA,UAAM,YAAYA,OAAK,KAAK,WAAW,OAAO;AAC9C,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,SAAiB,MAAgB,MAAuB;AAC9E,QAAM,QAAQI,OAAM,SAAS,MAAM;AAAA,IACjC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO;AAAA,IACP,aAAa,QAAQ,aAAa;AAAA,EACpC,CAAC;AACD,QAAM,GAAG,SAAS,MAAM,MAAS;AACjC,QAAM,MAAM;AACZ,SAAO;AACT;AAEA,SAAS,eAAe,MAAuB;AAC7C,MAAI,QAAQ,aAAa,SAAS;AAChC,WAAO;AAAA,MACL,+BAA+B;AAAA,MAC/B;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,6BAA6B,sBAAsB,IAAI,CAAC;AAAA,MAC1D;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,aAAa,UAAU;AACjC,WAAO,eAAe,QAAQ,CAAC,MAAM,YAAY,IAAI,GAAG,IAAI;AAAA,EAC9D;AAEA,QAAM,qBAAqB,QAAQ,IAAI,UAAU,KAAK;AACtD,MACE,uBAAuB,UACvB,mBAAmB,SAAS,KAC5B,yBAAyB,kBAAkB,KAC3C,eAAe,kBAAkB,MAAM,MACvC;AACA,WAAO,eAAe,oBAAoB,CAAC,GAAG,IAAI;AAAA,EACpD;AAEA,QAAM,iBAA6D;AAAA,IACjE,EAAE,SAAS,uBAAuB,MAAM,CAAC,EAAE;AAAA,IAC3C,EAAE,SAAS,kBAAkB,MAAM,CAAC,uBAAuB,IAAI,EAAE;AAAA,IACjE,EAAE,SAAS,WAAW,MAAM,CAAC,aAAa,IAAI,EAAE;AAAA,IAChD,EAAE,SAAS,kBAAkB,MAAM,CAAC,uBAAuB,IAAI,EAAE;AAAA,IACjE;AAAA,MACE,SAAS;AAAA,MACT,MAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,iBAAiB,IAAI,CAAC,YAAY,iBAAiB,QAAQ,IAAI,SAAS,IAAI,CAAC;AAAA,MACrF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,eAAe,KAAK,CAAC,cAAc,eAAe,UAAU,OAAO,MAAM,IAAI;AAC9F,MAAI,aAAa,QAAW;AAC1B,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,SAAS,SAAS,SAAS,MAAM,IAAI;AAC7D;AAEA,SAAS,kBACP,OACA,SACU;AACV,MAAI,iBAAiB,sBAAsB;AACzC,QAAI,MAAM,SAAS,uBAAuB,MAAM,SAAS,qBAAqB;AAC5E,aAAO,QAAQ,KAAK,EAAE,OAAO,MAAM,SAAS,MAAM,MAAM,KAAK,GAAG,GAAG;AAAA,IACrE;AACA,QAAI,MAAM,SAAS,0BAA0B,MAAM,SAAS,sBAAsB;AAChF,aAAO,QAAQ,KAAK,EAAE,OAAO,MAAM,SAAS,MAAM,MAAM,KAAK,GAAG,GAAG;AAAA,IACrE;AACA,WAAO,QAAQ,KAAK,EAAE,OAAO,MAAM,SAAS,MAAM,MAAM,KAAK,GAAG,GAAG;AAAA,EACrE;AACA,QAAM;AACR;AAEA,eAAe,kBAAkB,MAAc;AAC7C,QAAM,OAAO,MAAM,YAAY,IAAI;AACnC,QAAM,WAAW,MAAM,UAAU,MAAM,IAAI;AAC3C,SAAO,oBAAoB,MAAM,QAAQ;AAC3C;AAEA,SAAS,wBACP,KACA,kBAKM;AACN,MAAI,IAAI,+BAA+B,OAAO,YAAY;AACxD,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,WAAO,QAAQ,KAAK,MAAM,YAAY,GAAG,IAAI,CAAC;AAAA,EAChD,CAAC;AAED,MAAI,IAAI,8BAA8B,OAAO,YAAY;AACvD,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,WAAO,QAAQ,KAAK,MAAM,UAAU,GAAG,IAAI,CAAC;AAAA,EAC9C,CAAC;AAED,MAAI,IAAI,kCAAkC,OAAO,YAAY;AAC3D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,WAAO,QAAQ,KAAK,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,IAAI,iCAAiC,OAAO,YAAY;AAC1D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,WAAO,QAAQ,KAAK,GAAG,eAAe,KAAK,CAAC;AAAA,EAC9C,CAAC;AAED,MAAI,IAAI,4BAA4B,OAAO,YAAY;AACrD,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,WAAO,QAAQ,KAAK,GAAG,eAAe,SAAS,CAAC;AAAA,EAClD,CAAC;AAED,MAAI,IAAI,4CAA4C,OAAO,YAAY;AACrE,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,UAAU,mBAAmB,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC/D,QAAI;AACF,aAAO,QAAQ,KAAK,MAAM,GAAG,iBAAiB,KAAK,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,aAAO,kBAAkB,OAAO,OAAO;AAAA,IACzC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,6CAA6C,OAAO,YAAY;AACvE,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,UAAU,mBAAmB,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC/D,QAAI;AACF,aAAO,QAAQ,KAAK,MAAM,GAAG,iBAAiB,MAAM,OAAO,CAAC;AAAA,IAC9D,SAAS,OAAO;AACd,aAAO,kBAAkB,OAAO,OAAO;AAAA,IACzC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,4CAA4C,OAAO,YAAY;AACtE,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,UAAU,mBAAmB,QAAQ,IAAI,MAAM,SAAS,CAAC;AAC/D,QAAI;AACF,aAAO,QAAQ,KAAK,MAAM,GAAG,iBAAiB,KAAK,OAAO,CAAC;AAAA,IAC7D,SAAS,OAAO;AACd,aAAO,kBAAkB,OAAO,OAAO;AAAA,IACzC;AAAA,EACF,CAAC;AAED,MAAI,KAAK,mCAAmC,OAAO,YAAY;AAC7D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,SAAS,mBAAmB,QAAQ,IAAI,MAAM,QAAQ,CAAC;AAC7D,UAAM,OAAO,MAAM,YAAY,GAAG,IAAI;AACtC,UAAM,gBAAgB,KAAK,QAAQ,MAAM;AAEzC,QAAI,kBAAkB,QAAW;AAC/B,aAAO,QAAQ,KAAK,EAAE,OAAO,WAAW,MAAM,mBAAmB,GAAG,GAAG;AAAA,IACzE;AACA,QAAI,mBAAmB,aAAa,GAAG;AACrC,aAAO,QAAQ,KAAK,EAAE,OAAO,oCAAoC,GAAG,GAAG;AAAA,IACzE;AAEA,UAAM,UAAU,MAAM,yBAAyB;AAAA,MAC7C,KAAK,GAAG;AAAA,MACR,gBAAgB,KAAK;AAAA,MACrB;AAAA,IACF,CAAC;AACD,QAAI,YAAY,MAAM;AACpB,aAAO,QAAQ,KAAK,EAAE,OAAO,4CAA4C,GAAG,GAAG;AAAA,IACjF;AAEA,UAAM,cAAc,GAAG,eAAe,MAAM;AAAA,MAC1C,KAAK,GAAG;AAAA,MACR;AAAA,MACA,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,WAAO,QAAQ,KAAK,EAAE,GAAG,aAAa,cAAc,CAAC;AAAA,EACvD,CAAC;AAED,MAAI,KAAK,+BAA+B,OAAO,YAAY;AACzD,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,OAAO,MAAM,YAAY,GAAG,IAAI;AACtC,UAAM,UAAU,MAAM,6BAA6B;AAAA,MACjD,KAAK,GAAG;AAAA,MACR,gBAAgB,KAAK;AAAA,IACvB,CAAC;AACD,QAAI,YAAY,MAAM;AACpB,aAAO,QAAQ,KAAK,EAAE,OAAO,4CAA4C,GAAG,GAAG;AAAA,IACjF;AAEA,UAAM,cAAc,GAAG,eAAe,MAAM;AAAA,MAC1C,KAAK,GAAG;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD,WAAO,QAAQ,KAAK,WAAW;AAAA,EACjC,CAAC;AAED,MAAI,KAAK,sCAAsC,OAAO,YAAY;AAChE,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,OAAO,mBAAmB,QAAQ,IAAI,MAAM,MAAM,CAAC;AACzD,UAAM,OAAO,MAAM,YAAY,GAAG,IAAI;AACtC,UAAM,oBACJ,KAAK,QAAQ,OAAO,WAAW,IAAI,KAAK,KAAK,eAAe,IAAI,KAAK;AAEvE,QAAI,sBAAsB,MAAM;AAC9B,aAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,IAAI,mBAAmB,GAAG,GAAG;AAAA,IACnF;AACA,QAAI,mBAAmB,iBAAiB,GAAG;AACzC,aAAO,QAAQ,KAAK,EAAE,OAAO,qCAAqC,GAAG,GAAG;AAAA,IAC1E;AAEA,UAAM,kBAAkB,MAAM,yBAAyB,GAAG,MAAM,iBAAiB;AACjF,QAAI,oBAAoB,MAAM;AAC5B,aAAO,QAAQ;AAAA,QACb;AAAA,UACE,OACE;AAAA,QACJ;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,cAAc,GAAG,eAAe,MAAM;AAAA,MAC1C,KAAK,GAAG;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,gBAAgB;AAAA,MACzB,MAAM,gBAAgB;AAAA,MACtB,gBAAgB,gBAAgB;AAAA,IAClC,CAAC;AACD,WAAO,QAAQ,KAAK,EAAE,GAAG,aAAa,kBAAkB,CAAC;AAAA,EAC3D,CAAC;AAED,MAAI,KAAK,mCAAmC,OAAO,YAAY;AAC7D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,aAAK,GAAG,IAAI;AAClB,WAAO,QAAQ,KAAK,EAAE,QAAQ,MAAM,QAAQ,SAAS,CAAC;AAAA,EACxD,CAAC;AAED,MAAI,KAAK,oCAAoC,OAAO,YAAY;AAC9D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,cAAcJ,OAAK,KAAK,GAAG,MAAM,cAAc;AACrD,QAAI,CAAE,MAAM,mBAAmB,GAAG,MAAM,WAAW,GAAI;AACrD,aAAO,QAAQ,KAAK,EAAE,OAAO,sDAAsD,GAAG,GAAG;AAAA,IAC3F;AACA,UAAM,aAAK,WAAW;AACtB,WAAO,QAAQ,KAAK,EAAE,QAAQ,MAAM,QAAQ,UAAU,CAAC;AAAA,EACzD,CAAC;AAED,MAAI,KAAK,qCAAqC,OAAO,YAAY;AAC/D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,SAAS,eAAe,GAAG,IAAI;AACrC,WAAO,QAAQ,KAAK,EAAE,QAAQ,QAAQ,WAAW,GAAG,SAAS,MAAM,GAAG;AAAA,EACxE,CAAC;AAED,MAAI,KAAK,gCAAgC,OAAO,YAAY;AAC1D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,OAAO,MAAM,YAAY,GAAG,IAAI;AACtC,UAAM,cAAc,KAAK,KAAK,eAAe;AAC7C,UAAM,YAAY,KAAK,KAAK,aAAa;AAEzC,QAAI,gBAAgB,MAAM;AACxB,aAAO,QAAQ,KAAK,EAAE,OAAO,8BAA8B,GAAG,GAAG;AAAA,IACnE;AAEA,UAAM,cAAc,aAAaA,OAAK,KAAK,GAAG,MAAM,KAAK,QAAQ,OAAO,KAAK,SAAS,MAAM;AAC5F,QACE,CAAE,MAAM,mBAAmB,GAAG,MAAM,WAAW,KAC/C,CAAE,MAAM,8BAA8B,GAAG,MAAM,WAAW,GAC1D;AACA,aAAO,QAAQ,KAAK,EAAE,OAAO,uDAAuD,GAAG,GAAG;AAAA,IAC5F;AAEA,UAAM,aAAa,MAAM,kBAAkB,aAAa,WAAW;AACnE,QAAI,eAAe,UAAU;AAC3B,aAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AAAA,IAC5D;AACA,WAAO,QAAQ,KAAK,EAAE,QAAQ,KAAK,CAAC;AAAA,EACtC,CAAC;AAED,MAAI,OAAO,gCAAgC,OAAO,YAAY;AAC5D,UAAM,KAAK,MAAM,iBAAiB,QAAQ,IAAI,MAAM,IAAI,CAAC;AACzD,QAAI,CAAC,GAAI,QAAO,QAAQ,KAAK,EAAE,OAAO,uBAAuB,GAAG,GAAG;AACnE,UAAM,MAAM,mBAAmB,QAAQ,IAAI,MAAM,KAAK,CAAC;AACvD,UAAM,UAAU,GAAG,eAAe,KAAK,GAAG;AAC1C,WAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC;AAAA,EACjC,CAAC;AACH;AAEO,SAAS,qBACd,KACA,SAIM;AACN,QAAM,EAAE,IAAI,IAAI;AAChB,wBAAsB,KAAK,QAAQ,aAAa;AAEhD,iBAAe,iBAAiB,IAAY;AAC1C,UAAM,QAAQ,MAAM,IAAI,SAAS,QAAQ,EAAE;AAC3C,QAAI,CAAC,MAAO,QAAO;AACnB,UAAM,UAAU,IAAI,OAAO,KAAK;AAChC,WAAO;AAAA,MACL,MAAM,QAAQ;AAAA,MACd,gBAAgB,QAAQ;AAAA,MACxB,kBAAkB,QAAQ;AAAA,IAC5B;AAAA,EACF;AAEA,MAAI,IAAI,gBAAgB,CAAC,YAAY;AACnC,WAAO,QAAQ,KAAK,EAAE,OAAO,QAAQ,cAAc,CAAC;AAAA,EACtD,CAAC;AAED,MAAI,IAAI,mBAAmB,CAAC,YAAY;AACtC,WAAO,QAAQ,KAAK,EAAE,QAAQ,WAAW,SAAS,oBAAoB,CAAC;AAAA,EACzE,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,YAAY;AAC5C,WAAO,QAAQ,KAAK,MAAM,IAAI,cAAc,CAAC;AAAA,EAC/C,CAAC;AAED,MAAI,KAAK,mBAAmB,OAAO,YAAY;AAC7C,UAAM,OAAO,MAAM,QAAQ,IAAI,KAAuB,EAAE,MAAM,MAAM,IAAI;AACxE,QAAI,CAAC,MAAM,MAAM;AACf,aAAO,QAAQ,KAAK,EAAE,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACzD;AACA,QAAI;AACF,YAAM,QAAQ,MAAM,IAAI,SAAS,IAAI,KAAK,IAAI;AAC9C,aAAO,QAAQ,KAAK,OAAO,GAAG;AAAA,IAChC,SAAS,OAAO;AACd,aAAO,QAAQ,KAAK,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,gBAAgB,GAAG,GAAG;AAAA,IAC9F;AAAA,EACF,CAAC;AAED,MAAI,OAAO,uBAAuB,OAAO,YAAY;AACnD,UAAM,KAAK,QAAQ,IAAI,MAAM,IAAI;AACjC,UAAM,UAAU,IAAI,IAAI,EAAE;AAC1B,QAAI,SAAS;AACX,cAAQ,eAAe,QAAQ;AAAA,IACjC;AACA,UAAM,UAAU,MAAM,IAAI,SAAS,OAAO,EAAE;AAC5C,WAAO,QAAQ,KAAK,EAAE,QAAQ,GAAG,UAAU,MAAM,GAAG;AAAA,EACtD,CAAC;AAED,0BAAwB,KAAK,gBAAgB;AAG7C,MAAI,IAAI,gBAAgB,OAAO,YAAY;AACzC,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,KAAK,EAAE,OAAO,4BAA4B,GAAG,GAAG;AACzF,WAAO,QAAQ,KAAK,MAAM,YAAY,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EACpE,CAAC;AAED,MAAI,IAAI,eAAe,OAAO,YAAY;AACxC,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,KAAK,EAAE,OAAO,4BAA4B,GAAG,GAAG;AACzF,WAAO,QAAQ,KAAK,MAAM,UAAU,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAClE,CAAC;AAED,MAAI,IAAI,mBAAmB,OAAO,YAAY;AAC5C,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,KAAK,EAAE,OAAO,4BAA4B,GAAG,GAAG;AACzF,WAAO,QAAQ,KAAK,MAAM,kBAAkB,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC;AAAA,EAC1E,CAAC;AAED,MAAI,IAAI,kBAAkB,OAAO,YAAY;AAC3C,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,KAAK,CAAC,CAAC;AAChD,WAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,eAAe,KAAK,CAAC;AAAA,EAClE,CAAC;AAED,MAAI,IAAI,aAAa,OAAO,YAAY;AACtC,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,QAAI,QAAQ,WAAW,EAAG,QAAO,QAAQ,KAAK,CAAC,CAAC;AAChD,WAAO,QAAQ,KAAK,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,eAAe,SAAS,CAAC;AAAA,EACtE,CAAC;AACH;;;AO5iBA,SAAS,WAAW,uBAAuB;AAQ3C,SAAS,0BAA0B,SAAmC;AACpE,QAAM,SAAS,QAAQ,QAAQ;AAC/B,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,eAAe,QAAQ,QAAQ,gBAAgB;AAErD,MAAI,CAAC,0BAA0B,yBAAyB,OAAO,GAAG,cAAc,CAAC,GAAG;AAClF,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,SAAS,YAAY,CAAC,yBAAyB,IAAI,GAAG;AAC/D,WAAO;AAAA,EACT;AAEA,MAAI,iBAAiB,cAAc;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,qBAAqB,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,IAAI,IAAI,MAAM,EAAE,KAAK,YAAY,MAAM,KAAK,YAAY;AAAA,EACjE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,KAAwC;AAClE,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,KAAK,kBAAkB;AAC9C,WAAO,OAAO,aAAa,IAAI,WAAW;AAAA,EAC5C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAyCO,SAAS,kBAAkB,QAAgB,KAA2B;AAC3E,QAAM,MAAM,IAAI,gBAAgB;AAAA,IAC9B;AAAA,IACA,MAAM;AAAA,IACN,cAAc,CAAC,SAAmC,0BAA0B,KAAK,GAAG;AAAA,EACtF,CAAC;AAED,QAAM,mBAAmB,oBAAI,QAA2B;AACxD,QAAM,mBAAmB,oBAAI,IAAY;AAEzC,WAAS,cAAcK,cAAqB,gBAAsC;AAChF,QAAI,iBAAiB,IAAIA,YAAW,GAAG;AACrC;AAAA,IACF;AACA,qBAAiB,IAAIA,YAAW;AAEhC,mBAAe,GAAG,OAAO,CAAC,UAA2B;AACnD,2BAAqBA,cAAa,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,IAC1D,CAAC;AAED,mBAAe,GAAG,WAAW,CAAC,gBAAwC;AACpE,2BAAqBA,cAAa,EAAE,MAAM,WAAW,SAAS,YAAY,CAAC;AAAA,IAC7E,CAAC;AAAA,EACH;AAEA,WAAS,qBAAqBA,cAAqB,SAAwB;AACzE,UAAM,aAAa,KAAK,UAAU,OAAO;AACzC,eAAW,UAAU,IAAI,SAAS;AAChC,UAAI,OAAO,eAAe,UAAU,QAAQ,iBAAiB,IAAI,MAAM,MAAMA,cAAa;AACxF,eAAO,KAAK,UAAU;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,GAAG,cAAc,OAAO,QAAQ,YAAY;AAC9C,UAAMA,eAAc,mBAAmB,QAAQ,GAAG;AAClD,QAAI,CAACA,cAAa;AAChB,aAAO,MAAM,KAAM,oCAAoC;AACvD;AAAA,IACF;AAEA,UAAM,QAAQ,MAAM,IAAI,SAAS,QAAQA,YAAW;AACpD,QAAI,CAAC,OAAO;AACV,aAAO,MAAM,MAAM,sBAAsB;AACzC;AAAA,IACF;AAEA,UAAM,UAAU,IAAI,OAAO,KAAK;AAChC,qBAAiB,IAAI,QAAQA,YAAW;AACxC,kBAAcA,cAAa,QAAQ,cAAc;AAEjD,WAAO;AAAA,MACL,KAAK,UAAU;AAAA,QACb,MAAM;AAAA,QACN,WAAWA;AAAA,QACX,WAAW,QAAQ,eAAe,KAAK;AAAA,QACvC,MAAM,QAAQ,eAAe,SAAS;AAAA,MACxC,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO;AACT;;;AZzIA,SAAS,0BAA0B,MAAoB;AACrD,MAAI,SAAS,aAAa,SAAS,MAAM;AACvC;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,4BAA4B,KAAK,GAAG;AAClD;AAAA,EACF;AACA,UAAQ;AAAA,IACN;AAAA,EAGF;AACF;AAaA,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,UAAMC,KAAG,OAAO,QAAQ;AACxB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,iBAAyC;AACtD,QAAM,YAAYC,OAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAC7D,QAAM,aAAa;AAAA,IACjBD,OAAK,KAAK,WAAW,MAAM,OAAO,MAAM;AAAA,IACxCA,OAAK,KAAK,WAAW,MAAM,MAAM,OAAO,OAAO,MAAM;AAAA,IACrDA,OAAK,KAAK,WAAW,OAAO,MAAM;AAAA,EACpC;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,MAAM,WAAWA,OAAK,KAAK,WAAW,YAAY,CAAC,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAgB,MAAc,MAAqB;AACxE,QAAM,OAAO,iBAAiB,QAAS,MAAgC,OAAO;AAE9E,MAAI,SAAS,cAAc;AACzB,WAAO,IAAI;AAAA,MACT,QAAQ,IAAI,yBAAyB,IAAI,0DAA0D,OAAO,CAAC;AAAA,MAC3G,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AAEA,MAAI,SAAS,UAAU;AACrB,WAAO,IAAI,MAAM,kDAAkD,IAAI,IAAI,IAAI,KAAK;AAAA,MAClF,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACjE;AAEA,eAAe,aACb,QACA,KACA,MACA,MACe;AACf,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,QAAI,UAAU;AAEd,UAAM,UAAU,MAAM;AACpB,aAAO,IAAI,SAAS,OAAO;AAC3B,aAAO,IAAI,aAAa,WAAW;AACnC,UAAI,IAAI,SAAS,OAAO;AAAA,IAC1B;AAEA,UAAM,UAAU,CAAC,UAAmB;AAClC,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ;AACR,aAAO,cAAc,OAAO,MAAM,IAAI,CAAC;AAAA,IACzC;AAEA,UAAM,cAAc,MAAM;AACxB,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ;AACR,cAAQ;AAAA,IACV;AAEA,QAAI,KAAK,SAAS,OAAO;AACzB,WAAO,KAAK,SAAS,OAAO;AAC5B,WAAO,KAAK,aAAa,WAAW;AACpC,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B,CAAC;AACH;AAEA,eAAe,qBAAqB,KAAuD;AACzF,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,QAAI,MAAM,MAAM,QAAQ,CAAC;AAAA,EAC3B,CAAC;AACH;AAEA,eAAe,gBAAgB,QAA+B;AAC5D,MAAI,CAAC,OAAO,WAAW;AACrB;AAAA,EACF;AAEA,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,WAAO,MAAM,CAAC,UAAU;AACtB,UAAI,OAAO;AACT,eAAO,KAAK;AAAA,MACd,OAAO;AACL,gBAAQ;AAAA,MACV;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAe,WAAW,KAA0B;AAClD,QAAM,aAAa,MAAM,eAAe;AACxC,MAAI,eAAe,MAAM;AACvB,QAAI,IAAI,aAAa,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACtD,QAAI,IAAI,gBAAgB,YAAY,EAAE,MAAM,WAAW,CAAC,CAAC;AACzD,QAAI,IAAI,KAAK,OAAO,YAAY;AAC9B,YAAM,OAAO,MAAMD,KAAG,SAASC,OAAK,KAAK,YAAY,YAAY,GAAG,MAAM;AAC1E,aAAO,QAAQ,KAAK,IAAI;AAAA,IAC1B,CAAC;AAAA,EACH,OAAO;AACL,QAAI;AAAA,MAAI;AAAA,MAAK,CAAC,YACZ,QAAQ;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAmBA,eAAsB,aAAa,SAA8D;AAC/F,QAAM,MAAM,IAAI,KAAK;AACrB,uBAAqB,KAAK;AAAA,IACxB,KAAK,QAAQ;AAAA,IACb,eAAe,QAAQ,iBAAiB,oBAAoB;AAAA,EAC9D,CAAC;AACD,QAAM,WAAW,GAAG;AACpB,SAAO;AACT;AAEA,eAAsB,eAAe,SAKP;AAC5B,QAAM,OAAO,qBAAqB;AAClC,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,MAAM,IAAI,IAAI,EAAE,SAAS,QAAQ,QAAQ,CAAC;AAChD,MAAI,sBAAsB;AAC1B,4BAA0B,IAAI;AAE9B,MAAI,QAAQ,kBAAkB;AAC5B,UAAM,IAAI,SAAS,IAAI,QAAQ,gBAAgB;AAAA,EACjD;AAEA,QAAM,gBAAgB,oBAAoB;AAC1C,QAAM,MAAM,MAAM,aAAa,EAAE,KAAK,cAAc,CAAC;AAErD,QAAM,SAAS,oBAAoB;AAAA,IACjC,OAAO,IAAI;AAAA,IACX,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,MAAM,kBAAkB,QAAQ,GAAG;AACzC,QAAM,aAAa,QAAQ,KAAK,MAAM,IAAI;AAE1C,QAAM,MAAM,UAAU,SAAS,YAAY,cAAc,IAAI,IAAI,IAAI;AAErE,MAAI,QAAQ,gBAAgB,OAAO;AACjC,UAAM,UAAU,MAAM,IAAI,SAAS,KAAK;AACxC,UAAM,WAAW,QAAQ,SAAS,IAAI,GAAG,GAAG,eAAe,QAAQ,CAAC,EAAE,EAAE,KAAK;AAC7E,UAAM,aAAK,QAAQ;AAAA,EACrB;AAEA,QAAM,sBAAsB,IAAI,eAAe;AAE/C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,OAAO,YAAY;AACjB,UAAI,QAAQ;AACZ,YAAM,qBAAqB,GAAG;AAC9B,YAAM,gBAAgB,MAAM;AAAA,IAC9B;AAAA,EACF;AACF;;;Aa5OA,eAAsB,aAAa,OAAe,cAAgC;AAChF,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,oBAAoB,IAAI,mBAAmB;AAAA,MACtE,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,0BACpB,SACA,OAAe,cAC+B;AAC9C,MAAI;AACF,UAAM,kBAAkB,MAAM,MAAM,oBAAoB,IAAI,gBAAgB;AAAA,MAC1E,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,gBAAgB,GAAI,QAAO;AAChC,UAAM,UAAW,MAAM,gBAAgB,KAAK;AAE5C,UAAM,WAAW,MAAM,MAAM,oBAAoB,IAAI,mBAAmB;AAAA,MACtE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,uBAAuB;AAAA,QACvB,sBAAsB,QAAQ;AAAA,MAChC;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAAA,MACtC,QAAQ,YAAY,QAAQ,GAAI;AAAA,IAClC,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,QAAO;AACzB,WAAQ,MAAM,SAAS,KAAK;AAAA,EAC9B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aACdE,cACA,OAAe,cACf,OAAe,cACP;AACR,QAAM,cAAc,SAAS,YAAY,cAAc;AACvD,SAAO,UAAU,WAAW,IAAI,IAAI,eAAeA,YAAW;AAChE;;;AzBvCA,eAAsB,aAAa,SAIjB;AAChB,QAAM,MAAM,QAAQ,OAAO,QAAQ,IAAI;AACvC,QAAM,OAAO,QAAQ,QAAQ;AAE7B,UAAQ,IAAIC,IAAG,KAAK,eAAe,mBAAmB,EAAE,CAAC;AACzD,UAAQ,IAAI,uBAAuB;AAEnC,QAAM,OAAO,MAAM,YAAY,GAAG;AAClC,kBAAgB,IAAI;AAEpB,QAAM,WAAW,MAAM,UAAU,KAAK,IAAI;AAC1C,MAAI,SAAS,SAAS,GAAG;AACvB,YAAQ,IAAI,aAAa;AACzB,eAAW,QAAQ,UAAU;AAC3B,YAAM,SAAS,KAAK,aAAa,UAAUA,IAAG,IAAI,GAAG,IAAIA,IAAG,OAAO,GAAG;AACtE,cAAQ,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,EAAE;AAAA,IACzC;AAAA,EACF;AAEA,MAAI,MAAM,aAAa,IAAI,GAAG;AAC5B,YAAQ,IAAI,iDAAiD;AAC7D,UAAM,aAAa,MAAM,0BAA0B,KAAK,IAAI;AAC5D,QAAI,YAAY;AACd,YAAM,MAAM,aAAa,WAAW,IAAI,IAAI;AAC5C,cAAQ,IAAI,aAAaA,IAAG,KAAK,WAAW,IAAI,CAAC,YAAY;AAC7D,cAAQ,IAAI,gBAAgBA,IAAG,KAAK,GAAG,CAAC,EAAE;AAC1C,UAAI,QAAQ,gBAAgB,OAAO;AACjC,cAAM,aAAK,GAAG;AAAA,MAChB;AACA;AAAA,IACF;AACA,YAAQ,IAAI,iEAAiE;AAAA,EAC/E;AAEA,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC;AAAA,IACA,aAAa,QAAQ;AAAA,IACrB,kBAAkB;AAAA,EACpB,CAAC;AAED,UAAQ,IAAI;AAAA,0BAA6BA,IAAG,KAAK,OAAO,GAAG,CAAC,EAAE;AAChE;;;A0BtDA,OAAOC,SAAQ;AAIf,eAAsB,aAAa,SAGjB;AAChB,UAAQ,IAAIC,IAAG,KAAK,mBAAmB,mBAAmB,EAAE,CAAC;AAC7D,UAAQ,IAAI,0BAA0B;AAEtC,QAAM,SAAS,MAAM,eAAe;AAAA,IAClC,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,EACvB,CAAC;AAED,QAAM,YAAY,MAAM,OAAO,IAAI,cAAc;AACjD,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAI,0BAA0B,UAAU,MAAM,EAAE;AACxD,eAAW,MAAM,WAAW;AAC1B,cAAQ,IAAI,KAAKA,IAAG,KAAK,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE;AAAA,IACnD;AAAA,EACF,OAAO;AACL,YAAQ;AAAA,MACN;AAAA,IACF;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,oBAAuBA,IAAG,KAAK,OAAO,GAAG,CAAC,EAAE;AAC1D;;;AC7BA,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAGf,eAAsB,oBAAoB,SAAiC;AACzE,QAAM,WAAW,IAAI,kBAAkB;AACvC,QAAM,SAASC,OAAK,QAAQ,WAAW,QAAQ,IAAI,CAAC;AACpD,QAAM,QAAQ,MAAM,SAAS,IAAI,MAAM;AACvC,UAAQ,IAAI,mBAAmBC,IAAG,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,QAAQ,MAAM,IAAI,EAAE;AACrF;AAEA,eAAsB,uBAAsC;AAC1D,QAAM,WAAW,IAAI,kBAAkB;AACvC,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,MAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ;AAAA,MACN;AAAA,IACF;AACA;AAAA,EACF;AAEA,UAAQ,IAAI,GAAG,QAAQ,MAAM,aAAa,QAAQ,WAAW,IAAI,KAAK,GAAG;AAAA,CAAK;AAC9E,aAAW,SAAS,SAAS;AAC3B,YAAQ,IAAI,KAAKA,IAAG,KAAK,MAAM,IAAI,CAAC,KAAK,MAAM,EAAE,GAAG;AACpD,YAAQ,IAAI,OAAO,MAAM,IAAI,EAAE;AAAA,EACjC;AACF;AAEA,eAAsB,uBAAuB,IAA2B;AACtE,QAAM,WAAW,IAAI,kBAAkB;AACvC,QAAM,UAAU,MAAM,SAAS,OAAO,EAAE;AACxC,MAAI,SAAS;AACX,YAAQ,IAAI,qBAAqBA,IAAG,KAAK,EAAE,CAAC,GAAG;AAAA,EACjD,OAAO;AACL,YAAQ,MAAM,cAAc,EAAE,cAAc;AAC5C,YAAQ,WAAW;AAAA,EACrB;AACF;;;ACtCA,IAAM,sBAAsB;AAC5B,IAAM,0BAA0B;AAOhC,SAAS,aAAa,SAAkD;AACtE,QAAM,QAAQ,QAAQ,MAAM,oCAAoC;AAChE,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,CAAC,CAAC;AAC9D;AAEO,SAAS,eAAe,eAAuB,gBAAiC;AACrF,QAAM,SAAS,aAAa,aAAa;AACzC,QAAM,UAAU,aAAa,cAAc;AAC3C,MAAI,WAAW,QAAQ,YAAY,MAAM;AACvC,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,QAAQ,OAAO,QAAQ,SAAS,GAAG;AACrD,QAAI,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG;AAClC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,KAAK,IAAI,QAAQ,KAAK,GAAG;AAClC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAAmB,MAA0B;AAC3D,SAAO,sBAAsB,KAAK,aAAa;AAAA;AACjD;AAEA,SAAS,wBAAiC;AACxC,SAAO,QAAQ,IAAI,4BAA4B,OAAO,QAAQ,IAAI,OAAO;AAC3E;AAEA,eAAsB,eACpB,gBACA,YAA0B,OACE;AAC5B,MAAI,CAAC,sBAAsB,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,uBAAuB;AAE5E,MAAI;AACF,UAAM,WAAW,MAAM,UAAU,qBAAqB;AAAA,MACpD,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,MACA,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,UAAM,gBAAgB,OAAO,KAAK,YAAY,WAAW,KAAK,UAAU;AACxE,QAAI,kBAAkB,QAAQ,CAAC,eAAe,eAAe,cAAc,GAAG;AAC5E,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT,UAAE;AACA,iBAAa,OAAO;AAAA,EACtB;AACF;AAEA,eAAsB,kBAAkB,gBAAuC;AAC7E,QAAM,SAAS,MAAM,eAAe,cAAc;AAClD,MAAI,WAAW,MAAM;AACnB,YAAQ,IAAI;AAAA,EAAK,mBAAmB,MAAM,CAAC,EAAE;AAAA,EAC/C;AACF;;;AxDvEA,IAAM,UAAU,IAAI,QAAQ;AAE5B,SAAS,OAAO,OAAuB;AACrC,QAAM,OAAO,OAAO,KAAK;AACzB,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,QAAQ,KAAK,OAAO,OAAO;AACxD,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,SAAS,OAAO,SAA8B;AAC5C,UACG,KAAK,YAAY;AAChB,UAAM,kBAAkB,mBAAmB;AAAA,EAC7C,CAAC,EACA,MAAM,CAAC,UAAU;AAChB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,YAAQ,MAAM,OAAO;AACrB,YAAQ,WAAW;AAAA,EACrB,CAAC;AACL;AAEA,QACG,KAAK,YAAY,EACjB,YAAY,mEAAmE,EAC/E,QAAQ,mBAAmB,EAC3B,OAAO,qBAAqB,kBAAkB,QAAQ,IAAI,EAC1D,OAAO,aAAa,uCAAuC,EAC3D,OAAO,CAAC,YAA6C;AACpD;AAAA,IACE,aAAa;AAAA,MACX,KAAK,QAAQ,IAAI;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,yDAAyD,EACrE,OAAO,qBAAqB,YAAY,QAAQ,IAAI,EACpD,OAAO,aAAa,uCAAuC,EAC3D,OAAO,CAAC,YAA6C;AACpD;AAAA,IACE,aAAa;AAAA,MACX,MAAM,QAAQ;AAAA,MACd,aAAa,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH;AACF,CAAC;AAEH,IAAM,YAAY,QAAQ,QAAQ,WAAW,EAAE,YAAY,+BAA+B;AAE1F,UACG,QAAQ,YAAY,EACpB,YAAY,4CAA4C,EACxD,OAAO,CAAC,YAAqB;AAC5B,SAAO,oBAAoB,OAAO,CAAC;AACrC,CAAC;AAEH,UACG,QAAQ,MAAM,EACd,YAAY,iCAAiC,EAC7C,OAAO,MAAM;AACZ,SAAO,qBAAqB,CAAC;AAC/B,CAAC;AAEH,UACG,QAAQ,aAAa,EACrB,YAAY,2CAA2C,EACvD,OAAO,CAAC,OAAe;AACtB,SAAO,uBAAuB,EAAE,CAAC;AACnC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,SAAO,YAAY,QAAQ,IAAI,CAAC,CAAC;AACnC,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,OAAO,MAAM;AACZ,SAAO,cAAc,QAAQ,IAAI,CAAC,CAAC;AACrC,CAAC;AAEH,QACG,QAAQ,SAAS,EACjB,YAAY,sDAAsD,EAClE,OAAO,MAAM;AACZ,SAAO,eAAe,QAAQ,IAAI,CAAC,CAAC;AACtC,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,0CAA0C,EACtD,OAAO,MAAM;AACZ,SAAO,YAAY,QAAQ,IAAI,CAAC,CAAC;AACnC,CAAC;AAEH,QACG,QAAQ,KAAK,EACb,SAAS,YAAY,4BAA4B,EACjD,YAAY,uCAAuC,EACnD,OAAO,CAAC,WAAmB;AAC1B,SAAO,WAAW,QAAQ,QAAQ,IAAI,CAAC,CAAC;AAC1C,CAAC;AAEH,MAAM,QAAQ,WAAW,QAAQ,IAAI;","names":["fs","path","fs","path","fs","path","fs","path","isWithinRoot","isWithinRoot","path","fs","platform","fs","path","fs","path","isWithinRoot","fs","path","isWithinRoot","fs","path","fs","path","isWithinRoot","fs","path","readIfPresent","isWithinRoot","path","fs","fs","readIfPresent","path","ESC","fs","path","pc","path","fs","pc","pc","warning","pc","pc","spawn","runCommand","spawn","pc","pc","pc","pc","process","Buffer","path","promisify","fs","fsConstants","process","fs","process","os","fs","fs","fs","fs","process","os","fs","fs","process","promisify","process","execFile","process","process","promisify","execFile","execFileAsync","promisify","execFile","execFileAsync","execFileAsync","promisify","execFile","defaultBrowser","process","execFile","promisify","path","process","Buffer","defaultBrowser","fs","fsConstants","fs","path","fileURLToPath","spawn","fs","os","path","fs","path","isWithinRoot","path","os","fs","entry","constants","fs","path","spawn","isWithinRoot","path","fs","handle","constants","spawn","workspaceId","fs","path","fileURLToPath","workspaceId","pc","pc","pc","path","pc","path","pc"]}