uilint 0.2.145 → 0.2.147
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-ZUOFUPGT.js → chunk-5EDE3J6O.js} +2 -1
- package/dist/chunk-5QUW7BNW.js +80 -0
- package/dist/chunk-5QUW7BNW.js.map +1 -0
- package/dist/{chunk-ZOLQHFVQ.js → chunk-JEYSQ5KF.js} +20 -1
- package/dist/chunk-JEYSQ5KF.js.map +1 -0
- package/dist/index.js +475 -248
- package/dist/index.js.map +1 -1
- package/dist/{init-ui-KJYYI5DH.js → init-ui-QQXIZSKI.js} +123 -22
- package/dist/init-ui-QQXIZSKI.js.map +1 -0
- package/dist/{plugin-loader-O6PNFN6D.js → plugin-loader-LUIV7MLR.js} +2 -2
- package/dist/{remove-ui-ZHW4GUFL.js → remove-ui-GZRFA2AC.js} +2 -2
- package/dist/{render-43OMCORR.js → render-2P4YWHXV.js} +112 -97
- package/dist/render-2P4YWHXV.js.map +1 -0
- package/dist/{upgrade-TPZ62BT2.js → upgrade-2UKW3SIQ.js} +2 -2
- package/package.json +8 -8
- package/dist/chunk-WG2WZTB2.js +0 -56
- package/dist/chunk-WG2WZTB2.js.map +0 -1
- package/dist/chunk-ZOLQHFVQ.js.map +0 -1
- package/dist/init-ui-KJYYI5DH.js.map +0 -1
- package/dist/render-43OMCORR.js.map +0 -1
- /package/dist/{chunk-ZUOFUPGT.js.map → chunk-5EDE3J6O.js.map} +0 -0
- /package/dist/{plugin-loader-O6PNFN6D.js.map → plugin-loader-LUIV7MLR.js.map} +0 -0
- /package/dist/{remove-ui-ZHW4GUFL.js.map → remove-ui-GZRFA2AC.js.map} +0 -0
- /package/dist/{upgrade-TPZ62BT2.js.map → upgrade-2UKW3SIQ.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/serve/dashboard/store.ts"],"sourcesContent":["/**\n * Dashboard state store - simple event-based state management\n */\n\nimport type {\n DashboardState,\n DashboardStore,\n ActivityEntry,\n ActivityCategory,\n BackgroundTask,\n WorkspaceInfo,\n ServerStats,\n OllamaStatus,\n} from \"./types.js\";\n\ntype Listener = () => void;\n\nlet activityIdCounter = 0;\n\nfunction createInitialState(): DashboardState {\n return {\n isRunning: false,\n port: 9234,\n workspace: null,\n stats: {\n connectedClients: 0,\n subscriptions: 0,\n cacheEntries: 0,\n startTime: new Date(),\n },\n ollamaStatus: {\n status: \"checking\",\n },\n backgroundTasks: new Map(),\n activities: [],\n maxActivities: 50,\n verbose: false,\n activeFilter: \"all\",\n };\n}\n\n/**\n * Create a dashboard store instance\n */\nexport function createDashboardStore(): DashboardStore & {\n subscribe: (listener: Listener) => () => void;\n getState: () => DashboardState;\n} {\n let state = createInitialState();\n const listeners = new Set<Listener>();\n\n function notify() {\n for (const listener of listeners) {\n listener();\n }\n }\n\n const store: DashboardStore & {\n subscribe: (listener: Listener) => () => void;\n getState: () => DashboardState;\n } = {\n // State getters\n get isRunning() {\n return state.isRunning;\n },\n get port() {\n return state.port;\n },\n get workspace() {\n return state.workspace;\n },\n get stats() {\n return state.stats;\n },\n get backgroundTasks() {\n return state.backgroundTasks;\n },\n get activities() {\n return state.activities;\n },\n get maxActivities() {\n return state.maxActivities;\n },\n get verbose() {\n return state.verbose;\n },\n get ollamaStatus() {\n return state.ollamaStatus;\n },\n get activeFilter() {\n return state.activeFilter;\n },\n\n // Server lifecycle\n setRunning(running: boolean) {\n state = { ...state, isRunning: running };\n if (running) {\n state.stats = { ...state.stats, startTime: new Date() };\n }\n notify();\n },\n\n setPort(port: number) {\n state = { ...state, port };\n notify();\n },\n\n setWorkspace(info: WorkspaceInfo) {\n state = { ...state, workspace: info };\n notify();\n },\n\n // Stats updates\n updateStats(partial: Partial<ServerStats>) {\n state = { ...state, stats: { ...state.stats, ...partial } };\n notify();\n },\n\n incrementClients() {\n state = {\n ...state,\n stats: {\n ...state.stats,\n connectedClients: state.stats.connectedClients + 1,\n },\n };\n notify();\n },\n\n decrementClients() {\n state = {\n ...state,\n stats: {\n ...state.stats,\n connectedClients: Math.max(0, state.stats.connectedClients - 1),\n },\n };\n notify();\n },\n\n incrementSubscriptions() {\n state = {\n ...state,\n stats: {\n ...state.stats,\n subscriptions: state.stats.subscriptions + 1,\n },\n };\n notify();\n },\n\n decrementSubscriptions() {\n state = {\n ...state,\n stats: {\n ...state.stats,\n subscriptions: Math.max(0, state.stats.subscriptions - 1),\n },\n };\n notify();\n },\n\n setCacheEntries(count: number) {\n state = {\n ...state,\n stats: { ...state.stats, cacheEntries: count },\n };\n notify();\n },\n\n // Background tasks\n setBackgroundTask(task: BackgroundTask) {\n const newTasks = new Map(state.backgroundTasks);\n newTasks.set(task.id, task);\n state = { ...state, backgroundTasks: newTasks };\n notify();\n },\n\n updateBackgroundTaskProgress(\n id: string,\n progress: number,\n current?: number,\n total?: number,\n message?: string\n ) {\n const task = state.backgroundTasks.get(id);\n if (task) {\n const newTasks = new Map(state.backgroundTasks);\n newTasks.set(id, {\n ...task,\n progress,\n current,\n total,\n message,\n status: \"running\",\n });\n state = { ...state, backgroundTasks: newTasks };\n notify();\n }\n },\n\n completeBackgroundTask(id: string, error?: string) {\n const task = state.backgroundTasks.get(id);\n if (task) {\n const newTasks = new Map(state.backgroundTasks);\n newTasks.set(id, {\n ...task,\n status: error ? \"error\" : \"complete\",\n progress: error ? task.progress : 100,\n error,\n });\n state = { ...state, backgroundTasks: newTasks };\n notify();\n }\n },\n\n // Activity logging\n addActivity(entry: Omit<ActivityEntry, \"id\" | \"timestamp\">) {\n const newEntry: ActivityEntry = {\n ...entry,\n id: `activity-${++activityIdCounter}`,\n timestamp: new Date(),\n };\n\n // Prepend new entry, trim to max\n const activities = [newEntry, ...state.activities].slice(\n 0,\n state.maxActivities\n );\n state = { ...state, activities };\n notify();\n },\n\n clearActivities() {\n state = { ...state, activities: [] };\n notify();\n },\n\n // Display options\n toggleVerbose() {\n state = { ...state, verbose: !state.verbose };\n notify();\n },\n\n // Activity filter\n cycleFilter() {\n const order: ActivityCategory[] = [\"all\", \"errors\", \"vision\", \"semantic\", \"lint\"];\n const currentIndex = order.indexOf(state.activeFilter);\n const nextIndex = (currentIndex + 1) % order.length;\n state = { ...state, activeFilter: order[nextIndex]! };\n notify();\n },\n\n // Ollama status\n setOllamaStatus(status: OllamaStatus) {\n state = { ...state, ollamaStatus: status };\n notify();\n },\n\n // Subscription\n subscribe(listener: Listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n\n getState() {\n return state;\n },\n };\n\n return store;\n}\n\n// Singleton store instance for use across the application\nlet globalStore: ReturnType<typeof createDashboardStore> | null = null;\n\nexport function getDashboardStore(): ReturnType<typeof createDashboardStore> {\n if (!globalStore) {\n globalStore = createDashboardStore();\n }\n return globalStore;\n}\n\n// Reset store (useful for testing)\nexport function resetDashboardStore(): void {\n globalStore = null;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/init-ui.tsx","../src/commands/init/components/InstallApp.tsx","../src/commands/init/components/ProjectSelector.tsx","../src/commands/init/components/MultiSelect.tsx","../src/commands/init/components/RuleSelector.tsx","../src/commands/init/components/OptionField.tsx","../src/commands/init/components/InjectionPointSelector.tsx","../src/commands/init/test-helpers.ts"],"sourcesContent":["/**\n * Init command with Ink-based UI\n *\n * This is the init flow that shows:\n * 1. Project selection (which Next.js/Vite app to configure)\n * 2. Feature selection (what to install)\n * 3. ESLint rule configuration (if ESLint selected)\n * 4. Completion summary\n *\n * Non-interactive mode:\n * Use --react, --eslint, --genstyleguide, --skill flags (plus any plugin flags) to skip prompts.\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\nimport { InstallApp, type InjectionPointConfig } from \"./init/components/InstallApp.js\";\nimport { analyze } from \"./init/analyze.js\";\nimport { execute } from \"./init/execute.js\";\nimport { createPlan } from \"./init/plan.js\";\nimport { gatherChoices, type Prompter } from \"./init/test-helpers.js\";\nimport type {\n InstallOptions,\n ExecuteOptions,\n UserChoices,\n InstallItem,\n ProjectState,\n} from \"./init/types.js\";\nimport type {\n InstallerSelection,\n InstallTarget,\n} from \"./init/installers/types.js\";\nimport type { ConfiguredRule } from \"./init/components/RuleSelector.js\";\nimport { ruleRegistry } from \"uilint-eslint\";\nimport { pc } from \"../utils/prompts.js\";\nimport { discoverPlugins, loadPluginESLintRules, type PluginCLIManifest } from \"../utils/plugin-loader.js\";\nimport { detectCoverageSetup } from \"../utils/coverage-detect.js\";\nimport { runTestsWithCoverage, detectPackageManager, installDependencies } from \"../utils/package-manager.js\";\nimport { toInstallSpecifier } from \"./init/versioning.js\";\n\n// Import installers to trigger registration\nimport \"./init/installers/index.js\";\n\n/**\n * Auto-selecting prompter for non-interactive mode.\n * Automatically selects the first option when choices are needed.\n */\nconst autoPrompter: Prompter = {\n async selectInstallItems() {\n // This shouldn't be called in non-interactive mode since flags determine items\n return [];\n },\n async selectNextApp(apps) {\n // Auto-select first app\n return apps[0];\n },\n async selectViteApp(apps) {\n // Auto-select first app\n return apps[0];\n },\n async selectEslintPackages(packages) {\n // Auto-select all packages with ESLint config\n return packages.map((p) => p.path);\n },\n async selectEslintRules() {\n // Use all available rules with defaults\n return ruleRegistry;\n },\n async selectEslintRuleSeverity() {\n return \"defaults\";\n },\n async confirmCustomizeRuleOptions() {\n return false;\n },\n async configureRuleOptions() {\n return undefined;\n },\n};\n\nfunction limitList(items: string[], max: number): string[] {\n if (items.length <= max) return items;\n return [...items.slice(0, max), pc.dim(`…and ${items.length - max} more`)];\n}\n\nfunction printInstallReport(\n result: Awaited<ReturnType<typeof execute>>,\n testCoverageResult?: { ran: boolean; success: boolean; error?: string }\n): void {\n const failedDeps = result.dependencyResults.filter((r) => !r.success);\n const okDeps = result.dependencyResults.filter((r) => r.success);\n const failedActions = result.actionsPerformed.filter((r) => !r.success);\n const okActions = result.actionsPerformed.filter((r) => r.success);\n\n // High-level header\n if (result.success) {\n console.log(`\\n${pc.green(\"✓\")} Operation completed successfully`);\n } else {\n console.log(`\\n${pc.yellow(\"⚠\")} Operation completed with errors`);\n }\n\n // What was installed/changed (summary)\n const { summary } = result;\n const installed = summary.installedItems.map((x) => String(x));\n const created = summary.filesCreated;\n const modified = summary.filesModified;\n const deleted = summary.filesDeleted;\n\n if (installed.length > 0) {\n console.log(`\\n${pc.bold(\"Installed:\")}`);\n for (const item of installed) console.log(`- ${pc.green(\"✓\")} ${item}`);\n }\n\n if (summary.eslintTargets.length > 0) {\n console.log(`\\n${pc.bold(\"ESLint configured:\")}`);\n for (const t of summary.eslintTargets) {\n console.log(\n `- ${pc.green(\"✓\")} ${t.displayName} ${pc.dim(`(${t.configFile})`)}`\n );\n }\n }\n\n if (created.length + modified.length + deleted.length > 0) {\n console.log(`\\n${pc.bold(\"Files:\")}`);\n for (const p of limitList(created, 20))\n console.log(`- ${pc.green(\"+\")} ${p}`);\n for (const p of limitList(modified, 20))\n console.log(`- ${pc.yellow(\"~\")} ${p}`);\n for (const p of limitList(deleted, 20))\n console.log(`- ${pc.red(\"-\")} ${p}`);\n }\n\n if (summary.dependenciesInstalled.length > 0) {\n console.log(`\\n${pc.bold(\"Dependencies installed:\")}`);\n for (const d of summary.dependenciesInstalled) {\n console.log(\n `- ${pc.green(\"✓\")} ${d.packagePath} ${pc.dim(`← ${d.packages.join(\", \")}`)}`\n );\n }\n }\n\n // Test coverage result\n if (testCoverageResult?.ran) {\n console.log(`\\n${pc.bold(\"Test coverage:\")}`);\n if (testCoverageResult.success) {\n console.log(`- ${pc.green(\"✓\")} Coverage data generated successfully`);\n } else {\n console.log(`- ${pc.yellow(\"⚠\")} Tests ran with errors`);\n if (testCoverageResult.error) {\n console.log(pc.dim(` ${testCoverageResult.error.split(\"\\n\")[0]}`));\n }\n }\n }\n\n // Failures (include error info)\n if (failedDeps.length > 0 || failedActions.length > 0) {\n console.log(`\\n${pc.bold(pc.red(\"Failures:\"))}`);\n }\n\n if (failedDeps.length > 0) {\n console.log(`\\n${pc.bold(\"Dependency installs failed:\")}`);\n for (const dep of failedDeps) {\n const pkgs = dep.install.packages.join(\", \");\n console.log(\n `- ${pc.red(\"✗\")} ${dep.install.packageManager} in ${dep.install.packagePath} ${pc.dim(`← ${pkgs}`)}`\n );\n if (dep.error) console.log(pc.dim(dep.error.split(\"\\n\").slice(0, 30).join(\"\\n\")));\n }\n }\n\n if (failedActions.length > 0) {\n console.log(`\\n${pc.bold(\"Actions failed:\")}`);\n for (const a of failedActions) {\n const action = a.action as unknown as Record<string, unknown>;\n const type = String(action.type || \"unknown\");\n const pathish =\n (typeof action.path === \"string\" && action.path) ||\n (typeof action.projectPath === \"string\" && action.projectPath) ||\n (typeof action.packagePath === \"string\" && action.packagePath) ||\n \"\";\n\n console.error(`- ${type}${pathish ? ` (${pathish})` : \"\"}`);\n if (a.error) console.error(` ${a.error}`);\n }\n }\n\n // Quick stats (useful for CI logs)\n console.log(\n pc.dim(\n `\\nSummary: ${okActions.length} action(s) ok, ${failedActions.length} failed · ` +\n `${okDeps.length} dep install(s) ok, ${failedDeps.length} failed`\n )\n );\n}\n\n/**\n * Convert installer selections and configured rules to UserChoices for the execute phase\n */\nfunction selectionsToUserChoices(\n selections: InstallerSelection[],\n project: ProjectState,\n eslintRules?: ConfiguredRule[],\n injectionPointConfig?: InjectionPointConfig\n): UserChoices {\n const items: InstallItem[] = [];\n const choices: UserChoices = { items };\n\n for (const selection of selections) {\n if (!selection.selected || selection.targets.length === 0) continue;\n\n const { installer, targets } = selection;\n\n if (installer.id === \"genstyleguide\") {\n items.push(\"genstyleguide\");\n } else if (installer.id === \"skill\") {\n items.push(\"skill\");\n } else if (installer.id === \"eslint\") {\n items.push(\"eslint\");\n // Add ESLint choices with configured rules\n choices.eslint = {\n packagePaths: targets.map((t: InstallTarget) => t.path),\n // Use configured rules if provided, otherwise fall back to all rules\n selectedRules: eslintRules\n ? eslintRules.map((cr) => ({\n ...cr.rule,\n // Override severity with user's selection\n defaultSeverity: cr.severity,\n defaultOptions: cr.options,\n }))\n : ruleRegistry,\n };\n } else if (installer.id === \"next\") {\n items.push(\"next\");\n // Add Next.js choices\n const target = targets[0];\n const appInfo = project.nextApps.find(\n (app) => app.projectPath === target?.path\n );\n if (appInfo) {\n choices.next = {\n projectPath: appInfo.projectPath,\n detection: appInfo.detection,\n // Use injection point from follow-up UI selection\n targetFile: injectionPointConfig?.targetFile,\n createProviders: injectionPointConfig?.createProviders,\n };\n }\n } else if (installer.id === \"vite\") {\n items.push(\"vite\");\n // Add Vite choices\n const target = targets[0];\n const appInfo = project.viteApps.find(\n (app) => app.projectPath === target?.path\n );\n if (appInfo) {\n choices.vite = {\n projectPath: appInfo.projectPath,\n detection: appInfo.detection,\n };\n }\n }\n }\n\n return choices;\n}\n\n/**\n * Check if terminal supports interactive mode\n */\nfunction isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\n/**\n * Check if non-interactive flags are provided\n */\nfunction hasNonInteractiveFlags(options: InstallOptions): boolean {\n return Boolean(\n options.react || options.eslint || options.genstyleguide || options.skill ||\n (options.plugins && options.plugins.length > 0)\n );\n}\n\n/**\n * Pre-install plugin packages into the consumer project when flags are set.\n * This ensures the plugins are available for loadPluginESLintRules() to import.\n */\nasync function preInstallPlugins(\n selectedManifests: PluginCLIManifest[],\n projectPath: string,\n): Promise<void> {\n if (selectedManifests.length === 0) return;\n\n const pluginPackages = selectedManifests.map((m) =>\n toInstallSpecifier(m.packageName),\n );\n\n console.log(pc.dim(`Installing plugins: ${pluginPackages.join(\", \")}...`));\n const pm = detectPackageManager(projectPath);\n await installDependencies(pm, projectPath, pluginPackages, { dev: true, silent: true });\n}\n\n/**\n * Run init in non-interactive mode using CLI flags\n */\nasync function initNonInteractive(\n options: InstallOptions,\n executeOptions: ExecuteOptions = {},\n): Promise<void> {\n const projectPath = process.cwd();\n\n console.log(pc.blue(\"UILint init (non-interactive mode)\"));\n\n // Discover which plugins the user selected via CLI flags\n const allManifests = await discoverPlugins();\n const selectedPluginFlags = options.plugins ?? [];\n const selectedManifests = allManifests.filter((m) =>\n selectedPluginFlags.includes(m.cliFlag),\n );\n\n // Pre-install plugin packages so their rules can register before planning.\n // When running via npx, the plugins are optional peer deps and not available\n // alongside the CLI — we install them into the consumer project first, then\n // load them from there.\n await preInstallPlugins(selectedManifests, projectPath);\n\n // Re-discover after install (packages are now available in consumer project)\n const manifests =\n selectedManifests.length > 0\n ? await discoverPlugins(projectPath)\n : allManifests;\n\n // Load plugin rules (resolving from consumer project where they were just installed)\n await loadPluginESLintRules(manifests, projectPath);\n\n console.log(pc.dim(\"Analyzing project...\"));\n\n const project = await analyze(projectPath);\n\n // Ensure --eslint is implied when any plugin is selected\n if (selectedPluginFlags.length > 0 && !options.eslint) {\n options.eslint = true;\n }\n\n // Gather choices using flags (auto-prompter handles edge cases)\n const choices = await gatherChoices(project, options, autoPrompter);\n\n if (choices.items.length === 0) {\n console.log(\"\\nNo features selected. Use --react, --eslint, --genstyleguide, --skill, or a plugin flag.\");\n process.exit(1);\n }\n\n console.log(pc.dim(`Installing: ${choices.items.join(\", \")}`));\n\n // Create and execute plan\n const plan = createPlan(project, choices, { force: options.force });\n const result = await execute(plan, {\n ...executeOptions,\n projectPath: project.projectPath,\n });\n\n // Display results\n printInstallReport(result);\n\n process.exit(result.success ? 0 : 1);\n}\n\n/**\n * Main init function with Ink UI\n *\n * @param options - CLI options\n * @param executeOptions - Options for the execute phase\n */\nexport async function initUI(\n options: InstallOptions = {},\n executeOptions: ExecuteOptions = {}\n): Promise<void> {\n const projectPath = process.cwd();\n\n // Non-interactive mode: use flags directly without TTY\n if (hasNonInteractiveFlags(options)) {\n await initNonInteractive(options, executeOptions);\n return;\n }\n\n // Interactive mode: load any locally-available plugin rules\n const manifests = await discoverPlugins(projectPath);\n await loadPluginESLintRules(manifests, projectPath);\n\n // Check if terminal supports interactive mode\n if (!isInteractiveTerminal()) {\n console.error(\"\\n✗ Interactive mode requires a TTY terminal.\");\n console.error(\"Use --react, --eslint, --genstyleguide, --skill, or a plugin flag for non-interactive mode.\\n\");\n process.exit(1);\n }\n\n // Start project analysis\n const projectPromise = analyze(projectPath);\n\n // Render the Ink app\n const { waitUntilExit } = render(\n <InstallApp\n projectPromise={projectPromise}\n onComplete={async (selections, eslintRules, injectionPointConfig, removeSelections) => {\n // When user completes selection, proceed with installation\n const project = await projectPromise;\n const choices = selectionsToUserChoices(selections, project, eslintRules, injectionPointConfig);\n\n const hasInstalls = choices.items.length > 0;\n const hasRemovals = removeSelections && removeSelections.length > 0;\n\n if (!hasInstalls && !hasRemovals) {\n console.log(\"\\nNo changes selected\");\n process.exit(0);\n }\n\n // Generate install plan using existing plan logic\n const { createPlan } = await import(\"./init/plan.js\");\n const plan = createPlan(project, choices, { force: options.force });\n\n // Generate removal plan actions\n if (hasRemovals && removeSelections) {\n for (const selection of removeSelections) {\n if (!selection.selected || selection.targets.length === 0) continue;\n const { installer, targets } = selection;\n\n // Call planRemove if the installer supports it\n if (installer.planRemove) {\n const removePlan = installer.planRemove(targets, project);\n // Prepend removal actions to the plan (remove first, then install)\n plan.actions = [...removePlan.actions, ...plan.actions];\n }\n }\n }\n\n // Execute the plan with projectPath for prettier formatting\n const result = await execute(plan, {\n ...executeOptions,\n projectPath: project.projectPath,\n });\n\n // Run tests with coverage if require-test-coverage was installed\n let testCoverageResult: { ran: boolean; success: boolean; error?: string } | undefined;\n\n if (result.success && eslintRules?.some(r => r.rule.id === \"require-test-coverage\")) {\n // Get the target paths where ESLint was configured\n const eslintTargetPaths = choices.eslint?.packagePaths ?? [];\n\n for (const targetPath of eslintTargetPaths) {\n const coverageSetup = detectCoverageSetup(targetPath);\n\n // Only run tests if vitest and coverage config are set up\n if (coverageSetup.hasVitest && coverageSetup.hasCoverageConfig) {\n console.log(`\\n${pc.blue(\"Running tests with coverage...\")}`);\n const pm = detectPackageManager(targetPath);\n\n try {\n await runTestsWithCoverage(pm, targetPath);\n testCoverageResult = { ran: true, success: true };\n console.log(`${pc.green(\"✓\")} Coverage data generated`);\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n testCoverageResult = { ran: true, success: false, error: errorMsg };\n console.log(`${pc.yellow(\"⚠\")} Tests completed with errors`);\n }\n }\n }\n }\n\n // Display results\n printInstallReport(result, testCoverageResult);\n\n process.exit(result.success ? 0 : 1);\n }}\n onError={(error) => {\n console.error(\"\\n✗ Error:\", error.message);\n process.exit(1);\n }}\n />\n );\n\n // Wait for the app to exit\n await waitUntilExit();\n}\n","/**\n * InstallApp - Main Ink React component for the installer UI\n *\n * Multi-phase installation flow:\n * 1. Select a project (Next.js app, Vite app, etc.)\n * 2. Select features to install\n * 3. Configure injection point (if Next.js/Vite overlay selected with multiple options)\n * 4. Configure ESLint rules (if ESLint selected)\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text, useApp, useInput } from \"ink\";\nimport { Spinner } from \"./Spinner.js\";\nimport { ProjectSelector, getDetectedProjects, type DetectedProject } from \"./ProjectSelector.js\";\nimport { ConfigSelector, type ConfigItem, type ItemStatus } from \"./MultiSelect.js\";\nimport { RuleSelector, type ConfiguredRule } from \"./RuleSelector.js\";\nimport { InjectionPointSelector } from \"./InjectionPointSelector.js\";\nimport type { ProjectState } from \"../types.js\";\nimport type { InstallerSelection, InstallTarget } from \"../installers/types.js\";\nimport { getAllInstallers } from \"../installers/registry.js\";\nimport { getInjectionPoints, type InjectionPoint } from \"../installers/next-overlay.js\";\n\n/**\n * Map InstallTarget to ConfigItem status\n */\nfunction getTargetStatus(target: InstallTarget): ItemStatus {\n if (!target.isInstalled) {\n return \"not_installed\";\n }\n if (target.canUpgrade) {\n return \"upgradeable\";\n }\n return \"installed\";\n}\n\ntype AppPhase =\n | \"checking-requirements\"\n | \"scanning\"\n | \"select-project\"\n | \"configure-features\"\n | \"configure-injection-point\"\n | \"configure-eslint\"\n | \"error\";\n\n/**\n * Selected injection point config to pass to installer\n */\nexport interface InjectionPointConfig {\n targetFile?: string;\n createProviders?: boolean;\n}\n\nexport interface InstallAppProps {\n /** Project scan promise (resolves to ProjectState) */\n projectPromise: Promise<ProjectState>;\n /** Callback when installation is complete */\n onComplete: (\n selections: InstallerSelection[],\n eslintRules?: ConfiguredRule[],\n injectionPointConfig?: InjectionPointConfig,\n removeSelections?: InstallerSelection[]\n ) => void;\n /** Callback when error occurs */\n onError?: (error: Error) => void;\n}\n\n/**\n * Build config items for a specific project\n */\nfunction buildConfigItemsForProject(\n project: ProjectState,\n selectedProject: DetectedProject,\n selections: InstallerSelection[]\n): ConfigItem[] {\n const items: ConfigItem[] = [];\n\n for (const selection of selections) {\n const { installer, targets } = selection;\n\n // Filter targets to those relevant to the selected project\n const relevantTargets = targets.filter((target) => {\n // For overlay installers, match by path\n if (installer.id === \"next\" || installer.id === \"vite\") {\n return target.path === selectedProject.path;\n }\n // For ESLint, match by package path\n if (installer.id === \"eslint\") {\n return target.path === selectedProject.path;\n }\n // Global features (genstyleguide, skill) always included\n return true;\n });\n\n if (relevantTargets.length === 0) continue;\n\n // Map installer IDs to display info\n const displayInfo: Record<string, { category: string; icon: string }> = {\n next: { category: \"UI Analysis\", icon: \"🔍\" },\n vite: { category: \"UI Analysis\", icon: \"🔍\" },\n eslint: { category: \"ESLint Rules\", icon: \"📋\" },\n genstyleguide: { category: \"Cursor Integration\", icon: \"📝\" },\n skill: { category: \"Cursor Integration\", icon: \"⚡\" },\n };\n\n const info = displayInfo[installer.id] || { category: \"Other\", icon: \"•\" };\n\n for (const target of relevantTargets) {\n items.push({\n id: `${installer.id}:${target.id}`,\n label: installer.name,\n hint: target.hint,\n status: getTargetStatus(target),\n category: info.category,\n categoryIcon: info.icon,\n });\n }\n }\n\n return items;\n}\n\n/**\n * Build config items for global features only (no project-specific items)\n */\nfunction buildGlobalConfigItems(selections: InstallerSelection[]): ConfigItem[] {\n const items: ConfigItem[] = [];\n\n for (const selection of selections) {\n const { installer, targets } = selection;\n\n // Only include global installers\n if (installer.id !== \"genstyleguide\" && installer.id !== \"skill\") {\n continue;\n }\n\n const displayInfo: Record<string, { category: string; icon: string }> = {\n genstyleguide: { category: \"Cursor Integration\", icon: \"📝\" },\n skill: { category: \"Cursor Integration\", icon: \"⚡\" },\n };\n\n const info = displayInfo[installer.id] || { category: \"Other\", icon: \"•\" };\n\n for (const target of targets) {\n items.push({\n id: `${installer.id}:${target.id}`,\n label: installer.name,\n hint: target.hint,\n status: getTargetStatus(target),\n category: info.category,\n categoryIcon: info.icon,\n });\n }\n }\n\n return items;\n}\n\n/**\n * Minimum required Node.js version (major.minor)\n * Required by dependencies like chokidar, jsdom, etc.\n */\nconst MIN_NODE_MAJOR = 20;\nconst MIN_NODE_MINOR = 19;\n\n/**\n * Check if the current Node.js version meets the minimum requirement\n */\nfunction checkNodeVersion(): { ok: boolean; current: string; required: string } {\n const ver = process.versions.node || \"\";\n const parts = ver.split(\".\");\n const major = Number.parseInt(parts[0] || \"\", 10);\n const minor = Number.parseInt(parts[1] || \"\", 10);\n\n const meetsRequirement =\n Number.isFinite(major) &&\n Number.isFinite(minor) &&\n (major > MIN_NODE_MAJOR || (major === MIN_NODE_MAJOR && minor >= MIN_NODE_MINOR));\n\n return {\n ok: meetsRequirement,\n current: ver,\n required: `${MIN_NODE_MAJOR}.${MIN_NODE_MINOR}.0`,\n };\n}\n\n/**\n * Header component with app branding\n */\nfunction Header({ subtitle }: { subtitle?: string }): React.ReactElement {\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text bold color=\"cyan\">◆ UILint</Text>\n <Text dimColor> v0.5.0</Text>\n {subtitle && <Text dimColor> · {subtitle}</Text>}\n </Box>\n </Box>\n );\n}\n\n/**\n * Feature configuration with back support\n */\nfunction FeatureConfig({\n selectedProject,\n configItems,\n canGoBack,\n onSubmit,\n onBack,\n onCancel,\n}: {\n selectedProject: DetectedProject | null;\n configItems: ConfigItem[];\n canGoBack: boolean;\n onSubmit: (selectedIds: string[], uninstallIds: string[]) => void;\n onBack: () => void;\n onCancel: () => void;\n}): React.ReactElement {\n useInput((input, key) => {\n if ((input === \"b\" || key.leftArrow) && canGoBack) {\n onBack();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n {/* Show selected project context */}\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n <Text dimColor> ({selectedProject.hint})</Text>\n </Box>\n )}\n\n <ConfigSelector\n items={configItems}\n onSubmit={onSubmit}\n onCancel={onCancel}\n />\n\n {/* Back hint if multiple projects */}\n {canGoBack && (\n <Box marginTop={1}>\n <Text dimColor>\n Press <Text color=\"cyan\">b</Text> or <Text color=\"cyan\">←</Text> to select a different project\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\nexport function InstallApp({\n projectPromise,\n onComplete,\n onError,\n}: InstallAppProps): React.ReactElement {\n const { exit } = useApp();\n const [phase, setPhase] = useState<AppPhase>(\"checking-requirements\");\n const [_nodeVersionCheck, setNodeVersionCheck] = useState<{\n ok: boolean;\n current: string;\n required: string;\n } | null>(null);\n const [project, setProject] = useState<ProjectState | null>(null);\n const [detectedProjects, setDetectedProjects] = useState<DetectedProject[]>([]);\n const [selectedProject, setSelectedProject] = useState<DetectedProject | null>(null);\n const [selections, setSelections] = useState<InstallerSelection[]>([]);\n const [configItems, setConfigItems] = useState<ConfigItem[]>([]);\n const [selectedFeatureIds, setSelectedFeatureIds] = useState<string[]>([]);\n const [removeFeatureIds, setRemoveFeatureIds] = useState<string[]>([]);\n const [error, setError] = useState<Error | null>(null);\n\n // Injection point state\n const [injectionPoints, setInjectionPoints] = useState<InjectionPoint[]>([]);\n const [selectedInjectionPoint, setSelectedInjectionPoint] = useState<InjectionPointConfig | undefined>(undefined);\n\n // Check if ESLint is selected\n const _isEslintSelected = selectedFeatureIds.some((id) => id.startsWith(\"eslint:\"));\n\n // Check if Next.js overlay is selected\n const _isNextSelected = selectedFeatureIds.some((id) => id.startsWith(\"next:\"));\n\n // Phase 0: Check requirements (Node version)\n useEffect(() => {\n if (phase !== \"checking-requirements\") return;\n\n // Small delay for visual feedback that the check is happening\n const timer = setTimeout(() => {\n const result = checkNodeVersion();\n setNodeVersionCheck(result);\n\n if (result.ok) {\n setPhase(\"scanning\");\n } else {\n setError(\n new Error(\n `Node.js v${result.required}+ is required. You are running v${result.current}.`\n )\n );\n setPhase(\"error\");\n }\n }, 300);\n\n return () => clearTimeout(timer);\n }, [phase]);\n\n // Phase 1: Scan project\n useEffect(() => {\n if (phase !== \"scanning\") return;\n\n projectPromise\n .then((proj) => {\n setProject(proj);\n\n // Get detected projects\n const projects = getDetectedProjects(proj);\n setDetectedProjects(projects);\n\n // Build installer selections\n const installers = getAllInstallers();\n const initialSelections: InstallerSelection[] = installers\n .filter((installer) => installer.isApplicable(proj))\n .map((installer) => {\n const targets = installer.getTargets(proj);\n // Select if there are non-installed targets OR upgradeable targets\n const actionableTargets = targets.filter(\n (t) => !t.isInstalled || t.canUpgrade\n );\n return {\n installer,\n targets,\n selected: actionableTargets.length > 0,\n };\n });\n setSelections(initialSelections);\n\n // If only one project, skip project selection\n if (projects.length === 1) {\n const singleProject = projects[0]!;\n setSelectedProject(singleProject);\n const items = buildConfigItemsForProject(proj, singleProject, initialSelections);\n setConfigItems(items);\n setPhase(\"configure-features\");\n } else if (projects.length === 0) {\n // No projects detected - go straight to global features\n setPhase(\"configure-features\");\n const items = buildGlobalConfigItems(initialSelections);\n setConfigItems(items);\n } else {\n setPhase(\"select-project\");\n }\n })\n .catch((err) => {\n setError(err as Error);\n setPhase(\"error\");\n onError?.(err as Error);\n });\n }, [phase, projectPromise, onError]);\n\n // Handle project selection\n const handleProjectSelect = (selected: DetectedProject) => {\n setSelectedProject(selected);\n if (project) {\n const items = buildConfigItemsForProject(project, selected, selections);\n setConfigItems(items);\n }\n setPhase(\"configure-features\");\n };\n\n // Handle back to project selection\n const handleBackToProject = () => {\n if (detectedProjects.length > 1) {\n setSelectedProject(null);\n setPhase(\"select-project\");\n }\n };\n\n // Handle feature selection submission\n const handleFeatureSubmit = (selectedIds: string[], removeIds: string[]) => {\n setSelectedFeatureIds(selectedIds);\n setRemoveFeatureIds(removeIds);\n\n // Check if Next.js overlay is selected - if so, check injection points\n const nextSelected = selectedIds.some((id) => id.startsWith(\"next:\"));\n\n if (nextSelected && project && selectedProject) {\n // Find the Next.js app info\n const appInfo = project.nextApps.find(\n (app) => app.projectPath === selectedProject.path\n );\n\n if (appInfo) {\n const points = getInjectionPoints(appInfo.projectPath, appInfo.detection.appRoot);\n\n // If there's only one injection point, auto-select it\n if (points.length === 1) {\n const point = points[0]!;\n setSelectedInjectionPoint({\n targetFile: point.filePath,\n createProviders: point.createProviders,\n });\n // Continue to next phase\n proceedAfterInjectionPoint(selectedIds, {\n targetFile: point.filePath,\n createProviders: point.createProviders,\n });\n return;\n }\n\n // Multiple injection points - show selection UI\n if (points.length > 1) {\n setInjectionPoints(points);\n setPhase(\"configure-injection-point\");\n return;\n }\n }\n }\n\n // No injection point selection needed, check ESLint\n proceedAfterInjectionPoint(selectedIds, undefined);\n };\n\n // Proceed after injection point selection (or skip)\n const proceedAfterInjectionPoint = (\n selectedIds: string[],\n injectionConfig?: InjectionPointConfig\n ) => {\n // Check if ESLint is selected - if so, go to rule configuration\n const eslintSelected = selectedIds.some((id) => id.startsWith(\"eslint:\"));\n\n if (eslintSelected) {\n setPhase(\"configure-eslint\");\n } else {\n // No ESLint, complete with current selections\n finishInstallation(selectedIds, undefined, injectionConfig);\n }\n };\n\n // Handle injection point selection\n const handleInjectionPointSubmit = (point: InjectionPoint) => {\n const config: InjectionPointConfig = {\n targetFile: point.filePath,\n createProviders: point.createProviders,\n };\n setSelectedInjectionPoint(config);\n proceedAfterInjectionPoint(selectedFeatureIds, config);\n };\n\n // Handle back from injection point selection\n const handleBackFromInjectionPoint = () => {\n setPhase(\"configure-features\");\n };\n\n // Handle ESLint rule configuration submission\n const handleRuleSubmit = (configuredRules: ConfiguredRule[]) => {\n finishInstallation(selectedFeatureIds, configuredRules, selectedInjectionPoint);\n };\n\n // Handle back from ESLint config to feature selection\n const handleBackToFeatures = () => {\n setPhase(\"configure-features\");\n };\n\n // Finalize installation with all selections\n const finishInstallation = (\n selectedIds: string[],\n eslintRules?: ConfiguredRule[],\n injectionConfig?: InjectionPointConfig\n ) => {\n const selectedSet = new Set(selectedIds);\n const removeSet = new Set(removeFeatureIds);\n\n // Build install selections\n const updatedSelections = selections.map((sel) => {\n const selectedTargets = sel.targets.filter((t) =>\n selectedSet.has(`${sel.installer.id}:${t.id}`)\n );\n return {\n ...sel,\n targets: selectedTargets,\n selected: selectedTargets.length > 0,\n };\n });\n\n // Build remove selections\n const removeSelections = selections.map((sel) => {\n const removeTargets = sel.targets.filter((t) =>\n removeSet.has(`${sel.installer.id}:${t.id}`)\n );\n return {\n ...sel,\n targets: removeTargets,\n selected: removeTargets.length > 0,\n };\n }).filter((sel) => sel.selected);\n\n setSelections(updatedSelections);\n onComplete(updatedSelections, eslintRules, injectionConfig, removeSelections.length > 0 ? removeSelections : undefined);\n };\n\n const handleCancel = () => {\n exit();\n };\n\n // Render: Checking requirements\n if (phase === \"checking-requirements\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Install\" />\n <Box>\n <Spinner />\n <Text> Checking requirements...</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Scanning\n if (phase === \"scanning\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Install\" />\n <Box>\n <Spinner />\n <Text> Scanning project...</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Error\n if (phase === \"error\") {\n return (\n <Box flexDirection=\"column\">\n <Header />\n <Box>\n <Text color=\"red\">✗ </Text>\n <Text color=\"red\">{error?.message || \"An unknown error occurred\"}</Text>\n </Box>\n </Box>\n );\n }\n\n // Render: Project selection\n if (phase === \"select-project\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Install\" />\n <ProjectSelector\n projects={detectedProjects}\n onSelect={handleProjectSelect}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: Feature configuration\n if (phase === \"configure-features\" && project && configItems.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Features\" />\n <FeatureConfig\n selectedProject={selectedProject}\n configItems={configItems}\n canGoBack={detectedProjects.length > 1}\n onSubmit={handleFeatureSubmit}\n onBack={handleBackToProject}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: Injection point configuration\n if (phase === \"configure-injection-point\" && injectionPoints.length > 0) {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"Injection Point\" />\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n </Box>\n )}\n <InjectionPointSelector\n points={injectionPoints}\n onSubmit={handleInjectionPointSubmit}\n onBack={handleBackFromInjectionPoint}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Render: ESLint rule configuration\n if (phase === \"configure-eslint\") {\n return (\n <Box flexDirection=\"column\">\n <Header subtitle=\"ESLint Rules\" />\n {selectedProject && (\n <Box marginBottom={1}>\n <Text dimColor>Project: </Text>\n <Text bold color=\"cyan\">{selectedProject.name}</Text>\n </Box>\n )}\n <RuleSelector\n onSubmit={handleRuleSubmit}\n onBack={handleBackToFeatures}\n onCancel={handleCancel}\n />\n </Box>\n );\n }\n\n // Fallback\n return (\n <Box flexDirection=\"column\">\n <Header />\n <Text dimColor>Loading...</Text>\n </Box>\n );\n}\n","/**\n * ProjectSelector - First step: select which project to configure\n *\n * Shows a simple list of detected projects (Next.js apps, Vite apps, etc.)\n * and lets the user select one to configure.\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport type { ProjectState } from \"../types.js\";\n\nexport interface DetectedProject {\n /** Unique ID */\n id: string;\n /** Project name/label */\n name: string;\n /** Project path (relative to workspace) */\n path: string;\n /** Framework type */\n type: \"nextjs\" | \"vite\" | \"other\";\n /** Framework badge/hint */\n hint: string;\n /** Whether UILint is already configured */\n isConfigured: boolean;\n}\n\nexport interface ProjectSelectorProps {\n projects: DetectedProject[];\n onSelect: (project: DetectedProject) => void;\n onCancel?: () => void;\n}\n\n/**\n * Extract detected projects from ProjectState\n */\nexport function getDetectedProjects(project: ProjectState): DetectedProject[] {\n const projects: DetectedProject[] = [];\n\n // Add Next.js apps\n for (const app of project.nextApps) {\n const relativePath = app.projectPath.replace(project.workspaceRoot + \"/\", \"\");\n projects.push({\n id: `next:${app.projectPath}`,\n name: relativePath || \".\",\n path: app.projectPath,\n type: \"nextjs\",\n hint: \"Next.js App Router\",\n isConfigured: false, // TODO: detect if overlay is installed\n });\n }\n\n // Add Vite apps\n for (const app of project.viteApps) {\n const relativePath = app.projectPath.replace(project.workspaceRoot + \"/\", \"\");\n projects.push({\n id: `vite:${app.projectPath}`,\n name: relativePath || \".\",\n path: app.projectPath,\n type: \"vite\",\n hint: \"Vite + React\",\n isConfigured: false,\n });\n }\n\n return projects;\n}\n\nfunction FrameworkBadge({ type }: { type: DetectedProject[\"type\"] }): React.ReactElement {\n switch (type) {\n case \"nextjs\":\n return <Text color=\"white\" backgroundColor=\"black\"> Next.js </Text>;\n case \"vite\":\n return <Text color=\"black\" backgroundColor=\"yellow\"> Vite </Text>;\n default:\n return <Text dimColor>Other</Text>;\n }\n}\n\nexport function ProjectSelector({\n projects,\n onSelect,\n onCancel,\n}: ProjectSelectorProps): React.ReactElement {\n const { exit } = useApp();\n const [cursor, setCursor] = useState(0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : projects.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < projects.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n const selected = projects[cursor];\n if (selected) {\n onSelect(selected);\n }\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n }\n });\n\n if (projects.length === 0) {\n return (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">No projects detected.</Text>\n <Text dimColor>\n UILint works with Next.js (App Router) and Vite + React projects.\n </Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Select a project to configure:</Text>\n </Box>\n\n {projects.map((project, index) => {\n const isCursor = index === cursor;\n return (\n <Box key={project.id} paddingLeft={1}>\n {/* Cursor */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Framework badge */}\n <Box width={12}>\n <FrameworkBadge type={project.type} />\n </Box>\n\n {/* Project name */}\n <Box width={30}>\n <Text color={isCursor ? \"cyan\" : undefined} bold={isCursor}>\n {project.name}\n </Text>\n </Box>\n\n {/* Status */}\n {project.isConfigured && (\n <Text color=\"green\" dimColor>\n configured\n </Text>\n )}\n </Box>\n );\n })}\n\n {/* Footer */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">enter</Text> select{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * Configuration item for the installer dashboard\n */\n\nimport React, { useState, useCallback } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\n\nexport type ItemStatus =\n | \"installed\"\n | \"not_installed\"\n | \"selected\"\n | \"partial\"\n | \"upgradeable\"\n | \"remove\";\n\nexport interface ConfigItem {\n /** Unique ID */\n id: string;\n /** Display label */\n label: string;\n /** Optional description/hint */\n hint?: string;\n /** Current installation status */\n status: ItemStatus;\n /** Category/group this item belongs to */\n category: string;\n /** Icon for the category */\n categoryIcon?: string;\n /** Whether this item can be toggled */\n disabled?: boolean;\n}\n\nexport interface ConfigSelectorProps {\n items: ConfigItem[];\n onSubmit: (selectedIds: string[], uninstallIds: string[]) => void;\n onCancel?: () => void;\n}\n\nfunction StatusIndicator({ status, isSelected, isMarkedForRemoval }: { status: ItemStatus; isSelected: boolean; isMarkedForRemoval: boolean }): React.ReactElement {\n // Show red X if item is marked for removal\n if (isMarkedForRemoval) {\n return <Text color=\"red\">✗</Text>;\n }\n if (status === \"installed\") {\n return <Text color=\"green\">✓</Text>;\n }\n if (status === \"upgradeable\") {\n // Upgradeable: show blue up arrow if selected, green check if not\n return isSelected ? <Text color=\"blue\">⬆</Text> : <Text color=\"green\">✓</Text>;\n }\n if (isSelected || status === \"selected\") {\n return <Text color=\"cyan\">◉</Text>;\n }\n if (status === \"partial\") {\n return <Text color=\"yellow\">◐</Text>;\n }\n return <Text dimColor>○</Text>;\n}\n\nfunction StatusLabel({ status, isMarkedForRemoval }: { status: ItemStatus; isMarkedForRemoval: boolean }): React.ReactElement {\n if (isMarkedForRemoval) {\n return <Text color=\"red\" dimColor>remove</Text>;\n }\n if (status === \"installed\") {\n return <Text color=\"green\" dimColor>installed</Text>;\n }\n if (status === \"upgradeable\") {\n return <Text color=\"blue\" dimColor>upgrade available</Text>;\n }\n if (status === \"partial\") {\n return <Text color=\"yellow\" dimColor>partial</Text>;\n }\n return <Text dimColor>-</Text>;\n}\n\nexport function ConfigSelector({\n items,\n onSubmit,\n onCancel,\n}: ConfigSelectorProps): React.ReactElement {\n const { exit } = useApp();\n const [cursor, setCursor] = useState(0);\n const [selected, setSelected] = useState<Set<string>>(() => {\n // Pre-select items that aren't fully installed (including upgradeable)\n return new Set(\n items\n .filter((item) => item.status !== \"installed\" && !item.disabled)\n .map((item) => item.id)\n );\n });\n // Track installed items that are marked for removal\n const [markedForRemoval, setMarkedForRemoval] = useState<Set<string>>(new Set());\n\n // Group items by category\n const categories = Array.from(new Set(items.map((item) => item.category)));\n const itemsByCategory = new Map<string, ConfigItem[]>();\n for (const cat of categories) {\n itemsByCategory.set(cat, items.filter((item) => item.category === cat));\n }\n\n // Flatten for navigation\n const flatItems = items;\n\n const handleToggle = useCallback(() => {\n const item = flatItems[cursor];\n if (!item || item.disabled) return;\n\n // Handle installed items - toggle them for removal\n if (item.status === \"installed\") {\n setMarkedForRemoval((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n return next;\n });\n return;\n }\n\n // Handle non-installed items (including upgradeable, partial, not_installed)\n setSelected((prev) => {\n const next = new Set(prev);\n if (next.has(item.id)) {\n next.delete(item.id);\n } else {\n next.add(item.id);\n }\n return next;\n });\n }, [cursor, flatItems]);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : flatItems.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < flatItems.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n handleToggle();\n } else if (key.return) {\n onSubmit(Array.from(selected), Array.from(markedForRemoval));\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n } else if (input === \"a\") {\n // Select all non-installed and upgradeable\n setSelected(\n new Set(\n items\n .filter((item) => item.status !== \"installed\" && !item.disabled)\n .map((item) => item.id)\n )\n );\n // Clear removal selections\n setMarkedForRemoval(new Set());\n } else if (input === \"n\") {\n // Select none\n setSelected(new Set());\n // Clear removal selections too\n setMarkedForRemoval(new Set());\n }\n });\n\n let globalIndex = 0;\n\n return (\n <Box flexDirection=\"column\">\n {categories.map((category) => {\n const categoryItems = itemsByCategory.get(category) || [];\n const categoryIcon = categoryItems[0]?.categoryIcon || \"•\";\n\n return (\n <Box key={category} flexDirection=\"column\" marginBottom={1}>\n {/* Category header */}\n <Box>\n <Text bold color=\"white\">\n {categoryIcon} {category}\n </Text>\n </Box>\n\n {/* Category items */}\n {categoryItems.map((item) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const isItemSelected = selected.has(item.id);\n const isItemMarkedForRemoval = markedForRemoval.has(item.id);\n // Items are only disabled if explicitly marked as such\n const isDisabled = item.disabled === true;\n\n return (\n <Box key={item.id} paddingLeft={2}>\n {/* Cursor indicator */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Status checkbox */}\n <Box width={2}>\n <StatusIndicator status={item.status} isSelected={isItemSelected} isMarkedForRemoval={isItemMarkedForRemoval} />\n </Box>\n\n {/* Label */}\n <Box width={28}>\n <Text\n color={isItemMarkedForRemoval ? \"red\" : isDisabled ? undefined : isCursor ? \"cyan\" : undefined}\n dimColor={isDisabled && !isItemMarkedForRemoval}\n >\n {item.label}\n </Text>\n </Box>\n\n {/* Hint */}\n <Box width={20}>\n <Text dimColor>{item.hint || \"\"}</Text>\n </Box>\n\n {/* Status */}\n <StatusLabel status={item.status} isMarkedForRemoval={isItemMarkedForRemoval} />\n </Box>\n );\n })}\n </Box>\n );\n })}\n\n {/* Footer with keyboard hints */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">space</Text> toggle{\" \"}\n <Text color=\"cyan\">a</Text> all{\" \"}\n <Text color=\"cyan\">n</Text> none{\" \"}\n <Text color=\"cyan\">enter</Text> apply{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n\n {/* Selection summary */}\n <Box marginTop={1}>\n <Text>\n <Text color=\"cyan\">{selected.size}</Text>\n <Text dimColor> to install</Text>\n {markedForRemoval.size > 0 && (\n <>\n <Text dimColor>, </Text>\n <Text color=\"red\">{markedForRemoval.size}</Text>\n <Text dimColor> to remove</Text>\n </>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * RuleSelector - ESLint rule configuration UI\n *\n * Shows a list of available ESLint rules with:\n * - Toggle to enable/disable each rule\n * - Severity selection (error/warn)\n * - Rule documentation on hover/select\n * - Option configuration for rules with configurable options\n */\n\nimport React, { useState, useMemo } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport { getRulesByCategory, getCategoryMeta } from \"uilint-eslint\";\nimport type { RuleMeta } from \"uilint-eslint\";\nimport { OptionField, convertFieldValue } from \"./OptionField.js\";\n\nexport interface ConfiguredRule {\n rule: RuleMeta;\n severity: \"error\" | \"warn\" | \"off\";\n options?: unknown[];\n}\n\nexport interface RuleSelectorProps {\n onSubmit: (configuredRules: ConfiguredRule[]) => void;\n onBack?: () => void;\n onCancel?: () => void;\n}\n\ntype ViewMode = \"list\" | \"docs\" | \"confirm-options\" | \"edit-options\";\n\nfunction SeverityBadge({ severity }: { severity: \"error\" | \"warn\" | \"off\" }): React.ReactElement {\n if (severity === \"error\") {\n return <Text color=\"red\">error</Text>;\n }\n if (severity === \"warn\") {\n return <Text color=\"yellow\">warn</Text>;\n }\n return <Text dimColor>off</Text>;\n}\n\nfunction CategoryHeader({ name, icon }: { name: string; icon: string }): React.ReactElement {\n return (\n <Box marginTop={1} marginBottom={0}>\n <Text bold color=\"white\">\n {icon} {name}\n </Text>\n </Box>\n );\n}\n\nexport function RuleSelector({\n onSubmit,\n onBack,\n onCancel,\n}: RuleSelectorProps): React.ReactElement {\n const { exit } = useApp();\n\n const staticRules = useMemo(() => getRulesByCategory(\"static\"), []);\n const semanticRules = useMemo(() => getRulesByCategory(\"semantic\"), []);\n const allRules = useMemo(() => [...staticRules, ...semanticRules], [staticRules, semanticRules]);\n\n const [cursor, setCursor] = useState(0);\n const [viewMode, setViewMode] = useState<ViewMode>(\"list\");\n\n // Track enabled state and severity for each rule\n const [ruleStates, setRuleStates] = useState<Map<string, { enabled: boolean; severity: \"error\" | \"warn\" }>>(\n () => {\n const map = new Map();\n // Use rule metadata for default enablement\n for (const rule of allRules) {\n const categoryMeta = getCategoryMeta(rule.category);\n const enabled = rule.defaultEnabled ?? categoryMeta?.defaultEnabled ?? false;\n map.set(rule.id, {\n enabled,\n severity: rule.defaultSeverity === \"off\" ? \"warn\" : rule.defaultSeverity\n });\n }\n return map;\n }\n );\n\n // Track custom options for rules (only populated when user configures them)\n const [customOptions, setCustomOptions] = useState<Map<string, Record<string, unknown>>>(new Map());\n\n // For option editing: which rule and which field cursor\n const [editingRuleIndex, setEditingRuleIndex] = useState(0);\n const [editingFieldCursor, setEditingFieldCursor] = useState(0);\n\n // For confirm-options view: cursor position (0 = Yes, 1 = No)\n const [confirmCursor, setConfirmCursor] = useState(1); // Default to \"No\"\n\n const currentRule = allRules[cursor];\n\n // Get enabled rules that have configurable options\n const enabledRulesWithOptions = useMemo(() => {\n return allRules.filter((rule) => {\n const state = ruleStates.get(rule.id);\n return state?.enabled && rule.optionSchema && rule.optionSchema.fields.length > 0;\n });\n }, [allRules, ruleStates]);\n\n // Current rule being edited in edit-options mode\n const currentEditingRule = enabledRulesWithOptions[editingRuleIndex];\n const currentEditingFields = currentEditingRule?.optionSchema?.fields ?? [];\n\n const toggleRule = () => {\n if (!currentRule) return;\n setRuleStates((prev) => {\n const next = new Map(prev);\n const current = next.get(currentRule.id)!;\n next.set(currentRule.id, { ...current, enabled: !current.enabled });\n return next;\n });\n };\n\n const cycleSeverity = () => {\n if (!currentRule) return;\n setRuleStates((prev) => {\n const next = new Map(prev);\n const current = next.get(currentRule.id)!;\n const newSeverity = current.severity === \"error\" ? \"warn\" : \"error\";\n next.set(currentRule.id, { ...current, severity: newSeverity });\n return next;\n });\n };\n\n // Final submit - build configured rules with options\n const finalSubmit = () => {\n const configuredRules: ConfiguredRule[] = [];\n for (const rule of allRules) {\n const state = ruleStates.get(rule.id);\n if (state?.enabled) {\n const custom = customOptions.get(rule.id);\n const baseOptions = rule.defaultOptions?.[0] ?? {};\n configuredRules.push({\n rule,\n severity: state.severity,\n options: custom ? [{ ...baseOptions, ...custom }] : rule.defaultOptions,\n });\n }\n }\n onSubmit(configuredRules);\n };\n\n // Transition from list to confirm/submit\n const handleListSubmit = () => {\n if (enabledRulesWithOptions.length > 0) {\n // Show confirm dialog\n setViewMode(\"confirm-options\");\n setConfirmCursor(1); // Default to \"No\"\n } else {\n // No rules with options, submit directly\n finalSubmit();\n }\n };\n\n // Handle confirm-options selection\n const handleConfirmSelection = () => {\n if (confirmCursor === 0) {\n // Yes - configure options\n setEditingRuleIndex(0);\n setEditingFieldCursor(0);\n // Initialize custom options with defaults for the first rule\n if (enabledRulesWithOptions[0]) {\n initializeRuleOptions(enabledRulesWithOptions[0]);\n }\n setViewMode(\"edit-options\");\n } else {\n // No - use defaults\n finalSubmit();\n }\n };\n\n // Initialize custom options for a rule with its defaults\n const initializeRuleOptions = (rule: RuleMeta) => {\n if (!customOptions.has(rule.id) && rule.optionSchema) {\n const baseOptions = rule.defaultOptions?.[0] ?? {};\n const initial: Record<string, unknown> = {};\n for (const field of rule.optionSchema.fields) {\n initial[field.key] = (baseOptions as Record<string, unknown>)[field.key] ?? field.defaultValue;\n }\n setCustomOptions((prev) => {\n const next = new Map(prev);\n next.set(rule.id, initial);\n return next;\n });\n }\n };\n\n // Update a field value for current editing rule\n const updateFieldValue = (fieldKey: string, value: unknown) => {\n if (!currentEditingRule) return;\n setCustomOptions((prev) => {\n const next = new Map(prev);\n const current = next.get(currentEditingRule.id) ?? {};\n next.set(currentEditingRule.id, { ...current, [fieldKey]: value });\n return next;\n });\n };\n\n // Move to next rule in edit-options mode\n const nextEditingRule = () => {\n if (editingRuleIndex < enabledRulesWithOptions.length - 1) {\n const nextIndex = editingRuleIndex + 1;\n setEditingRuleIndex(nextIndex);\n setEditingFieldCursor(0);\n // Initialize options for next rule\n if (enabledRulesWithOptions[nextIndex]) {\n initializeRuleOptions(enabledRulesWithOptions[nextIndex]!);\n }\n } else {\n // Done with all rules\n finalSubmit();\n }\n };\n\n // Skip current rule (use defaults) and move to next\n const skipCurrentRule = () => {\n // Remove any custom options for this rule (use defaults)\n if (currentEditingRule) {\n setCustomOptions((prev) => {\n const next = new Map(prev);\n next.delete(currentEditingRule.id);\n return next;\n });\n }\n nextEditingRule();\n };\n\n useInput((input, key) => {\n // Docs view\n if (viewMode === \"docs\") {\n if (key.escape || key.return || input === \"d\" || input === \"q\") {\n setViewMode(\"list\");\n }\n return;\n }\n\n // Confirm options view\n if (viewMode === \"confirm-options\") {\n if (key.upArrow || key.downArrow) {\n setConfirmCursor((prev) => (prev === 0 ? 1 : 0));\n } else if (key.return || input === \" \") {\n handleConfirmSelection();\n } else if (key.escape || input === \"q\") {\n setViewMode(\"list\");\n }\n return;\n }\n\n // Edit options view\n if (viewMode === \"edit-options\") {\n if (key.upArrow) {\n setEditingFieldCursor((prev) =>\n prev > 0 ? prev - 1 : currentEditingFields.length - 1\n );\n } else if (key.downArrow) {\n setEditingFieldCursor((prev) =>\n prev < currentEditingFields.length - 1 ? prev + 1 : 0\n );\n } else if (key.return) {\n // Confirm this rule's options and move to next\n nextEditingRule();\n } else if (key.escape) {\n // Skip this rule (use defaults)\n skipCurrentRule();\n } else if (input === \"q\") {\n // Cancel and go back to list\n setViewMode(\"list\");\n }\n // Note: Individual field inputs are handled by OptionField component\n return;\n }\n\n // List view controls\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : allRules.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < allRules.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n toggleRule();\n } else if (input === \"s\") {\n cycleSeverity();\n } else if (input === \"d\") {\n setViewMode(\"docs\");\n } else if (key.return) {\n handleListSubmit();\n } else if (key.escape || input === \"q\") {\n onCancel?.();\n exit();\n } else if ((input === \"b\" || key.leftArrow) && onBack) {\n onBack();\n } else if (input === \"a\") {\n // Enable all\n setRuleStates((prev) => {\n const next = new Map(prev);\n for (const rule of allRules) {\n const current = next.get(rule.id)!;\n next.set(rule.id, { ...current, enabled: true });\n }\n return next;\n });\n } else if (input === \"n\") {\n // Disable all\n setRuleStates((prev) => {\n const next = new Map(prev);\n for (const rule of allRules) {\n const current = next.get(rule.id)!;\n next.set(rule.id, { ...current, enabled: false });\n }\n return next;\n });\n }\n });\n\n // Show documentation view\n if (viewMode === \"docs\" && currentRule) {\n const docLines = currentRule.docs.trim().split(\"\\n\").slice(0, 20);\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">{currentRule.name}</Text>\n <Text dimColor> - {currentRule.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n {docLines.map((line, i) => (\n <Text key={i} dimColor={line.startsWith(\"#\")}>\n {line}\n </Text>\n ))}\n {currentRule.docs.split(\"\\n\").length > 20 && (\n <Text dimColor>... (truncated)</Text>\n )}\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Press any key to return to list\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Show confirm options view\n if (viewMode === \"confirm-options\") {\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configure Rule Options</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text>\n <Text color=\"cyan\">{enabledRulesWithOptions.length}</Text>\n <Text> selected rules have configurable options. Would you like to customize them?</Text>\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" paddingLeft={2}>\n <Box>\n <Text color={confirmCursor === 0 ? \"cyan\" : undefined}>\n {confirmCursor === 0 ? \"› \" : \" \"}\n </Text>\n <Text color={confirmCursor === 0 ? \"cyan\" : undefined} bold={confirmCursor === 0}>\n Yes\n </Text>\n <Text dimColor> - Configure each rule's options</Text>\n </Box>\n <Box>\n <Text color={confirmCursor === 1 ? \"cyan\" : undefined}>\n {confirmCursor === 1 ? \"› \" : \" \"}\n </Text>\n <Text color={confirmCursor === 1 ? \"cyan\" : undefined} bold={confirmCursor === 1}>\n No\n </Text>\n <Text dimColor> - Use defaults for all rules</Text>\n </Box>\n </Box>\n\n <Box marginTop={1}>\n <Text dimColor>\n Rules with options:{\" \"}\n {enabledRulesWithOptions.map((r) => r.name).join(\", \")}\n </Text>\n </Box>\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> select{\" \"}\n <Text color=\"cyan\">enter</Text> confirm{\" \"}\n <Text color=\"cyan\">esc</Text> back\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Show edit options view\n if (viewMode === \"edit-options\" && currentEditingRule) {\n const ruleOptions = customOptions.get(currentEditingRule.id) ?? {};\n const baseOptions = currentEditingRule.defaultOptions?.[0] ?? {};\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\n {currentEditingRule.icon ?? \"⚙️\"} {currentEditingRule.name}\n </Text>\n <Text dimColor> ({editingRuleIndex + 1}/{enabledRulesWithOptions.length})</Text>\n </Box>\n\n <Box marginBottom={1}>\n <Text dimColor>{currentEditingRule.description}</Text>\n </Box>\n\n <Box flexDirection=\"column\">\n {currentEditingFields.map((field, i) => {\n const currentValue = ruleOptions[field.key] ??\n (baseOptions as Record<string, unknown>)[field.key] ??\n field.defaultValue;\n const defaultValue = (baseOptions as Record<string, unknown>)[field.key] ?? field.defaultValue;\n\n return (\n <OptionField\n key={field.key}\n field={field}\n value={currentValue}\n onChange={(newValue) => {\n const converted = convertFieldValue(newValue, field, defaultValue);\n updateFieldValue(field.key, converted);\n }}\n isActive={i === editingFieldCursor}\n />\n );\n })}\n </Box>\n\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">space</Text> toggle{\" \"}\n <Text color=\"cyan\">enter</Text> next rule{\" \"}\n <Text color=\"cyan\">esc</Text> skip (use defaults)\n </Text>\n </Box>\n </Box>\n );\n }\n\n // Count enabled rules\n const enabledCount = Array.from(ruleStates.values()).filter((s) => s.enabled).length;\n const errorCount = Array.from(ruleStates.entries()).filter(\n ([, s]) => s.enabled && s.severity === \"error\"\n ).length;\n const warnCount = enabledCount - errorCount;\n\n // Build flat list with category markers\n let globalIndex = 0;\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Configure ESLint Rules</Text>\n </Box>\n\n {/* Static rules */}\n {(() => {\n const cat = getCategoryMeta(\"static\");\n return cat ? (\n <>\n <CategoryHeader name={cat.name} icon={cat.icon} />\n <Text dimColor> {cat.description}</Text>\n </>\n ) : null;\n })()}\n\n {staticRules.map((rule) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const state = ruleStates.get(rule.id)!;\n const hasOptions = rule.optionSchema && rule.optionSchema.fields.length > 0;\n\n return (\n <Box key={rule.id} paddingLeft={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Box width={3}>\n <Text color={state.enabled ? \"green\" : undefined} dimColor={!state.enabled}>\n {state.enabled ? \"✓\" : \"○\"}\n </Text>\n </Box>\n <Box width={30}>\n <Text\n color={isCursor ? \"cyan\" : undefined}\n dimColor={!state.enabled}\n bold={isCursor}\n >\n {rule.name}\n </Text>\n </Box>\n <Box width={8}>\n {state.enabled ? (\n <SeverityBadge severity={state.severity} />\n ) : (\n <Text dimColor>-</Text>\n )}\n </Box>\n {hasOptions && state.enabled && (\n <Text dimColor> ⚙</Text>\n )}\n </Box>\n );\n })}\n\n {/* Semantic rules */}\n {(() => {\n const cat = getCategoryMeta(\"semantic\");\n return cat ? (\n <>\n <CategoryHeader name={cat.name} icon={cat.icon} />\n <Text dimColor> {cat.description}</Text>\n </>\n ) : null;\n })()}\n\n {semanticRules.map((rule) => {\n const itemIndex = globalIndex++;\n const isCursor = itemIndex === cursor;\n const state = ruleStates.get(rule.id)!;\n const hasOptions = rule.optionSchema && rule.optionSchema.fields.length > 0;\n\n return (\n <Box key={rule.id} paddingLeft={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Box width={3}>\n <Text color={state.enabled ? \"green\" : undefined} dimColor={!state.enabled}>\n {state.enabled ? \"✓\" : \"○\"}\n </Text>\n </Box>\n <Box width={30}>\n <Text\n color={isCursor ? \"cyan\" : undefined}\n dimColor={!state.enabled}\n bold={isCursor}\n >\n {rule.name}\n </Text>\n </Box>\n <Box width={8}>\n {state.enabled ? (\n <SeverityBadge severity={state.severity} />\n ) : (\n <Text dimColor>-</Text>\n )}\n </Box>\n {hasOptions && state.enabled && (\n <Text dimColor> ⚙</Text>\n )}\n </Box>\n );\n })}\n\n {/* Current rule description */}\n {currentRule && (\n <Box marginTop={1} paddingX={2}>\n <Text dimColor>{currentRule.description}</Text>\n </Box>\n )}\n\n {/* Footer with keyboard hints */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">space</Text> toggle{\" \"}\n <Text color=\"cyan\">s</Text> severity{\" \"}\n <Text color=\"cyan\">d</Text> docs{\" \"}\n <Text color=\"cyan\">a</Text> all{\" \"}\n <Text color=\"cyan\">n</Text> none{\" \"}\n <Text color=\"cyan\">enter</Text> confirm\n </Text>\n </Box>\n\n {/* Summary */}\n <Box marginTop={1}>\n <Text>\n <Text color=\"cyan\">{enabledCount}</Text>\n <Text dimColor> rules enabled (</Text>\n <Text color=\"red\">{errorCount}</Text>\n <Text dimColor> errors, </Text>\n <Text color=\"yellow\">{warnCount}</Text>\n <Text dimColor> warnings)</Text>\n {enabledRulesWithOptions.length > 0 && (\n <Text dimColor>, {enabledRulesWithOptions.length} with options ⚙</Text>\n )}\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * OptionField - Ink components for editing rule option fields\n *\n * Renders appropriate input UI based on field type:\n * - boolean: Toggle checkbox\n * - number: Text input with number validation\n * - text: Text input\n * - select: Single-select list\n * - multiselect: Multi-select list\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput } from \"ink\";\nimport type { OptionFieldSchema } from \"uilint-eslint\";\n\nexport interface OptionFieldProps {\n field: OptionFieldSchema;\n value: unknown;\n onChange: (value: unknown) => void;\n isActive: boolean;\n}\n\n/**\n * Boolean field - toggle with space\n */\nfunction BooleanField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const checked = Boolean(value);\n\n useInput(\n (input) => {\n if (isActive && input === \" \") {\n onChange(!checked);\n }\n },\n { isActive }\n );\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text color={checked ? \"green\" : \"gray\"}>\n {checked ? \"[✓]\" : \"[ ]\"}\n </Text>\n <Text> {field.label}</Text>\n {field.description && (\n <Text dimColor> - {field.description}</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Number field - text input with validation\n */\nfunction NumberField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const [inputValue, setInputValue] = useState(String(value ?? field.defaultValue ?? \"\"));\n const [error, setError] = useState<string | null>(null);\n\n useInput(\n (input, key) => {\n if (!isActive) return;\n\n if (key.backspace || key.delete) {\n const newValue = inputValue.slice(0, -1);\n setInputValue(newValue);\n const num = Number(newValue);\n if (!isNaN(num) && newValue !== \"\") {\n onChange(num);\n setError(null);\n } else if (newValue === \"\") {\n setError(null);\n } else {\n setError(\"Enter a valid number\");\n }\n } else if (/^[0-9.-]$/.test(input)) {\n const newValue = inputValue + input;\n setInputValue(newValue);\n const num = Number(newValue);\n if (!isNaN(num)) {\n onChange(num);\n setError(null);\n } else {\n setError(\"Enter a valid number\");\n }\n }\n },\n { isActive }\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} underline={isActive}>\n {inputValue || field.placeholder || \"\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n {error && (\n <Box paddingLeft={4}>\n <Text color=\"red\">{error}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\n/**\n * Text field - simple text input\n */\nfunction TextField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n // Handle array values by joining with commas\n const displayValue = Array.isArray(value)\n ? value.join(\", \")\n : String(value ?? field.defaultValue ?? \"\");\n const [inputValue, setInputValue] = useState(displayValue);\n\n useInput(\n (input, key) => {\n if (!isActive) return;\n\n if (key.backspace || key.delete) {\n const newValue = inputValue.slice(0, -1);\n setInputValue(newValue);\n onChange(newValue);\n } else if (input && !key.ctrl && !key.meta) {\n const newValue = inputValue + input;\n setInputValue(newValue);\n onChange(newValue);\n }\n },\n { isActive }\n );\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} underline={isActive}>\n {inputValue || field.placeholder || \"(empty)\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Select field - cycle through options with space or left/right arrows\n * Uses inline display to avoid conflicts with parent navigation\n */\nfunction SelectField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const options = field.options ?? [];\n const currentIndex = options.findIndex(\n (opt) => String(opt.value) === String(value)\n );\n const selectedIndex = currentIndex >= 0 ? currentIndex : 0;\n\n useInput(\n (input, key) => {\n if (!isActive || options.length === 0) return;\n\n // Space or right arrow cycles forward\n if (input === \" \" || key.rightArrow) {\n const newIndex = selectedIndex < options.length - 1 ? selectedIndex + 1 : 0;\n onChange(options[newIndex]!.value);\n }\n // Left arrow cycles backward\n else if (key.leftArrow) {\n const newIndex = selectedIndex > 0 ? selectedIndex - 1 : options.length - 1;\n onChange(options[newIndex]!.value);\n }\n },\n { isActive }\n );\n\n const selectedOption = options[selectedIndex];\n\n return (\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}: </Text>\n <Text color={isActive ? \"cyan\" : undefined} bold={isActive}>\n {\"◀ \"}\n {selectedOption?.label ?? \"(none)\"}\n {\" ▶\"}\n </Text>\n {field.description && (\n <Text dimColor> ({field.description})</Text>\n )}\n </Box>\n );\n}\n\n/**\n * Multiselect field - multiple selections from options\n */\nfunction MultiselectField({\n field,\n value,\n onChange,\n isActive,\n}: OptionFieldProps): React.ReactElement {\n const options = field.options ?? [];\n const selectedValues = new Set(\n Array.isArray(value) ? value.map(String) : []\n );\n const [cursor, setCursor] = useState(0);\n\n useInput(\n (input, key) => {\n if (!isActive || options.length === 0) return;\n\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : options.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < options.length - 1 ? prev + 1 : 0));\n } else if (input === \" \") {\n const opt = options[cursor]!;\n const newSelected = new Set(selectedValues);\n if (newSelected.has(String(opt.value))) {\n newSelected.delete(String(opt.value));\n } else {\n newSelected.add(String(opt.value));\n }\n onChange(Array.from(newSelected));\n }\n },\n { isActive }\n );\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text color={isActive ? \"cyan\" : undefined}>\n {isActive ? \"› \" : \" \"}\n </Text>\n <Text>{field.label}</Text>\n {field.description && (\n <Text dimColor> - {field.description}</Text>\n )}\n </Box>\n {isActive && (\n <Box flexDirection=\"column\" paddingLeft={4}>\n {options.map((opt, i) => {\n const isSelected = selectedValues.has(String(opt.value));\n const isCursor = i === cursor;\n return (\n <Box key={String(opt.value)}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n <Text color={isSelected ? \"green\" : undefined}>\n {isSelected ? \"[✓]\" : \"[ ]\"}\n </Text>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {\" \"}{opt.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n {!isActive && (\n <Box paddingLeft={4}>\n <Text dimColor>\n Selected: {Array.from(selectedValues).length > 0\n ? Array.from(selectedValues).join(\", \")\n : \"(none)\"}\n </Text>\n </Box>\n )}\n </Box>\n );\n}\n\n/**\n * Main OptionField component - renders the appropriate field type\n */\nexport function OptionField(props: OptionFieldProps): React.ReactElement {\n const { field } = props;\n\n switch (field.type) {\n case \"boolean\":\n return <BooleanField {...props} />;\n case \"number\":\n return <NumberField {...props} />;\n case \"text\":\n return <TextField {...props} />;\n case \"select\":\n return <SelectField {...props} />;\n case \"multiselect\":\n return <MultiselectField {...props} />;\n default:\n return (\n <Box>\n <Text dimColor>Unknown field type: {field.type}</Text>\n </Box>\n );\n }\n}\n\n/**\n * Converts field value to the expected type for rule options.\n * Handles comma-separated text → array conversion for array-typed defaults.\n */\nexport function convertFieldValue(\n value: unknown,\n field: OptionFieldSchema,\n defaultValue: unknown\n): unknown {\n // If defaultValue is an array but field type is text, parse comma-separated\n if (Array.isArray(defaultValue) && field.type === \"text\" && typeof value === \"string\") {\n return value\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n }\n return value;\n}\n","/**\n * InjectionPointSelector - Select where to inject the UI devtools component\n *\n * Shows a list of possible injection points (client boundaries) and lets\n * the user select one. Only one can be selected (single-select).\n */\n\nimport React, { useState } from \"react\";\nimport { Box, Text, useInput, useApp } from \"ink\";\nimport type { InjectionPoint } from \"../installers/next-overlay.js\";\n\nexport interface InjectionPointSelectorProps {\n /** Available injection points */\n points: InjectionPoint[];\n /** Callback when user selects a point */\n onSubmit: (point: InjectionPoint) => void;\n /** Callback to go back */\n onBack?: () => void;\n /** Callback when user cancels */\n onCancel?: () => void;\n}\n\nexport function InjectionPointSelector({\n points,\n onSubmit,\n onBack,\n onCancel,\n}: InjectionPointSelectorProps): React.ReactElement {\n const { exit } = useApp();\n\n // Find the recommended point to pre-select, or default to first\n const recommendedIndex = points.findIndex((p) => p.recommended);\n const [cursor, setCursor] = useState(recommendedIndex >= 0 ? recommendedIndex : 0);\n\n useInput((input, key) => {\n if (key.upArrow) {\n setCursor((prev) => (prev > 0 ? prev - 1 : points.length - 1));\n } else if (key.downArrow) {\n setCursor((prev) => (prev < points.length - 1 ? prev + 1 : 0));\n } else if (key.return) {\n const selected = points[cursor];\n if (selected) {\n onSubmit(selected);\n }\n } else if (input === \"b\" || key.leftArrow) {\n onBack?.();\n } else if (input === \"q\" || key.escape) {\n onCancel?.();\n exit();\n }\n });\n\n return (\n <Box flexDirection=\"column\">\n <Box marginBottom={1}>\n <Text bold>Where should the devtools component be injected?</Text>\n </Box>\n\n {points.map((point, index) => {\n const isCursor = index === cursor;\n\n return (\n <Box key={point.id} paddingLeft={1}>\n {/* Cursor indicator */}\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"› \" : \" \"}\n </Text>\n\n {/* Radio button */}\n <Box width={2}>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {isCursor ? \"◉\" : \"○\"}\n </Text>\n </Box>\n\n {/* Label */}\n <Box>\n <Text color={isCursor ? \"cyan\" : undefined}>\n {point.label}\n </Text>\n {point.hint && (\n <Text dimColor> ({point.hint})</Text>\n )}\n </Box>\n </Box>\n );\n })}\n\n {/* Footer with keyboard hints */}\n <Box marginTop={1} borderStyle=\"single\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor>\n <Text color=\"cyan\">↑↓</Text> navigate{\" \"}\n <Text color=\"cyan\">enter</Text> select{\" \"}\n <Text color=\"cyan\">b</Text> back{\" \"}\n <Text color=\"cyan\">q</Text> quit\n </Text>\n </Box>\n </Box>\n );\n}\n","/**\n * Test helpers for the install command\n *\n * These helpers provide backward compatibility with existing tests\n * by bridging between the old Prompter-based API and the new installer system.\n */\n\nimport type { RuleMetadata } from \"uilint-eslint\";\nimport type {\n InstallItem,\n NextAppInfo,\n ViteAppInfo,\n EslintPackageInfo,\n UserChoices,\n NextChoices,\n ViteChoices,\n EslintChoices,\n InstallOptions,\n ProjectState,\n} from \"./types.js\";\n\n// ============================================================================\n// Prompter Interface (for backward compatibility with tests)\n// ============================================================================\n\nexport interface Prompter {\n selectInstallItems(): Promise<InstallItem[]>;\n selectNextApp(apps: NextAppInfo[]): Promise<NextAppInfo>;\n selectViteApp(apps: ViteAppInfo[]): Promise<ViteAppInfo>;\n selectEslintPackages(packages: EslintPackageInfo[]): Promise<string[]>;\n selectEslintRules(): Promise<RuleMetadata[]>;\n selectEslintRuleSeverity(): Promise<\"warn\" | \"error\" | \"defaults\">;\n confirmCustomizeRuleOptions(): Promise<boolean>;\n configureRuleOptions(\n rule: RuleMetadata\n ): Promise<Record<string, unknown> | undefined>;\n}\n\n// ============================================================================\n// Choice Gathering Logic (for backward compatibility with tests)\n// ============================================================================\n\n/**\n * Gather all user choices using the prompter or CLI flags\n *\n * This function provides backward compatibility with existing tests.\n */\nexport async function gatherChoices(\n state: ProjectState,\n options: InstallOptions,\n prompter: Prompter\n): Promise<UserChoices> {\n // Determine items from flags or prompts\n let items: InstallItem[];\n\n const hasExplicitFlags =\n options.genstyleguide !== undefined ||\n options.skill !== undefined ||\n options.routes !== undefined ||\n options.react !== undefined;\n\n if (hasExplicitFlags || options.eslint) {\n items = [];\n if (options.genstyleguide) items.push(\"genstyleguide\");\n if (options.skill) items.push(\"skill\");\n if (options.routes || options.react) items.push(\"next\");\n if (options.eslint) items.push(\"eslint\");\n } else {\n items = await prompter.selectInstallItems();\n }\n\n // Next.js app selection\n let nextChoices: NextChoices | undefined;\n if (items.includes(\"next\")) {\n if (state.nextApps.length === 0) {\n throw new Error(\n \"Could not find a Next.js App Router app root (expected app/ or src/app/). Run this from your Next.js project root.\"\n );\n } else if (state.nextApps.length === 1) {\n nextChoices = {\n projectPath: state.nextApps[0].projectPath,\n detection: state.nextApps[0].detection,\n // In non-interactive mode, default to creating providers.tsx\n createProviders: hasExplicitFlags,\n };\n } else {\n const selected = await prompter.selectNextApp(state.nextApps);\n nextChoices = {\n projectPath: selected.projectPath,\n detection: selected.detection,\n // In non-interactive mode, default to creating providers.tsx\n createProviders: hasExplicitFlags,\n };\n }\n }\n\n // Vite app selection\n let viteChoices: ViteChoices | undefined;\n if (items.includes(\"vite\")) {\n if (state.viteApps.length === 0) {\n throw new Error(\n \"Could not find a Vite + React project (expected vite.config.* + react deps). Run this from your Vite project root.\"\n );\n } else if (state.viteApps.length === 1) {\n viteChoices = {\n projectPath: state.viteApps[0].projectPath,\n detection: state.viteApps[0].detection,\n };\n } else {\n const selected = await prompter.selectViteApp(state.viteApps);\n viteChoices = {\n projectPath: selected.projectPath,\n detection: selected.detection,\n };\n }\n }\n\n // ESLint choices\n let eslintChoices: EslintChoices | undefined;\n if (items.includes(\"eslint\")) {\n // Filter to packages with ESLint config\n const packagesWithEslint = state.packages.filter(\n (p) => p.eslintConfigPath !== null\n );\n\n if (packagesWithEslint.length === 0) {\n throw new Error(\n \"No packages with eslint.config.{ts,mjs,js,cjs} found. Create an ESLint config first.\"\n );\n }\n\n const packagePaths = await prompter.selectEslintPackages(\n packagesWithEslint\n );\n\n if (packagePaths.length > 0) {\n let selectedRules = await prompter.selectEslintRules();\n\n // Apply a global severity choice (default: warn)\n const severity = await prompter.selectEslintRuleSeverity();\n if (severity !== \"defaults\") {\n selectedRules = selectedRules.map((rule) => ({\n ...rule,\n defaultSeverity: severity,\n }));\n }\n\n // Ask if user wants to customize individual rule options\n const hasConfigurableRules = selectedRules.some(\n (r) => r.optionSchema && r.optionSchema.fields.length > 0\n );\n\n if (hasConfigurableRules) {\n const customizeOptions = await prompter.confirmCustomizeRuleOptions();\n\n if (customizeOptions) {\n selectedRules = await configureRuleOptions(selectedRules, prompter);\n }\n }\n\n eslintChoices = { packagePaths, selectedRules };\n }\n }\n\n return {\n items,\n next: nextChoices,\n vite: viteChoices,\n eslint: eslintChoices,\n };\n}\n\n/**\n * Configure options for individual rules based on their schemas\n */\nasync function configureRuleOptions(\n rules: RuleMetadata[],\n prompter: Prompter\n): Promise<RuleMetadata[]> {\n const configured: RuleMetadata[] = [];\n\n for (const rule of rules) {\n if (rule.optionSchema && rule.optionSchema.fields.length > 0) {\n const options = await prompter.configureRuleOptions(rule);\n if (options) {\n // Merge with existing defaultOptions structure\n const existingOptions =\n rule.defaultOptions && rule.defaultOptions.length > 0\n ? (rule.defaultOptions[0] as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n configured.push({\n ...rule,\n defaultOptions: [{ ...existingOptions, ...options }],\n });\n } else {\n configured.push(rule);\n }\n } else {\n // No configuration needed for this rule\n configured.push(rule);\n }\n }\n\n return configured;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,SAAS,cAAc;;;ACJvB,SAAgB,YAAAA,WAAU,iBAAiB;AAC3C,SAAS,OAAAC,MAAK,QAAAC,OAAM,UAAAC,SAAQ,YAAAC,iBAAgB;;;ACJ5C,SAAgB,gBAAgB;AAChC,SAAS,KAAK,MAAM,UAAU,cAAc;AA8D/B,cAkCP,YAlCO;AAnCN,SAAS,oBAAoB,SAA0C;AAC5E,QAAM,WAA8B,CAAC;AAGrC,aAAW,OAAO,QAAQ,UAAU;AAClC,UAAM,eAAe,IAAI,YAAY,QAAQ,QAAQ,gBAAgB,KAAK,EAAE;AAC5E,aAAS,KAAK;AAAA,MACZ,IAAI,QAAQ,IAAI,WAAW;AAAA,MAC3B,MAAM,gBAAgB;AAAA,MACtB,MAAM,IAAI;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA;AAAA,IAChB,CAAC;AAAA,EACH;AAGA,aAAW,OAAO,QAAQ,UAAU;AAClC,UAAM,eAAe,IAAI,YAAY,QAAQ,QAAQ,gBAAgB,KAAK,EAAE;AAC5E,aAAS,KAAK;AAAA,MACZ,IAAI,QAAQ,IAAI,WAAW;AAAA,MAC3B,MAAM,gBAAgB;AAAA,MACtB,MAAM,IAAI;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,EAAE,KAAK,GAA0D;AACvF,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,oBAAC,QAAK,OAAM,SAAQ,iBAAgB,SAAQ,uBAAS;AAAA,IAC9D,KAAK;AACH,aAAO,oBAAC,QAAK,OAAM,SAAQ,iBAAgB,UAAS,oBAAM;AAAA,IAC5D;AACE,aAAO,oBAAC,QAAK,UAAQ,MAAC,mBAAK;AAAA,EAC/B;AACF;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAA6C;AAC3C,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,CAAC;AAEtC,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,SAAS;AACf,gBAAU,CAAC,SAAU,OAAO,IAAI,OAAO,IAAI,SAAS,SAAS,CAAE;AAAA,IACjE,WAAW,IAAI,WAAW;AACxB,gBAAU,CAAC,SAAU,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,IACjE,WAAW,IAAI,QAAQ;AACrB,YAAM,WAAW,SAAS,MAAM;AAChC,UAAI,UAAU;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF,WAAW,UAAU,OAAO,IAAI,QAAQ;AACtC,iBAAW;AACX,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,MAAI,SAAS,WAAW,GAAG;AACzB,WACE,qBAAC,OAAI,eAAc,UACjB;AAAA,0BAAC,QAAK,OAAM,UAAS,mCAAqB;AAAA,MAC1C,oBAAC,QAAK,UAAQ,MAAC,+EAEf;AAAA,OACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAI,eAAc,UACjB;AAAA,wBAAC,OAAI,cAAc,GACjB,8BAAC,QAAK,MAAI,MAAC,4CAA8B,GAC3C;AAAA,IAEC,SAAS,IAAI,CAAC,SAAS,UAAU;AAChC,YAAM,WAAW,UAAU;AAC3B,aACE,qBAAC,OAAqB,aAAa,GAEjC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QAGA,oBAAC,OAAI,OAAO,IACV,8BAAC,kBAAe,MAAM,QAAQ,MAAM,GACtC;AAAA,QAGA,oBAAC,OAAI,OAAO,IACV,8BAAC,QAAK,OAAO,WAAW,SAAS,QAAW,MAAM,UAC/C,kBAAQ,MACX,GACF;AAAA,QAGC,QAAQ,gBACP,oBAAC,QAAK,OAAM,SAAQ,UAAQ,MAAC,wBAE7B;AAAA,WAtBM,QAAQ,EAwBlB;AAAA,IAEJ,CAAC;AAAA,IAGD,oBAAC,OAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,+BAAC,QAAK,UAAQ,MACZ;AAAA,0BAAC,QAAK,OAAM,QAAO,0BAAE;AAAA,MAAO;AAAA,MAAU;AAAA,MACtC,oBAAC,QAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,MAAQ;AAAA,MACvC,oBAAC,QAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,OAC7B,GACF;AAAA,KACF;AAEJ;;;AC5JA,SAAgB,YAAAC,WAAU,mBAAmB;AAC7C,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;AAoCjC,SA2MC,UA3MD,OAAAC,MAuIG,QAAAC,aAvIH;AAHX,SAAS,gBAAgB,EAAE,QAAQ,YAAY,mBAAmB,GAAiG;AAEjK,MAAI,oBAAoB;AACtB,WAAO,gBAAAD,KAACH,OAAA,EAAK,OAAM,OAAM,oBAAC;AAAA,EAC5B;AACA,MAAI,WAAW,aAAa;AAC1B,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,SAAQ,oBAAC;AAAA,EAC9B;AACA,MAAI,WAAW,eAAe;AAE5B,WAAO,aAAa,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,oBAAC,IAAU,gBAAAG,KAACH,OAAA,EAAK,OAAM,SAAQ,oBAAC;AAAA,EACzE;AACA,MAAI,cAAc,WAAW,YAAY;AACvC,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,oBAAC;AAAA,EAC7B;AACA,MAAI,WAAW,WAAW;AACxB,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,UAAS,oBAAC;AAAA,EAC/B;AACA,SAAO,gBAAAG,KAACH,OAAA,EAAK,UAAQ,MAAC,oBAAC;AACzB;AAEA,SAAS,YAAY,EAAE,QAAQ,mBAAmB,GAA4E;AAC5H,MAAI,oBAAoB;AACtB,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,OAAM,UAAQ,MAAC,oBAAM;AAAA,EAC1C;AACA,MAAI,WAAW,aAAa;AAC1B,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,SAAQ,UAAQ,MAAC,uBAAS;AAAA,EAC/C;AACA,MAAI,WAAW,eAAe;AAC5B,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,UAAQ,MAAC,+BAAiB;AAAA,EACtD;AACA,MAAI,WAAW,WAAW;AACxB,WAAO,gBAAAG,KAACH,OAAA,EAAK,OAAM,UAAS,UAAQ,MAAC,qBAAO;AAAA,EAC9C;AACA,SAAO,gBAAAG,KAACH,OAAA,EAAK,UAAQ,MAAC,eAAC;AACzB;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAA4C;AAC1C,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,CAAC,QAAQ,SAAS,IAAIJ,UAAS,CAAC;AACtC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsB,MAAM;AAE1D,WAAO,IAAI;AAAA,MACT,MACG,OAAO,CAAC,SAAS,KAAK,WAAW,eAAe,CAAC,KAAK,QAAQ,EAC9D,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAsB,oBAAI,IAAI,CAAC;AAG/E,QAAM,aAAa,MAAM,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC;AACzE,QAAM,kBAAkB,oBAAI,IAA0B;AACtD,aAAW,OAAO,YAAY;AAC5B,oBAAgB,IAAI,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,aAAa,GAAG,CAAC;AAAA,EACxE;AAGA,QAAM,YAAY;AAElB,QAAM,eAAe,YAAY,MAAM;AACrC,UAAM,OAAO,UAAU,MAAM;AAC7B,QAAI,CAAC,QAAQ,KAAK,SAAU;AAG5B,QAAI,KAAK,WAAW,aAAa;AAC/B,0BAAoB,CAAC,SAAS;AAC5B,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACrB,eAAK,OAAO,KAAK,EAAE;AAAA,QACrB,OAAO;AACL,eAAK,IAAI,KAAK,EAAE;AAAA,QAClB;AACA,eAAO;AAAA,MACT,CAAC;AACD;AAAA,IACF;AAGA,gBAAY,CAAC,SAAS;AACpB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,UAAI,KAAK,IAAI,KAAK,EAAE,GAAG;AACrB,aAAK,OAAO,KAAK,EAAE;AAAA,MACrB,OAAO;AACL,aAAK,IAAI,KAAK,EAAE;AAAA,MAClB;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,SAAS,CAAC;AAEtB,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,SAAS;AACf,gBAAU,CAAC,SAAU,OAAO,IAAI,OAAO,IAAI,UAAU,SAAS,CAAE;AAAA,IAClE,WAAW,IAAI,WAAW;AACxB,gBAAU,CAAC,SAAU,OAAO,UAAU,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,IAClE,WAAW,UAAU,KAAK;AACxB,mBAAa;AAAA,IACf,WAAW,IAAI,QAAQ;AACrB,eAAS,MAAM,KAAK,QAAQ,GAAG,MAAM,KAAK,gBAAgB,CAAC;AAAA,IAC7D,WAAW,UAAU,OAAO,IAAI,QAAQ;AACtC,iBAAW;AACX,WAAK;AAAA,IACP,WAAW,UAAU,KAAK;AAExB;AAAA,QACE,IAAI;AAAA,UACF,MACG,OAAO,CAAC,SAAS,KAAK,WAAW,eAAe,CAAC,KAAK,QAAQ,EAC9D,IAAI,CAAC,SAAS,KAAK,EAAE;AAAA,QAC1B;AAAA,MACF;AAEA,0BAAoB,oBAAI,IAAI,CAAC;AAAA,IAC/B,WAAW,UAAU,KAAK;AAExB,kBAAY,oBAAI,IAAI,CAAC;AAErB,0BAAoB,oBAAI,IAAI,CAAC;AAAA,IAC/B;AAAA,EACF,CAAC;AAED,MAAI,cAAc;AAElB,SACE,gBAAAG,MAACL,MAAA,EAAI,eAAc,UAChB;AAAA,eAAW,IAAI,CAAC,aAAa;AAC5B,YAAM,gBAAgB,gBAAgB,IAAI,QAAQ,KAAK,CAAC;AACxD,YAAM,eAAe,cAAc,CAAC,GAAG,gBAAgB;AAEvD,aACE,gBAAAK,MAACL,MAAA,EAAmB,eAAc,UAAS,cAAc,GAEvD;AAAA,wBAAAI,KAACJ,MAAA,EACC,0BAAAK,MAACJ,OAAA,EAAK,MAAI,MAAC,OAAM,SACd;AAAA;AAAA,UAAa;AAAA,UAAE;AAAA,WAClB,GACF;AAAA,QAGC,cAAc,IAAI,CAAC,SAAS;AAC3B,gBAAM,YAAY;AAClB,gBAAM,WAAW,cAAc;AAC/B,gBAAM,iBAAiB,SAAS,IAAI,KAAK,EAAE;AAC3C,gBAAM,yBAAyB,iBAAiB,IAAI,KAAK,EAAE;AAE3D,gBAAM,aAAa,KAAK,aAAa;AAErC,iBACE,gBAAAI,MAACL,MAAA,EAAkB,aAAa,GAE9B;AAAA,4BAAAI,KAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,YAGA,gBAAAG,KAACJ,MAAA,EAAI,OAAO,GACV,0BAAAI,KAAC,mBAAgB,QAAQ,KAAK,QAAQ,YAAY,gBAAgB,oBAAoB,wBAAwB,GAChH;AAAA,YAGA,gBAAAA,KAACJ,MAAA,EAAI,OAAO,IACV,0BAAAI;AAAA,cAACH;AAAA,cAAA;AAAA,gBACC,OAAO,yBAAyB,QAAQ,aAAa,SAAY,WAAW,SAAS;AAAA,gBACrF,UAAU,cAAc,CAAC;AAAA,gBAExB,eAAK;AAAA;AAAA,YACR,GACF;AAAA,YAGA,gBAAAG,KAACJ,MAAA,EAAI,OAAO,IACV,0BAAAI,KAACH,OAAA,EAAK,UAAQ,MAAE,eAAK,QAAQ,IAAG,GAClC;AAAA,YAGA,gBAAAG,KAAC,eAAY,QAAQ,KAAK,QAAQ,oBAAoB,wBAAwB;AAAA,eA3BtE,KAAK,EA4Bf;AAAA,QAEJ,CAAC;AAAA,WAhDO,QAiDV;AAAA,IAEJ,CAAC;AAAA,IAGD,gBAAAA,KAACJ,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,0BAAAK,MAACJ,OAAA,EAAK,UAAQ,MACZ;AAAA,sBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,0BAAE;AAAA,MAAO;AAAA,MAAU;AAAA,MACtC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,MAAQ;AAAA,MACvC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAK;AAAA,MAChC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAM;AAAA,MACjC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,MAAO;AAAA,MACtC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,OAC7B,GACF;AAAA,IAGA,gBAAAG,KAACJ,MAAA,EAAI,WAAW,GACd,0BAAAK,MAACJ,OAAA,EACC;AAAA,sBAAAG,KAACH,OAAA,EAAK,OAAM,QAAQ,mBAAS,MAAK;AAAA,MAClC,gBAAAG,KAACH,OAAA,EAAK,UAAQ,MAAC,yBAAW;AAAA,MACzB,iBAAiB,OAAO,KACvB,gBAAAI,MAAA,YACE;AAAA,wBAAAD,KAACH,OAAA,EAAK,UAAQ,MAAC,gBAAE;AAAA,QACjB,gBAAAG,KAACH,OAAA,EAAK,OAAM,OAAO,2BAAiB,MAAK;AAAA,QACzC,gBAAAG,KAACH,OAAA,EAAK,UAAQ,MAAC,wBAAU;AAAA,SAC3B;AAAA,OAEJ,GACF;AAAA,KACF;AAEJ;;;ACpPA,SAAgB,YAAAK,WAAU,eAAe;AACzC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;AAC5C,SAAS,oBAAoB,uBAAuB;;;ACDpD,SAAgB,YAAAC,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAgC9B,gBAAAC,MAMA,QAAAC,aANA;AAnBN,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,UAAU,QAAQ,KAAK;AAE7B,EAAAF;AAAA,IACE,CAAC,UAAU;AACT,UAAI,YAAY,UAAU,KAAK;AAC7B,iBAAS,CAAC,OAAO;AAAA,MACnB;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,SACE,gBAAAE,MAACJ,MAAA,EACC;AAAA,oBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,IACA,gBAAAE,KAACF,OAAA,EAAK,OAAO,UAAU,UAAU,QAC9B,oBAAU,aAAQ,OACrB;AAAA,IACA,gBAAAG,MAACH,OAAA,EAAK;AAAA;AAAA,MAAE,MAAM;AAAA,OAAM;AAAA,IACnB,MAAM,eACL,gBAAAG,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAI,MAAM;AAAA,OAAY;AAAA,KAEzC;AAEJ;AAKA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,CAAC,YAAY,aAAa,IAAIF,UAAS,OAAO,SAAS,MAAM,gBAAgB,EAAE,CAAC;AACtF,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,EAAAG;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,CAAC,SAAU;AAEf,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,cAAM,WAAW,WAAW,MAAM,GAAG,EAAE;AACvC,sBAAc,QAAQ;AACtB,cAAM,MAAM,OAAO,QAAQ;AAC3B,YAAI,CAAC,MAAM,GAAG,KAAK,aAAa,IAAI;AAClC,mBAAS,GAAG;AACZ,mBAAS,IAAI;AAAA,QACf,WAAW,aAAa,IAAI;AAC1B,mBAAS,IAAI;AAAA,QACf,OAAO;AACL,mBAAS,sBAAsB;AAAA,QACjC;AAAA,MACF,WAAW,YAAY,KAAK,KAAK,GAAG;AAClC,cAAM,WAAW,aAAa;AAC9B,sBAAc,QAAQ;AACtB,cAAM,MAAM,OAAO,QAAQ;AAC3B,YAAI,CAAC,MAAM,GAAG,GAAG;AACf,mBAAS,GAAG;AACZ,mBAAS,IAAI;AAAA,QACf,OAAO;AACL,mBAAS,sBAAsB;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,SACE,gBAAAE,MAACJ,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAI,MAACJ,MAAA,EACC;AAAA,sBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,MACA,gBAAAG,MAACH,OAAA,EAAM;AAAA,cAAM;AAAA,QAAM;AAAA,SAAE;AAAA,MACrB,gBAAAE,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAAW,WAAW,UACpD,wBAAc,MAAM,eAAe,IACtC;AAAA,MACC,MAAM,eACL,gBAAAG,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAG,MAAM;AAAA,QAAY;AAAA,SAAC;AAAA,OAEzC;AAAA,IACC,SACC,gBAAAE,KAACH,MAAA,EAAI,aAAa,GAChB,0BAAAG,KAACF,OAAA,EAAK,OAAM,OAAO,iBAAM,GAC3B;AAAA,KAEJ;AAEJ;AAKA,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AAEvC,QAAM,eAAe,MAAM,QAAQ,KAAK,IACpC,MAAM,KAAK,IAAI,IACf,OAAO,SAAS,MAAM,gBAAgB,EAAE;AAC5C,QAAM,CAAC,YAAY,aAAa,IAAIF,UAAS,YAAY;AAEzD,EAAAG;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,CAAC,SAAU;AAEf,UAAI,IAAI,aAAa,IAAI,QAAQ;AAC/B,cAAM,WAAW,WAAW,MAAM,GAAG,EAAE;AACvC,sBAAc,QAAQ;AACtB,iBAAS,QAAQ;AAAA,MACnB,WAAW,SAAS,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM;AAC1C,cAAM,WAAW,aAAa;AAC9B,sBAAc,QAAQ;AACtB,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,SACE,gBAAAE,MAACJ,MAAA,EACC;AAAA,oBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,IACA,gBAAAG,MAACH,OAAA,EAAM;AAAA,YAAM;AAAA,MAAM;AAAA,OAAE;AAAA,IACrB,gBAAAE,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAAW,WAAW,UACpD,wBAAc,MAAM,eAAe,WACtC;AAAA,IACC,MAAM,eACL,gBAAAG,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAG,MAAM;AAAA,MAAY;AAAA,OAAC;AAAA,KAEzC;AAEJ;AAMA,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,eAAe,QAAQ;AAAA,IAC3B,CAAC,QAAQ,OAAO,IAAI,KAAK,MAAM,OAAO,KAAK;AAAA,EAC7C;AACA,QAAM,gBAAgB,gBAAgB,IAAI,eAAe;AAEzD,EAAAC;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,CAAC,YAAY,QAAQ,WAAW,EAAG;AAGvC,UAAI,UAAU,OAAO,IAAI,YAAY;AACnC,cAAM,WAAW,gBAAgB,QAAQ,SAAS,IAAI,gBAAgB,IAAI;AAC1E,iBAAS,QAAQ,QAAQ,EAAG,KAAK;AAAA,MACnC,WAES,IAAI,WAAW;AACtB,cAAM,WAAW,gBAAgB,IAAI,gBAAgB,IAAI,QAAQ,SAAS;AAC1E,iBAAS,QAAQ,QAAQ,EAAG,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,QAAM,iBAAiB,QAAQ,aAAa;AAE5C,SACE,gBAAAE,MAACJ,MAAA,EACC;AAAA,oBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,IACA,gBAAAG,MAACH,OAAA,EAAM;AAAA,YAAM;AAAA,MAAM;AAAA,OAAE;AAAA,IACrB,gBAAAG,MAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAAW,MAAM,UAC/C;AAAA;AAAA,MACA,gBAAgB,SAAS;AAAA,MACzB;AAAA,OACH;AAAA,IACC,MAAM,eACL,gBAAAG,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAG,MAAM;AAAA,MAAY;AAAA,OAAC;AAAA,KAEzC;AAEJ;AAKA,SAAS,iBAAiB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyC;AACvC,QAAM,UAAU,MAAM,WAAW,CAAC;AAClC,QAAM,iBAAiB,IAAI;AAAA,IACzB,MAAM,QAAQ,KAAK,IAAI,MAAM,IAAI,MAAM,IAAI,CAAC;AAAA,EAC9C;AACA,QAAM,CAAC,QAAQ,SAAS,IAAIF,UAAS,CAAC;AAEtC,EAAAG;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,CAAC,YAAY,QAAQ,WAAW,EAAG;AAEvC,UAAI,IAAI,SAAS;AACf,kBAAU,CAAC,SAAU,OAAO,IAAI,OAAO,IAAI,QAAQ,SAAS,CAAE;AAAA,MAChE,WAAW,IAAI,WAAW;AACxB,kBAAU,CAAC,SAAU,OAAO,QAAQ,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,MAChE,WAAW,UAAU,KAAK;AACxB,cAAM,MAAM,QAAQ,MAAM;AAC1B,cAAM,cAAc,IAAI,IAAI,cAAc;AAC1C,YAAI,YAAY,IAAI,OAAO,IAAI,KAAK,CAAC,GAAG;AACtC,sBAAY,OAAO,OAAO,IAAI,KAAK,CAAC;AAAA,QACtC,OAAO;AACL,sBAAY,IAAI,OAAO,IAAI,KAAK,CAAC;AAAA,QACnC;AACA,iBAAS,MAAM,KAAK,WAAW,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,IACA,EAAE,SAAS;AAAA,EACb;AAEA,SACE,gBAAAE,MAACJ,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAI,MAACJ,MAAA,EACC;AAAA,sBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,MACA,gBAAAE,KAACF,OAAA,EAAM,gBAAM,OAAM;AAAA,MAClB,MAAM,eACL,gBAAAG,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAI,MAAM;AAAA,SAAY;AAAA,OAEzC;AAAA,IACC,YACC,gBAAAE,KAACH,MAAA,EAAI,eAAc,UAAS,aAAa,GACtC,kBAAQ,IAAI,CAAC,KAAK,MAAM;AACvB,YAAM,aAAa,eAAe,IAAI,OAAO,IAAI,KAAK,CAAC;AACvD,YAAM,WAAW,MAAM;AACvB,aACE,gBAAAI,MAACJ,MAAA,EACC;AAAA,wBAAAG,KAACF,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QACA,gBAAAE,KAACF,OAAA,EAAK,OAAO,aAAa,UAAU,QACjC,uBAAa,aAAQ,OACxB;AAAA,QACA,gBAAAG,MAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B;AAAA;AAAA,UAAK,IAAI;AAAA,WACZ;AAAA,WATQ,OAAO,IAAI,KAAK,CAU1B;AAAA,IAEJ,CAAC,GACH;AAAA,IAED,CAAC,YACA,gBAAAE,KAACH,MAAA,EAAI,aAAa,GAChB,0BAAAI,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACF,MAAM,KAAK,cAAc,EAAE,SAAS,IAC3C,MAAM,KAAK,cAAc,EAAE,KAAK,IAAI,IACpC;AAAA,OACN,GACF;AAAA,KAEJ;AAEJ;AAKO,SAAS,YAAY,OAA6C;AACvE,QAAM,EAAE,MAAM,IAAI;AAElB,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,aAAO,gBAAAE,KAAC,gBAAc,GAAG,OAAO;AAAA,IAClC,KAAK;AACH,aAAO,gBAAAA,KAAC,eAAa,GAAG,OAAO;AAAA,IACjC,KAAK;AACH,aAAO,gBAAAA,KAAC,aAAW,GAAG,OAAO;AAAA,IAC/B,KAAK;AACH,aAAO,gBAAAA,KAAC,eAAa,GAAG,OAAO;AAAA,IACjC,KAAK;AACH,aAAO,gBAAAA,KAAC,oBAAkB,GAAG,OAAO;AAAA,IACtC;AACE,aACE,gBAAAA,KAACH,MAAA,EACC,0BAAAI,MAACH,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAqB,MAAM;AAAA,SAAK,GACjD;AAAA,EAEN;AACF;AAMO,SAAS,kBACd,OACA,OACA,cACS;AAET,MAAI,MAAM,QAAQ,YAAY,KAAK,MAAM,SAAS,UAAU,OAAO,UAAU,UAAU;AACrF,WAAO,MACJ,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,OAAO;AAAA,EACnB;AACA,SAAO;AACT;;;AD/TW,SAubD,YAAAI,WAvbC,OAAAC,MAWL,QAAAC,aAXK;AAFX,SAAS,cAAc,EAAE,SAAS,GAA+D;AAC/F,MAAI,aAAa,SAAS;AACxB,WAAO,gBAAAD,KAACE,OAAA,EAAK,OAAM,OAAM,mBAAK;AAAA,EAChC;AACA,MAAI,aAAa,QAAQ;AACvB,WAAO,gBAAAF,KAACE,OAAA,EAAK,OAAM,UAAS,kBAAI;AAAA,EAClC;AACA,SAAO,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,iBAAG;AAC3B;AAEA,SAAS,eAAe,EAAE,MAAM,KAAK,GAAuD;AAC1F,SACE,gBAAAF,KAACG,MAAA,EAAI,WAAW,GAAG,cAAc,GAC/B,0BAAAF,MAACC,OAAA,EAAK,MAAI,MAAC,OAAM,SACd;AAAA;AAAA,IAAK;AAAA,IAAE;AAAA,KACV,GACF;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAA0C;AACxC,QAAM,EAAE,KAAK,IAAIE,QAAO;AAExB,QAAM,cAAc,QAAQ,MAAM,mBAAmB,QAAQ,GAAG,CAAC,CAAC;AAClE,QAAM,gBAAgB,QAAQ,MAAM,mBAAmB,UAAU,GAAG,CAAC,CAAC;AACtE,QAAM,WAAW,QAAQ,MAAM,CAAC,GAAG,aAAa,GAAG,aAAa,GAAG,CAAC,aAAa,aAAa,CAAC;AAE/F,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,CAAC;AACtC,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAmB,MAAM;AAGzD,QAAM,CAAC,YAAY,aAAa,IAAIA;AAAA,IAClC,MAAM;AACJ,YAAM,MAAM,oBAAI,IAAI;AAEpB,iBAAW,QAAQ,UAAU;AAC3B,cAAM,eAAe,gBAAgB,KAAK,QAAQ;AAClD,cAAM,UAAU,KAAK,kBAAkB,cAAc,kBAAkB;AACvE,YAAI,IAAI,KAAK,IAAI;AAAA,UACf;AAAA,UACA,UAAU,KAAK,oBAAoB,QAAQ,SAAS,KAAK;AAAA,QAC3D,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAGA,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAA+C,oBAAI,IAAI,CAAC;AAGlG,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAS,CAAC;AAC1D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAS,CAAC;AAG9D,QAAM,CAAC,eAAe,gBAAgB,IAAIA,UAAS,CAAC;AAEpD,QAAM,cAAc,SAAS,MAAM;AAGnC,QAAM,0BAA0B,QAAQ,MAAM;AAC5C,WAAO,SAAS,OAAO,CAAC,SAAS;AAC/B,YAAM,QAAQ,WAAW,IAAI,KAAK,EAAE;AACpC,aAAO,OAAO,WAAW,KAAK,gBAAgB,KAAK,aAAa,OAAO,SAAS;AAAA,IAClF,CAAC;AAAA,EACH,GAAG,CAAC,UAAU,UAAU,CAAC;AAGzB,QAAM,qBAAqB,wBAAwB,gBAAgB;AACnE,QAAM,uBAAuB,oBAAoB,cAAc,UAAU,CAAC;AAE1E,QAAM,aAAa,MAAM;AACvB,QAAI,CAAC,YAAa;AAClB,kBAAc,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,UAAU,KAAK,IAAI,YAAY,EAAE;AACvC,WAAK,IAAI,YAAY,IAAI,EAAE,GAAG,SAAS,SAAS,CAAC,QAAQ,QAAQ,CAAC;AAClE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,gBAAgB,MAAM;AAC1B,QAAI,CAAC,YAAa;AAClB,kBAAc,CAAC,SAAS;AACtB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,UAAU,KAAK,IAAI,YAAY,EAAE;AACvC,YAAM,cAAc,QAAQ,aAAa,UAAU,SAAS;AAC5D,WAAK,IAAI,YAAY,IAAI,EAAE,GAAG,SAAS,UAAU,YAAY,CAAC;AAC9D,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,cAAc,MAAM;AACxB,UAAM,kBAAoC,CAAC;AAC3C,eAAW,QAAQ,UAAU;AAC3B,YAAM,QAAQ,WAAW,IAAI,KAAK,EAAE;AACpC,UAAI,OAAO,SAAS;AAClB,cAAM,SAAS,cAAc,IAAI,KAAK,EAAE;AACxC,cAAM,cAAc,KAAK,iBAAiB,CAAC,KAAK,CAAC;AACjD,wBAAgB,KAAK;AAAA,UACnB;AAAA,UACA,UAAU,MAAM;AAAA,UAChB,SAAS,SAAS,CAAC,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,IAAI,KAAK;AAAA,QAC3D,CAAC;AAAA,MACH;AAAA,IACF;AACA,aAAS,eAAe;AAAA,EAC1B;AAGA,QAAM,mBAAmB,MAAM;AAC7B,QAAI,wBAAwB,SAAS,GAAG;AAEtC,kBAAY,iBAAiB;AAC7B,uBAAiB,CAAC;AAAA,IACpB,OAAO;AAEL,kBAAY;AAAA,IACd;AAAA,EACF;AAGA,QAAM,yBAAyB,MAAM;AACnC,QAAI,kBAAkB,GAAG;AAEvB,0BAAoB,CAAC;AACrB,4BAAsB,CAAC;AAEvB,UAAI,wBAAwB,CAAC,GAAG;AAC9B,8BAAsB,wBAAwB,CAAC,CAAC;AAAA,MAClD;AACA,kBAAY,cAAc;AAAA,IAC5B,OAAO;AAEL,kBAAY;AAAA,IACd;AAAA,EACF;AAGA,QAAM,wBAAwB,CAAC,SAAmB;AAChD,QAAI,CAAC,cAAc,IAAI,KAAK,EAAE,KAAK,KAAK,cAAc;AACpD,YAAM,cAAc,KAAK,iBAAiB,CAAC,KAAK,CAAC;AACjD,YAAM,UAAmC,CAAC;AAC1C,iBAAW,SAAS,KAAK,aAAa,QAAQ;AAC5C,gBAAQ,MAAM,GAAG,IAAK,YAAwC,MAAM,GAAG,KAAK,MAAM;AAAA,MACpF;AACA,uBAAiB,CAAC,SAAS;AACzB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,IAAI,KAAK,IAAI,OAAO;AACzB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,mBAAmB,CAAC,UAAkB,UAAmB;AAC7D,QAAI,CAAC,mBAAoB;AACzB,qBAAiB,CAAC,SAAS;AACzB,YAAM,OAAO,IAAI,IAAI,IAAI;AACzB,YAAM,UAAU,KAAK,IAAI,mBAAmB,EAAE,KAAK,CAAC;AACpD,WAAK,IAAI,mBAAmB,IAAI,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,MAAM,CAAC;AACjE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAGA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,mBAAmB,wBAAwB,SAAS,GAAG;AACzD,YAAM,YAAY,mBAAmB;AACrC,0BAAoB,SAAS;AAC7B,4BAAsB,CAAC;AAEvB,UAAI,wBAAwB,SAAS,GAAG;AACtC,8BAAsB,wBAAwB,SAAS,CAAE;AAAA,MAC3D;AAAA,IACF,OAAO;AAEL,kBAAY;AAAA,IACd;AAAA,EACF;AAGA,QAAM,kBAAkB,MAAM;AAE5B,QAAI,oBAAoB;AACtB,uBAAiB,CAAC,SAAS;AACzB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,aAAK,OAAO,mBAAmB,EAAE;AACjC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AACA,oBAAgB;AAAA,EAClB;AAEA,EAAAC,UAAS,CAAC,OAAO,QAAQ;AAEvB,QAAI,aAAa,QAAQ;AACvB,UAAI,IAAI,UAAU,IAAI,UAAU,UAAU,OAAO,UAAU,KAAK;AAC9D,oBAAY,MAAM;AAAA,MACpB;AACA;AAAA,IACF;AAGA,QAAI,aAAa,mBAAmB;AAClC,UAAI,IAAI,WAAW,IAAI,WAAW;AAChC,yBAAiB,CAAC,SAAU,SAAS,IAAI,IAAI,CAAE;AAAA,MACjD,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,+BAAuB;AAAA,MACzB,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,oBAAY,MAAM;AAAA,MACpB;AACA;AAAA,IACF;AAGA,QAAI,aAAa,gBAAgB;AAC/B,UAAI,IAAI,SAAS;AACf;AAAA,UAAsB,CAAC,SACrB,OAAO,IAAI,OAAO,IAAI,qBAAqB,SAAS;AAAA,QACtD;AAAA,MACF,WAAW,IAAI,WAAW;AACxB;AAAA,UAAsB,CAAC,SACrB,OAAO,qBAAqB,SAAS,IAAI,OAAO,IAAI;AAAA,QACtD;AAAA,MACF,WAAW,IAAI,QAAQ;AAErB,wBAAgB;AAAA,MAClB,WAAW,IAAI,QAAQ;AAErB,wBAAgB;AAAA,MAClB,WAAW,UAAU,KAAK;AAExB,oBAAY,MAAM;AAAA,MACpB;AAEA;AAAA,IACF;AAGA,QAAI,IAAI,SAAS;AACf,gBAAU,CAAC,SAAU,OAAO,IAAI,OAAO,IAAI,SAAS,SAAS,CAAE;AAAA,IACjE,WAAW,IAAI,WAAW;AACxB,gBAAU,CAAC,SAAU,OAAO,SAAS,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,IACjE,WAAW,UAAU,KAAK;AACxB,iBAAW;AAAA,IACb,WAAW,UAAU,KAAK;AACxB,oBAAc;AAAA,IAChB,WAAW,UAAU,KAAK;AACxB,kBAAY,MAAM;AAAA,IACpB,WAAW,IAAI,QAAQ;AACrB,uBAAiB;AAAA,IACnB,WAAW,IAAI,UAAU,UAAU,KAAK;AACtC,iBAAW;AACX,WAAK;AAAA,IACP,YAAY,UAAU,OAAO,IAAI,cAAc,QAAQ;AACrD,aAAO;AAAA,IACT,WAAW,UAAU,KAAK;AAExB,oBAAc,CAAC,SAAS;AACtB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,mBAAW,QAAQ,UAAU;AAC3B,gBAAM,UAAU,KAAK,IAAI,KAAK,EAAE;AAChC,eAAK,IAAI,KAAK,IAAI,EAAE,GAAG,SAAS,SAAS,KAAK,CAAC;AAAA,QACjD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,WAAW,UAAU,KAAK;AAExB,oBAAc,CAAC,SAAS;AACtB,cAAM,OAAO,IAAI,IAAI,IAAI;AACzB,mBAAW,QAAQ,UAAU;AAC3B,gBAAM,UAAU,KAAK,IAAI,KAAK,EAAE;AAChC,eAAK,IAAI,KAAK,IAAI,EAAE,GAAG,SAAS,SAAS,MAAM,CAAC;AAAA,QAClD;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAGD,MAAI,aAAa,UAAU,aAAa;AACtC,UAAM,WAAW,YAAY,KAAK,KAAK,EAAE,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE;AAChE,WACE,gBAAAL,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAACE,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAH,KAACE,OAAA,EAAK,MAAI,MAAC,OAAM,QAAQ,sBAAY,MAAK;AAAA,QAC1C,gBAAAD,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UAAI,YAAY;AAAA,WAAY;AAAA,SAC7C;AAAA,MAEA,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAC3E;AAAA,iBAAS,IAAI,CAAC,MAAM,MACnB,gBAAAH,KAACE,OAAA,EAAa,UAAU,KAAK,WAAW,GAAG,GACxC,kBADQ,CAEX,CACD;AAAA,QACA,YAAY,KAAK,MAAM,IAAI,EAAE,SAAS,MACrC,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,6BAAe;AAAA,SAElC;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,WAAW,GACd,0BAAAH,KAACE,OAAA,EAAK,UAAQ,MAAC,6CAEf,GACF;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,aAAa,mBAAmB;AAClC,WACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAH,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACE,OAAA,EAAK,MAAI,MAAC,oCAAsB,GACnC;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAF,MAACC,OAAA,EACC;AAAA,wBAAAF,KAACE,OAAA,EAAK,OAAM,QAAQ,kCAAwB,QAAO;AAAA,QACnD,gBAAAF,KAACE,OAAA,EAAK,0FAA4E;AAAA,SACpF,GACF;AAAA,MAEA,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,aAAa,GACvC;AAAA,wBAAAF,MAACE,MAAA,EACC;AAAA,0BAAAH,KAACE,OAAA,EAAK,OAAO,kBAAkB,IAAI,SAAS,QACzC,4BAAkB,IAAI,YAAO,MAChC;AAAA,UACA,gBAAAF,KAACE,OAAA,EAAK,OAAO,kBAAkB,IAAI,SAAS,QAAW,MAAM,kBAAkB,GAAG,iBAElF;AAAA,UACA,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,8CAAgC;AAAA,WACjD;AAAA,QACA,gBAAAD,MAACE,MAAA,EACC;AAAA,0BAAAH,KAACE,OAAA,EAAK,OAAO,kBAAkB,IAAI,SAAS,QACzC,4BAAkB,IAAI,YAAO,MAChC;AAAA,UACA,gBAAAF,KAACE,OAAA,EAAK,OAAO,kBAAkB,IAAI,SAAS,QAAW,MAAM,kBAAkB,GAAG,gBAElF;AAAA,UACA,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,2CAA6B;AAAA,WAC9C;AAAA,SACF;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,WAAW,GACd,0BAAAF,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QACO;AAAA,QACnB,wBAAwB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAAA,SACvD,GACF;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,0BAAAF,MAACC,OAAA,EAAK,UAAQ,MACZ;AAAA,wBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,0BAAE;AAAA,QAAO;AAAA,QAAQ;AAAA,QACpC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,QAAO;AAAA,QAAS;AAAA,QACxC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,iBAAG;AAAA,QAAO;AAAA,SAC/B,GACF;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,aAAa,kBAAkB,oBAAoB;AACrD,UAAM,cAAc,cAAc,IAAI,mBAAmB,EAAE,KAAK,CAAC;AACjE,UAAM,cAAc,mBAAmB,iBAAiB,CAAC,KAAK,CAAC;AAE/D,WACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,MAACE,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAF,MAACC,OAAA,EAAK,MAAI,MAAC,OAAM,QACd;AAAA,6BAAmB,QAAQ;AAAA,UAAK;AAAA,UAAE,mBAAmB;AAAA,WACxD;AAAA,QACA,gBAAAD,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UAAG,mBAAmB;AAAA,UAAE;AAAA,UAAE,wBAAwB;AAAA,UAAO;AAAA,WAAC;AAAA,SAC3E;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACE,OAAA,EAAK,UAAQ,MAAE,6BAAmB,aAAY,GACjD;AAAA,MAEA,gBAAAF,KAACG,MAAA,EAAI,eAAc,UAChB,+BAAqB,IAAI,CAAC,OAAO,MAAM;AACtC,cAAM,eAAe,YAAY,MAAM,GAAG,KACvC,YAAwC,MAAM,GAAG,KAClD,MAAM;AACR,cAAM,eAAgB,YAAwC,MAAM,GAAG,KAAK,MAAM;AAElF,eACE,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,aAAa;AACtB,oBAAM,YAAY,kBAAkB,UAAU,OAAO,YAAY;AACjE,+BAAiB,MAAM,KAAK,SAAS;AAAA,YACvC;AAAA,YACA,UAAU,MAAM;AAAA;AAAA,UAPX,MAAM;AAAA,QAQb;AAAA,MAEJ,CAAC,GACH;AAAA,MAEA,gBAAAA,KAACG,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,0BAAAF,MAACC,OAAA,EAAK,UAAQ,MACZ;AAAA,wBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,0BAAE;AAAA,QAAO;AAAA,QAAU;AAAA,QACtC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,QAAO;AAAA,QAAQ;AAAA,QACvC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,QAAO;AAAA,QAAW;AAAA,QAC1C,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,iBAAG;AAAA,QAAO;AAAA,SAC/B,GACF;AAAA,OACF;AAAA,EAEJ;AAGA,QAAM,eAAe,MAAM,KAAK,WAAW,OAAO,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE;AAC9E,QAAM,aAAa,MAAM,KAAK,WAAW,QAAQ,CAAC,EAAE;AAAA,IAClD,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa;AAAA,EACzC,EAAE;AACF,QAAM,YAAY,eAAe;AAGjC,MAAI,cAAc;AAElB,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAH,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACE,OAAA,EAAK,MAAI,MAAC,oCAAsB,GACnC;AAAA,KAGE,MAAM;AACN,YAAM,MAAM,gBAAgB,QAAQ;AACpC,aAAO,MACL,gBAAAD,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,kBAAe,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM;AAAA,QAChD,gBAAAC,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UAAG,IAAI;AAAA,WAAY;AAAA,SACpC,IACE;AAAA,IACN,GAAG;AAAA,IAEF,YAAY,IAAI,CAAC,SAAS;AACzB,YAAM,YAAY;AAClB,YAAM,WAAW,cAAc;AAC/B,YAAM,QAAQ,WAAW,IAAI,KAAK,EAAE;AACpC,YAAM,aAAa,KAAK,gBAAgB,KAAK,aAAa,OAAO,SAAS;AAE1E,aACE,gBAAAD,MAACE,MAAA,EAAkB,aAAa,GAC9B;AAAA,wBAAAH,KAACE,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,GACV,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,UAAU,UAAU,QAAW,UAAU,CAAC,MAAM,SAChE,gBAAM,UAAU,WAAM,UACzB,GACF;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,IACV,0BAAAH;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,OAAO,WAAW,SAAS;AAAA,YAC3B,UAAU,CAAC,MAAM;AAAA,YACjB,MAAM;AAAA,YAEL,eAAK;AAAA;AAAA,QACR,GACF;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,GACT,gBAAM,UACL,gBAAAH,KAAC,iBAAc,UAAU,MAAM,UAAU,IAEzC,gBAAAA,KAACE,OAAA,EAAK,UAAQ,MAAC,eAAC,GAEpB;AAAA,QACC,cAAc,MAAM,WACnB,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,WA1BX,KAAK,EA4Bf;AAAA,IAEJ,CAAC;AAAA,KAGC,MAAM;AACN,YAAM,MAAM,gBAAgB,UAAU;AACtC,aAAO,MACL,gBAAAD,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,kBAAe,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM;AAAA,QAChD,gBAAAC,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,UAAG,IAAI;AAAA,WAAY;AAAA,SACpC,IACE;AAAA,IACN,GAAG;AAAA,IAEF,cAAc,IAAI,CAAC,SAAS;AAC3B,YAAM,YAAY;AAClB,YAAM,WAAW,cAAc;AAC/B,YAAM,QAAQ,WAAW,IAAI,KAAK,EAAE;AACpC,YAAM,aAAa,KAAK,gBAAgB,KAAK,aAAa,OAAO,SAAS;AAE1E,aACE,gBAAAD,MAACE,MAAA,EAAkB,aAAa,GAC9B;AAAA,wBAAAH,KAACE,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,GACV,0BAAAH,KAACE,OAAA,EAAK,OAAO,MAAM,UAAU,UAAU,QAAW,UAAU,CAAC,MAAM,SAChE,gBAAM,UAAU,WAAM,UACzB,GACF;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,IACV,0BAAAH;AAAA,UAACE;AAAA,UAAA;AAAA,YACC,OAAO,WAAW,SAAS;AAAA,YAC3B,UAAU,CAAC,MAAM;AAAA,YACjB,MAAM;AAAA,YAEL,eAAK;AAAA;AAAA,QACR,GACF;AAAA,QACA,gBAAAF,KAACG,MAAA,EAAI,OAAO,GACT,gBAAM,UACL,gBAAAH,KAAC,iBAAc,UAAU,MAAM,UAAU,IAEzC,gBAAAA,KAACE,OAAA,EAAK,UAAQ,MAAC,eAAC,GAEpB;AAAA,QACC,cAAc,MAAM,WACnB,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,qBAAE;AAAA,WA1BX,KAAK,EA4Bf;AAAA,IAEJ,CAAC;AAAA,IAGA,eACC,gBAAAF,KAACG,MAAA,EAAI,WAAW,GAAG,UAAU,GAC3B,0BAAAH,KAACE,OAAA,EAAK,UAAQ,MAAE,sBAAY,aAAY,GAC1C;AAAA,IAIF,gBAAAF,KAACG,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,0BAAAF,MAACC,OAAA,EAAK,UAAQ,MACZ;AAAA,sBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,0BAAE;AAAA,MAAO;AAAA,MAAU;AAAA,MACtC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,MAAQ;AAAA,MACvC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAU;AAAA,MACrC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAM;AAAA,MACjC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAK;AAAA,MAChC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAM;AAAA,MACjC,gBAAAF,KAACE,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,OACjC,GACF;AAAA,IAGA,gBAAAF,KAACG,MAAA,EAAI,WAAW,GACd,0BAAAF,MAACC,OAAA,EACC;AAAA,sBAAAF,KAACE,OAAA,EAAK,OAAM,QAAQ,wBAAa;AAAA,MACjC,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,8BAAgB;AAAA,MAC/B,gBAAAF,KAACE,OAAA,EAAK,OAAM,OAAO,sBAAW;AAAA,MAC9B,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,MACxB,gBAAAF,KAACE,OAAA,EAAK,OAAM,UAAU,qBAAU;AAAA,MAChC,gBAAAF,KAACE,OAAA,EAAK,UAAQ,MAAC,wBAAU;AAAA,MACxB,wBAAwB,SAAS,KAChC,gBAAAD,MAACC,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAG,wBAAwB;AAAA,QAAO;AAAA,SAAe;AAAA,OAEpE,GACF;AAAA,KACF;AAEJ;;;AEplBA,SAAgB,YAAAK,iBAAgB;AAChC,SAAS,OAAAC,MAAK,QAAAC,OAAM,YAAAC,WAAU,UAAAC,eAAc;AA+CpC,gBAAAC,MA0BQ,QAAAC,aA1BR;AAjCD,SAAS,uBAAuB;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAoD;AAClD,QAAM,EAAE,KAAK,IAAIF,QAAO;AAGxB,QAAM,mBAAmB,OAAO,UAAU,CAAC,MAAM,EAAE,WAAW;AAC9D,QAAM,CAAC,QAAQ,SAAS,IAAIJ,UAAS,oBAAoB,IAAI,mBAAmB,CAAC;AAEjF,EAAAG,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,SAAS;AACf,gBAAU,CAAC,SAAU,OAAO,IAAI,OAAO,IAAI,OAAO,SAAS,CAAE;AAAA,IAC/D,WAAW,IAAI,WAAW;AACxB,gBAAU,CAAC,SAAU,OAAO,OAAO,SAAS,IAAI,OAAO,IAAI,CAAE;AAAA,IAC/D,WAAW,IAAI,QAAQ;AACrB,YAAM,WAAW,OAAO,MAAM;AAC9B,UAAI,UAAU;AACZ,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF,WAAW,UAAU,OAAO,IAAI,WAAW;AACzC,eAAS;AAAA,IACX,WAAW,UAAU,OAAO,IAAI,QAAQ;AACtC,iBAAW;AACX,WAAK;AAAA,IACP;AAAA,EACF,CAAC;AAED,SACE,gBAAAG,MAACL,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAI,KAACJ,MAAA,EAAI,cAAc,GACjB,0BAAAI,KAACH,OAAA,EAAK,MAAI,MAAC,8DAAgD,GAC7D;AAAA,IAEC,OAAO,IAAI,CAAC,OAAO,UAAU;AAC5B,YAAM,WAAW,UAAU;AAE3B,aACE,gBAAAI,MAACL,MAAA,EAAmB,aAAa,GAE/B;AAAA,wBAAAI,KAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,YAAO,MACrB;AAAA,QAGA,gBAAAG,KAACJ,MAAA,EAAI,OAAO,GACV,0BAAAI,KAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,qBAAW,WAAM,UACpB,GACF;AAAA,QAGA,gBAAAI,MAACL,MAAA,EACC;AAAA,0BAAAI,KAACH,OAAA,EAAK,OAAO,WAAW,SAAS,QAC9B,gBAAM,OACT;AAAA,UACC,MAAM,QACL,gBAAAI,MAACJ,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,YAAG,MAAM;AAAA,YAAK;AAAA,aAAC;AAAA,WAElC;AAAA,WArBQ,MAAM,EAsBhB;AAAA,IAEJ,CAAC;AAAA,IAGD,gBAAAG,KAACJ,MAAA,EAAI,WAAW,GAAG,aAAY,UAAS,aAAY,QAAO,UAAU,GACnE,0BAAAK,MAACJ,OAAA,EAAK,UAAQ,MACZ;AAAA,sBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,0BAAE;AAAA,MAAO;AAAA,MAAU;AAAA,MACtC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,mBAAK;AAAA,MAAO;AAAA,MAAQ;AAAA,MACvC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAM;AAAA,MACjC,gBAAAG,KAACH,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,OAC7B,GACF;AAAA,KACF;AAEJ;;;AL6FQ,gBAAAK,MAEa,QAAAC,aAFb;AAvKR,SAAS,gBAAgB,QAAmC;AAC1D,MAAI,CAAC,OAAO,aAAa;AACvB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAoCA,SAAS,2BACP,SACA,iBACA,YACc;AACd,QAAM,QAAsB,CAAC;AAE7B,aAAW,aAAa,YAAY;AAClC,UAAM,EAAE,WAAW,QAAQ,IAAI;AAG/B,UAAM,kBAAkB,QAAQ,OAAO,CAAC,WAAW;AAEjD,UAAI,UAAU,OAAO,UAAU,UAAU,OAAO,QAAQ;AACtD,eAAO,OAAO,SAAS,gBAAgB;AAAA,MACzC;AAEA,UAAI,UAAU,OAAO,UAAU;AAC7B,eAAO,OAAO,SAAS,gBAAgB;AAAA,MACzC;AAEA,aAAO;AAAA,IACT,CAAC;AAED,QAAI,gBAAgB,WAAW,EAAG;AAGlC,UAAM,cAAkE;AAAA,MACtE,MAAM,EAAE,UAAU,eAAe,MAAM,YAAK;AAAA,MAC5C,MAAM,EAAE,UAAU,eAAe,MAAM,YAAK;AAAA,MAC5C,QAAQ,EAAE,UAAU,gBAAgB,MAAM,YAAK;AAAA,MAC/C,eAAe,EAAE,UAAU,sBAAsB,MAAM,YAAK;AAAA,MAC5D,OAAO,EAAE,UAAU,sBAAsB,MAAM,SAAI;AAAA,IACrD;AAEA,UAAM,OAAO,YAAY,UAAU,EAAE,KAAK,EAAE,UAAU,SAAS,MAAM,SAAI;AAEzE,eAAW,UAAU,iBAAiB;AACpC,YAAM,KAAK;AAAA,QACT,IAAI,GAAG,UAAU,EAAE,IAAI,OAAO,EAAE;AAAA,QAChC,OAAO,UAAU;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,QAAQ,gBAAgB,MAAM;AAAA,QAC9B,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,uBAAuB,YAAgD;AAC9E,QAAM,QAAsB,CAAC;AAE7B,aAAW,aAAa,YAAY;AAClC,UAAM,EAAE,WAAW,QAAQ,IAAI;AAG/B,QAAI,UAAU,OAAO,mBAAmB,UAAU,OAAO,SAAS;AAChE;AAAA,IACF;AAEA,UAAM,cAAkE;AAAA,MACtE,eAAe,EAAE,UAAU,sBAAsB,MAAM,YAAK;AAAA,MAC5D,OAAO,EAAE,UAAU,sBAAsB,MAAM,SAAI;AAAA,IACrD;AAEA,UAAM,OAAO,YAAY,UAAU,EAAE,KAAK,EAAE,UAAU,SAAS,MAAM,SAAI;AAEzE,eAAW,UAAU,SAAS;AAC5B,YAAM,KAAK;AAAA,QACT,IAAI,GAAG,UAAU,EAAE,IAAI,OAAO,EAAE;AAAA,QAChC,OAAO,UAAU;AAAA,QACjB,MAAM,OAAO;AAAA,QACb,QAAQ,gBAAgB,MAAM;AAAA,QAC9B,UAAU,KAAK;AAAA,QACf,cAAc,KAAK;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAMA,IAAM,iBAAiB;AACvB,IAAM,iBAAiB;AAKvB,SAAS,mBAAuE;AAC9E,QAAM,MAAM,QAAQ,SAAS,QAAQ;AACrC,QAAM,QAAQ,IAAI,MAAM,GAAG;AAC3B,QAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,KAAK,IAAI,EAAE;AAChD,QAAM,QAAQ,OAAO,SAAS,MAAM,CAAC,KAAK,IAAI,EAAE;AAEhD,QAAM,mBACJ,OAAO,SAAS,KAAK,KACrB,OAAO,SAAS,KAAK,MACpB,QAAQ,kBAAmB,UAAU,kBAAkB,SAAS;AAEnE,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,UAAU,GAAG,cAAc,IAAI,cAAc;AAAA,EAC/C;AACF;AAKA,SAAS,OAAO,EAAE,SAAS,GAA8C;AACvE,SACE,gBAAAD,KAACE,MAAA,EAAI,eAAc,UAAS,cAAc,GACxC,0BAAAD,MAACC,MAAA,EACC;AAAA,oBAAAF,KAACG,OAAA,EAAK,MAAI,MAAC,OAAM,QAAO,2BAAQ;AAAA,IAChC,gBAAAH,KAACG,OAAA,EAAK,UAAQ,MAAC,qBAAO;AAAA,IACrB,YAAY,gBAAAF,MAACE,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MAAI;AAAA,OAAS;AAAA,KAC3C,GACF;AAEJ;AAKA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOuB;AACrB,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,SAAK,UAAU,OAAO,IAAI,cAAc,WAAW;AACjD,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE,gBAAAH,MAACC,MAAA,EAAI,eAAc,UAEhB;AAAA,uBACC,gBAAAD,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,sBAAAF,KAACG,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,MACxB,gBAAAH,KAACG,OAAA,EAAK,MAAI,MAAC,OAAM,QAAQ,0BAAgB,MAAK;AAAA,MAC9C,gBAAAF,MAACE,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,QAAG,gBAAgB;AAAA,QAAK;AAAA,SAAC;AAAA,OAC1C;AAAA,IAGF,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP;AAAA,QACA;AAAA;AAAA,IACF;AAAA,IAGC,aACC,gBAAAA,KAACE,MAAA,EAAI,WAAW,GACd,0BAAAD,MAACE,OAAA,EAAK,UAAQ,MAAC;AAAA;AAAA,MACP,gBAAAH,KAACG,OAAA,EAAK,OAAM,QAAO,eAAC;AAAA,MAAO;AAAA,MAAI,gBAAAH,KAACG,OAAA,EAAK,OAAM,QAAO,oBAAC;AAAA,MAAO;AAAA,OAClE,GACF;AAAA,KAEJ;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAAwC;AACtC,QAAM,EAAE,KAAK,IAAIE,QAAO;AACxB,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAmB,uBAAuB;AACpE,QAAM,CAAC,mBAAmB,mBAAmB,IAAIA,UAIvC,IAAI;AACd,QAAM,CAAC,SAAS,UAAU,IAAIA,UAA8B,IAAI;AAChE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAA4B,CAAC,CAAC;AAC9E,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAAiC,IAAI;AACnF,QAAM,CAAC,YAAY,aAAa,IAAIA,UAA+B,CAAC,CAAC;AACrE,QAAM,CAAC,aAAa,cAAc,IAAIA,UAAuB,CAAC,CAAC;AAC/D,QAAM,CAAC,oBAAoB,qBAAqB,IAAIA,UAAmB,CAAC,CAAC;AACzE,QAAM,CAAC,kBAAkB,mBAAmB,IAAIA,UAAmB,CAAC,CAAC;AACrE,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAuB,IAAI;AAGrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,UAA2B,CAAC,CAAC;AAC3E,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,UAA2C,MAAS;AAGhH,QAAM,oBAAoB,mBAAmB,KAAK,CAAC,OAAO,GAAG,WAAW,SAAS,CAAC;AAGlF,QAAM,kBAAkB,mBAAmB,KAAK,CAAC,OAAO,GAAG,WAAW,OAAO,CAAC;AAG9E,YAAU,MAAM;AACd,QAAI,UAAU,wBAAyB;AAGvC,UAAM,QAAQ,WAAW,MAAM;AAC7B,YAAM,SAAS,iBAAiB;AAChC,0BAAoB,MAAM;AAE1B,UAAI,OAAO,IAAI;AACb,iBAAS,UAAU;AAAA,MACrB,OAAO;AACL;AAAA,UACE,IAAI;AAAA,YACF,YAAY,OAAO,QAAQ,mCAAmC,OAAO,OAAO;AAAA,UAC9E;AAAA,QACF;AACA,iBAAS,OAAO;AAAA,MAClB;AAAA,IACF,GAAG,GAAG;AAEN,WAAO,MAAM,aAAa,KAAK;AAAA,EACjC,GAAG,CAAC,KAAK,CAAC;AAGV,YAAU,MAAM;AACd,QAAI,UAAU,WAAY;AAE1B,mBACG,KAAK,CAAC,SAAS;AACd,iBAAW,IAAI;AAGf,YAAM,WAAW,oBAAoB,IAAI;AACzC,0BAAoB,QAAQ;AAG5B,YAAM,aAAa,iBAAiB;AACpC,YAAM,oBAA0C,WAC7C,OAAO,CAAC,cAAc,UAAU,aAAa,IAAI,CAAC,EAClD,IAAI,CAAC,cAAc;AAClB,cAAM,UAAU,UAAU,WAAW,IAAI;AAEzC,cAAM,oBAAoB,QAAQ;AAAA,UAChC,CAAC,MAAM,CAAC,EAAE,eAAe,EAAE;AAAA,QAC7B;AACA,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU,kBAAkB,SAAS;AAAA,QACvC;AAAA,MACF,CAAC;AACH,oBAAc,iBAAiB;AAG/B,UAAI,SAAS,WAAW,GAAG;AACzB,cAAM,gBAAgB,SAAS,CAAC;AAChC,2BAAmB,aAAa;AAChC,cAAM,QAAQ,2BAA2B,MAAM,eAAe,iBAAiB;AAC/E,uBAAe,KAAK;AACpB,iBAAS,oBAAoB;AAAA,MAC/B,WAAW,SAAS,WAAW,GAAG;AAEhC,iBAAS,oBAAoB;AAC7B,cAAM,QAAQ,uBAAuB,iBAAiB;AACtD,uBAAe,KAAK;AAAA,MACtB,OAAO;AACL,iBAAS,gBAAgB;AAAA,MAC3B;AAAA,IACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,eAAS,GAAY;AACrB,eAAS,OAAO;AAChB,gBAAU,GAAY;AAAA,IACxB,CAAC;AAAA,EACL,GAAG,CAAC,OAAO,gBAAgB,OAAO,CAAC;AAGnC,QAAM,sBAAsB,CAAC,aAA8B;AACzD,uBAAmB,QAAQ;AAC3B,QAAI,SAAS;AACX,YAAM,QAAQ,2BAA2B,SAAS,UAAU,UAAU;AACtE,qBAAe,KAAK;AAAA,IACtB;AACA,aAAS,oBAAoB;AAAA,EAC/B;AAGA,QAAM,sBAAsB,MAAM;AAChC,QAAI,iBAAiB,SAAS,GAAG;AAC/B,yBAAmB,IAAI;AACvB,eAAS,gBAAgB;AAAA,IAC3B;AAAA,EACF;AAGA,QAAM,sBAAsB,CAAC,aAAuB,cAAwB;AAC1E,0BAAsB,WAAW;AACjC,wBAAoB,SAAS;AAG7B,UAAM,eAAe,YAAY,KAAK,CAAC,OAAO,GAAG,WAAW,OAAO,CAAC;AAEpE,QAAI,gBAAgB,WAAW,iBAAiB;AAE9C,YAAM,UAAU,QAAQ,SAAS;AAAA,QAC/B,CAAC,QAAQ,IAAI,gBAAgB,gBAAgB;AAAA,MAC/C;AAEA,UAAI,SAAS;AACX,cAAM,SAAS,mBAAmB,QAAQ,aAAa,QAAQ,UAAU,OAAO;AAGhF,YAAI,OAAO,WAAW,GAAG;AACvB,gBAAM,QAAQ,OAAO,CAAC;AACtB,oCAA0B;AAAA,YACxB,YAAY,MAAM;AAAA,YAClB,iBAAiB,MAAM;AAAA,UACzB,CAAC;AAED,qCAA2B,aAAa;AAAA,YACtC,YAAY,MAAM;AAAA,YAClB,iBAAiB,MAAM;AAAA,UACzB,CAAC;AACD;AAAA,QACF;AAGA,YAAI,OAAO,SAAS,GAAG;AACrB,6BAAmB,MAAM;AACzB,mBAAS,2BAA2B;AACpC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,+BAA2B,aAAa,MAAS;AAAA,EACnD;AAGA,QAAM,6BAA6B,CACjC,aACA,oBACG;AAEH,UAAM,iBAAiB,YAAY,KAAK,CAAC,OAAO,GAAG,WAAW,SAAS,CAAC;AAExE,QAAI,gBAAgB;AAClB,eAAS,kBAAkB;AAAA,IAC7B,OAAO;AAEL,yBAAmB,aAAa,QAAW,eAAe;AAAA,IAC5D;AAAA,EACF;AAGA,QAAM,6BAA6B,CAAC,UAA0B;AAC5D,UAAM,SAA+B;AAAA,MACnC,YAAY,MAAM;AAAA,MAClB,iBAAiB,MAAM;AAAA,IACzB;AACA,8BAA0B,MAAM;AAChC,+BAA2B,oBAAoB,MAAM;AAAA,EACvD;AAGA,QAAM,+BAA+B,MAAM;AACzC,aAAS,oBAAoB;AAAA,EAC/B;AAGA,QAAM,mBAAmB,CAAC,oBAAsC;AAC9D,uBAAmB,oBAAoB,iBAAiB,sBAAsB;AAAA,EAChF;AAGA,QAAM,uBAAuB,MAAM;AACjC,aAAS,oBAAoB;AAAA,EAC/B;AAGA,QAAM,qBAAqB,CACzB,aACA,aACA,oBACG;AACH,UAAM,cAAc,IAAI,IAAI,WAAW;AACvC,UAAM,YAAY,IAAI,IAAI,gBAAgB;AAG1C,UAAM,oBAAoB,WAAW,IAAI,CAAC,QAAQ;AAChD,YAAM,kBAAkB,IAAI,QAAQ;AAAA,QAAO,CAAC,MAC1C,YAAY,IAAI,GAAG,IAAI,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;AAAA,MAC/C;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU,gBAAgB,SAAS;AAAA,MACrC;AAAA,IACF,CAAC;AAGD,UAAM,mBAAmB,WAAW,IAAI,CAAC,QAAQ;AAC/C,YAAM,gBAAgB,IAAI,QAAQ;AAAA,QAAO,CAAC,MACxC,UAAU,IAAI,GAAG,IAAI,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE;AAAA,MAC7C;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,SAAS;AAAA,QACT,UAAU,cAAc,SAAS;AAAA,MACnC;AAAA,IACF,CAAC,EAAE,OAAO,CAAC,QAAQ,IAAI,QAAQ;AAE/B,kBAAc,iBAAiB;AAC/B,eAAW,mBAAmB,aAAa,iBAAiB,iBAAiB,SAAS,IAAI,mBAAmB,MAAS;AAAA,EACxH;AAEA,QAAM,eAAe,MAAM;AACzB,SAAK;AAAA,EACP;AAGA,MAAI,UAAU,yBAAyB;AACrC,WACE,gBAAAL,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,WAAU;AAAA,MAC3B,gBAAAC,MAACC,MAAA,EACC;AAAA,wBAAAF,KAAC,WAAQ;AAAA,QACT,gBAAAA,KAACG,OAAA,EAAK,uCAAyB;AAAA,SACjC;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,YAAY;AACxB,WACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,WAAU;AAAA,MAC3B,gBAAAC,MAACC,MAAA,EACC;AAAA,wBAAAF,KAAC,WAAQ;AAAA,QACT,gBAAAA,KAACG,OAAA,EAAK,kCAAoB;AAAA,SAC5B;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,SAAS;AACrB,WACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO;AAAA,MACR,gBAAAC,MAACC,MAAA,EACC;AAAA,wBAAAF,KAACG,OAAA,EAAK,OAAM,OAAM,qBAAE;AAAA,QACpB,gBAAAH,KAACG,OAAA,EAAK,OAAM,OAAO,iBAAO,WAAW,6BAA4B;AAAA,SACnE;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,kBAAkB;AAC9B,WACE,gBAAAF,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,WAAU;AAAA,MAC3B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,UAAU;AAAA,UACV,UAAU;AAAA,UACV,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,wBAAwB,WAAW,YAAY,SAAS,GAAG;AACvE,WACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,YAAW;AAAA,MAC5B,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,WAAW,iBAAiB,SAAS;AAAA,UACrC,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,+BAA+B,gBAAgB,SAAS,GAAG;AACvE,WACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,mBAAkB;AAAA,MAClC,mBACC,gBAAAC,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAF,KAACG,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,QACxB,gBAAAH,KAACG,OAAA,EAAK,MAAI,MAAC,OAAM,QAAQ,0BAAgB,MAAK;AAAA,SAChD;AAAA,MAEF,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AAGA,MAAI,UAAU,oBAAoB;AAChC,WACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,sBAAAF,KAAC,UAAO,UAAS,gBAAe;AAAA,MAC/B,mBACC,gBAAAC,MAACC,MAAA,EAAI,cAAc,GACjB;AAAA,wBAAAF,KAACG,OAAA,EAAK,UAAQ,MAAC,uBAAS;AAAA,QACxB,gBAAAH,KAACG,OAAA,EAAK,MAAI,MAAC,OAAM,QAAQ,0BAAgB,MAAK;AAAA,SAChD;AAAA,MAEF,gBAAAH;AAAA,QAAC;AAAA;AAAA,UACC,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU;AAAA;AAAA,MACZ;AAAA,OACF;AAAA,EAEJ;AAGA,SACE,gBAAAC,MAACC,MAAA,EAAI,eAAc,UACjB;AAAA,oBAAAF,KAAC,UAAO;AAAA,IACR,gBAAAA,KAACG,OAAA,EAAK,UAAQ,MAAC,wBAAU;AAAA,KAC3B;AAEJ;;;AMjkBA,eAAsB,cACpB,OACA,SACA,UACsB;AAEtB,MAAI;AAEJ,QAAM,mBACJ,QAAQ,kBAAkB,UAC1B,QAAQ,UAAU,UAClB,QAAQ,WAAW,UACnB,QAAQ,UAAU;AAEpB,MAAI,oBAAoB,QAAQ,QAAQ;AACtC,YAAQ,CAAC;AACT,QAAI,QAAQ,cAAe,OAAM,KAAK,eAAe;AACrD,QAAI,QAAQ,MAAO,OAAM,KAAK,OAAO;AACrC,QAAI,QAAQ,UAAU,QAAQ,MAAO,OAAM,KAAK,MAAM;AACtD,QAAI,QAAQ,OAAQ,OAAM,KAAK,QAAQ;AAAA,EACzC,OAAO;AACL,YAAQ,MAAM,SAAS,mBAAmB;AAAA,EAC5C;AAGA,MAAI;AACJ,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,QAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,WAAW,MAAM,SAAS,WAAW,GAAG;AACtC,oBAAc;AAAA,QACZ,aAAa,MAAM,SAAS,CAAC,EAAE;AAAA,QAC/B,WAAW,MAAM,SAAS,CAAC,EAAE;AAAA;AAAA,QAE7B,iBAAiB;AAAA,MACnB;AAAA,IACF,OAAO;AACL,YAAM,WAAW,MAAM,SAAS,cAAc,MAAM,QAAQ;AAC5D,oBAAc;AAAA,QACZ,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA;AAAA,QAEpB,iBAAiB;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,MAAM,SAAS,MAAM,GAAG;AAC1B,QAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF,WAAW,MAAM,SAAS,WAAW,GAAG;AACtC,oBAAc;AAAA,QACZ,aAAa,MAAM,SAAS,CAAC,EAAE;AAAA,QAC/B,WAAW,MAAM,SAAS,CAAC,EAAE;AAAA,MAC/B;AAAA,IACF,OAAO;AACL,YAAM,WAAW,MAAM,SAAS,cAAc,MAAM,QAAQ;AAC5D,oBAAc;AAAA,QACZ,aAAa,SAAS;AAAA,QACtB,WAAW,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,MAAI;AACJ,MAAI,MAAM,SAAS,QAAQ,GAAG;AAE5B,UAAM,qBAAqB,MAAM,SAAS;AAAA,MACxC,CAAC,MAAM,EAAE,qBAAqB;AAAA,IAChC;AAEA,QAAI,mBAAmB,WAAW,GAAG;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,MAAM,SAAS;AAAA,MAClC;AAAA,IACF;AAEA,QAAI,aAAa,SAAS,GAAG;AAC3B,UAAI,gBAAgB,MAAM,SAAS,kBAAkB;AAGrD,YAAM,WAAW,MAAM,SAAS,yBAAyB;AACzD,UAAI,aAAa,YAAY;AAC3B,wBAAgB,cAAc,IAAI,CAAC,UAAU;AAAA,UAC3C,GAAG;AAAA,UACH,iBAAiB;AAAA,QACnB,EAAE;AAAA,MACJ;AAGA,YAAM,uBAAuB,cAAc;AAAA,QACzC,CAAC,MAAM,EAAE,gBAAgB,EAAE,aAAa,OAAO,SAAS;AAAA,MAC1D;AAEA,UAAI,sBAAsB;AACxB,cAAM,mBAAmB,MAAM,SAAS,4BAA4B;AAEpE,YAAI,kBAAkB;AACpB,0BAAgB,MAAM,qBAAqB,eAAe,QAAQ;AAAA,QACpE;AAAA,MACF;AAEA,sBAAgB,EAAE,cAAc,cAAc;AAAA,IAChD;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AACF;AAKA,eAAe,qBACb,OACA,UACyB;AACzB,QAAM,aAA6B,CAAC;AAEpC,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,gBAAgB,KAAK,aAAa,OAAO,SAAS,GAAG;AAC5D,YAAM,UAAU,MAAM,SAAS,qBAAqB,IAAI;AACxD,UAAI,SAAS;AAEX,cAAM,kBACJ,KAAK,kBAAkB,KAAK,eAAe,SAAS,IAC/C,KAAK,eAAe,CAAC,IACrB,CAAC;AACR,mBAAW,KAAK;AAAA,UACd,GAAG;AAAA,UACH,gBAAgB,CAAC,EAAE,GAAG,iBAAiB,GAAG,QAAQ,CAAC;AAAA,QACrD,CAAC;AAAA,MACH,OAAO;AACL,mBAAW,KAAK,IAAI;AAAA,MACtB;AAAA,IACF,OAAO;AAEL,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,SAAO;AACT;;;AP5KA,SAAS,oBAAoB;AA+WzB,gBAAAI,YAAA;AAjWJ,IAAM,eAAyB;AAAA,EAC7B,MAAM,qBAAqB;AAEzB,WAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,cAAc,MAAM;AAExB,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,MAAM,cAAc,MAAM;AAExB,WAAO,KAAK,CAAC;AAAA,EACf;AAAA,EACA,MAAM,qBAAqB,UAAU;AAEnC,WAAO,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACnC;AAAA,EACA,MAAM,oBAAoB;AAExB,WAAO;AAAA,EACT;AAAA,EACA,MAAM,2BAA2B;AAC/B,WAAO;AAAA,EACT;AAAA,EACA,MAAM,8BAA8B;AAClC,WAAO;AAAA,EACT;AAAA,EACA,MAAM,uBAAuB;AAC3B,WAAO;AAAA,EACT;AACF;AAEA,SAAS,UAAU,OAAiB,KAAuB;AACzD,MAAI,MAAM,UAAU,IAAK,QAAO;AAChC,SAAO,CAAC,GAAG,MAAM,MAAM,GAAG,GAAG,GAAG,GAAG,IAAI,aAAQ,MAAM,SAAS,GAAG,OAAO,CAAC;AAC3E;AAEA,SAAS,mBACP,QACA,oBACM;AACN,QAAM,aAAa,OAAO,kBAAkB,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AACpE,QAAM,SAAS,OAAO,kBAAkB,OAAO,CAAC,MAAM,EAAE,OAAO;AAC/D,QAAM,gBAAgB,OAAO,iBAAiB,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;AACtE,QAAM,YAAY,OAAO,iBAAiB,OAAO,CAAC,MAAM,EAAE,OAAO;AAGjE,MAAI,OAAO,SAAS;AAClB,YAAQ,IAAI;AAAA,EAAK,GAAG,MAAM,QAAG,CAAC,mCAAmC;AAAA,EACnE,OAAO;AACL,YAAQ,IAAI;AAAA,EAAK,GAAG,OAAO,QAAG,CAAC,kCAAkC;AAAA,EACnE;AAGA,QAAM,EAAE,QAAQ,IAAI;AACpB,QAAM,YAAY,QAAQ,eAAe,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;AAC7D,QAAM,UAAU,QAAQ;AACxB,QAAM,WAAW,QAAQ;AACzB,QAAM,UAAU,QAAQ;AAExB,MAAI,UAAU,SAAS,GAAG;AACxB,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,YAAY,CAAC,EAAE;AACxC,eAAW,QAAQ,UAAW,SAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,IAAI,EAAE;AAAA,EACxE;AAEA,MAAI,QAAQ,cAAc,SAAS,GAAG;AACpC,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,oBAAoB,CAAC,EAAE;AAChD,eAAW,KAAK,QAAQ,eAAe;AACrC,cAAQ;AAAA,QACN,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,IAAI,EAAE,UAAU,GAAG,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS,SAAS,SAAS,QAAQ,SAAS,GAAG;AACzD,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,QAAQ,CAAC,EAAE;AACpC,eAAW,KAAK,UAAU,SAAS,EAAE;AACnC,cAAQ,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,EAAE;AACvC,eAAW,KAAK,UAAU,UAAU,EAAE;AACpC,cAAQ,IAAI,KAAK,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE;AACxC,eAAW,KAAK,UAAU,SAAS,EAAE;AACnC,cAAQ,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE;AAAA,EACvC;AAEA,MAAI,QAAQ,sBAAsB,SAAS,GAAG;AAC5C,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,yBAAyB,CAAC,EAAE;AACrD,eAAW,KAAK,QAAQ,uBAAuB;AAC7C,cAAQ;AAAA,QACN,KAAK,GAAG,MAAM,QAAG,CAAC,IAAI,EAAE,WAAW,IAAI,GAAG,IAAI,UAAK,EAAE,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MAC7E;AAAA,IACF;AAAA,EACF;AAGA,MAAI,oBAAoB,KAAK;AAC3B,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,gBAAgB,CAAC,EAAE;AAC5C,QAAI,mBAAmB,SAAS;AAC9B,cAAQ,IAAI,KAAK,GAAG,MAAM,QAAG,CAAC,uCAAuC;AAAA,IACvE,OAAO;AACL,cAAQ,IAAI,KAAK,GAAG,OAAO,QAAG,CAAC,wBAAwB;AACvD,UAAI,mBAAmB,OAAO;AAC5B,gBAAQ,IAAI,GAAG,IAAI,KAAK,mBAAmB,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW,SAAS,KAAK,cAAc,SAAS,GAAG;AACrD,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,EAAE;AAAA,EACjD;AAEA,MAAI,WAAW,SAAS,GAAG;AACzB,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,6BAA6B,CAAC,EAAE;AACzD,eAAW,OAAO,YAAY;AAC5B,YAAM,OAAO,IAAI,QAAQ,SAAS,KAAK,IAAI;AAC3C,cAAQ;AAAA,QACN,KAAK,GAAG,IAAI,QAAG,CAAC,IAAI,IAAI,QAAQ,cAAc,OAAO,IAAI,QAAQ,WAAW,IAAI,GAAG,IAAI,UAAK,IAAI,EAAE,CAAC;AAAA,MACrG;AACA,UAAI,IAAI,MAAO,SAAQ,IAAI,GAAG,IAAI,IAAI,MAAM,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC;AAAA,IAClF;AAAA,EACF;AAEA,MAAI,cAAc,SAAS,GAAG;AAC5B,YAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,iBAAiB,CAAC,EAAE;AAC7C,eAAW,KAAK,eAAe;AAC7B,YAAM,SAAS,EAAE;AACjB,YAAM,OAAO,OAAO,OAAO,QAAQ,SAAS;AAC5C,YAAM,UACH,OAAO,OAAO,SAAS,YAAY,OAAO,QAC1C,OAAO,OAAO,gBAAgB,YAAY,OAAO,eACjD,OAAO,OAAO,gBAAgB,YAAY,OAAO,eAClD;AAEF,cAAQ,MAAM,KAAK,IAAI,GAAG,UAAU,KAAK,OAAO,MAAM,EAAE,EAAE;AAC1D,UAAI,EAAE,MAAO,SAAQ,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,IAC3C;AAAA,EACF;AAGA,UAAQ;AAAA,IACN,GAAG;AAAA,MACD;AAAA,WAAc,UAAU,MAAM,kBAAkB,cAAc,MAAM,gBAC/D,OAAO,MAAM,uBAAuB,WAAW,MAAM;AAAA,IAC5D;AAAA,EACF;AACF;AAKA,SAAS,wBACP,YACA,SACA,aACA,sBACa;AACb,QAAM,QAAuB,CAAC;AAC9B,QAAM,UAAuB,EAAE,MAAM;AAErC,aAAW,aAAa,YAAY;AAClC,QAAI,CAAC,UAAU,YAAY,UAAU,QAAQ,WAAW,EAAG;AAE3D,UAAM,EAAE,WAAW,QAAQ,IAAI;AAE/B,QAAI,UAAU,OAAO,iBAAiB;AACpC,YAAM,KAAK,eAAe;AAAA,IAC5B,WAAW,UAAU,OAAO,SAAS;AACnC,YAAM,KAAK,OAAO;AAAA,IACpB,WAAW,UAAU,OAAO,UAAU;AACpC,YAAM,KAAK,QAAQ;AAEnB,cAAQ,SAAS;AAAA,QACf,cAAc,QAAQ,IAAI,CAAC,MAAqB,EAAE,IAAI;AAAA;AAAA,QAEtD,eAAe,cACX,YAAY,IAAI,CAAC,QAAQ;AAAA,UACvB,GAAG,GAAG;AAAA;AAAA,UAEN,iBAAiB,GAAG;AAAA,UACpB,gBAAgB,GAAG;AAAA,QACrB,EAAE,IACF;AAAA,MACN;AAAA,IACF,WAAW,UAAU,OAAO,QAAQ;AAClC,YAAM,KAAK,MAAM;AAEjB,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,UAAU,QAAQ,SAAS;AAAA,QAC/B,CAAC,QAAQ,IAAI,gBAAgB,QAAQ;AAAA,MACvC;AACA,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,UACb,aAAa,QAAQ;AAAA,UACrB,WAAW,QAAQ;AAAA;AAAA,UAEnB,YAAY,sBAAsB;AAAA,UAClC,iBAAiB,sBAAsB;AAAA,QACzC;AAAA,MACF;AAAA,IACF,WAAW,UAAU,OAAO,QAAQ;AAClC,YAAM,KAAK,MAAM;AAEjB,YAAM,SAAS,QAAQ,CAAC;AACxB,YAAM,UAAU,QAAQ,SAAS;AAAA,QAC/B,CAAC,QAAQ,IAAI,gBAAgB,QAAQ;AAAA,MACvC;AACA,UAAI,SAAS;AACX,gBAAQ,OAAO;AAAA,UACb,aAAa,QAAQ;AAAA,UACrB,WAAW,QAAQ;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,SAAS,wBAAiC;AACxC,SAAO,QAAQ,QAAQ,MAAM,SAAS,QAAQ,OAAO,KAAK;AAC5D;AAKA,SAAS,uBAAuB,SAAkC;AAChE,SAAO;AAAA,IACL,QAAQ,SAAS,QAAQ,UAAU,QAAQ,iBAAiB,QAAQ,SACnE,QAAQ,WAAW,QAAQ,QAAQ,SAAS;AAAA,EAC/C;AACF;AAMA,eAAe,kBACb,mBACA,aACe;AACf,MAAI,kBAAkB,WAAW,EAAG;AAEpC,QAAM,iBAAiB,kBAAkB;AAAA,IAAI,CAAC,MAC5C,mBAAmB,EAAE,WAAW;AAAA,EAClC;AAEA,UAAQ,IAAI,GAAG,IAAI,uBAAuB,eAAe,KAAK,IAAI,CAAC,KAAK,CAAC;AACzE,QAAM,KAAK,qBAAqB,WAAW;AAC3C,QAAM,oBAAoB,IAAI,aAAa,gBAAgB,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC;AACxF;AAKA,eAAe,mBACb,SACA,iBAAiC,CAAC,GACnB;AACf,QAAM,cAAc,QAAQ,IAAI;AAEhC,UAAQ,IAAI,GAAG,KAAK,oCAAoC,CAAC;AAGzD,QAAM,eAAe,MAAM,gBAAgB;AAC3C,QAAM,sBAAsB,QAAQ,WAAW,CAAC;AAChD,QAAM,oBAAoB,aAAa;AAAA,IAAO,CAAC,MAC7C,oBAAoB,SAAS,EAAE,OAAO;AAAA,EACxC;AAMA,QAAM,kBAAkB,mBAAmB,WAAW;AAGtD,QAAM,YACJ,kBAAkB,SAAS,IACvB,MAAM,gBAAgB,WAAW,IACjC;AAGN,QAAM,sBAAsB,WAAW,WAAW;AAElD,UAAQ,IAAI,GAAG,IAAI,sBAAsB,CAAC;AAE1C,QAAM,UAAU,MAAM,QAAQ,WAAW;AAGzC,MAAI,oBAAoB,SAAS,KAAK,CAAC,QAAQ,QAAQ;AACrD,YAAQ,SAAS;AAAA,EACnB;AAGA,QAAM,UAAU,MAAM,cAAc,SAAS,SAAS,YAAY;AAElE,MAAI,QAAQ,MAAM,WAAW,GAAG;AAC9B,YAAQ,IAAI,4FAA4F;AACxG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,GAAG,IAAI,eAAe,QAAQ,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AAG7D,QAAM,OAAO,WAAW,SAAS,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AAClE,QAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,IACjC,GAAG;AAAA,IACH,aAAa,QAAQ;AAAA,EACvB,CAAC;AAGD,qBAAmB,MAAM;AAEzB,UAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AACrC;AAQA,eAAsB,OACpB,UAA0B,CAAC,GAC3B,iBAAiC,CAAC,GACnB;AACf,QAAM,cAAc,QAAQ,IAAI;AAGhC,MAAI,uBAAuB,OAAO,GAAG;AACnC,UAAM,mBAAmB,SAAS,cAAc;AAChD;AAAA,EACF;AAGA,QAAM,YAAY,MAAM,gBAAgB,WAAW;AACnD,QAAM,sBAAsB,WAAW,WAAW;AAGlD,MAAI,CAAC,sBAAsB,GAAG;AAC5B,YAAQ,MAAM,oDAA+C;AAC7D,YAAQ,MAAM,+FAA+F;AAC7G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,iBAAiB,QAAQ,WAAW;AAG1C,QAAM,EAAE,cAAc,IAAI;AAAA,IACxB,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,YAAY,OAAO,YAAY,aAAa,sBAAsB,qBAAqB;AAErF,gBAAM,UAAU,MAAM;AACtB,gBAAM,UAAU,wBAAwB,YAAY,SAAS,aAAa,oBAAoB;AAE9F,gBAAM,cAAc,QAAQ,MAAM,SAAS;AAC3C,gBAAM,cAAc,oBAAoB,iBAAiB,SAAS;AAElE,cAAI,CAAC,eAAe,CAAC,aAAa;AAChC,oBAAQ,IAAI,uBAAuB;AACnC,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAGA,gBAAM,EAAE,YAAAC,YAAW,IAAI,MAAM,OAAO,oBAAgB;AACpD,gBAAM,OAAOA,YAAW,SAAS,SAAS,EAAE,OAAO,QAAQ,MAAM,CAAC;AAGlE,cAAI,eAAe,kBAAkB;AACnC,uBAAW,aAAa,kBAAkB;AACxC,kBAAI,CAAC,UAAU,YAAY,UAAU,QAAQ,WAAW,EAAG;AAC3D,oBAAM,EAAE,WAAW,QAAQ,IAAI;AAG/B,kBAAI,UAAU,YAAY;AACxB,sBAAM,aAAa,UAAU,WAAW,SAAS,OAAO;AAExD,qBAAK,UAAU,CAAC,GAAG,WAAW,SAAS,GAAG,KAAK,OAAO;AAAA,cACxD;AAAA,YACF;AAAA,UACF;AAGA,gBAAM,SAAS,MAAM,QAAQ,MAAM;AAAA,YACjC,GAAG;AAAA,YACH,aAAa,QAAQ;AAAA,UACvB,CAAC;AAGD,cAAI;AAEJ,cAAI,OAAO,WAAW,aAAa,KAAK,OAAK,EAAE,KAAK,OAAO,uBAAuB,GAAG;AAEnF,kBAAM,oBAAoB,QAAQ,QAAQ,gBAAgB,CAAC;AAE3D,uBAAW,cAAc,mBAAmB;AAC1C,oBAAM,gBAAgB,oBAAoB,UAAU;AAGpD,kBAAI,cAAc,aAAa,cAAc,mBAAmB;AAC9D,wBAAQ,IAAI;AAAA,EAAK,GAAG,KAAK,gCAAgC,CAAC,EAAE;AAC5D,sBAAM,KAAK,qBAAqB,UAAU;AAE1C,oBAAI;AACF,wBAAM,qBAAqB,IAAI,UAAU;AACzC,uCAAqB,EAAE,KAAK,MAAM,SAAS,KAAK;AAChD,0BAAQ,IAAI,GAAG,GAAG,MAAM,QAAG,CAAC,0BAA0B;AAAA,gBACxD,SAAS,OAAO;AACd,wBAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACtE,uCAAqB,EAAE,KAAK,MAAM,SAAS,OAAO,OAAO,SAAS;AAClE,0BAAQ,IAAI,GAAG,GAAG,OAAO,QAAG,CAAC,8BAA8B;AAAA,gBAC7D;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAGA,6BAAmB,QAAQ,kBAAkB;AAE7C,kBAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AAAA,QACrC;AAAA,QACA,SAAS,CAAC,UAAU;AAClB,kBAAQ,MAAM,mBAAc,MAAM,OAAO;AACzC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA;AAAA,IACF;AAAA,EACF;AAGA,QAAM,cAAc;AACtB;","names":["useState","Box","Text","useApp","useInput","useState","Box","Text","useInput","useApp","jsx","jsxs","useState","Box","Text","useInput","useApp","useState","Box","Text","useInput","jsx","jsxs","Fragment","jsx","jsxs","Text","Box","useApp","useState","useInput","useState","Box","Text","useInput","useApp","jsx","jsxs","jsx","jsxs","Box","Text","useInput","useApp","useState","jsx","createPlan"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/serve/dashboard/render.tsx","../src/commands/serve/dashboard/ServeDashboard.tsx","../src/commands/serve/dashboard/components/ServerHeader.tsx","../src/commands/serve/dashboard/components/WorkspaceInfo.tsx","../src/commands/serve/dashboard/components/StatsBar.tsx","../src/commands/serve/dashboard/components/BackgroundTasks.tsx","../src/commands/serve/dashboard/components/ActivityLog.tsx","../src/commands/serve/dashboard/components/HelpBar.tsx","../src/commands/serve/dashboard/components/OllamaStatus.tsx"],"sourcesContent":["/**\n * Render the dashboard using Ink\n */\n\nimport React from \"react\";\nimport { render } from \"ink\";\nimport { ServeDashboard } from \"./ServeDashboard.js\";\nimport { getDashboardStore } from \"./store.js\";\n\nexport interface RenderOptions {\n onQuit?: () => void;\n onRebuildIndex?: () => void;\n}\n\n/**\n * Intercept console.log/error/warn so stray output from ESLint rules,\n * child processes, etc. is routed to the dashboard activity log instead\n * of corrupting the Ink terminal UI. Returns a restore function.\n */\nfunction interceptConsole(): () => void {\n const origLog = console.log;\n const origError = console.error;\n const origWarn = console.warn;\n\n const route = (type: \"info\" | \"error\" | \"warning\", args: unknown[]) => {\n const message = args.map(String).join(\" \");\n if (!message.trim()) return;\n getDashboardStore().addActivity({\n type,\n message,\n isError: type === \"error\",\n isWarning: type === \"warning\",\n });\n };\n\n console.log = (...args: unknown[]) => route(\"info\", args);\n console.error = (...args: unknown[]) => route(\"error\", args);\n console.warn = (...args: unknown[]) => route(\"warning\", args);\n\n return () => {\n console.log = origLog;\n console.error = origError;\n console.warn = origWarn;\n };\n}\n\n/**\n * Render the dashboard and return cleanup function\n */\nexport function renderDashboard(options: RenderOptions = {}): {\n unmount: () => void;\n waitUntilExit: () => Promise<void>;\n} {\n // Clear the terminal so prior output doesn't mix with the Ink dashboard\n process.stdout.write(\"\\x1B[2J\\x1B[H\");\n\n // Intercept console methods so stray output goes to the activity log\n const restoreConsole = interceptConsole();\n\n const { unmount: inkUnmount, waitUntilExit: inkWaitUntilExit } = render(\n <ServeDashboard\n onQuit={options.onQuit}\n onRebuildIndex={options.onRebuildIndex}\n />\n );\n\n return {\n unmount: () => {\n restoreConsole();\n inkUnmount();\n },\n waitUntilExit: () => inkWaitUntilExit().finally(restoreConsole),\n };\n}\n","/**\n * ServeDashboard - main Ink component for the WebSocket server CLI dashboard\n */\n\nimport React, { useState, useEffect, useCallback } from \"react\";\nimport { Box, useInput, useApp } from \"ink\";\nimport {\n ServerHeader,\n WorkspaceInfo,\n StatsBar,\n BackgroundTasks,\n ActivityLog,\n HelpBar,\n} from \"./components/index.js\";\nimport type { DashboardState } from \"./types.js\";\nimport { getDashboardStore } from \"./store.js\";\n\nexport interface ServeDashboardProps {\n /** Callback when user requests to quit */\n onQuit?: () => void;\n /** Callback when user requests to rebuild index */\n onRebuildIndex?: () => void;\n}\n\nexport function ServeDashboard({\n onQuit,\n onRebuildIndex,\n}: ServeDashboardProps): React.ReactElement {\n const { exit } = useApp();\n const store = getDashboardStore();\n\n // Subscribe to store updates\n const [state, setState] = useState<DashboardState>(store.getState());\n const [scrollOffset, setScrollOffset] = useState(0);\n\n useEffect(() => {\n const unsubscribe = store.subscribe(() => {\n setState(store.getState());\n });\n return unsubscribe;\n }, [store]);\n\n // Clamp scrollOffset when activities change\n useEffect(() => {\n setScrollOffset((prev) => {\n const maxOffset = Math.max(0, state.activities.length - 15);\n return Math.min(prev, maxOffset);\n });\n }, [state.activities.length]);\n\n // Check Ollama status periodically\n useEffect(() => {\n const checkOllamaStatus = async () => {\n try {\n const response = await fetch(\"http://localhost:11434/api/tags\", {\n method: \"GET\",\n signal: AbortSignal.timeout(5000),\n });\n\n if (response.ok) {\n const data = (await response.json()) as { models?: Array<{ name?: string }> };\n const models = data.models || [];\n // Get the first model name as the \"active\" model indicator\n const modelName = models.length > 0 ? models[0].name : undefined;\n store.setOllamaStatus({\n status: \"connected\",\n model: modelName,\n lastChecked: new Date(),\n });\n } else {\n store.setOllamaStatus({\n status: \"error\",\n lastChecked: new Date(),\n });\n }\n } catch {\n store.setOllamaStatus({\n status: \"offline\",\n lastChecked: new Date(),\n });\n }\n };\n\n // Initial check\n checkOllamaStatus();\n\n // Check every 30 seconds\n const interval = setInterval(checkOllamaStatus, 30000);\n return () => clearInterval(interval);\n }, [store]);\n\n // Handle keyboard input\n useInput(\n useCallback(\n (input, key) => {\n if (input === \"q\" || (key.ctrl && input === \"c\")) {\n onQuit?.();\n exit();\n } else if (input === \"c\") {\n store.clearActivities();\n setScrollOffset(0);\n } else if (input === \"v\") {\n store.toggleVerbose();\n } else if (input === \"f\") {\n store.cycleFilter();\n setScrollOffset(0);\n } else if (input === \"r\") {\n onRebuildIndex?.();\n } else if (key.downArrow || input === \"j\") {\n setScrollOffset((prev) => {\n const maxOffset = Math.max(0, state.activities.length - 15);\n return Math.min(maxOffset, prev + 1);\n });\n } else if (key.upArrow || input === \"k\") {\n setScrollOffset((prev) => Math.max(0, prev - 1));\n }\n },\n [exit, onQuit, onRebuildIndex, store, state.activities.length]\n )\n );\n\n return (\n <Box flexDirection=\"column\" width=\"100%\">\n <ServerHeader port={state.port} isRunning={state.isRunning} />\n\n <WorkspaceInfo\n workspaceRoot={state.workspace?.workspaceRoot ?? null}\n appRoot={state.workspace?.appRoot ?? null}\n />\n\n <StatsBar\n connectedClients={state.stats.connectedClients}\n subscriptions={state.stats.subscriptions}\n cacheEntries={state.stats.cacheEntries}\n startTime={state.stats.startTime}\n ollamaStatus={state.ollamaStatus.status}\n ollamaModel={state.ollamaStatus.model}\n />\n\n <BackgroundTasks tasks={state.backgroundTasks} />\n\n <ActivityLog\n activities={state.activities}\n maxVisible={15}\n verbose={state.verbose}\n scrollOffset={scrollOffset}\n activeFilter={state.activeFilter}\n />\n\n <HelpBar verbose={state.verbose} activeFilter={state.activeFilter} />\n </Box>\n );\n}\n","/**\n * ServerHeader component - displays server status and URL\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface ServerHeaderProps {\n port: number;\n isRunning: boolean;\n}\n\nexport function ServerHeader({\n port,\n isRunning,\n}: ServerHeaderProps): React.ReactElement {\n const url = `ws://localhost:${port}`;\n const statusColor = isRunning ? \"green\" : \"red\";\n const statusIcon = isRunning ? \"\\u25CF\" : \"\\u25CB\"; // Filled/hollow circle\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor=\"cyan\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Text bold color=\"cyan\">\n UILint Server\n </Text>\n <Box>\n <Text dimColor>{url}</Text>\n <Text> </Text>\n <Text color={statusColor}>{statusIcon}</Text>\n </Box>\n </Box>\n );\n}\n","/**\n * WorkspaceInfo component - displays workspace and app root paths\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\n\nexport interface WorkspaceInfoProps {\n workspaceRoot: string | null;\n appRoot: string | null;\n}\n\nfunction truncatePath(path: string, maxLen: number = 60): string {\n if (path.length <= maxLen) return path;\n return \"...\" + path.slice(-(maxLen - 3));\n}\n\nexport function WorkspaceInfo({\n workspaceRoot,\n appRoot,\n}: WorkspaceInfoProps): React.ReactElement {\n if (!workspaceRoot && !appRoot) {\n return (\n <Box paddingX={1}>\n <Text dimColor>Initializing...</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" paddingX={1}>\n <Box>\n <Text dimColor>Workspace: </Text>\n <Text>{truncatePath(workspaceRoot || \"\")}</Text>\n </Box>\n {appRoot && appRoot !== workspaceRoot && (\n <Box>\n <Text dimColor>App Root: </Text>\n <Text>{truncatePath(appRoot)}</Text>\n </Box>\n )}\n </Box>\n );\n}\n","/**\n * StatsBar component - displays server statistics\n */\n\nimport React, { useState, useEffect } from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { OllamaStatusState } from \"../types.js\";\n\nexport interface StatsBarProps {\n connectedClients: number;\n subscriptions: number;\n cacheEntries: number;\n startTime: Date;\n ollamaStatus?: OllamaStatusState;\n ollamaModel?: string;\n}\n\nfunction formatUptime(startTime: Date): string {\n const diff = Date.now() - startTime.getTime();\n const seconds = Math.floor(diff / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n}\n\nconst ollamaStatusConfig: Record<\n OllamaStatusState,\n { icon: string; color: string }\n> = {\n checking: { icon: \"\\u25CB\", color: \"gray\" },\n connected: { icon: \"\\u25CF\", color: \"green\" },\n offline: { icon: \"\\u25CF\", color: \"red\" },\n error: { icon: \"\\u25CF\", color: \"yellow\" },\n};\n\nexport function StatsBar({\n connectedClients,\n subscriptions,\n cacheEntries,\n startTime,\n ollamaStatus,\n ollamaModel,\n}: StatsBarProps): React.ReactElement {\n const [, setTick] = useState(0);\n\n // Update uptime display every second\n useEffect(() => {\n const timer = setInterval(() => {\n setTick((t) => t + 1);\n }, 1000);\n return () => clearInterval(timer);\n }, []);\n\n const ollamaConfig = ollamaStatus\n ? ollamaStatusConfig[ollamaStatus]\n : ollamaStatusConfig.checking;\n\n return (\n <Box\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n justifyContent=\"space-between\"\n >\n <Box gap={2}>\n <Box>\n <Text dimColor>Clients: </Text>\n <Text bold color={connectedClients > 0 ? \"green\" : \"gray\"}>\n {connectedClients}\n </Text>\n </Box>\n <Box>\n <Text dimColor>Subs: </Text>\n <Text>{subscriptions}</Text>\n </Box>\n <Box>\n <Text dimColor>Ollama: </Text>\n <Text color={ollamaConfig.color}>{ollamaConfig.icon}</Text>\n {ollamaModel && ollamaStatus === \"connected\" && (\n <Text dimColor> {ollamaModel}</Text>\n )}\n </Box>\n </Box>\n <Box gap={2}>\n <Box>\n <Text dimColor>Cache: </Text>\n <Text>{cacheEntries}</Text>\n </Box>\n <Box>\n <Text dimColor>Uptime: </Text>\n <Text>{formatUptime(startTime)}</Text>\n </Box>\n </Box>\n </Box>\n );\n}\n","/**\n * BackgroundTasks component - displays background task progress\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { BackgroundTask } from \"../types.js\";\n\nexport interface BackgroundTasksProps {\n tasks: Map<string, BackgroundTask>;\n}\n\nfunction ProgressBar({\n progress,\n width = 20,\n}: {\n progress: number;\n width?: number;\n}): React.ReactElement {\n const filled = Math.round((progress / 100) * width);\n const empty = width - filled;\n\n return (\n <Text>\n <Text color=\"cyan\">{\"\\u2588\".repeat(filled)}</Text>\n <Text dimColor>{\"\\u2591\".repeat(empty)}</Text>\n </Text>\n );\n}\n\nfunction TaskRow({ task }: { task: BackgroundTask }): React.ReactElement {\n const statusIcon = {\n idle: \"\\u25CB\", // hollow circle\n running: \"\\u25CF\", // filled circle\n complete: \"\\u2713\", // checkmark\n error: \"\\u2717\", // x mark\n }[task.status];\n\n const statusColor = {\n idle: \"gray\",\n running: \"cyan\",\n complete: \"green\",\n error: \"red\",\n }[task.status] as \"gray\" | \"cyan\" | \"green\" | \"red\";\n\n return (\n <Box>\n <Text color={statusColor}>{statusIcon} </Text>\n <Text>{task.name}: </Text>\n {task.status === \"running\" && task.progress !== undefined ? (\n <Box gap={1}>\n <ProgressBar progress={task.progress} width={15} />\n <Text dimColor>\n {task.progress.toFixed(0)}%\n {task.current !== undefined && task.total !== undefined\n ? ` (${task.current}/${task.total})`\n : \"\"}\n </Text>\n </Box>\n ) : task.status === \"complete\" ? (\n <Text color=\"green\">Complete</Text>\n ) : task.status === \"error\" ? (\n <Text color=\"red\">{task.error || \"Failed\"}</Text>\n ) : (\n <Text dimColor>{task.message || \"Idle\"}</Text>\n )}\n </Box>\n );\n}\n\nexport function BackgroundTasks({\n tasks,\n}: BackgroundTasksProps): React.ReactElement | null {\n const taskArray = Array.from(tasks.values());\n\n if (taskArray.length === 0) {\n return null;\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n >\n <Text bold dimColor>\n Background Tasks\n </Text>\n {taskArray.map((task) => (\n <TaskRow key={task.id} task={task} />\n ))}\n </Box>\n );\n}\n","/**\n * ActivityLog component - displays recent server activity\n *\n * Supports filtering by category (errors, vision, semantic, lint)\n * and auto-expanding error details.\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ActivityEntry, ActivityType, ActivityCategory } from \"../types.js\";\n\nexport interface ActivityLogProps {\n activities: ActivityEntry[];\n maxVisible?: number;\n verbose?: boolean;\n scrollOffset?: number;\n activeFilter?: ActivityCategory;\n}\n\nconst filterLabels: Record<ActivityCategory, string> = {\n all: \"All\",\n errors: \"Errors\",\n vision: \"Vision\",\n semantic: \"Semantic\",\n lint: \"Lint\",\n system: \"System\",\n};\n\nfunction formatTime(date: Date): string {\n return date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n}\n\n/** Strip ANSI escape sequences from a string */\nfunction stripAnsi(str: string): string {\n // eslint-disable-next-line no-control-regex\n return str.replace(/\\x1B\\[[0-9;]*[a-zA-Z]/g, \"\").replace(/\\r/g, \"\");\n}\n\n/** Truncate a string to maxLen, appending \"…\" if truncated */\nfunction truncate(str: string, maxLen: number): string {\n const clean = stripAnsi(str).replace(/\\n/g, \" \");\n if (clean.length <= maxLen) return clean;\n return clean.slice(0, maxLen - 1) + \"…\";\n}\n\ntype InkColor =\n | \"black\" | \"red\" | \"green\" | \"yellow\" | \"blue\"\n | \"magenta\" | \"cyan\" | \"white\" | \"gray\" | \"grey\";\n\nfunction getTypeDisplay(type: ActivityType): { label: string; color: InkColor } {\n const displays: Record<ActivityType, { label: string; color: InkColor }> = {\n \"lint:file\": { label: \"lint\", color: \"blue\" },\n \"lint:element\": { label: \"lint\", color: \"blue\" },\n \"lint:done\": { label: \"lint\", color: \"green\" },\n subscribe: { label: \"sub\", color: \"cyan\" },\n \"cache:invalidate\": { label: \"cache\", color: \"yellow\" },\n \"vision:analyze\": { label: \"vision\", color: \"magenta\" },\n \"vision:done\": { label: \"vision\", color: \"green\" },\n \"vision:check\": { label: \"vision\", color: \"magenta\" },\n \"semantic:analyze\": { label: \"semant\", color: \"blue\" },\n \"semantic:done\": { label: \"semant\", color: \"green\" },\n \"semantic:error\": { label: \"semant\", color: \"red\" },\n \"config:set\": { label: \"config\", color: \"yellow\" },\n \"rule:config:set\": { label: \"rule\", color: \"yellow\" },\n \"screenshot:save\": { label: \"screen\", color: \"cyan\" },\n \"screenshot:saved\": { label: \"screen\", color: \"green\" },\n \"coverage:request\": { label: \"cov\", color: \"blue\" },\n \"coverage:result\": { label: \"cov\", color: \"green\" },\n \"file:changed\": { label: \"change\", color: \"yellow\" },\n \"client:connect\": { label: \"client\", color: \"green\" },\n \"client:disconnect\": { label: \"client\", color: \"red\" },\n error: { label: \"error\", color: \"red\" },\n warning: { label: \"warn\", color: \"yellow\" },\n info: { label: \"info\", color: \"gray\" },\n };\n\n return displays[type] || { label: type, color: \"gray\" };\n}\n\n// Max width for message/detail lines (leaves room for time + type label + padding)\nconst MAX_MSG_WIDTH = 120;\nconst MAX_DETAIL_WIDTH = 100;\n\nfunction ActivityRow({\n entry,\n verbose,\n}: {\n entry: ActivityEntry;\n verbose?: boolean;\n}): React.ReactElement {\n const { label, color } = getTypeDisplay(entry.type);\n\n // Always show detail for errors, otherwise respect verbose mode\n const showDetail = (verbose || entry.isError) && entry.detail;\n\n return (\n <Box flexDirection=\"column\">\n <Box>\n <Text dimColor>{formatTime(entry.timestamp)} </Text>\n <Text color={color} bold>\n {label.padEnd(7)}\n </Text>\n <Text color={entry.isError ? \"red\" : entry.isWarning ? \"yellow\" : undefined}>\n {truncate(entry.message, MAX_MSG_WIDTH)}\n </Text>\n </Box>\n {showDetail && (\n <Box paddingLeft={16}>\n <Text dimColor>{truncate(entry.detail!, MAX_DETAIL_WIDTH)}</Text>\n </Box>\n )}\n </Box>\n );\n}\n\nexport function ActivityLog({\n activities,\n maxVisible = 15,\n verbose = false,\n scrollOffset = 0,\n activeFilter = \"all\",\n}: ActivityLogProps): React.ReactElement {\n // Apply category filter\n const filtered =\n activeFilter !== \"all\"\n ? activities.filter((a) => a.category === activeFilter)\n : activities;\n\n const total = filtered.length;\n const start = Math.min(scrollOffset, Math.max(0, total - 1));\n const end = Math.min(start + maxVisible, total);\n const visibleActivities = filtered.slice(start, end);\n\n const isScrolled = start > 0;\n const hasMoreBelow = end < total;\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n flexGrow={1}\n >\n <Box justifyContent=\"space-between\">\n <Box gap={1}>\n <Text bold dimColor>\n Activity\n </Text>\n {activeFilter !== \"all\" && (\n <Text color=\"yellow\">[{filterLabels[activeFilter]}]</Text>\n )}\n </Box>\n <Box gap={1}>\n {isScrolled && (\n <Text color=\"cyan\">{\"\\u2191\"}</Text>\n )}\n {total > maxVisible && (\n <Text dimColor>\n {start + 1}-{end} of {total}\n </Text>\n )}\n {hasMoreBelow && (\n <Text color=\"cyan\">{\"\\u2193\"}</Text>\n )}\n </Box>\n </Box>\n {visibleActivities.length === 0 ? (\n <Text dimColor>\n {activeFilter !== \"all\"\n ? `No ${filterLabels[activeFilter].toLowerCase()} activity yet...`\n : \"No activity yet...\"}\n </Text>\n ) : (\n visibleActivities.map((entry) => (\n <ActivityRow key={entry.id} entry={entry} verbose={verbose} />\n ))\n )}\n </Box>\n );\n}\n","/**\n * HelpBar component - displays keyboard shortcuts\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { ActivityCategory } from \"../types.js\";\n\nexport interface HelpBarProps {\n verbose: boolean;\n activeFilter?: ActivityCategory;\n}\n\nconst filterLabels: Record<ActivityCategory, string> = {\n all: \"all\",\n errors: \"errors\",\n vision: \"vision\",\n semantic: \"semantic\",\n lint: \"lint\",\n system: \"system\",\n};\n\nexport function HelpBar({ verbose, activeFilter = \"all\" }: HelpBarProps): React.ReactElement {\n return (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1} gap={2}>\n <Box>\n <Text bold color=\"cyan\">\n q\n </Text>\n <Text dimColor> quit</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n c\n </Text>\n <Text dimColor> clear log</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n v\n </Text>\n <Text dimColor> verbose {verbose ? \"(on)\" : \"(off)\"}</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n f\n </Text>\n <Text dimColor> filter ({filterLabels[activeFilter]})</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n r\n </Text>\n <Text dimColor> rebuild index</Text>\n </Box>\n <Box>\n <Text bold color=\"cyan\">\n {\"\\u2191\\u2193\"}\n </Text>\n <Text dimColor> scroll</Text>\n </Box>\n </Box>\n );\n}\n","/**\n * OllamaStatus component - displays Ollama connection status\n */\n\nimport React from \"react\";\nimport { Box, Text } from \"ink\";\nimport type { OllamaStatusState } from \"../types.js\";\n\nexport interface OllamaStatusProps {\n status: OllamaStatusState;\n model?: string;\n}\n\nconst statusConfig: Record<\n OllamaStatusState,\n { icon: string; color: string; label: string }\n> = {\n checking: { icon: \"\\u25CB\", color: \"gray\", label: \"checking\" },\n connected: { icon: \"\\u25CF\", color: \"green\", label: \"connected\" },\n offline: { icon: \"\\u25CF\", color: \"red\", label: \"offline\" },\n error: { icon: \"\\u25CF\", color: \"red\", label: \"error\" },\n};\n\nexport function OllamaStatus({\n status,\n model,\n}: OllamaStatusProps): React.ReactElement {\n const config = statusConfig[status];\n\n return (\n <Box gap={1}>\n <Text dimColor>Ollama:</Text>\n <Text color={config.color}>{config.icon}</Text>\n <Text color={config.color}>{config.label}</Text>\n {model && status === \"connected\" && (\n <Text dimColor>({model})</Text>\n )}\n </Box>\n );\n}\n"],"mappings":"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","names":["useState","useEffect","Box","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","Box","Text","jsx","jsxs","filterLabels","Box","Text","jsx","jsxs","jsx","jsxs","useState","useEffect","Box","jsx"]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|