@titan-design/active-work 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +207 -0
- package/claude-commands/aw-prompt.md +21 -0
- package/dist/aw.js +183 -0
- package/dist/aw.js.map +1 -0
- package/dist/chunk-OET6AFME.js +1276 -0
- package/dist/chunk-OET6AFME.js.map +1 -0
- package/dist/cli.js +6967 -0
- package/dist/cli.js.map +1 -0
- package/dist/dashboard/index.html +22 -0
- package/package.json +88 -0
- package/scripts/gen-cli-reference.mjs +139 -0
- package/scripts/postinstall.js +48 -0
- package/scripts/preuninstall.js +15 -0
- package/skill/SKILL.md +54 -0
- package/skill/references/auditing-existing-work.md +125 -0
- package/skill/references/cli-dev.md +63 -0
- package/skill/references/onboarding.md +72 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/archive.ts","../src/commands/new.ts","../src/utils/gray-matter-io.ts","../src/utils/slug.ts","../src/commands/paths.ts","../src/commands/rename.ts","../src/commands/set.ts","../src/commands/touch.ts","../src/commands/focus.ts","../src/commands/_focus-helpers.ts","../src/commands/pause.ts","../src/commands/unfocus.ts","../src/commands/unpause.ts","../src/commands/task-add.ts","../src/commands/task-delete.ts","../src/commands/task-done.ts","../src/commands/task-edit.ts","../src/commands/task-list.ts","../src/commands/task-reorder.ts","../src/commands/session-list.ts","../src/commands/session-record.ts","../src/commands/sessions-browser.ts","../src/commands/artifact-add-branch.ts","../src/commands/artifact-add-stash.ts","../src/commands/artifact-list.ts","../src/commands/artifact-note.ts","../src/commands/artifact-prune.ts","../src/commands/artifact-status.ts","../src/commands/source-add.ts","../src/commands/audit.ts","../src/commands/list.ts","../src/commands/worktree-set.ts","../src/commands/worktree-set-default.ts","../src/commands/discover.ts","../src/discover/index.ts","../src/discover/run-command.ts","../src/discover/github.ts","../src/discover/git.ts","../src/discover/projects.ts","../src/discover/claude.ts","../src/commands/drop.ts","../src/discover/triaged-log.ts","../src/commands/fold.ts","../src/commands/track.ts","../src/commands/prompt.ts","../src/commands/edit.ts","../src/commands/mcp-serve.ts","../src/server/mcp.ts","../src/server/daemon.ts","../src/server/http.ts","../src/server/health.ts","../src/server/dashboard-routes.ts","../src/server/logger.ts","../src/server/events.ts","../src/server/file-watch.ts","../src/server/lifecycle.ts","../src/commands/mcp-stop.ts","../src/commands/mcp-restart.ts","../src/commands/mcp-status.ts","../src/commands/mcp-logs.ts","../src/commands/setup.ts","../src/setup/steps.ts","../src/schemas/state.ts","../src/migrations/v1-to-v2-artifacts.ts","../src/migrations/index.ts","../src/setup/supervision-systemd.ts","../src/setup/supervision-launchd.ts","../src/setup/supervision.ts","../src/commands/uninstall.ts","../src/commands/doctor.ts","../src/doctor.ts","../src/commands/sync.ts","../src/commands/index.ts","../src/utils/usage-log.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { Command, CommanderError } from 'commander';\nimport type { ZodSchema, ZodTypeAny } from 'zod';\nimport { registry } from './registry/index.js';\nimport './commands/index.js'; // populates the registry via side effect\nimport { getActiveRoot } from './utils/paths.js';\nimport { formatError, EXIT } from './errors.js';\nimport {\n successEnvelope,\n errorEnvelope,\n type AnyCommand,\n type CliMeta,\n type CommandContext,\n} from './registry/index.js';\nimport { color } from './utils/color.js';\nimport { appendUsage } from './utils/usage-log.js';\n\n/**\n * Look up the inner zod type, skipping optional/nullable/default wrappers.\n *\n * Returns the unwrapped def type string (e.g. `'string'`, `'number'`,\n * `'array'`, `'boolean'`, `'enum'`) so the dispatcher can decide how to\n * coerce a raw commander value before zod parsing.\n */\nfunction unwrapZodType(schema: ZodTypeAny | undefined): string | undefined {\n if (!schema) return undefined;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let def = (schema as any)?._zod?.def;\n while (def && (def.type === 'optional' || def.type === 'nullable' || def.type === 'default')) {\n def = def.innerType?._zod?.def;\n }\n return def?.type as string | undefined;\n}\n\n/**\n * Pull the per-field zod schema out of a top-level `z.object({...})`.\n *\n * Returns `undefined` when the schema isn't an object or the field is\n * absent — callers fall back to treating the value as a plain string.\n */\nfunction fieldSchema(args: ZodSchema, name: string): ZodTypeAny | undefined {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const shape = (args as any)?._zod?.def?.shape;\n if (!shape) return undefined;\n return shape[name] as ZodTypeAny | undefined;\n}\n\n/** Coerce a raw commander value (string | boolean | undefined) to the type implied by zod. */\nfunction coerce(value: unknown, zodType: string | undefined): unknown {\n if (value === undefined) return undefined;\n if (zodType === 'boolean') {\n return value === true || value === 'true';\n }\n if (zodType === 'number') {\n if (typeof value === 'number') return value;\n const n = Number(value);\n return Number.isNaN(n) ? value : n;\n }\n if (zodType === 'array') {\n if (Array.isArray(value)) return value;\n return String(value)\n .split(',')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n return value;\n}\n\n/** Split a registry command name like `task.add` into commander sub-command path parts. */\nfunction splitName(name: string): string[] {\n return name.split('.');\n}\n\n/**\n * Walk/create a chain of `commander` sub-commands for the given group\n * parts (e.g. `['task']` for `task.add`). Returns the leaf parent so the\n * caller can attach the final action sub-command.\n */\nfunction ensureGroup(root: Command, parts: string[]): Command {\n let current = root;\n for (const part of parts) {\n const existing = current.commands.find((c) => c.name() === part);\n if (existing) {\n current = existing;\n continue;\n }\n const next = current\n .command(part)\n .description(`${part} commands`);\n current = next;\n }\n return current;\n}\n\n/** Convert a hyphenated CLI flag/positional name to its `args` camelCase / snake_case key. */\nfunction flagToKey(long: string): string {\n // `--ship-target` -> `ship_target` to match zod schemas (snake_case\n // convention in this codebase).\n return long.replace(/^--/, '').replace(/-/g, '_');\n}\n\ninterface InvocationOutput {\n exitCode: number;\n success: boolean;\n}\n\nasync function emitSuccess(\n cmd: AnyCommand,\n result: unknown,\n ctx: CommandContext,\n): Promise<void> {\n if (ctx.format === 'json') {\n process.stdout.write(\n JSON.stringify(successEnvelope(result, ctx.warnings)) + '\\n',\n );\n return;\n }\n // Human mode: a bare string result is printed raw (e.g. `prompt` dumps the\n // bootstrap text); everything else is pretty-printed JSON for now. Commands\n // can layer richer output later by checking ctx.format themselves.\n if (typeof result === 'string') {\n process.stdout.write(result.endsWith('\\n') ? result : result + '\\n');\n } else if (result !== undefined && result !== null) {\n process.stdout.write(JSON.stringify(result, null, 2) + '\\n');\n }\n // Touch cmd to avoid an unused-parameter warning when extending later.\n void cmd;\n}\n\nfunction emitError(message: string, code: number, format: 'human' | 'json'): void {\n if (format === 'json') {\n process.stdout.write(JSON.stringify(errorEnvelope(message, code)) + '\\n');\n return;\n }\n process.stderr.write(color.red('error: ' + message) + '\\n');\n}\n\n/**\n * Build the action handler for a single registry command.\n *\n * Captures positionals + options into a plain object, coerces values to\n * the types implied by the command's zod schema, runs the schema, then\n * invokes `cmd.run`. Always writes a usage-log line and exits with the\n * appropriate sysexits code.\n */\nfunction makeAction(\n cmd: AnyCommand,\n rootProgram: Command,\n): (...handlerArgs: unknown[]) => Promise<void> {\n const meta: CliMeta = cmd.cli ?? {};\n const positionalNames = meta.positional ?? [];\n\n return async (...handlerArgs: unknown[]) => {\n const start = Date.now();\n const optsFromCommander = (handlerArgs[positionalNames.length] ??\n {}) as Record<string, unknown>;\n const rootOpts = rootProgram.opts() as { json?: boolean };\n const format: 'human' | 'json' = rootOpts.json ? 'json' : 'human';\n\n const raw: Record<string, unknown> = {};\n\n // Positionals: handlerArgs[0..positionalNames.length-1]\n positionalNames.forEach((pname, i) => {\n const value = handlerArgs[i];\n if (value !== undefined) {\n const t = unwrapZodType(fieldSchema(cmd.args, pname));\n raw[pname] = coerce(value, t);\n }\n });\n\n // Options\n if (meta.options) {\n for (const [key, opt] of Object.entries(meta.options)) {\n const flagKey = flagToKey(opt.long);\n // commander camelCases long flag names, dropping leading --.\n const commanderKey = flagKey.replace(/_([a-z])/g, (_, c: string) =>\n c.toUpperCase(),\n );\n const value =\n optsFromCommander[commanderKey] ?? optsFromCommander[flagKey];\n if (value !== undefined) {\n const t = unwrapZodType(fieldSchema(cmd.args, key));\n raw[key] = coerce(value, t);\n }\n }\n }\n\n const ctx: CommandContext = {\n activeRoot: getActiveRoot(),\n warnings: [],\n format,\n cwd: process.cwd(),\n };\n\n const result = await invoke(cmd, raw, ctx, format);\n const duration = Date.now() - start;\n await appendUsage({\n ts: new Date().toISOString(),\n command: cmd.name,\n args: raw,\n duration_ms: duration,\n success: result.success,\n exit_code: result.exitCode,\n });\n process.exit(result.exitCode);\n };\n}\n\nasync function invoke(\n cmd: AnyCommand,\n raw: Record<string, unknown>,\n ctx: CommandContext,\n format: 'human' | 'json',\n): Promise<InvocationOutput> {\n let parsed: unknown;\n try {\n parsed = cmd.args.parse(raw);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n emitError(`invalid arguments: ${message}`, EXIT.USAGE, format);\n return { exitCode: EXIT.USAGE, success: false };\n }\n\n try {\n const result = await cmd.run(parsed, ctx);\n await emitSuccess(cmd, result, ctx);\n return { exitCode: EXIT.OK, success: true };\n } catch (err) {\n const { message, code } = formatError(err);\n emitError(message, code, format);\n return { exitCode: code, success: false };\n }\n}\n\n/**\n * Translate a registry `CliMeta` description of a single option into the\n * commander option-spec string. Boolean zod fields become bare flags\n * (`--flag`); everything else takes an option-argument (`--flag <value>`).\n */\nfunction buildOptionFlags(\n cmd: AnyCommand,\n key: string,\n opt: CliMeta['options'] extends infer M\n ? M extends Record<string, infer O>\n ? O\n : never\n : never,\n): string {\n const zodType = unwrapZodType(fieldSchema(cmd.args, key));\n const short = opt.short ? `${opt.short}, ` : '';\n if (zodType === 'boolean') {\n return `${short}${opt.long}`;\n }\n return `${short}${opt.long} <value>`;\n}\n\n/** Attach one registry command as a sub-command under its appropriate parent. */\nfunction attachCommand(root: Command, cmd: AnyCommand): void {\n const parts = splitName(cmd.name);\n const leafName = parts[parts.length - 1]!;\n const parent = ensureGroup(root, parts.slice(0, -1));\n const sub = parent.command(leafName).description(cmd.description);\n\n const meta: CliMeta = cmd.cli ?? {};\n for (const pname of meta.positional ?? []) {\n const zType = unwrapZodType(fieldSchema(cmd.args, pname));\n const optional =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (fieldSchema(cmd.args, pname) as any)?._zod?.def?.type === 'optional';\n const display = optional ? `[${pname}]` : `<${pname}>`;\n sub.argument(display, `${pname}${zType ? ` (${zType})` : ''}`);\n }\n\n if (meta.options) {\n for (const [key, opt] of Object.entries(meta.options)) {\n const flags = buildOptionFlags(cmd, key, opt);\n if (opt.required) {\n sub.requiredOption(flags, opt.description);\n } else {\n sub.option(flags, opt.description);\n }\n }\n }\n\n sub.action(makeAction(cmd, root));\n}\n\nfunction buildProgram(): Command {\n const program = new Command();\n // exitOverride must be set before sub-commands are created so the\n // setting is inherited via `copyInheritedSettings`. Sub-commands then\n // throw a `CommanderError` instead of calling `process.exit` directly.\n program.exitOverride();\n program\n .name('active-work')\n .description('active-work CLI — durable workspace state for engineering work')\n .version('0.1.0')\n .option('--json', 'emit machine-readable JSON envelope on stdout')\n .addHelpText(\n 'after',\n '\\nRun `active-work <command> --help` for command-specific options.\\n' +\n 'Tip: `aw [slug]` launches Claude with the bootstrap prompt.\\n',\n );\n\n // Sort commands so help output is stable.\n const cmds = Array.from(registry.values()).sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n for (const cmd of cmds) {\n attachCommand(program, cmd);\n }\n\n return program;\n}\n\n/**\n * Entry point. Builds the program and dispatches argv. Commander errors\n * (e.g. unknown command, missing required option) are mapped to the\n * USAGE exit code; everything else surfaces via the per-command action.\n */\nexport async function main(argv: string[]): Promise<void> {\n const program = buildProgram();\n try {\n await program.parseAsync(argv);\n } catch (err) {\n if (err instanceof CommanderError) {\n // Commander already wrote to stderr for help / version. Just exit.\n if (err.code === 'commander.helpDisplayed' || err.code === 'commander.version') {\n process.exit(0);\n }\n process.exit(EXIT.USAGE);\n }\n const { message, code } = formatError(err);\n emitError(message, code, 'human');\n process.exit(code);\n }\n}\n\nvoid main(process.argv);\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { NotFoundError, UsageError, ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n domain: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n from: z.string(),\n to: z.string(),\n});\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction isInside(child: string, parent: string): boolean {\n const rel = path.relative(parent, child);\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n\nfunction yearMonth(): string {\n const d = new Date();\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n return `${y}-${m}`;\n}\n\nexport default defineCommand({\n name: 'archive',\n description: 'Move an initiative out of active root into <archiveRoot>/<domain>/archive/.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'domain'],\n usage: 'active-work archive <slug> <domain>',\n },\n async run(args, ctx) {\n const from = path.resolve(path.join(ctx.activeRoot, args.slug));\n if (!(await dirExists(from))) {\n throw new NotFoundError(`Initiative not found: ${args.slug}`);\n }\n\n const cwd = path.resolve(process.cwd());\n if (isInside(cwd, from)) {\n throw new UsageError(\n `Refusing to archive: current working directory is inside ${from}. cd elsewhere first.`,\n );\n }\n\n const archiveRoot = path.resolve(ctx.activeRoot, '..');\n const destDir = path.join(archiveRoot, args.domain, 'archive');\n const to = path.join(destDir, `${args.slug}-${yearMonth()}`);\n\n if (await dirExists(to)) {\n throw new ValidationError(`Archive destination already exists: ${to}`);\n }\n\n await fs.mkdir(destDir, { recursive: true });\n\n try {\n await fs.rename(from, to);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EXDEV') {\n await fs.cp(from, to, { recursive: true });\n await fs.rm(from, { recursive: true, force: true });\n } else {\n throw err;\n }\n }\n\n return { from, to };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport matter from 'gray-matter';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema, type BriefFrontmatter } from '../schemas/brief.js';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { writeYaml } from '../utils/yaml-io.js';\nimport { today } from '../utils/today.js';\nimport { validateSlug, derivePrefix } from '../utils/slug.js';\nimport { ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n title: z.string().min(1),\n ship_target: z.string().min(1).optional(),\n owner: z.string().min(1).optional(),\n worktree: z.string().min(1).optional(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n dir: z.string(),\n rank: z.number().int().positive(),\n task_prefix: z.string(),\n});\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nasync function computeNextRank(activeRoot: string): Promise<number> {\n let entries: string[];\n try {\n entries = await fs.readdir(activeRoot);\n } catch {\n return 1;\n }\n let max = 0;\n for (const entry of entries) {\n if (entry.startsWith('.')) continue;\n const briefPath = path.join(activeRoot, entry, 'brief.md');\n let raw: string;\n try {\n raw = await fs.readFile(briefPath, 'utf8');\n } catch {\n continue;\n }\n const parsed = matter(raw);\n const data = parsed.data as Record<string, unknown>;\n if (data.state === 'focused' && typeof data.rank === 'number' && data.rank > max) {\n max = data.rank;\n }\n }\n return max + 1;\n}\n\nexport default defineCommand({\n name: 'new',\n description: 'Scaffold a new initiative directory.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n title: { long: '--title', description: 'Initiative title', required: true },\n ship_target: { long: '--ship-target', description: 'Ship target (e.g., 2026-Q3)' },\n owner: { long: '--owner', description: 'Owner / handle' },\n worktree: { long: '--worktree', description: 'Default worktree path' },\n },\n usage: 'active-work new <slug> --title <title> [--ship-target <t>] [--owner <o>] [--worktree <path>]',\n },\n async run(args, ctx) {\n const slugCheck = validateSlug(args.slug);\n if (!slugCheck.ok) {\n throw new ValidationError(`Invalid slug \"${args.slug}\": ${slugCheck.error}`);\n }\n\n const dir = path.join(ctx.activeRoot, args.slug);\n if (await dirExists(dir)) {\n throw new ValidationError(`Initiative already exists: ${args.slug} (${dir})`);\n }\n\n const rank = await computeNextRank(ctx.activeRoot);\n const task_prefix = derivePrefix(args.slug);\n\n const frontmatter: BriefFrontmatter = {\n schema_version: 1,\n title: args.title,\n updated: today(),\n state: 'focused',\n rank,\n task_prefix,\n ...(args.ship_target ? { ship_target: args.ship_target } : {}),\n ...(args.owner ? { owner: args.owner } : {}),\n ...(args.worktree\n ? { worktrees: { main: { path: args.worktree, default: true } } }\n : {}),\n };\n\n await fs.mkdir(dir, { recursive: true });\n await fs.mkdir(path.join(dir, 'tasks'), { recursive: true });\n await fs.mkdir(path.join(dir, 'sessions'), { recursive: true });\n await fs.mkdir(path.join(dir, 'sources'), { recursive: true });\n\n const briefBody = `# ${args.title}\\n\\nWhy: ...\\n`;\n await writeFrontmatter(\n path.join(dir, 'brief.md'),\n frontmatter,\n briefBody,\n BriefFrontmatterSchema,\n );\n\n const handoffBody = `# Current state\\n\\n_(write a paragraph here)_\\n`;\n await fs.writeFile(path.join(dir, 'handoff.md'), handoffBody, 'utf8');\n\n await writeYaml(\n path.join(dir, 'artifacts.yml'),\n { branches: [], stashes: [] },\n ArtifactsSchema,\n );\n\n return {\n slug: args.slug,\n dir,\n rank,\n task_prefix,\n };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport matter from 'gray-matter';\nimport type { ZodType } from 'zod';\nimport { atomicWrite } from './fs-atomic.js';\nimport { coerceDates } from './coerce-dates.js';\n\nexport interface FrontmatterFile<T> {\n frontmatter: T;\n body: string;\n}\n\n/**\n * Read a markdown file with YAML frontmatter and validate the frontmatter\n * against `schema`.\n *\n * Throws when the file is unreadable or the frontmatter does not satisfy the\n * schema. Errors include the file path so the caller can act on them.\n */\nexport async function readFrontmatter<T>(\n filePath: string,\n schema: ZodType<T>,\n): Promise<FrontmatterFile<T>> {\n const raw = await fs.readFile(filePath, 'utf8');\n const parsed = matter(raw);\n const coerced = coerceDates(parsed.data);\n const result = schema.safeParse(coerced);\n if (!result.success) {\n throw new Error(\n `Frontmatter validation failed for ${filePath}: ${result.error.message}`,\n );\n }\n return { frontmatter: result.data, body: parsed.content };\n}\n\n/**\n * Read a markdown file's frontmatter without schema validation.\n *\n * Used by repair-style flows (e.g. `active-work set`) that need to fix files whose\n * frontmatter is currently invalid.\n */\nexport async function readRawFrontmatter(\n filePath: string,\n): Promise<{ frontmatter: Record<string, unknown>; body: string }> {\n const raw = await fs.readFile(filePath, 'utf8');\n const parsed = matter(raw);\n const coerced = coerceDates(parsed.data) as Record<string, unknown>;\n return {\n frontmatter: { ...coerced },\n body: parsed.content,\n };\n}\n\n/**\n * Validate `frontmatter` against `schema`, then atomically write the\n * combined frontmatter + body to `filePath`.\n */\nexport async function writeFrontmatter<T>(\n filePath: string,\n frontmatter: T,\n body: string,\n schema: ZodType<T>,\n): Promise<void> {\n const result = schema.safeParse(frontmatter);\n if (!result.success) {\n throw new Error(\n `Frontmatter validation failed for ${filePath}: ${result.error.message}`,\n );\n }\n const stringified = matter.stringify(body, result.data as object);\n await atomicWrite(filePath, stringified);\n}\n","const SLUG_PATTERN = /^[a-z][a-z0-9-]*[a-z0-9]$/;\nconst MIN_LEN = 2;\nconst MAX_LEN = 60;\nconst MAX_PREFIX_LEN = 8;\n\nexport type SlugValidation = { ok: true } | { ok: false; error: string };\n\n/**\n * Validate a kebab-case slug.\n *\n * Rules:\n * - 2-60 characters long\n * - lowercase letters, digits, and `-` only\n * - starts with a letter, ends with a letter or digit\n * - no consecutive dashes\n */\nexport function validateSlug(s: string): SlugValidation {\n if (typeof s !== 'string' || s.length === 0) {\n return { ok: false, error: 'slug must be a non-empty string' };\n }\n if (s.length < MIN_LEN) {\n return { ok: false, error: `slug must be at least ${MIN_LEN} characters` };\n }\n if (s.length > MAX_LEN) {\n return { ok: false, error: `slug must be at most ${MAX_LEN} characters` };\n }\n if (s.includes('--')) {\n return { ok: false, error: 'slug must not contain consecutive dashes' };\n }\n if (!SLUG_PATTERN.test(s)) {\n return {\n ok: false,\n error:\n 'slug must be lowercase kebab-case: start with a letter, end with a letter or digit, allow [a-z0-9-]',\n };\n }\n return { ok: true };\n}\n\n/**\n * Derive a Jira-style task prefix from a slug.\n *\n * Takes the first character of each `-`-separated segment, uppercases each,\n * and concatenates. Truncates to 8 characters.\n *\n * @example\n * derivePrefix('ec-personalization') // 'EP'\n * derivePrefix('inbox') // 'I'\n * derivePrefix('auth-service-v2') // 'ASV'\n */\nexport function derivePrefix(slug: string): string {\n const letters = slug\n .split('-')\n .filter((segment) => segment.length > 0)\n .map((segment) => segment[0]!.toUpperCase())\n .join('');\n return letters.slice(0, MAX_PREFIX_LEN);\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { NotFoundError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n brief: z.string(),\n handoff: z.string(),\n tasks_dir: z.string(),\n sessions_dir: z.string(),\n artifacts: z.string(),\n sources_dir: z.string(),\n});\n\nexport default defineCommand({\n name: 'paths',\n description: 'Print all artifact paths for an initiative.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n usage: 'active-work paths <slug>',\n },\n async run(args, ctx) {\n const dir = path.join(ctx.activeRoot, args.slug);\n try {\n const stat = await fs.stat(dir);\n if (!stat.isDirectory()) {\n throw new NotFoundError(`Initiative not found: ${args.slug}`);\n }\n } catch (err) {\n if (err instanceof NotFoundError) throw err;\n throw new NotFoundError(`Initiative not found: ${args.slug}`);\n }\n\n return {\n brief: path.join(dir, 'brief.md'),\n handoff: path.join(dir, 'handoff.md'),\n tasks_dir: path.join(dir, 'tasks'),\n sessions_dir: path.join(dir, 'sessions'),\n artifacts: path.join(dir, 'artifacts.yml'),\n sources_dir: path.join(dir, 'sources'),\n };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { validateSlug } from '../utils/slug.js';\nimport { NotFoundError, ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n old_slug: z.string().min(1),\n new_slug: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n from: z.string(),\n to: z.string(),\n});\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport default defineCommand({\n name: 'rename',\n description: 'Rename an initiative slug (moves the directory; task_prefix unchanged).',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['old_slug', 'new_slug'],\n usage: 'active-work rename <old-slug> <new-slug>',\n },\n async run(args, ctx) {\n const check = validateSlug(args.new_slug);\n if (!check.ok) {\n throw new ValidationError(`Invalid new slug \"${args.new_slug}\": ${check.error}`);\n }\n\n const from = path.join(ctx.activeRoot, args.old_slug);\n const to = path.join(ctx.activeRoot, args.new_slug);\n\n if (!(await dirExists(from))) {\n throw new NotFoundError(`Initiative not found: ${args.old_slug}`);\n }\n if (await dirExists(to)) {\n throw new ValidationError(`Destination already exists: ${args.new_slug}`);\n }\n\n await fs.rename(from, to);\n return { from, to };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema } from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readRawFrontmatter, writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n field: z.string().min(1),\n value: z.unknown(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n field: z.string(),\n value: z.unknown(),\n});\n\nfunction setPath(target: Record<string, unknown>, dotted: string, value: unknown): void {\n const parts = dotted.split('.').filter((p) => p.length > 0);\n if (parts.length === 0) {\n throw new ValidationError('Field path must not be empty');\n }\n let cursor: Record<string, unknown> = target;\n for (let i = 0; i < parts.length - 1; i++) {\n const key = parts[i]!;\n const next = cursor[key];\n if (next === undefined || next === null || typeof next !== 'object' || Array.isArray(next)) {\n const fresh: Record<string, unknown> = {};\n cursor[key] = fresh;\n cursor = fresh;\n } else {\n cursor = next as Record<string, unknown>;\n }\n }\n cursor[parts[parts.length - 1]!] = value;\n}\n\nexport default defineCommand({\n name: 'set',\n description: 'Set a single field on an initiative brief.md frontmatter.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'field', 'value'],\n usage: 'active-work set <slug> <field> <value>',\n },\n async run(args, ctx) {\n const dir = path.join(ctx.activeRoot, args.slug);\n const briefPath = path.join(dir, 'brief.md');\n try {\n await fs.access(briefPath);\n } catch {\n throw new NotFoundError(`Initiative not found: ${args.slug}`);\n }\n\n await withFileLock(getLockPath(args.slug), async () => {\n const { frontmatter, body } = await readRawFrontmatter(briefPath);\n setPath(frontmatter, args.field, args.value);\n frontmatter.updated = today();\n try {\n await writeFrontmatter(briefPath, frontmatter, body, BriefFrontmatterSchema);\n } catch (err) {\n const reason = err instanceof Error ? err.message : String(err);\n throw new ValidationError(\n `Cannot set ${args.field}=${JSON.stringify(args.value)}: ${reason}`,\n );\n }\n });\n\n return { slug: args.slug, field: args.field, value: args.value };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema } from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readRawFrontmatter, writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n updated: z.string(),\n});\n\nexport default defineCommand({\n name: 'touch',\n description: \"Stamp `updated: today()` on an initiative's brief.md.\",\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n usage: 'active-work touch <slug>',\n },\n async run(args, ctx) {\n const briefPath = path.join(ctx.activeRoot, args.slug, 'brief.md');\n try {\n await fs.access(briefPath);\n } catch {\n throw new NotFoundError(`Initiative not found: ${args.slug}`);\n }\n\n const updated = today();\n await withFileLock(getLockPath(args.slug), async () => {\n const { frontmatter, body } = await readRawFrontmatter(briefPath);\n frontmatter.updated = updated;\n await writeFrontmatter(briefPath, frontmatter, body, BriefFrontmatterSchema);\n });\n\n return { slug: args.slug, updated };\n },\n});\n","import { z } from 'zod';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, UsageError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\nimport {\n loadAllBriefs,\n sortSlugs,\n type InitiativeBrief,\n} from './_focus-helpers.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n rank: z.number().int().positive().optional(),\n});\n\nconst ShiftEntrySchema = z.object({\n slug: z.string(),\n from: z.number().int().positive().optional(),\n to: z.number().int().positive(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n rank: z.number().int().positive(),\n shifted: z.array(ShiftEntrySchema),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\ninterface RankedSlug {\n slug: string;\n rank: number;\n}\n\nfunction buildRanking(briefs: InitiativeBrief[]): RankedSlug[] {\n return briefs\n .filter((b) => b.frontmatter.state === 'focused')\n .map((b) => {\n // schema guarantees rank is present when state is focused\n const rank = b.frontmatter.rank;\n if (rank === undefined) {\n throw new Error(\n `Focused initiative ${b.slug} is missing rank in brief.md`,\n );\n }\n return { slug: b.slug, rank };\n })\n .sort((a, b) => a.rank - b.rank);\n}\n\nexport default defineCommand<Args, Result>({\n name: 'focus',\n description: 'Promote an initiative into the focused list at a given rank.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n rank: {\n long: '--rank',\n description: 'Target rank (positive integer). Defaults to end of list.',\n },\n },\n usage: 'active-work focus <slug> [--rank N]',\n },\n async run({ slug, rank }) {\n const briefs = await loadAllBriefs();\n const target = briefs.find((b) => b.slug === slug);\n if (!target) {\n throw new NotFoundError(`Initiative not found: ${slug}`);\n }\n\n const ranked = buildRanking(briefs);\n const currentRank = ranked.find((r) => r.slug === slug)?.rank;\n const withoutTarget = ranked.filter((r) => r.slug !== slug);\n\n let desired: number;\n if (rank === undefined) {\n // Append: 1 if no one focused (excluding target), else max+1.\n desired = withoutTarget.length === 0\n ? 1\n : Math.max(...withoutTarget.map((r) => r.rank)) + 1;\n } else {\n const maxAllowed = withoutTarget.length + 1;\n if (rank > maxAllowed) {\n throw new UsageError(\n `rank ${rank} exceeds maximum of ${maxAllowed} for the focused list`,\n );\n }\n desired = rank;\n }\n\n // Compute the new ranking.\n const finalRanking: RankedSlug[] = withoutTarget.map((r) => ({\n slug: r.slug,\n rank: r.rank >= desired ? r.rank + 1 : r.rank,\n }));\n finalRanking.push({ slug, rank: desired });\n finalRanking.sort((a, b) => a.rank - b.rank);\n\n // Determine which briefs actually changed so we only rewrite those.\n const changes = new Map<string, { from?: number; to: number }>();\n for (const entry of finalRanking) {\n const prior = ranked.find((r) => r.slug === entry.slug)?.rank;\n const sameState =\n entry.slug === slug\n ? target.frontmatter.state === 'focused' && prior === entry.rank\n : prior === entry.rank;\n if (!sameState) {\n changes.set(entry.slug, { from: prior, to: entry.rank });\n }\n }\n\n // Always include target if it wasn't focused before, even if rank\n // somehow matches (defensive).\n if (!changes.has(slug)) {\n changes.set(slug, { from: currentRank, to: desired });\n }\n\n const updateDate = today();\n const lockOrder = sortSlugs(changes.keys());\n await applyLocked(lockOrder, async () => {\n for (const slugToWrite of lockOrder) {\n const change = changes.get(slugToWrite);\n if (!change) continue;\n const brief = briefs.find((b) => b.slug === slugToWrite);\n if (!brief) {\n throw new NotFoundError(\n `Initiative ${slugToWrite} disappeared mid-update`,\n );\n }\n const next: BriefFrontmatter = {\n ...brief.frontmatter,\n state: 'focused',\n rank: change.to,\n updated: updateDate,\n };\n // Clear paused-only fields just in case target was paused; safe noop\n // for already-focused entries.\n delete (next as Partial<BriefFrontmatter>).paused_since;\n delete (next as Partial<BriefFrontmatter>).restart_trigger;\n await writeFrontmatter(\n brief.briefPath,\n next,\n brief.body,\n BriefFrontmatterSchema,\n );\n }\n });\n\n const shifted = [...changes.entries()]\n .filter(([s]) => s !== slug)\n .map(([s, c]) => ({ slug: s, from: c.from, to: c.to }))\n .sort((a, b) => a.to - b.to);\n\n return { slug, rank: desired, shifted };\n },\n});\n\nasync function applyLocked(\n slugs: string[],\n fn: () => Promise<void>,\n): Promise<void> {\n // Acquire all locks in deterministic order. Nest withFileLock calls so\n // releases happen in reverse order.\n const recurse = async (index: number): Promise<void> => {\n if (index === slugs.length) {\n await fn();\n return;\n }\n await withFileLock(getLockPath(slugs[index]), () => recurse(index + 1));\n };\n await recurse(0);\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getActiveRoot, getInitiativeDir } from '../utils/paths.js';\nimport { readFrontmatter } from '../utils/gray-matter-io.js';\n\nexport interface InitiativeBrief {\n slug: string;\n briefPath: string;\n frontmatter: BriefFrontmatter;\n body: string;\n}\n\n/**\n * Resolve the path to an initiative's `brief.md` for a given slug.\n */\nexport function briefPathFor(slug: string): string {\n return path.join(getInitiativeDir(slug), 'brief.md');\n}\n\n/**\n * Enumerate every initiative directory under the active root by looking for\n * `brief.md`. Returns the parsed and schema-validated frontmatter for each.\n *\n * Directories with no `brief.md` are skipped silently — those are not\n * initiatives. Hidden files (e.g. `.schema-version`) are ignored.\n */\nexport async function loadAllBriefs(): Promise<InitiativeBrief[]> {\n const root = getActiveRoot();\n let entries: string[];\n try {\n entries = await fs.readdir(root);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n\n const briefs: InitiativeBrief[] = [];\n for (const name of entries) {\n if (name.startsWith('.')) continue;\n const briefPath = path.join(root, name, 'brief.md');\n let stat;\n try {\n stat = await fs.stat(briefPath);\n } catch {\n continue;\n }\n if (!stat.isFile()) continue;\n const { frontmatter, body } = await readFrontmatter(\n briefPath,\n BriefFrontmatterSchema,\n );\n briefs.push({ slug: name, briefPath, frontmatter, body });\n }\n briefs.sort((a, b) => a.slug.localeCompare(b.slug));\n return briefs;\n}\n\n/**\n * Sort a list of slugs into a deterministic order suitable for locking\n * multiple initiatives' brief.md files simultaneously without deadlock.\n */\nexport function sortSlugs(slugs: Iterable<string>): string[] {\n return [...new Set(slugs)].sort();\n}\n","import { z } from 'zod';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\nimport { loadAllBriefs, sortSlugs } from './_focus-helpers.js';\n\nconst ISO_DATE_REGEX = /^\\d{4}-\\d{2}-\\d{2}$/;\n\nconst isoDate = z\n .string()\n .regex(ISO_DATE_REGEX, 'since must be YYYY-MM-DD')\n .refine((v) => {\n const parsed = new Date(v);\n if (Number.isNaN(parsed.getTime())) return false;\n return parsed.toISOString().slice(0, 10) === v;\n }, 'since must be a valid calendar date');\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n since: isoDate,\n restart_trigger: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n paused_since: z.string(),\n restart_trigger: z.string(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'pause',\n description: 'Mark an initiative as paused with required restart metadata.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n since: {\n long: '--since',\n description: 'Pause-since date (YYYY-MM-DD).',\n required: true,\n },\n 'restart-trigger': {\n long: '--restart-trigger',\n description: 'What event should cause this initiative to resume.',\n required: true,\n },\n },\n usage: 'active-work pause <slug> --since YYYY-MM-DD --restart-trigger \"...\"',\n },\n async run({ slug, since, restart_trigger }) {\n const briefs = await loadAllBriefs();\n const target = briefs.find((b) => b.slug === slug);\n if (!target) {\n throw new NotFoundError(`Initiative not found: ${slug}`);\n }\n\n const wasFocused = target.frontmatter.state === 'focused';\n const survivors = wasFocused\n ? briefs\n .filter(\n (b) => b.frontmatter.state === 'focused' && b.slug !== slug,\n )\n .map((b) => {\n if (b.frontmatter.rank === undefined) {\n throw new Error(`Focused initiative ${b.slug} missing rank`);\n }\n return { slug: b.slug, rank: b.frontmatter.rank };\n })\n .sort((a, b) => a.rank - b.rank)\n : [];\n\n const renumberOps: { slug: string; to: number }[] = [];\n survivors.forEach((s, i) => {\n const newRank = i + 1;\n if (s.rank !== newRank) {\n renumberOps.push({ slug: s.slug, to: newRank });\n }\n });\n\n const updateDate = today();\n const slugsToLock = sortSlugs([slug, ...renumberOps.map((r) => r.slug)]);\n\n await applyLocked(slugsToLock, async () => {\n const paused: BriefFrontmatter = {\n ...target.frontmatter,\n state: 'paused',\n paused_since: since,\n restart_trigger,\n updated: updateDate,\n };\n delete (paused as Partial<BriefFrontmatter>).rank;\n await writeFrontmatter(\n target.briefPath,\n paused,\n target.body,\n BriefFrontmatterSchema,\n );\n\n for (const op of renumberOps) {\n const brief = briefs.find((b) => b.slug === op.slug);\n if (!brief) continue;\n const next: BriefFrontmatter = {\n ...brief.frontmatter,\n state: 'focused',\n rank: op.to,\n updated: updateDate,\n };\n await writeFrontmatter(\n brief.briefPath,\n next,\n brief.body,\n BriefFrontmatterSchema,\n );\n }\n });\n\n return { slug, paused_since: since, restart_trigger };\n },\n});\n\nasync function applyLocked(\n slugs: string[],\n fn: () => Promise<void>,\n): Promise<void> {\n const recurse = async (index: number): Promise<void> => {\n if (index === slugs.length) {\n await fn();\n return;\n }\n await withFileLock(getLockPath(slugs[index]), () => recurse(index + 1));\n };\n await recurse(0);\n}\n","import { z } from 'zod';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, UsageError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\nimport { loadAllBriefs, sortSlugs } from './_focus-helpers.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n});\n\nconst RenumberEntrySchema = z.object({\n slug: z.string(),\n from: z.number().int().positive(),\n to: z.number().int().positive(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n renumbered: z.array(RenumberEntrySchema),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'unfocus',\n description: 'Demote a focused initiative to backburner and renumber survivors.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n usage: 'active-work unfocus <slug>',\n },\n async run({ slug }) {\n const briefs = await loadAllBriefs();\n const target = briefs.find((b) => b.slug === slug);\n if (!target) {\n throw new NotFoundError(`Initiative not found: ${slug}`);\n }\n if (target.frontmatter.state !== 'focused') {\n throw new UsageError(\n `Cannot unfocus ${slug}: state is ${target.frontmatter.state}`,\n );\n }\n\n const survivors = briefs\n .filter((b) => b.frontmatter.state === 'focused' && b.slug !== slug)\n .map((b) => {\n if (b.frontmatter.rank === undefined) {\n throw new Error(`Focused initiative ${b.slug} missing rank`);\n }\n return { slug: b.slug, rank: b.frontmatter.rank };\n })\n .sort((a, b) => a.rank - b.rank);\n\n const renumberOps: { slug: string; from: number; to: number }[] = [];\n survivors.forEach((s, i) => {\n const newRank = i + 1;\n if (s.rank !== newRank) {\n renumberOps.push({ slug: s.slug, from: s.rank, to: newRank });\n }\n });\n\n const updateDate = today();\n const slugsToLock = sortSlugs([slug, ...renumberOps.map((r) => r.slug)]);\n\n await applyLocked(slugsToLock, async () => {\n // Write target.\n const cleared: BriefFrontmatter = {\n ...target.frontmatter,\n state: 'backburner',\n updated: updateDate,\n };\n delete (cleared as Partial<BriefFrontmatter>).rank;\n await writeFrontmatter(\n target.briefPath,\n cleared,\n target.body,\n BriefFrontmatterSchema,\n );\n\n // Renumber survivors that actually moved.\n for (const op of renumberOps) {\n const brief = briefs.find((b) => b.slug === op.slug);\n if (!brief) continue;\n const next: BriefFrontmatter = {\n ...brief.frontmatter,\n state: 'focused',\n rank: op.to,\n updated: updateDate,\n };\n await writeFrontmatter(\n brief.briefPath,\n next,\n brief.body,\n BriefFrontmatterSchema,\n );\n }\n });\n\n return { slug, renumbered: renumberOps };\n },\n});\n\nasync function applyLocked(\n slugs: string[],\n fn: () => Promise<void>,\n): Promise<void> {\n const recurse = async (index: number): Promise<void> => {\n if (index === slugs.length) {\n await fn();\n return;\n }\n await withFileLock(getLockPath(slugs[index]), () => recurse(index + 1));\n };\n await recurse(0);\n}\n","import { z } from 'zod';\nimport {\n BriefFrontmatterSchema,\n type BriefFrontmatter,\n} from '../schemas/brief.js';\nimport { getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, UsageError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\nimport { loadAllBriefs } from './_focus-helpers.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'unpause',\n description: 'Move a paused initiative back to backburner.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n usage: 'active-work unpause <slug>',\n },\n async run({ slug }) {\n const briefs = await loadAllBriefs();\n const target = briefs.find((b) => b.slug === slug);\n if (!target) {\n throw new NotFoundError(`Initiative not found: ${slug}`);\n }\n if (target.frontmatter.state !== 'paused') {\n throw new UsageError(\n `Cannot unpause ${slug}: state is ${target.frontmatter.state}`,\n );\n }\n\n await withFileLock(getLockPath(slug), async () => {\n const next: BriefFrontmatter = {\n ...target.frontmatter,\n state: 'backburner',\n updated: today(),\n };\n delete (next as Partial<BriefFrontmatter>).paused_since;\n delete (next as Partial<BriefFrontmatter>).restart_trigger;\n delete (next as Partial<BriefFrontmatter>).rank;\n await writeFrontmatter(\n target.briefPath,\n next,\n target.body,\n BriefFrontmatterSchema,\n );\n });\n\n return { slug };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport {\n getActiveRoot,\n getInitiativeDir,\n getLockPath,\n} from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readRawFrontmatter } from '../utils/gray-matter-io.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, ValidationError } from '../errors.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n title: z.string().min(1),\n priority: z.number().int().positive().optional(),\n severity: z.enum(['critical', 'high', 'medium', 'low']).optional(),\n estimate: z.number().positive().optional(),\n done_when: z.string().min(1).optional(),\n tags: z.array(z.string()).optional(),\n notes: z.string().optional(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst PREFIX_RE = /^[A-Z][A-Z0-9]*$/;\n\nasync function readBriefPrefix(slug: string): Promise<string> {\n const briefPath = path.join(getInitiativeDir(slug), 'brief.md');\n let raw: { frontmatter: Record<string, unknown> };\n try {\n raw = await readRawFrontmatter(briefPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotFoundError(`Initiative not found: ${slug}`);\n }\n throw err;\n }\n const prefix = raw.frontmatter.task_prefix;\n if (typeof prefix !== 'string' || !PREFIX_RE.test(prefix)) {\n throw new ValidationError(\n `Brief at ${briefPath} is missing a valid task_prefix`,\n );\n }\n return prefix;\n}\n\nasync function listTaskFiles(slug: string): Promise<string[]> {\n const dir = path.join(getInitiativeDir(slug), 'tasks');\n try {\n const entries = await fs.readdir(dir);\n return entries.filter((e) => e.endsWith('.yml'));\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n}\n\nasync function loadExistingTasks(slug: string): Promise<Task[]> {\n const files = await listTaskFiles(slug);\n const dir = path.join(getInitiativeDir(slug), 'tasks');\n const tasks: Task[] = [];\n for (const file of files) {\n const task = await readYaml(path.join(dir, file), TaskSchema);\n tasks.push(task);\n }\n return tasks;\n}\n\nfunction nextTaskNumber(prefix: string, existing: Task[]): number {\n let max = 0;\n const re = new RegExp(`^${prefix}-(\\\\d+)$`);\n for (const t of existing) {\n const m = re.exec(t.id);\n if (m) {\n const n = Number.parseInt(m[1]!, 10);\n if (n > max) max = n;\n }\n }\n return max + 1;\n}\n\nfunction nextPriority(existing: Task[]): number {\n let max = 0;\n for (const t of existing) {\n if (t.priority > max) max = t.priority;\n }\n return max + 1;\n}\n\nexport default defineCommand<Args, Task>({\n name: 'task.add',\n description: 'Create a new task in an initiative',\n args: ArgsSchema,\n result: TaskSchema,\n cli: {\n positional: ['slug'],\n options: {\n title: { long: '--title', description: 'Task title', required: true },\n priority: { long: '--priority', description: 'Priority (positive int)' },\n severity: {\n long: '--severity',\n description: 'critical|high|medium|low',\n },\n estimate: { long: '--estimate', description: 'Estimate (hours)' },\n done_when: {\n long: '--done-when',\n description: 'Definition of done',\n },\n tags: { long: '--tags', description: 'Comma-separated tag list' },\n notes: { long: '--notes', description: 'Free-form notes' },\n },\n },\n async run(args) {\n // Touch activeRoot so it's resolved before locking.\n getActiveRoot();\n return withFileLock(getLockPath(args.slug), async () => {\n const prefix = await readBriefPrefix(args.slug);\n const existing = await loadExistingTasks(args.slug);\n const n = nextTaskNumber(prefix, existing);\n const id = `${prefix}-${n}`;\n const priority = args.priority ?? nextPriority(existing);\n const date = today();\n const task: Task = {\n id,\n title: args.title,\n priority,\n severity: args.severity,\n estimate: args.estimate,\n done_when: args.done_when,\n status: 'open',\n tags: args.tags,\n notes: args.notes,\n created: date,\n updated: date,\n done_at: null,\n };\n const taskDir = path.join(getInitiativeDir(args.slug), 'tasks');\n await fs.mkdir(taskDir, { recursive: true });\n await writeYaml(path.join(taskDir, `${id}.yml`), task, TaskSchema);\n return task;\n });\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { getActiveRoot, getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { NotFoundError } from '../errors.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n id: z.string().min(1),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n id: z.string(),\n deleted: z.literal(true),\n});\n\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'task.delete',\n description: 'Hard delete a task file (prefer task.done in normal use)',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'id'],\n },\n async run(args) {\n getActiveRoot();\n return withFileLock(getLockPath(args.slug), async () => {\n const file = path.join(\n getInitiativeDir(args.slug),\n 'tasks',\n `${args.id}.yml`,\n );\n try {\n await fs.unlink(file);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotFoundError(`Task not found: ${args.id}`);\n }\n throw err;\n }\n return { id: args.id, deleted: true };\n });\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport { getActiveRoot, getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError } from '../errors.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n id: z.string().min(1),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nexport default defineCommand<Args, Task>({\n name: 'task.done',\n description: 'Mark a task as done',\n args: ArgsSchema,\n result: TaskSchema,\n cli: {\n positional: ['slug', 'id'],\n },\n async run(args) {\n getActiveRoot();\n return withFileLock(getLockPath(args.slug), async () => {\n const file = path.join(\n getInitiativeDir(args.slug),\n 'tasks',\n `${args.id}.yml`,\n );\n let task: Task;\n try {\n task = await readYaml(file, TaskSchema);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotFoundError(`Task not found: ${args.id}`);\n }\n throw err;\n }\n const date = today();\n const updated: Task = {\n ...task,\n status: 'done',\n done_at: date,\n updated: date,\n };\n await writeYaml(file, updated, TaskSchema);\n return updated;\n });\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport { getActiveRoot, getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, UsageError, ValidationError } from '../errors.js';\n\nconst EDITABLE_FIELDS = [\n 'title',\n 'priority',\n 'severity',\n 'estimate',\n 'done_when',\n 'tags',\n 'notes',\n 'status',\n] as const;\n\ntype EditableField = (typeof EDITABLE_FIELDS)[number];\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n id: z.string().min(1),\n field: z.string().min(1),\n value: z.unknown(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nfunction isEditable(field: string): field is EditableField {\n return (EDITABLE_FIELDS as readonly string[]).includes(field);\n}\n\nexport default defineCommand<Args, Task>({\n name: 'task.edit',\n description: 'Edit a single field on a task',\n args: ArgsSchema,\n result: TaskSchema,\n cli: {\n positional: ['slug', 'id', 'field', 'value'],\n },\n async run(args) {\n if (!isEditable(args.field)) {\n throw new UsageError(\n `Field is not editable: ${args.field} (allowed: ${EDITABLE_FIELDS.join(', ')})`,\n );\n }\n getActiveRoot();\n return withFileLock(getLockPath(args.slug), async () => {\n const file = path.join(\n getInitiativeDir(args.slug),\n 'tasks',\n `${args.id}.yml`,\n );\n let task: Task;\n try {\n task = await readYaml(file, TaskSchema);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n throw new NotFoundError(`Task not found: ${args.id}`);\n }\n throw err;\n }\n const date = today();\n const next: Record<string, unknown> = { ...task, [args.field]: args.value };\n next.updated = date;\n if (args.field === 'status' && args.value === 'done') {\n next.done_at = date;\n }\n const parsed = TaskSchema.safeParse(next);\n if (!parsed.success) {\n throw new ValidationError(\n `Invalid value for ${args.field}: ${parsed.error.message}`,\n );\n }\n await writeYaml(file, parsed.data, TaskSchema);\n return parsed.data;\n });\n },\n});\n","import { promises as fs, type Dirent } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport { getActiveRoot, getInitiativeDir } from '../utils/paths.js';\nimport { readYaml } from '../utils/yaml-io.js';\nimport { UsageError } from '../errors.js';\n\nconst StatusFilter = z.enum(['open', 'done', 'all']).default('open');\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1).optional(),\n all_initiatives: z.boolean().optional(),\n tag: z.string().optional(),\n severity: z.enum(['critical', 'high', 'medium', 'low']).optional(),\n status: StatusFilter.optional(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\ntype TaskWithSlug = Task & { slug: string };\n\nconst ResultSchema = z.object({\n tasks: z.array(TaskSchema.extend({ slug: z.string() })),\n});\n\ntype Result = z.infer<typeof ResultSchema>;\n\nasync function listSlugs(): Promise<string[]> {\n const root = getActiveRoot();\n let entries: Dirent[];\n try {\n entries = await fs.readdir(root, { withFileTypes: true });\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n return entries.filter((e) => e.isDirectory()).map((e) => e.name);\n}\n\nasync function loadTasksForSlug(slug: string): Promise<TaskWithSlug[]> {\n const dir = path.join(getInitiativeDir(slug), 'tasks');\n let files: string[];\n try {\n files = await fs.readdir(dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n const tasks: TaskWithSlug[] = [];\n for (const file of files) {\n if (!file.endsWith('.yml')) continue;\n const task = await readYaml(path.join(dir, file), TaskSchema);\n tasks.push({ ...task, slug });\n }\n return tasks;\n}\n\nexport default defineCommand<Args, Result>({\n name: 'task.list',\n description: 'List tasks for an initiative or across all initiatives',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n all_initiatives: {\n long: '--all-initiatives',\n description: 'Scan every initiative under the active root',\n },\n tag: { long: '--tag', description: 'Filter by tag membership' },\n severity: {\n long: '--severity',\n description: 'Filter by severity (critical|high|medium|low)',\n },\n status: {\n long: '--status',\n description: 'open (default), done, or all',\n },\n },\n },\n async run(args) {\n const status = args.status ?? 'open';\n const slugs: string[] = args.all_initiatives\n ? await listSlugs()\n : (() => {\n if (!args.slug) {\n throw new UsageError(\n 'task.list requires --all-initiatives or a slug',\n );\n }\n return [args.slug];\n })();\n\n let collected: TaskWithSlug[] = [];\n for (const slug of slugs) {\n const tasks = await loadTasksForSlug(slug);\n collected = collected.concat(tasks);\n }\n\n const filtered = collected.filter((t) => {\n if (status !== 'all' && t.status !== status) return false;\n if (args.tag && !(t.tags ?? []).includes(args.tag)) return false;\n if (args.severity && t.severity !== args.severity) return false;\n return true;\n });\n\n filtered.sort((a, b) => a.priority - b.priority);\n return { tasks: filtered };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { TaskSchema, type Task } from '../schemas/task.js';\nimport { getActiveRoot, getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError } from '../errors.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n id: z.string().min(1),\n new_priority: z.number().int().positive(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ShiftedSchema = z.object({\n id: z.string(),\n from: z.number().int(),\n to: z.number().int(),\n});\n\nconst ResultSchema = z.object({\n id: z.string(),\n from: z.number().int(),\n to: z.number().int(),\n shifted: z.array(ShiftedSchema),\n});\n\ntype Result = z.infer<typeof ResultSchema>;\n\nasync function loadAllTasks(\n slug: string,\n): Promise<Array<{ task: Task; file: string }>> {\n const dir = path.join(getInitiativeDir(slug), 'tasks');\n let files: string[];\n try {\n files = await fs.readdir(dir);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n const out: Array<{ task: Task; file: string }> = [];\n for (const file of files) {\n if (!file.endsWith('.yml')) continue;\n const full = path.join(dir, file);\n out.push({ task: await readYaml(full, TaskSchema), file: full });\n }\n return out;\n}\n\nexport default defineCommand<Args, Result>({\n name: 'task.reorder',\n description: 'Move a task to a new priority and shift siblings down',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'id', 'new_priority'],\n },\n async run(args) {\n getActiveRoot();\n return withFileLock(getLockPath(args.slug), async () => {\n const entries = await loadAllTasks(args.slug);\n const target = entries.find((e) => e.task.id === args.id);\n if (!target) {\n throw new NotFoundError(`Task not found: ${args.id}`);\n }\n const oldPriority = target.task.priority;\n const newPriority = args.new_priority;\n const shifted: Array<{ id: string; from: number; to: number }> = [];\n const date = today();\n\n if (oldPriority === newPriority) {\n return { id: args.id, from: oldPriority, to: newPriority, shifted };\n }\n\n const writes: Array<{ task: Task; file: string }> = [];\n\n for (const entry of entries) {\n if (entry.task.id === args.id) continue;\n if (entry.task.priority >= newPriority) {\n const before = entry.task.priority;\n const after = before + 1;\n const next: Task = {\n ...entry.task,\n priority: after,\n updated: date,\n };\n writes.push({ task: next, file: entry.file });\n shifted.push({ id: entry.task.id, from: before, to: after });\n }\n }\n\n const targetNext: Task = {\n ...target.task,\n priority: newPriority,\n updated: date,\n };\n writes.push({ task: targetNext, file: target.file });\n\n for (const w of writes) {\n await writeYaml(w.file, w.task, TaskSchema);\n }\n\n return { id: args.id, from: oldPriority, to: newPriority, shifted };\n });\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport matter from 'gray-matter';\nimport { SessionFrontmatterSchema } from '../schemas/session.js';\nimport type { SessionFrontmatter } from '../schemas/session.js';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n limit: z.number().int().positive().optional(),\n});\n\nconst SessionEntrySchema = z.object({\n filename: z.string(),\n frontmatter: SessionFrontmatterSchema,\n first_line: z.string(),\n});\n\nconst ResultSchema = z.object({\n sessions: z.array(SessionEntrySchema),\n errors: z.array(z.object({ filename: z.string(), error: z.string() })),\n});\n\nconst DEFAULT_LIMIT = 100;\nconst MAX_FIRST_LINE = 120;\n\nfunction extractFirstLine(body: string): string {\n const lines = body.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n return trimmed.length > MAX_FIRST_LINE\n ? trimmed.slice(0, MAX_FIRST_LINE)\n : trimmed;\n }\n return '';\n}\n\ninterface ListEntry {\n filename: string;\n frontmatter: SessionFrontmatter;\n first_line: string;\n}\n\ninterface ListError {\n filename: string;\n error: string;\n}\n\nasync function listSessionFiles(dir: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(dir);\n return entries.filter((e) => e.endsWith('.md')).sort();\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return [];\n throw err;\n }\n}\n\n/**\n * YAML parses unquoted ISO 8601 timestamps as `Date` instances. The session\n * schema expects ISO strings, so coerce known timestamp fields back to their\n * string form before validation.\n */\nfunction coerceTimestamps(\n raw: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...raw };\n for (const field of ['started', 'ended'] as const) {\n const value = out[field];\n if (value instanceof Date) {\n out[field] = value.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n }\n }\n return out;\n}\n\nasync function readSession(\n filePath: string,\n): Promise<{ frontmatter: SessionFrontmatter; body: string }> {\n const raw = await fs.readFile(filePath, 'utf8');\n const parsed = matter(raw);\n const coerced = coerceTimestamps(parsed.data as Record<string, unknown>);\n const result = SessionFrontmatterSchema.safeParse(coerced);\n if (!result.success) {\n throw new Error(\n `Frontmatter validation failed for ${filePath}: ${result.error.message}`,\n );\n }\n return { frontmatter: result.data, body: parsed.content };\n}\n\nexport default defineCommand({\n name: 'session.list',\n description: 'List session summaries for an initiative, sorted by end time',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n limit: {\n long: '--limit',\n description: `Maximum sessions to return (default ${DEFAULT_LIMIT})`,\n },\n },\n usage: 'session.list <slug> [--limit N]',\n },\n async run(args) {\n const limit = args.limit ?? DEFAULT_LIMIT;\n const sessionsDir = path.join(getInitiativeDir(args.slug), 'sessions');\n const filenames = await listSessionFiles(sessionsDir);\n\n const entries: ListEntry[] = [];\n const errors: ListError[] = [];\n\n for (const filename of filenames) {\n const fullPath = path.join(sessionsDir, filename);\n try {\n const { frontmatter, body } = await readSession(fullPath);\n entries.push({\n filename,\n frontmatter,\n first_line: extractFirstLine(body),\n });\n } catch (err) {\n errors.push({\n filename,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n entries.sort((a, b) => {\n const aEnded = new Date(a.frontmatter.ended).getTime();\n const bEnded = new Date(b.frontmatter.ended).getTime();\n return bEnded - aEnded;\n });\n\n return { sessions: entries.slice(0, limit), errors };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { SessionFrontmatterSchema } from '../schemas/session.js';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z\n .object({\n slug: z.string().min(1),\n session_id: z.string().min(1),\n started: z.string().min(1),\n ended: z.string().min(1),\n track: z.enum(['canonical', 'sidecar']).default('canonical'),\n body: z.string().optional(),\n body_file: z.string().optional(),\n })\n .superRefine((value, ctx) => {\n const hasBody = value.body !== undefined;\n const hasFile = value.body_file !== undefined;\n if (!hasBody && !hasFile) {\n ctx.addIssue({\n code: 'custom',\n path: ['body'],\n message: 'Exactly one of --body or --body-file is required',\n });\n }\n if (hasBody && hasFile) {\n ctx.addIssue({\n code: 'custom',\n path: ['body'],\n message: '--body and --body-file are mutually exclusive',\n });\n }\n });\n\nconst ResultSchema = z.object({\n path: z.string(),\n filename: z.string(),\n});\n\nfunction formatStartedStamp(started: string): string {\n const parsed = new Date(started);\n if (Number.isNaN(parsed.getTime())) {\n throw new ValidationError(`Invalid started timestamp: ${started}`);\n }\n const yyyy = parsed.getUTCFullYear().toString().padStart(4, '0');\n const mm = (parsed.getUTCMonth() + 1).toString().padStart(2, '0');\n const dd = parsed.getUTCDate().toString().padStart(2, '0');\n const hh = parsed.getUTCHours().toString().padStart(2, '0');\n const min = parsed.getUTCMinutes().toString().padStart(2, '0');\n return `${yyyy}-${mm}-${dd}-${hh}${min}`;\n}\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function pickAvailableFilename(\n dir: string,\n baseName: string,\n): Promise<{ filename: string; fullPath: string }> {\n const initial = `${baseName}.md`;\n const initialPath = path.join(dir, initial);\n if (!(await exists(initialPath))) {\n return { filename: initial, fullPath: initialPath };\n }\n for (let i = 1; i < 10_000; i++) {\n const candidate = `${baseName}-${i}.md`;\n const candidatePath = path.join(dir, candidate);\n if (!(await exists(candidatePath))) {\n return { filename: candidate, fullPath: candidatePath };\n }\n }\n throw new Error(`Could not find an available filename for ${baseName}`);\n}\n\nexport default defineCommand({\n name: 'session.record',\n description: 'Write a session summary file under <slug>/sessions/',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n session_id: {\n long: '--session-id',\n description: 'Claude session identifier',\n required: true,\n },\n started: {\n long: '--started',\n description: 'ISO 8601 session start timestamp',\n required: true,\n },\n ended: {\n long: '--ended',\n description: 'ISO 8601 session end timestamp',\n required: true,\n },\n track: {\n long: '--track',\n description: \"'canonical' | 'sidecar' (default: canonical)\",\n },\n body: {\n long: '--body',\n description: 'Raw markdown body',\n },\n body_file: {\n long: '--body-file',\n description: 'Path to a file containing the markdown body',\n },\n },\n usage: 'session.record <slug> --session-id <id> --started <iso> --ended <iso> [--track canonical|sidecar] (--body <text> | --body-file <path>)',\n },\n async run(args) {\n const sessionsDir = path.join(getInitiativeDir(args.slug), 'sessions');\n await fs.mkdir(sessionsDir, { recursive: true });\n\n const stamp = formatStartedStamp(args.started);\n const baseName = `${stamp}-${args.session_id}`;\n const { filename, fullPath } = await pickAvailableFilename(\n sessionsDir,\n baseName,\n );\n\n const body = args.body ?? (await fs.readFile(args.body_file!, 'utf8'));\n\n await writeFrontmatter(\n fullPath,\n {\n session_id: args.session_id,\n started: args.started,\n ended: args.ended,\n track: args.track,\n },\n body,\n SessionFrontmatterSchema,\n );\n\n return { path: fullPath, filename };\n },\n});\n","import { promises as fs, createReadStream } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport readline from 'node:readline';\nimport { z } from 'zod';\nimport { getActiveRoot, expandTilde } from '../utils/paths.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n limit: z.number().int().positive().optional(),\n include_active: z.boolean().optional(),\n});\n\nconst SessionEntrySchema = z.object({\n session_id: z.string(),\n cwd: z.string(),\n ended: z.string(),\n summary: z.string(),\n});\n\nconst ResultSchema = z.object({\n sessions: z.array(SessionEntrySchema),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\ntype SessionEntry = z.infer<typeof SessionEntrySchema>;\n\nconst DEFAULT_LIMIT = 50;\nconst SUMMARY_MAX = 150;\nconst CONTINUATION_MARKER = 'This session is being continued from a previous conversation';\n\nfunction claudeProjectsRoot(): string {\n const override = process.env.CLAUDE_PROJECTS_ROOT;\n if (override && override.length > 0) {\n return path.resolve(expandTilde(override));\n }\n return path.join(os.homedir(), '.claude', 'projects');\n}\n\ninterface ScannedSession {\n sessionId: string;\n cwd: string;\n mtimeMs: number;\n filePath: string;\n}\n\n/**\n * Walk the projects root looking for `*.jsonl` session files. Each\n * subdirectory under projects root holds sessions for one safe-encoded\n * working directory.\n */\nasync function listJsonlFiles(root: string): Promise<string[]> {\n let projectDirs: string[];\n try {\n projectDirs = await fs.readdir(root, { withFileTypes: true }).then((entries) =>\n entries.filter((e) => e.isDirectory()).map((e) => path.join(root, e.name)),\n );\n } catch {\n return [];\n }\n const all: string[] = [];\n for (const dir of projectDirs) {\n let files: string[];\n try {\n files = await fs.readdir(dir);\n } catch {\n continue;\n }\n for (const f of files) {\n if (f.endsWith('.jsonl')) {\n all.push(path.join(dir, f));\n }\n }\n }\n return all;\n}\n\n/**\n * Read the first line containing a `\"cwd\"` field without slurping the\n * whole file. Returns `null` when no such line is found.\n */\nasync function lightScanCwd(filePath: string): Promise<string | null> {\n const stream = createReadStream(filePath, { encoding: 'utf8' });\n const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });\n try {\n for await (const line of rl) {\n if (!line.includes('\"cwd\"')) continue;\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n const cwd = parsed.cwd;\n if (typeof cwd === 'string' && cwd.length > 0) {\n return cwd;\n }\n } catch {\n // ignore malformed line; keep scanning\n }\n }\n return null;\n } finally {\n rl.close();\n stream.destroy();\n }\n}\n\nasync function scanSession(filePath: string): Promise<ScannedSession | null> {\n const cwd = await lightScanCwd(filePath);\n if (!cwd) return null;\n const stat = await fs.stat(filePath);\n const sessionId = path.basename(filePath, '.jsonl');\n return { sessionId, cwd, mtimeMs: stat.mtimeMs, filePath };\n}\n\nasync function listActiveInitiativeRoots(): Promise<string[]> {\n const activeRoot = getActiveRoot();\n let entries: Dirent[];\n try {\n entries = await fs.readdir(activeRoot, { withFileTypes: true });\n } catch {\n return [];\n }\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => path.join(activeRoot, e.name));\n}\n\nfunction isPathPrefix(parent: string, child: string): boolean {\n const p = path.resolve(parent);\n const c = path.resolve(child);\n if (p === c) return true;\n const withSep = p.endsWith(path.sep) ? p : p + path.sep;\n return c.startsWith(withSep);\n}\n\nfunction extractFirstUserText(line: string): string | null {\n try {\n const parsed = JSON.parse(line) as Record<string, unknown>;\n if (parsed.type !== 'user') return null;\n const message = parsed.message as Record<string, unknown> | undefined;\n if (!message) return null;\n const content = message.content;\n if (typeof content === 'string') return content;\n if (Array.isArray(content)) {\n for (const part of content) {\n if (\n part &&\n typeof part === 'object' &&\n 'text' in part &&\n typeof (part as { text: unknown }).text === 'string'\n ) {\n return (part as { text: string }).text;\n }\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nfunction truncate(text: string, max: number): string {\n const trimmed = text.replace(/\\s+/g, ' ').trim();\n if (trimmed.length <= max) return trimmed;\n return trimmed.slice(0, max);\n}\n\n/**\n * Stream the jsonl file to extract a summary: prefer the most recent\n * compaction-continuation marker, otherwise fall back to the first\n * user message text.\n */\nasync function extractSummary(filePath: string): Promise<string> {\n const stream = createReadStream(filePath, { encoding: 'utf8' });\n const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });\n let latestContinuation: string | null = null;\n let firstUser: string | null = null;\n try {\n for await (const line of rl) {\n if (line.includes(CONTINUATION_MARKER)) {\n const text = extractFirstUserText(line);\n if (text) latestContinuation = text;\n } else if (firstUser === null) {\n const text = extractFirstUserText(line);\n if (text) firstUser = text;\n }\n }\n } finally {\n rl.close();\n stream.destroy();\n }\n const raw = latestContinuation ?? firstUser ?? '';\n return truncate(raw, SUMMARY_MAX);\n}\n\nexport async function runSessions(args: Args): Promise<Result> {\n const limit = args.limit ?? DEFAULT_LIMIT;\n const includeActive = args.include_active ?? false;\n\n const root = claudeProjectsRoot();\n const files = await listJsonlFiles(root);\n\n const scanned: ScannedSession[] = [];\n for (const f of files) {\n try {\n const entry = await scanSession(f);\n if (entry) scanned.push(entry);\n } catch {\n // ignore unreadable files\n }\n }\n\n let filtered = scanned;\n if (!includeActive) {\n const activeRoots = await listActiveInitiativeRoots();\n if (activeRoots.length > 0) {\n filtered = scanned.filter(\n (s) => !activeRoots.some((root) => isPathPrefix(root, s.cwd)),\n );\n }\n }\n\n filtered.sort((a, b) => b.mtimeMs - a.mtimeMs);\n const top = filtered.slice(0, limit);\n\n const sessions: SessionEntry[] = [];\n for (const entry of top) {\n const summary = await extractSummary(entry.filePath);\n sessions.push({\n session_id: entry.sessionId,\n cwd: entry.cwd,\n ended: new Date(entry.mtimeMs).toISOString(),\n summary,\n });\n }\n\n return { sessions };\n}\n\nconst sessions = defineCommand<Args, Result>({\n name: 'sessions',\n description: 'Browse recent Claude sessions discovered under ~/.claude/projects.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n limit: { long: '--limit', description: 'Max sessions to return (default 50).' },\n include_active: {\n long: '--include-active',\n description: 'Include sessions whose cwd lives under an active initiative.',\n },\n },\n usage: 'active-work sessions [--limit N] [--include-active]',\n },\n async run(args) {\n return runSessions(args);\n },\n});\n\nexport default sessions;\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n repo: z.string().min(1),\n name: z.string().min(1),\n note: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n branch: z.object({\n repo: z.string(),\n name: z.string(),\n note: z.string().optional(),\n }),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'artifact.add-branch',\n description: 'Append or upsert a branch entry in artifacts.yml.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n repo: { long: '--repo', description: 'Repo path or org/repo', required: true },\n name: { long: '--name', description: 'Branch name', required: true },\n note: { long: '--note', description: 'Why this branch is worth tracking' },\n },\n },\n async run(args) {\n const artifactsPath = path.join(getInitiativeDir(args.slug), 'artifacts.yml');\n return withFileLock(getLockPath(args.slug), async () => {\n const current = await readYaml(artifactsPath, ArtifactsSchema);\n const entry = {\n repo: args.repo,\n name: args.name,\n ...(args.note ? { note: args.note } : {}),\n };\n const idx = current.branches.findIndex(\n (b) => b.repo === args.repo && b.name === args.name,\n );\n if (idx >= 0) {\n // Preserve the prior note unless the caller supplied a new one.\n const prior = current.branches[idx]!;\n current.branches[idx] = {\n repo: args.repo,\n name: args.name,\n ...(args.note !== undefined\n ? { note: args.note }\n : prior.note !== undefined\n ? { note: prior.note }\n : {}),\n };\n } else {\n current.branches.push(entry);\n }\n await writeYaml(artifactsPath, current, ArtifactsSchema);\n return { slug: args.slug, branch: current.branches[idx >= 0 ? idx : current.branches.length - 1]! };\n });\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n repo: z.string().min(1),\n label: z.string().min(1),\n sha: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n stash: z.object({\n repo: z.string(),\n label: z.string(),\n sha: z.string().optional(),\n }),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'artifact.add-stash',\n description: 'Append a stash entry to artifacts.yml.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n repo: { long: '--repo', description: 'Repo path', required: true },\n label: { long: '--label', description: 'Stash label', required: true },\n sha: { long: '--sha', description: 'Stash SHA, if known' },\n },\n },\n async run(args) {\n const artifactsPath = path.join(getInitiativeDir(args.slug), 'artifacts.yml');\n return withFileLock(getLockPath(args.slug), async () => {\n const current = await readYaml(artifactsPath, ArtifactsSchema);\n const entry = {\n repo: args.repo,\n label: args.label,\n ...(args.sha ? { sha: args.sha } : {}),\n };\n current.stashes.push(entry);\n await writeYaml(artifactsPath, current, ArtifactsSchema);\n return { slug: args.slug, stash: entry };\n });\n },\n});\n","import { promises as fs, type Dirent } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema, type Artifacts } from '../schemas/artifacts.js';\nimport { getActiveRoot, getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml } from '../utils/yaml-io.js';\nimport { UsageError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().optional(),\n all_initiatives: z.boolean().optional(),\n});\n\nconst ItemSchema = z.object({\n slug: z.string(),\n artifacts: ArtifactsSchema,\n});\n\nconst ResultSchema = z.object({\n items: z.array(ItemSchema),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nasync function readForSlug(slug: string): Promise<Artifacts> {\n const artifactsPath = path.join(getInitiativeDir(slug), 'artifacts.yml');\n return withFileLock(getLockPath(slug), () =>\n readYaml(artifactsPath, ArtifactsSchema),\n );\n}\n\nasync function listInitiativeSlugs(): Promise<string[]> {\n const root = getActiveRoot();\n let entries: Dirent[];\n try {\n entries = await fs.readdir(root, { withFileTypes: true });\n } catch {\n return [];\n }\n const slugs: string[] = [];\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith('.')) continue;\n const artifactsPath = path.join(root, entry.name, 'artifacts.yml');\n try {\n await fs.access(artifactsPath);\n slugs.push(entry.name);\n } catch {\n // skip dirs without artifacts.yml\n }\n }\n slugs.sort();\n return slugs;\n}\n\nexport default defineCommand<Args, Result>({\n name: 'artifact.list',\n description: 'List artifacts for a slug or across all initiatives.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n all_initiatives: {\n long: '--all-initiatives',\n description: 'Return artifacts for every initiative',\n },\n },\n },\n async run(args) {\n if (args.all_initiatives) {\n const slugs = await listInitiativeSlugs();\n const items: Array<{ slug: string; artifacts: Artifacts }> = [];\n for (const slug of slugs) {\n items.push({ slug, artifacts: await readForSlug(slug) });\n }\n return { items };\n }\n if (!args.slug) {\n throw new UsageError(\n 'artifact.list requires <slug> or --all-initiatives',\n );\n }\n const artifacts = await readForSlug(args.slug);\n return { items: [{ slug: args.slug, artifacts }] };\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { UsageError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n repo: z.string().min(1),\n name: z.string().min(1),\n note: z.string().min(1),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n branch: z.object({\n repo: z.string(),\n name: z.string(),\n note: z.string(),\n }),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'artifact.note',\n description: 'Set or update the free-form note on a tracked branch.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n repo: { long: '--repo', description: 'Repo path or org/repo', required: true },\n name: { long: '--name', description: 'Branch name', required: true },\n note: { long: '--note', description: 'Note text', required: true },\n },\n },\n async run(args) {\n const artifactsPath = path.join(getInitiativeDir(args.slug), 'artifacts.yml');\n return withFileLock(getLockPath(args.slug), async () => {\n const current = await readYaml(artifactsPath, ArtifactsSchema);\n const idx = current.branches.findIndex(\n (b) => b.repo === args.repo && b.name === args.name,\n );\n if (idx < 0) {\n throw new UsageError(\n `No tracked branch '${args.name}' in repo '${args.repo}'. Add it first via 'artifact add-branch'.`,\n );\n }\n const updated = { repo: args.repo, name: args.name, note: args.note };\n current.branches[idx] = updated;\n await writeYaml(artifactsPath, current, ArtifactsSchema);\n return { slug: args.slug, branch: updated };\n });\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema, type BranchEntry } from '../schemas/artifacts.js';\nimport { getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml, writeYaml } from '../utils/yaml-io.js';\nimport { defineCommand } from '../registry/index.js';\nimport { getGitRunner, resolveLocalRepoPath } from '../utils/git-gh.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n apply: z.boolean().optional(),\n});\n\nconst PrunedSchema = z.object({\n repo: z.string(),\n name: z.string(),\n reason: z.string(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n applied: z.boolean(),\n pruned: z.array(PrunedSchema),\n kept_count: z.number().int().nonnegative(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nasync function branchExists(repoPath: string, name: string): Promise<boolean> {\n const git = getGitRunner();\n try {\n const res = await git('git', [\n '-C',\n repoPath,\n 'rev-parse',\n '--verify',\n `refs/heads/${name}`,\n ]);\n return res.code === 0;\n } catch {\n return false;\n }\n}\n\nasync function classifyBranch(\n branch: BranchEntry,\n): Promise<{ keep: true } | { keep: false; reason: string }> {\n const repoPath = resolveLocalRepoPath(branch.repo);\n if (!repoPath) {\n // `org/repo` style — we have no local clone to verify against, so\n // keep it: prune should never delete a tracked branch we can't see.\n return { keep: true };\n }\n const present = await branchExists(repoPath, branch.name);\n if (present) return { keep: true };\n return { keep: false, reason: 'branch missing in local repo' };\n}\n\nconst artifactPrune = defineCommand<Args, Result>({\n name: 'artifact.prune',\n description:\n 'List (default) or remove (--apply) tracked branches that no longer exist locally.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n options: {\n apply: {\n long: '--apply',\n description: 'Write the pruned artifacts.yml. Without this, dry-run only.',\n },\n },\n },\n async run(args) {\n const artifactsPath = path.join(getInitiativeDir(args.slug), 'artifacts.yml');\n const apply = args.apply ?? false;\n return withFileLock(getLockPath(args.slug), async () => {\n const current = await readYaml(artifactsPath, ArtifactsSchema);\n const keep: BranchEntry[] = [];\n const pruned: Array<{ repo: string; name: string; reason: string }> = [];\n for (const branch of current.branches) {\n const verdict = await classifyBranch(branch);\n if (verdict.keep) {\n keep.push(branch);\n } else {\n pruned.push({ repo: branch.repo, name: branch.name, reason: verdict.reason });\n }\n }\n if (apply && pruned.length > 0) {\n current.branches = keep;\n await writeYaml(artifactsPath, current, ArtifactsSchema);\n }\n return {\n slug: args.slug,\n applied: apply && pruned.length > 0,\n pruned,\n kept_count: keep.length,\n };\n });\n },\n});\n\nexport default artifactPrune;\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { getInitiativeDir, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readYaml } from '../utils/yaml-io.js';\nimport { defineCommand } from '../registry/index.js';\nimport {\n getGhRunner,\n getGitRunner,\n resolveLocalRepoPath,\n resolveOrgRepo,\n} from '../utils/git-gh.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n});\n\nconst PrInfoSchema = z.object({\n number: z.number().int(),\n state: z.string(),\n title: z.string(),\n url: z.string(),\n checks: z.string().optional(),\n});\n\nconst BranchStatusSchema = z.object({\n repo: z.string(),\n name: z.string(),\n note: z.string().optional(),\n present: z.boolean(),\n last_commit_iso: z.string().nullable(),\n ahead: z.number().int().nullable(),\n behind: z.number().int().nullable(),\n pr: PrInfoSchema.nullable(),\n error: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n branches: z.array(BranchStatusSchema),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\ntype BranchStatus = z.infer<typeof BranchStatusSchema>;\ntype PrInfo = z.infer<typeof PrInfoSchema>;\n\ninterface BranchInput {\n repo: string;\n name: string;\n note?: string;\n}\n\nconst MAX_CONCURRENCY = 8;\n\nexport { setGitRunner, setGhRunner, resetRunners } from '../utils/git-gh.js';\n\n/**\n * Bounded-parallel map. Runs `worker(item)` for each item in `items`,\n * with at most `concurrency` in-flight at any time. Preserves order.\n */\nasync function mapConcurrent<I, O>(\n items: I[],\n concurrency: number,\n worker: (item: I, index: number) => Promise<O>,\n): Promise<O[]> {\n const results: O[] = new Array(items.length);\n let cursor = 0;\n async function pump(): Promise<void> {\n while (true) {\n const i = cursor++;\n if (i >= items.length) return;\n results[i] = await worker(items[i]!, i);\n }\n }\n const lanes = Array.from({ length: Math.min(concurrency, items.length) }, () => pump());\n await Promise.all(lanes);\n return results;\n}\n\nasync function checkBranchPresent(repoPath: string, name: string): Promise<boolean> {\n const git = getGitRunner();\n try {\n const res = await git('git', ['-C', repoPath, 'rev-parse', '--verify', `refs/heads/${name}`]);\n return res.code === 0;\n } catch {\n return false;\n }\n}\n\nasync function lastCommitIso(repoPath: string, name: string): Promise<string | null> {\n const git = getGitRunner();\n try {\n const res = await git('git', ['-C', repoPath, 'log', '-1', '--format=%cI', name]);\n if (res.code !== 0) return null;\n const stamp = res.stdout.trim();\n return stamp.length > 0 ? stamp : null;\n } catch {\n return null;\n }\n}\n\nasync function detectDefaultBase(repoPath: string): Promise<string | null> {\n const git = getGitRunner();\n for (const candidate of ['main', 'master']) {\n try {\n const res = await git('git', [\n '-C',\n repoPath,\n 'rev-parse',\n '--verify',\n `refs/remotes/origin/${candidate}`,\n ]);\n if (res.code === 0) return candidate;\n } catch {\n // continue\n }\n }\n return null;\n}\n\nasync function aheadBehind(\n repoPath: string,\n name: string,\n): Promise<{ ahead: number | null; behind: number | null }> {\n const base = await detectDefaultBase(repoPath);\n if (!base) return { ahead: null, behind: null };\n const git = getGitRunner();\n try {\n const res = await git('git', [\n '-C',\n repoPath,\n 'rev-list',\n '--left-right',\n '--count',\n `origin/${base}...${name}`,\n ]);\n if (res.code !== 0) return { ahead: null, behind: null };\n // Output is \"<behind>\\t<ahead>\" (left is base, right is branch).\n const parts = res.stdout.trim().split(/\\s+/);\n if (parts.length !== 2) return { ahead: null, behind: null };\n const behind = Number(parts[0]);\n const ahead = Number(parts[1]);\n if (!Number.isFinite(behind) || !Number.isFinite(ahead)) {\n return { ahead: null, behind: null };\n }\n return { ahead, behind };\n } catch {\n return { ahead: null, behind: null };\n }\n}\n\nasync function fetchPrInfo(orgRepo: string, name: string): Promise<PrInfo | null> {\n const gh = getGhRunner();\n try {\n const res = await gh('gh', [\n 'pr',\n 'list',\n '--head',\n name,\n '--repo',\n orgRepo,\n '--json',\n 'number,state,title,url,statusCheckRollup',\n '--limit',\n '1',\n ]);\n if (res.code !== 0) return null;\n const parsed = JSON.parse(res.stdout) as Array<{\n number?: number;\n state?: string;\n title?: string;\n url?: string;\n statusCheckRollup?: Array<{ conclusion?: string; state?: string }>;\n }>;\n if (!Array.isArray(parsed) || parsed.length === 0) return null;\n const first = parsed[0]!;\n if (\n typeof first.number !== 'number' ||\n typeof first.state !== 'string' ||\n typeof first.title !== 'string' ||\n typeof first.url !== 'string'\n ) {\n return null;\n }\n const checks = summarizeChecks(first.statusCheckRollup ?? []);\n return {\n number: first.number,\n state: first.state,\n title: first.title,\n url: first.url,\n ...(checks ? { checks } : {}),\n };\n } catch {\n return null;\n }\n}\n\nfunction summarizeChecks(\n rollup: Array<{ conclusion?: string; state?: string }>,\n): string | undefined {\n if (rollup.length === 0) return undefined;\n let pass = 0;\n let fail = 0;\n let pending = 0;\n for (const entry of rollup) {\n const tag = (entry.conclusion ?? entry.state ?? '').toUpperCase();\n if (tag === 'SUCCESS') pass++;\n else if (tag === 'FAILURE' || tag === 'CANCELLED' || tag === 'TIMED_OUT') fail++;\n else pending++;\n }\n if (fail > 0) return `fail (${fail}/${rollup.length})`;\n if (pending > 0) return `pending (${pending}/${rollup.length})`;\n return `pass (${pass}/${rollup.length})`;\n}\n\nasync function statusForBranch(branch: BranchInput): Promise<BranchStatus> {\n const out: BranchStatus = {\n repo: branch.repo,\n name: branch.name,\n ...(branch.note ? { note: branch.note } : {}),\n present: false,\n last_commit_iso: null,\n ahead: null,\n behind: null,\n pr: null,\n };\n\n const repoPath = resolveLocalRepoPath(branch.repo);\n\n try {\n if (repoPath) {\n out.present = await checkBranchPresent(repoPath, branch.name);\n if (out.present) {\n out.last_commit_iso = await lastCommitIso(repoPath, branch.name);\n const { ahead, behind } = await aheadBehind(repoPath, branch.name);\n out.ahead = ahead;\n out.behind = behind;\n }\n }\n\n const orgRepo = await resolveOrgRepo(branch.repo);\n if (orgRepo) {\n out.pr = await fetchPrInfo(orgRepo, branch.name);\n }\n } catch (err) {\n out.error = err instanceof Error ? err.message : String(err);\n }\n\n return out;\n}\n\nconst artifactStatus = defineCommand<Args, Result>({\n name: 'artifact.status',\n description:\n 'Pull live PR and branch state for the initiative via `git` + `gh`. Read-only.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug'],\n },\n async run(args) {\n const artifactsPath = path.join(getInitiativeDir(args.slug), 'artifacts.yml');\n const current = await withFileLock(getLockPath(args.slug), () =>\n readYaml(artifactsPath, ArtifactsSchema),\n );\n const branches = await mapConcurrent(\n current.branches,\n MAX_CONCURRENCY,\n statusForBranch,\n );\n return { slug: args.slug, branches };\n },\n});\n\nexport default artifactStatus;\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { today } from '../utils/today.js';\nimport { ValidationError, NotFoundError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n file: z.string().min(1),\n type: z.enum(['pr', 'deepdive', 'session', 'pointer']),\n label: z.string().optional(),\n topic: z.string().optional(),\n pr_number: z.number().int().positive().optional(),\n date: z.string().optional(),\n force: z.boolean().optional(),\n});\n\nconst ResultSchema = z.object({\n moved_to: z.string(),\n noop: z.boolean().optional(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\n/**\n * Slugify a label or topic for use in a filename.\n *\n * Lowercases, replaces non-alphanumeric runs with `-`, trims leading/trailing\n * dashes. Falls back to `untitled` when the result is empty.\n */\nexport function slugifyLabel(input: string): string {\n const cleaned = input\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '');\n return cleaned.length > 0 ? cleaned : 'untitled';\n}\n\nfunction deriveFilename(args: Args): string {\n switch (args.type) {\n case 'pr': {\n if (args.pr_number === undefined) {\n throw new ValidationError('source.add type=pr requires --pr-number');\n }\n if (!args.label) {\n throw new ValidationError('source.add type=pr requires --label');\n }\n return `pr-${args.pr_number}-${slugifyLabel(args.label)}.md`;\n }\n case 'deepdive': {\n if (!args.topic) {\n throw new ValidationError('source.add type=deepdive requires --topic');\n }\n return `deepdive-${slugifyLabel(args.topic)}.md`;\n }\n case 'session': {\n if (!args.label) {\n throw new ValidationError('source.add type=session requires --label');\n }\n const date = args.date ?? today();\n return `${date}-${slugifyLabel(args.label)}.md`;\n }\n case 'pointer': {\n if (!args.label) {\n throw new ValidationError('source.add type=pointer requires --label');\n }\n return `${slugifyLabel(args.label)}.md`;\n }\n }\n}\n\nasync function pathExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function movePath(src: string, dest: string): Promise<void> {\n try {\n await fs.rename(src, dest);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'EXDEV') {\n await fs.copyFile(src, dest);\n await fs.unlink(src);\n return;\n }\n throw err;\n }\n}\n\nexport default defineCommand<Args, Result>({\n name: 'source.add',\n description:\n 'Move a source file into <slug>/sources/ with a conventional filename.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'file'],\n options: {\n type: {\n long: '--type',\n description: 'Source type: pr | deepdive | session | pointer',\n required: true,\n },\n label: { long: '--label', description: 'Short label (slugified into filename)' },\n topic: { long: '--topic', description: 'Topic for deepdive type' },\n pr_number: { long: '--pr-number', description: 'PR number for type=pr' },\n date: { long: '--date', description: 'Date YYYY-MM-DD for type=session' },\n force: { long: '--force', description: 'Overwrite if target exists' },\n },\n },\n async run(args) {\n const sourcePath = path.resolve(args.file);\n if (!(await pathExists(sourcePath))) {\n throw new NotFoundError(`source file not found: ${sourcePath}`);\n }\n\n const filename = deriveFilename(args);\n const sourcesDir = path.join(getInitiativeDir(args.slug), 'sources');\n const targetPath = path.join(sourcesDir, filename);\n\n if (path.resolve(sourcePath) === path.resolve(targetPath)) {\n return { moved_to: targetPath, noop: true };\n }\n\n await fs.mkdir(sourcesDir, { recursive: true });\n\n if ((await pathExists(targetPath)) && !args.force) {\n throw new ValidationError(\n `target already exists: ${targetPath} (use --force to overwrite)`,\n );\n }\n\n await movePath(sourcePath, targetPath);\n return { moved_to: targetPath };\n },\n});\n","import path from 'node:path';\nimport { promises as fs } from 'node:fs';\nimport type { Dirent } from 'node:fs';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema, type BriefFrontmatter } from '../schemas/brief.js';\nimport { getActiveRoot, expandTilde } from '../utils/paths.js';\nimport { readFrontmatter } from '../utils/gray-matter-io.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst argsSchema = z.object({}).strict();\n\nconst initiativeSummarySchema = z.object({\n slug: z.string(),\n title: z.string(),\n state: z.enum(['focused', 'backburner', 'paused', 'done']),\n rank: z.number().int().positive().optional(),\n updated: z.string(),\n ship_target: z.string().optional(),\n});\n\nconst parseErrorSchema = z.object({\n slug: z.string(),\n error: z.string(),\n});\n\nconst conflictSchema = z.object({\n path: z.string(),\n slugs: z.array(z.string()),\n});\n\nconst resultSchema = z.object({\n initiatives: z.array(initiativeSummarySchema),\n parse_errors: z.array(parseErrorSchema),\n worktree_conflicts: z.array(conflictSchema),\n});\n\n\nconst STATE_ORDER: Record<BriefFrontmatter['state'], number> = {\n focused: 0,\n backburner: 1,\n paused: 2,\n done: 3,\n};\n\nexport interface ScanEntry {\n slug: string;\n frontmatter: BriefFrontmatter;\n}\n\nexport interface ScanError {\n slug: string;\n error: string;\n}\n\nexport interface ScanResult {\n entries: ScanEntry[];\n errors: ScanError[];\n}\n\nexport async function scanInitiatives(activeRoot: string): Promise<ScanResult> {\n let dirents: Dirent[];\n try {\n dirents = await fs.readdir(activeRoot, { withFileTypes: true });\n } catch {\n return { entries: [], errors: [] };\n }\n\n const entries: ScanEntry[] = [];\n const errors: ScanError[] = [];\n\n for (const dirent of dirents) {\n if (!dirent.isDirectory()) continue;\n if (dirent.name.startsWith('.')) continue;\n const slug = dirent.name;\n const briefPath = path.join(activeRoot, slug, 'brief.md');\n try {\n await fs.access(briefPath);\n } catch {\n continue;\n }\n try {\n const { frontmatter } = await readFrontmatter(\n briefPath,\n BriefFrontmatterSchema,\n );\n entries.push({ slug, frontmatter });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n errors.push({ slug, error: message });\n }\n }\n\n return { entries, errors };\n}\n\nfunction detectWorktreeConflicts(\n entries: ScanEntry[],\n): Array<{ path: string; slugs: string[] }> {\n const byPath = new Map<string, Set<string>>();\n for (const { slug, frontmatter } of entries) {\n const worktrees = frontmatter.worktrees;\n if (!worktrees) continue;\n for (const entry of Object.values(worktrees)) {\n const resolved = path.resolve(expandTilde(entry.path));\n let bucket = byPath.get(resolved);\n if (!bucket) {\n bucket = new Set();\n byPath.set(resolved, bucket);\n }\n bucket.add(slug);\n }\n }\n const conflicts: Array<{ path: string; slugs: string[] }> = [];\n for (const [resolved, slugs] of byPath) {\n if (slugs.size > 1) {\n conflicts.push({ path: resolved, slugs: [...slugs].sort() });\n }\n }\n conflicts.sort((a, b) => a.path.localeCompare(b.path));\n return conflicts;\n}\n\nfunction compareInitiatives(\n a: ScanEntry,\n b: ScanEntry,\n): number {\n const aRank = a.frontmatter.rank ?? Number.POSITIVE_INFINITY;\n const bRank = b.frontmatter.rank ?? Number.POSITIVE_INFINITY;\n if (aRank !== bRank) return aRank - bRank;\n const aState = STATE_ORDER[a.frontmatter.state];\n const bState = STATE_ORDER[b.frontmatter.state];\n if (aState !== bState) return aState - bState;\n return a.slug.localeCompare(b.slug);\n}\n\nexport default defineCommand({\n name: 'audit',\n description:\n 'Cross-initiative summary: lists every initiative, parse failures, and worktree path conflicts.',\n args: argsSchema,\n result: resultSchema,\n cli: {},\n async run() {\n const activeRoot = getActiveRoot();\n const { entries, errors } = await scanInitiatives(activeRoot);\n const initiatives = [...entries]\n .sort(compareInitiatives)\n .map(({ slug, frontmatter }) => ({\n slug,\n title: frontmatter.title,\n state: frontmatter.state,\n ...(frontmatter.rank !== undefined ? { rank: frontmatter.rank } : {}),\n updated: frontmatter.updated,\n ...(frontmatter.ship_target !== undefined\n ? { ship_target: frontmatter.ship_target }\n : {}),\n }));\n return {\n initiatives,\n parse_errors: errors,\n worktree_conflicts: detectWorktreeConflicts(entries),\n };\n },\n});\n","import { z } from 'zod';\nimport type { BriefFrontmatter } from '../schemas/brief.js';\nimport { getActiveRoot } from '../utils/paths.js';\nimport { scanInitiatives } from './audit.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst argsSchema = z.object({}).strict();\n\nconst itemSchema = z.object({\n slug: z.string(),\n title: z.string(),\n state: z.enum(['focused', 'backburner', 'paused', 'done']),\n rank: z.number().int().positive().optional(),\n ship_target: z.string().optional(),\n paused_since: z.string().optional(),\n updated: z.string(),\n});\n\nconst sectionSchema = z.object({\n heading: z.string(),\n items: z.array(itemSchema),\n});\n\nconst parseErrorSchema = z.object({\n slug: z.string(),\n error: z.string(),\n});\n\nconst resultSchema = z.object({\n sections: z.array(sectionSchema),\n parse_errors: z.array(parseErrorSchema),\n});\n\ninterface Item {\n slug: string;\n title: string;\n state: BriefFrontmatter['state'];\n rank?: number;\n ship_target?: string;\n paused_since?: string;\n updated: string;\n}\n\nfunction toItem(slug: string, fm: BriefFrontmatter): Item {\n return {\n slug,\n title: fm.title,\n state: fm.state,\n ...(fm.rank !== undefined ? { rank: fm.rank } : {}),\n ...(fm.ship_target !== undefined ? { ship_target: fm.ship_target } : {}),\n ...(fm.paused_since !== undefined ? { paused_since: fm.paused_since } : {}),\n updated: fm.updated,\n };\n}\n\nexport default defineCommand({\n name: 'list',\n description:\n 'List every initiative grouped by state. Replaces the legacy INDEX.md dump.',\n args: argsSchema,\n result: resultSchema,\n cli: {\n usage: 'list',\n },\n async run() {\n const activeRoot = getActiveRoot();\n const { entries, errors } = await scanInitiatives(activeRoot);\n\n const focused: Item[] = [];\n const backburner: Item[] = [];\n const paused: Item[] = [];\n const done: Item[] = [];\n\n for (const { slug, frontmatter } of entries) {\n const item = toItem(slug, frontmatter);\n switch (frontmatter.state) {\n case 'focused':\n focused.push(item);\n break;\n case 'backburner':\n backburner.push(item);\n break;\n case 'paused':\n paused.push(item);\n break;\n case 'done':\n done.push(item);\n break;\n }\n }\n\n focused.sort((a, b) => {\n const aRank = a.rank ?? Number.POSITIVE_INFINITY;\n const bRank = b.rank ?? Number.POSITIVE_INFINITY;\n if (aRank !== bRank) return aRank - bRank;\n return a.slug.localeCompare(b.slug);\n });\n backburner.sort((a, b) => a.slug.localeCompare(b.slug));\n paused.sort((a, b) => {\n const aPaused = a.paused_since ?? '';\n const bPaused = b.paused_since ?? '';\n if (aPaused !== bPaused) return aPaused.localeCompare(bPaused);\n return a.slug.localeCompare(b.slug);\n });\n done.sort((a, b) => {\n if (a.updated !== b.updated) return b.updated.localeCompare(a.updated);\n return a.slug.localeCompare(b.slug);\n });\n\n return {\n sections: [\n { heading: 'Focused', items: focused },\n { heading: 'Backburner', items: backburner },\n { heading: 'Paused', items: paused },\n { heading: 'Done', items: done },\n ],\n parse_errors: errors,\n };\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema, type BriefFrontmatter } from '../schemas/brief.js';\nimport { getActiveRoot, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readFrontmatter, writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst argsSchema = z.object({\n slug: z.string().min(1),\n path: z.string().min(1),\n label: z.string().min(1).optional(),\n default: z.boolean().optional(),\n});\n\nconst resultSchema = z.object({\n slug: z.string(),\n label: z.string(),\n path: z.string(),\n default: z.boolean(),\n});\n\nconst DEFAULT_LABEL = 'main';\n\nexport default defineCommand({\n name: 'worktree.set',\n description:\n 'Add or update a worktree entry on an existing initiative. A lone worktree is made default automatically; use --default to promote an added one.',\n args: argsSchema,\n result: resultSchema,\n cli: {\n positional: ['slug', 'path'],\n options: {\n label: {\n long: '--label',\n description: `Worktree label (default: ${DEFAULT_LABEL}).`,\n },\n default: {\n long: '--default',\n description: 'Mark this worktree as the default, clearing default on others.',\n },\n },\n usage: 'active-work worktree.set <slug> <path> [--label <label>] [--default]',\n },\n async run(args) {\n const label = args.label ?? DEFAULT_LABEL;\n const briefPath = path.join(getActiveRoot(), args.slug, 'brief.md');\n return withFileLock(getLockPath(args.slug), async () => {\n let frontmatter: BriefFrontmatter;\n let body: string;\n try {\n ({ frontmatter, body } = await readFrontmatter(\n briefPath,\n BriefFrontmatterSchema,\n ));\n } catch (err) {\n throw new ValidationError(err instanceof Error ? err.message : String(err));\n }\n\n const existing = frontmatter.worktrees ?? {};\n // Default when: explicitly requested, this is the only worktree, or we're\n // updating a label that was already the default (don't silently demote it).\n const hadOthers = Object.keys(existing).some((name) => name !== label);\n const wasDefault = existing[label]?.default === true;\n const makeDefault = args.default === true || !hadOthers || wasDefault;\n\n const nextWorktrees: NonNullable<BriefFrontmatter['worktrees']> = {};\n for (const [name, entry] of Object.entries(existing)) {\n const rest = { ...entry };\n delete rest.default;\n // A new default clears the flag on every other label.\n if (makeDefault && name !== label) {\n nextWorktrees[name] = rest;\n } else {\n nextWorktrees[name] = entry;\n }\n }\n nextWorktrees[label] = {\n path: args.path,\n ...(makeDefault ? { default: true } : {}),\n };\n\n const next = {\n ...frontmatter,\n worktrees: nextWorktrees,\n updated: today(),\n };\n await writeFrontmatter(briefPath, next, body, BriefFrontmatterSchema);\n return { slug: args.slug, label, path: args.path, default: makeDefault };\n });\n },\n});\n","import path from 'node:path';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema, type BriefFrontmatter } from '../schemas/brief.js';\nimport { getActiveRoot, getLockPath } from '../utils/paths.js';\nimport { withFileLock } from '../utils/fs-atomic.js';\nimport { readFrontmatter, writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { today } from '../utils/today.js';\nimport { NotFoundError, ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst argsSchema = z.object({\n slug: z.string().min(1),\n label: z.string().min(1),\n});\n\nconst resultSchema = z.object({\n slug: z.string(),\n default_label: z.string(),\n});\n\nexport default defineCommand({\n name: 'worktree.set-default',\n description:\n 'Mark the named worktree label as default for an initiative; clears default on other labels.',\n args: argsSchema,\n result: resultSchema,\n cli: {\n positional: ['slug', 'label'],\n },\n async run({ slug, label }) {\n const briefPath = path.join(getActiveRoot(), slug, 'brief.md');\n return withFileLock(getLockPath(slug), async () => {\n let frontmatter: BriefFrontmatter;\n let body: string;\n try {\n ({ frontmatter, body } = await readFrontmatter(\n briefPath,\n BriefFrontmatterSchema,\n ));\n } catch (err) {\n throw new ValidationError(err instanceof Error ? err.message : String(err));\n }\n const worktrees = frontmatter.worktrees;\n if (!worktrees || !Object.prototype.hasOwnProperty.call(worktrees, label)) {\n throw new NotFoundError(\n `Worktree label \"${label}\" not found in brief for \"${slug}\"`,\n );\n }\n const nextWorktrees: NonNullable<typeof worktrees> = {};\n for (const [name, entry] of Object.entries(worktrees)) {\n const rest = { ...entry };\n delete rest.default;\n if (name === label) {\n nextWorktrees[name] = { ...rest, default: true };\n } else {\n nextWorktrees[name] = rest;\n }\n }\n const next = {\n ...frontmatter,\n worktrees: nextWorktrees,\n updated: today(),\n };\n await writeFrontmatter(briefPath, next, body, BriefFrontmatterSchema);\n return { slug, default_label: label };\n });\n },\n});\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { runDiscovery } from '../discover/index.js';\n\n/**\n * `active-work discover` — orchestrates every configured discovery source and emits\n * a flat list of hits. Always non-interactive; Claude is the primary\n * caller, and a human can pipe to a picker.\n */\n\nconst ArgsSchema = z.object({\n github_repos: z.array(z.string().min(1)).optional(),\n local_repos: z.array(z.string().min(1)).optional(),\n projects_root: z.string().optional(),\n});\n\nconst HitSchema = z.object({\n source: z.string(),\n ref: z.string(),\n detail: z.string(),\n metadata: z.record(z.string(), z.unknown()).optional(),\n slug_match: z.string().optional(),\n untracked: z.boolean().optional(),\n});\n\nconst ResultSchema = z.object({\n hits: z.array(HitSchema),\n errors: z.array(z.object({ source: z.string(), error: z.string() })),\n});\n\nexport default defineCommand({\n name: 'discover',\n description:\n 'Scan configured sources (gh PRs, local git, projects root, Claude sessions) and emit unfiltered discovery hits.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n github_repos: {\n long: '--github-repos',\n description: 'Comma-separated owner/repo list for gh PR discovery',\n },\n local_repos: {\n long: '--local-repos',\n description: 'Comma-separated repo paths for local git discovery',\n },\n projects_root: {\n long: '--projects-root',\n description: 'Root directory whose subdirs are scanned as projects',\n },\n },\n },\n async run(args) {\n return runDiscovery({\n github_repos: args.github_repos,\n local_repos: args.local_repos,\n projects_root: args.projects_root,\n });\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { getActiveRoot } from '../utils/paths.js';\nimport type {\n DiscoveryConfig,\n DiscoveryHit,\n DiscoveryResult,\n DiscoverySourceError,\n} from './types.js';\nimport { discoverGitHub } from './github.js';\nimport { discoverGit } from './git.js';\nimport { discoverProjects } from './projects.js';\nimport { discoverClaudeSessions } from './claude.js';\n\n/**\n * Run every discovery source the config asks for, aggregate hits, then\n * cross-reference against the set of known initiative slugs sitting in\n * `<activeRoot>/*` and suppress anything already triaged via\n * `<activeRoot>/.triaged.log`.\n */\n\nexport async function runDiscovery(config: DiscoveryConfig): Promise<DiscoveryResult> {\n const allHits: DiscoveryHit[] = [];\n const allErrors: DiscoverySourceError[] = [];\n\n const githubRepos = config.github_repos ?? [];\n const localRepos = config.local_repos ?? [];\n const projectsRoot = config.projects_root ?? '';\n\n if (githubRepos.length > 0) {\n const r = await discoverGitHub(githubRepos);\n allHits.push(...r.hits);\n allErrors.push(...r.errors);\n }\n if (localRepos.length > 0) {\n const r = await discoverGit(localRepos);\n allHits.push(...r.hits);\n allErrors.push(...r.errors);\n }\n if (projectsRoot.length > 0) {\n const r = await discoverProjects(projectsRoot);\n allHits.push(...r.hits);\n allErrors.push(...r.errors);\n }\n // Claude session scanning is cheap and config-free, so always run it.\n const claude = await discoverClaudeSessions();\n allHits.push(...claude.hits);\n allErrors.push(...claude.errors);\n\n const activeRoot = getActiveRoot();\n const slugs = await loadSlugs(activeRoot);\n const suppressed = await loadTriagedRefs(activeRoot);\n\n const filtered: DiscoveryHit[] = [];\n for (const hit of allHits) {\n if (suppressed.has(hit.ref)) continue;\n const match = matchSlug(hit, slugs);\n if (match) {\n hit.slug_match = match;\n hit.untracked = false;\n } else {\n hit.untracked = true;\n }\n filtered.push(hit);\n }\n\n return { hits: filtered, errors: allErrors };\n}\n\nasync function loadSlugs(activeRoot: string): Promise<string[]> {\n try {\n const entries = await fs.readdir(activeRoot, { withFileTypes: true });\n return entries\n .filter((e) => e.isDirectory() && !e.name.startsWith('.'))\n .map((e) => e.name);\n } catch {\n return [];\n }\n}\n\nasync function loadTriagedRefs(activeRoot: string): Promise<Set<string>> {\n const logPath = path.join(activeRoot, '.triaged.log');\n const refs = new Set<string>();\n try {\n const raw = await fs.readFile(logPath, 'utf8');\n for (const line of raw.split('\\n')) {\n if (!line.trim()) continue;\n const parts = line.split('\\t');\n // Format: <iso>\\t<action>\\t<ref>\\t<extra>\n const ref = parts[2];\n if (ref) refs.add(ref);\n }\n } catch {\n // No log yet — nothing to suppress.\n }\n return refs;\n}\n\nfunction matchSlug(hit: DiscoveryHit, slugs: string[]): string | undefined {\n const haystacks: string[] = [hit.ref.toLowerCase()];\n const cwd = hit.metadata?.cwd;\n if (typeof cwd === 'string') haystacks.push(cwd.toLowerCase());\n for (const slug of slugs) {\n const needle = slug.toLowerCase();\n if (haystacks.some((h) => h.includes(needle))) return slug;\n }\n return undefined;\n}\n\nexport type { DiscoveryConfig, DiscoveryHit, DiscoveryResult } from './types.js';\n","import { spawn } from 'node:child_process';\n\n/**\n * Minimal subprocess runner used by the discovery sources.\n *\n * Captures stdout/stderr separately. Resolves with the exit code so callers\n * can decide how to treat non-zero exits per-source.\n */\n\nexport interface CommandResult {\n code: number | null;\n stdout: string;\n stderr: string;\n}\n\nexport interface CommandOptions {\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n /** Max ms before the child is killed; defaults to 15s. */\n timeoutMs?: number;\n}\n\nexport type RunCommand = (\n bin: string,\n args: string[],\n opts?: CommandOptions,\n) => Promise<CommandResult>;\n\nconst DEFAULT_TIMEOUT_MS = 15_000;\n\nexport const runCommand: RunCommand = (bin, args, opts = {}) => {\n return new Promise<CommandResult>((resolve, reject) => {\n const child = spawn(bin, args, {\n cwd: opts.cwd,\n env: opts.env ?? process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n });\n const stdoutChunks: Buffer[] = [];\n const stderrChunks: Buffer[] = [];\n let settled = false;\n\n const timer = setTimeout(() => {\n if (settled) return;\n settled = true;\n child.kill('SIGKILL');\n reject(new Error(`${bin} timed out after ${opts.timeoutMs ?? DEFAULT_TIMEOUT_MS}ms`));\n }, opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n\n child.stdout?.on('data', (chunk: Buffer) => stdoutChunks.push(chunk));\n child.stderr?.on('data', (chunk: Buffer) => stderrChunks.push(chunk));\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n reject(err);\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n resolve({\n code,\n stdout: Buffer.concat(stdoutChunks).toString('utf8'),\n stderr: Buffer.concat(stderrChunks).toString('utf8'),\n });\n });\n });\n};\n","import type { DiscoveryHit, DiscoverySourceError } from './types.js';\nimport { runCommand, type RunCommand } from './run-command.js';\n\n/**\n * Discover open PRs authored by the current user, per repo.\n *\n * Shells out to `gh pr list --author @me --state open` and converts each\n * PR to a `DiscoveryHit`. Failures (gh missing, auth, network) are\n * captured per-repo and never thrown.\n */\n\ninterface GhPullRequest {\n number: number;\n title: string;\n isDraft: boolean;\n headRefName: string;\n updatedAt: string;\n}\n\nexport interface DiscoverGitHubResult {\n hits: DiscoveryHit[];\n errors: DiscoverySourceError[];\n}\n\nexport async function discoverGitHub(\n repos: string[],\n run: RunCommand = runCommand,\n): Promise<DiscoverGitHubResult> {\n const hits: DiscoveryHit[] = [];\n const errors: DiscoverySourceError[] = [];\n\n for (const repo of repos) {\n const sourceId = `gh:${repo}`;\n try {\n const result = await run('gh', [\n 'pr',\n 'list',\n '--author',\n '@me',\n '--state',\n 'open',\n '--limit',\n '100',\n '--repo',\n repo,\n '--json',\n 'number,title,isDraft,headRefName,updatedAt',\n ]);\n if (result.code !== 0) {\n errors.push({\n source: sourceId,\n error: result.stderr.trim() || `gh exited with code ${result.code}`,\n });\n continue;\n }\n const parsed = JSON.parse(result.stdout) as GhPullRequest[];\n for (const pr of parsed) {\n hits.push({\n source: sourceId,\n ref: pr.headRefName,\n detail: `${pr.isDraft ? '[draft] ' : ''}#${pr.number} ${pr.title}`,\n metadata: {\n repo,\n number: pr.number,\n title: pr.title,\n isDraft: pr.isDraft,\n headRefName: pr.headRefName,\n updatedAt: pr.updatedAt,\n },\n });\n }\n } catch (err) {\n errors.push({\n source: sourceId,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { hits, errors };\n}\n","import path from 'node:path';\nimport type { DiscoveryHit, DiscoverySourceError } from './types.js';\nimport { runCommand, type RunCommand } from './run-command.js';\n\n/**\n * Discover local git activity (recent branches, worktrees, stashes) across\n * one or more repo paths. Each repo is queried independently so a failure\n * in one repo doesn't suppress hits from the others.\n */\n\nexport interface DiscoverGitResult {\n hits: DiscoveryHit[];\n errors: DiscoverySourceError[];\n}\n\nconst BRANCH_LIMIT = 20;\n\nexport async function discoverGit(\n repoPaths: string[],\n run: RunCommand = runCommand,\n): Promise<DiscoverGitResult> {\n const hits: DiscoveryHit[] = [];\n const errors: DiscoverySourceError[] = [];\n\n for (const repoPath of repoPaths) {\n const repoName = path.basename(repoPath);\n await collectBranches(repoPath, repoName, hits, errors, run);\n await collectWorktrees(repoPath, repoName, hits, errors, run);\n await collectStashes(repoPath, repoName, hits, errors, run);\n }\n\n return { hits, errors };\n}\n\nasync function collectBranches(\n repoPath: string,\n repoName: string,\n hits: DiscoveryHit[],\n errors: DiscoverySourceError[],\n run: RunCommand,\n): Promise<void> {\n const sourceId = `branch:${repoName}`;\n try {\n const result = await run('git', [\n '-C',\n repoPath,\n 'for-each-ref',\n '--sort=-committerdate',\n `--count=${BRANCH_LIMIT}`,\n '--format=%(refname:short)|%(committerdate:short)|%(subject)',\n 'refs/heads/',\n ]);\n if (result.code !== 0) {\n errors.push({ source: sourceId, error: errMsg(result.stderr, result.code) });\n return;\n }\n for (const line of splitLines(result.stdout)) {\n const [name, date, ...rest] = line.split('|');\n if (!name) continue;\n const subject = rest.join('|');\n hits.push({\n source: sourceId,\n ref: name,\n detail: `${name} @ ${date ?? ''} — ${subject}`,\n metadata: { repo: repoName, repoPath, name, date, subject },\n });\n }\n } catch (err) {\n errors.push({ source: sourceId, error: errStr(err) });\n }\n}\n\nasync function collectWorktrees(\n repoPath: string,\n repoName: string,\n hits: DiscoveryHit[],\n errors: DiscoverySourceError[],\n run: RunCommand,\n): Promise<void> {\n const sourceId = `worktree:${repoName}`;\n try {\n const result = await run('git', ['-C', repoPath, 'worktree', 'list', '--porcelain']);\n if (result.code !== 0) {\n errors.push({ source: sourceId, error: errMsg(result.stderr, result.code) });\n return;\n }\n for (const entry of parseWorktreePorcelain(result.stdout)) {\n // Skip the main worktree (== repoPath); only surface auxiliary ones.\n if (entry.path && entry.path !== repoPath && entry.branch) {\n hits.push({\n source: sourceId,\n ref: entry.branch,\n detail: `worktree ${entry.path} on ${entry.branch}`,\n metadata: { repo: repoName, repoPath, ...entry },\n });\n }\n }\n } catch (err) {\n errors.push({ source: sourceId, error: errStr(err) });\n }\n}\n\nasync function collectStashes(\n repoPath: string,\n repoName: string,\n hits: DiscoveryHit[],\n errors: DiscoverySourceError[],\n run: RunCommand,\n): Promise<void> {\n const sourceId = `stash:${repoName}`;\n try {\n const result = await run('git', ['-C', repoPath, 'stash', 'list']);\n if (result.code !== 0) {\n errors.push({ source: sourceId, error: errMsg(result.stderr, result.code) });\n return;\n }\n for (const line of splitLines(result.stdout)) {\n // Format: stash@{N}: WIP on <branch>: <hash> <subject>\n const refMatch = line.match(/^(stash@\\{\\d+\\}):\\s*(.*)$/);\n if (!refMatch) continue;\n const [, ref, message] = refMatch;\n hits.push({\n source: sourceId,\n ref: ref!,\n detail: message ?? line,\n metadata: { repo: repoName, repoPath, ref, message },\n });\n }\n } catch (err) {\n errors.push({ source: sourceId, error: errStr(err) });\n }\n}\n\ninterface WorktreeEntry {\n path?: string;\n head?: string;\n branch?: string;\n}\n\nfunction parseWorktreePorcelain(stdout: string): WorktreeEntry[] {\n const entries: WorktreeEntry[] = [];\n let current: WorktreeEntry = {};\n for (const rawLine of stdout.split('\\n')) {\n const line = rawLine.trimEnd();\n if (line === '') {\n if (Object.keys(current).length > 0) entries.push(current);\n current = {};\n continue;\n }\n if (line.startsWith('worktree ')) current.path = line.slice('worktree '.length);\n else if (line.startsWith('HEAD ')) current.head = line.slice('HEAD '.length);\n else if (line.startsWith('branch ')) {\n const ref = line.slice('branch '.length);\n current.branch = ref.replace(/^refs\\/heads\\//, '');\n }\n }\n if (Object.keys(current).length > 0) entries.push(current);\n return entries;\n}\n\nfunction splitLines(s: string): string[] {\n return s\n .split('\\n')\n .map((l) => l.trimEnd())\n .filter((l) => l.length > 0);\n}\n\nfunction errMsg(stderr: string, code: number | null): string {\n return stderr.trim() || `git exited with code ${code}`;\n}\n\nfunction errStr(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n","import { promises as fs, type Dirent } from 'node:fs';\nimport path from 'node:path';\nimport type { DiscoveryHit, DiscoverySourceError } from './types.js';\nimport { expandTilde } from '../utils/paths.js';\n\n/**\n * Scan a \"projects root\" directory (e.g. `~/code`) and surface each\n * top-level subdir as a potential work item. Skips dotfiles and the\n * conventional `active` worktree-staging dir.\n */\n\nexport interface DiscoverProjectsResult {\n hits: DiscoveryHit[];\n errors: DiscoverySourceError[];\n}\n\nconst MS_PER_DAY = 24 * 60 * 60 * 1000;\nconst RECENT_THRESHOLD_DAYS = 30;\n\nexport async function discoverProjects(\n projectsRoot: string,\n): Promise<DiscoverProjectsResult> {\n const hits: DiscoveryHit[] = [];\n const errors: DiscoverySourceError[] = [];\n\n if (!projectsRoot) return { hits, errors };\n\n const resolved = path.resolve(expandTilde(projectsRoot));\n let entries: Dirent[];\n try {\n entries = await fs.readdir(resolved, { withFileTypes: true });\n } catch (err) {\n errors.push({\n source: 'projects',\n error: err instanceof Error ? err.message : String(err),\n });\n return { hits, errors };\n }\n\n const now = Date.now();\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith('.')) continue;\n if (entry.name === 'active') continue;\n\n const fullPath = path.join(resolved, entry.name);\n let mtimeMs = 0;\n try {\n const stat = await fs.stat(fullPath);\n mtimeMs = stat.mtimeMs;\n } catch (err) {\n errors.push({\n source: `projects:${entry.name}`,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n const ageDays = (now - mtimeMs) / MS_PER_DAY;\n const recency =\n ageDays <= RECENT_THRESHOLD_DAYS\n ? `modified <${RECENT_THRESHOLD_DAYS}d ago`\n : 'older';\n hits.push({\n source: 'projects',\n ref: entry.name,\n detail: `${entry.name} (${recency})`,\n metadata: {\n name: entry.name,\n path: fullPath,\n mtime: new Date(mtimeMs).toISOString(),\n ageDays: Math.round(ageDays),\n recency,\n },\n });\n }\n\n return { hits, errors };\n}\n","import { promises as fs, type Dirent } from 'node:fs';\nimport os from 'node:os';\nimport path from 'node:path';\nimport type { DiscoveryHit, DiscoverySourceError } from './types.js';\n\n/**\n * Scan `~/.claude/projects/` for recent session JSONLs and surface one hit\n * per unique `cwd`. Honors `CLAUDE_PROJECTS_ROOT` for test injection.\n *\n * We do a light scan of each session file — just enough to extract `cwd`,\n * a subject (first user message or last compaction summary), and an mtime.\n * We do NOT filter against claimed slugs here; that's the orchestrator's\n * cross-reference step.\n */\n\nexport interface DiscoverClaudeResult {\n hits: DiscoveryHit[];\n errors: DiscoverySourceError[];\n}\n\ninterface CwdAggregate {\n cwd: string;\n sessionCount: number;\n lastMtimeMs: number;\n subject: string;\n lastSessionId: string;\n}\n\nconst MAX_SCAN_LINES = 200;\nconst COMPACTION_SUBJECT_PREFIX = '[compaction] ';\n\nexport async function discoverClaudeSessions(): Promise<DiscoverClaudeResult> {\n const root =\n process.env.CLAUDE_PROJECTS_ROOT ?? path.join(os.homedir(), '.claude', 'projects');\n const hits: DiscoveryHit[] = [];\n const errors: DiscoverySourceError[] = [];\n\n let projectDirs: Dirent[];\n try {\n projectDirs = await fs.readdir(root, { withFileTypes: true });\n } catch (err) {\n // No claude projects dir at all? That's not an error — return empty.\n const e = err as NodeJS.ErrnoException;\n if (e.code === 'ENOENT') return { hits, errors };\n errors.push({ source: 'claude-session', error: e.message ?? String(err) });\n return { hits, errors };\n }\n\n const byCwd = new Map<string, CwdAggregate>();\n\n for (const dir of projectDirs) {\n if (!dir.isDirectory()) continue;\n const dirPath = path.join(root, dir.name);\n let files: Dirent[];\n try {\n files = await fs.readdir(dirPath, { withFileTypes: true });\n } catch (err) {\n errors.push({\n source: `claude-session:${dir.name}`,\n error: err instanceof Error ? err.message : String(err),\n });\n continue;\n }\n for (const file of files) {\n if (!file.isFile() || !file.name.endsWith('.jsonl')) continue;\n const filePath = path.join(dirPath, file.name);\n try {\n await aggregateSession(filePath, byCwd);\n } catch (err) {\n errors.push({\n source: `claude-session:${file.name}`,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n }\n\n for (const agg of byCwd.values()) {\n hits.push({\n source: 'claude-session',\n ref: agg.cwd,\n detail: `${agg.sessionCount} session(s) at ${agg.cwd}${\n agg.subject ? ` — ${agg.subject}` : ''\n }`,\n metadata: {\n cwd: agg.cwd,\n sessionCount: agg.sessionCount,\n lastMtime: new Date(agg.lastMtimeMs).toISOString(),\n lastSessionId: agg.lastSessionId,\n subject: agg.subject,\n },\n });\n }\n\n return { hits, errors };\n}\n\nasync function aggregateSession(\n filePath: string,\n byCwd: Map<string, CwdAggregate>,\n): Promise<void> {\n const stat = await fs.stat(filePath);\n // Read up to MAX_SCAN_LINES; this is a light scan, not a parser.\n const raw = await fs.readFile(filePath, 'utf8');\n const lines = raw.split('\\n').slice(0, MAX_SCAN_LINES);\n\n let cwd: string | undefined;\n let firstUserMessage: string | undefined;\n let lastCompactionSummary: string | undefined;\n\n for (const line of lines) {\n if (!line) continue;\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n continue;\n }\n if (!record || typeof record !== 'object') continue;\n const rec = record as Record<string, unknown>;\n if (!cwd && typeof rec.cwd === 'string' && rec.cwd.length > 0) {\n cwd = rec.cwd;\n }\n if (!firstUserMessage) {\n const text = extractUserMessageText(rec);\n if (text) firstUserMessage = text;\n }\n const summary = extractCompactionSummary(rec);\n if (summary) lastCompactionSummary = summary;\n }\n\n if (!cwd) return;\n const subject = lastCompactionSummary\n ? `${COMPACTION_SUBJECT_PREFIX}${truncate(lastCompactionSummary, 120)}`\n : firstUserMessage\n ? truncate(firstUserMessage, 120)\n : '';\n const sessionId = path.basename(filePath, '.jsonl');\n\n const existing = byCwd.get(cwd);\n if (!existing) {\n byCwd.set(cwd, {\n cwd,\n sessionCount: 1,\n lastMtimeMs: stat.mtimeMs,\n subject,\n lastSessionId: sessionId,\n });\n return;\n }\n existing.sessionCount += 1;\n if (stat.mtimeMs > existing.lastMtimeMs) {\n existing.lastMtimeMs = stat.mtimeMs;\n existing.lastSessionId = sessionId;\n if (subject) existing.subject = subject;\n } else if (!existing.subject && subject) {\n existing.subject = subject;\n }\n}\n\nfunction extractUserMessageText(rec: Record<string, unknown>): string | undefined {\n if (rec.type !== 'user') return undefined;\n const message = rec.message;\n if (!message || typeof message !== 'object') return undefined;\n const content = (message as Record<string, unknown>).content;\n if (typeof content === 'string') return content.trim() || undefined;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (\n block &&\n typeof block === 'object' &&\n (block as Record<string, unknown>).type === 'text' &&\n typeof (block as Record<string, unknown>).text === 'string'\n ) {\n const text = ((block as Record<string, unknown>).text as string).trim();\n if (text) return text;\n }\n }\n }\n return undefined;\n}\n\nfunction extractCompactionSummary(rec: Record<string, unknown>): string | undefined {\n if (rec.type !== 'summary') return undefined;\n if (typeof rec.summary === 'string' && rec.summary.trim().length > 0) {\n return rec.summary.trim();\n }\n return undefined;\n}\n\nfunction truncate(s: string, max: number): string {\n const oneline = s.replace(/\\s+/g, ' ').trim();\n return oneline.length > max ? `${oneline.slice(0, max - 1)}…` : oneline;\n}\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { appendTriagedLog } from '../discover/triaged-log.js';\n\n/**\n * `active-work drop <ref>` — silently dismiss a discover hit. The orchestrator\n * reads `.triaged.log` and skips refs already marked dropped.\n */\n\nconst ArgsSchema = z.object({\n ref: z.string().min(1),\n reason: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n ref: z.string(),\n});\n\nexport default defineCommand({\n name: 'drop',\n description: 'Mark a discover hit as dropped so future discovers suppress it.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['ref'],\n options: {\n reason: {\n long: '--reason',\n description: 'Optional one-line reason recorded in the triage log',\n },\n },\n },\n async run(args) {\n await appendTriagedLog('drop', args.ref, args.reason ?? '-');\n return { ref: args.ref };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { atomicWrite } from '../utils/fs-atomic.js';\nimport { getActiveRoot } from '../utils/paths.js';\nimport { nowIso } from '../utils/today.js';\n\n/**\n * Append a single triage decision to `<activeRoot>/.triaged.log`.\n *\n * Format: `<nowIso()>\\t<action>\\t<ref>\\t<extra>` — one line per decision.\n * The orchestrator reads this file to suppress already-decided refs from\n * future discoveries.\n */\nexport async function appendTriagedLog(\n action: 'fold' | 'drop' | 'track',\n ref: string,\n extra: string,\n): Promise<void> {\n const root = getActiveRoot();\n await fs.mkdir(root, { recursive: true });\n const logPath = path.join(root, '.triaged.log');\n let existing = '';\n try {\n existing = await fs.readFile(logPath, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n const line = `${nowIso()}\\t${action}\\t${ref}\\t${extra}\\n`;\n await atomicWrite(logPath, existing + line);\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { SessionFrontmatterSchema } from '../schemas/session.js';\nimport { NotFoundError } from '../errors.js';\nimport { nowIso } from '../utils/today.js';\nimport { appendTriagedLog } from '../discover/triaged-log.js';\n\n/**\n * `active-work fold <ref> --into <slug>` — record that a discover hit has been\n * absorbed by an existing initiative.\n *\n * Side effects:\n * - writes a `sidecar`-track session file under the initiative's\n * `sessions/` so the fold is visible in the audit trail\n * - appends a `fold` line to `<activeRoot>/.triaged.log` so future\n * discovers suppress this ref\n */\n\nconst ArgsSchema = z.object({\n ref: z.string().min(1),\n into: z.string().min(1),\n note: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n ref: z.string(),\n into: z.string(),\n session_file: z.string(),\n});\n\nexport default defineCommand({\n name: 'fold',\n description: 'Mark a discover hit as folded into an existing initiative.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['ref'],\n options: {\n into: {\n long: '--into',\n description: 'Slug of the initiative this hit is folded into',\n required: true,\n },\n note: {\n long: '--note',\n description: 'Optional human note describing the fold',\n },\n },\n },\n async run(args) {\n const initiativeDir = getInitiativeDir(args.into);\n try {\n const stat = await fs.stat(initiativeDir);\n if (!stat.isDirectory()) {\n throw new NotFoundError(`Initiative not found: ${args.into}`);\n }\n } catch (err) {\n if (err instanceof NotFoundError) throw err;\n throw new NotFoundError(`Initiative not found: ${args.into}`);\n }\n\n const sessionsDir = path.join(initiativeDir, 'sessions');\n await fs.mkdir(sessionsDir, { recursive: true });\n\n const startedIso = nowIso();\n const filename = buildSessionFilename(startedIso, args.ref);\n const sessionFile = path.join(sessionsDir, filename);\n\n const body = [\n `Folded hit \\`${args.ref}\\` into initiative \\`${args.into}\\`.`,\n '',\n args.note ? args.note : '_No note provided._',\n ].join('\\n');\n\n await writeFrontmatter(\n sessionFile,\n {\n session_id: `folded-${sanitizeRef(args.ref)}`,\n started: startedIso,\n ended: startedIso,\n track: 'sidecar' as const,\n },\n body,\n SessionFrontmatterSchema,\n );\n\n await appendTriagedLog('fold', args.ref, `into:${args.into}`);\n\n return { ref: args.ref, into: args.into, session_file: sessionFile };\n },\n});\n\nfunction buildSessionFilename(iso: string, ref: string): string {\n // iso: 2026-05-12T15:23:45.000Z → 2026-05-12-1523\n const stamp = iso.slice(0, 16).replace('T', '-').replace(':', '');\n return `${stamp}-folded-${sanitizeRef(ref)}.md`;\n}\n\nfunction sanitizeRef(ref: string): string {\n return (\n ref\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 40) || 'ref'\n );\n}\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { BriefFrontmatterSchema } from '../schemas/brief.js';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { atomicWrite } from '../utils/fs-atomic.js';\nimport { writeFrontmatter } from '../utils/gray-matter-io.js';\nimport { derivePrefix, validateSlug } from '../utils/slug.js';\nimport { today } from '../utils/today.js';\nimport { UsageError, ValidationError } from '../errors.js';\nimport { stringify as yamlStringify } from 'yaml';\nimport { appendTriagedLog } from '../discover/triaged-log.js';\n\n/**\n * `active-work track <ref> --slug <slug>` — scaffold a fresh initiative from a\n * discover hit. The original `ref` is preserved in the brief body so\n * future readers can trace where the initiative came from.\n *\n * This deliberately re-implements directory scaffolding inline rather\n * than importing `active-work new`; the parallel-work split means `new` lives on a\n * branch this one can't reach.\n */\n\nconst ArgsSchema = z.object({\n ref: z.string().min(1),\n slug: z.string().min(1),\n title: z.string().optional(),\n ship_target: z.string().optional(),\n owner: z.string().optional(),\n worktree: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n dir: z.string(),\n ref: z.string(),\n});\n\nexport default defineCommand({\n name: 'track',\n description: 'Scaffold a new initiative from a discover hit.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['ref'],\n options: {\n slug: {\n long: '--slug',\n description: 'Kebab-case slug for the new initiative',\n required: true,\n },\n title: { long: '--title', description: 'Human-readable initiative title' },\n ship_target: { long: '--ship-target', description: 'Target ship window (e.g. 2026-Q3)' },\n owner: { long: '--owner', description: 'Initiative owner handle' },\n worktree: {\n long: '--worktree',\n description: 'Default worktree path to record on the brief',\n },\n },\n },\n async run(args) {\n const validation = validateSlug(args.slug);\n if (!validation.ok) {\n throw new ValidationError(validation.error);\n }\n const dir = getInitiativeDir(args.slug);\n\n if (await dirExists(dir)) {\n throw new UsageError(`Initiative already exists: ${args.slug}`);\n }\n await fs.mkdir(path.join(dir, 'tasks'), { recursive: true });\n await fs.mkdir(path.join(dir, 'sessions'), { recursive: true });\n await fs.mkdir(path.join(dir, 'sources'), { recursive: true });\n\n const title = args.title ?? deriveTitle(args.slug);\n const briefBody = buildBriefBody(title, args.ref);\n\n const worktrees = args.worktree\n ? { main: { path: args.worktree, default: true } }\n : undefined;\n\n await writeFrontmatter(\n path.join(dir, 'brief.md'),\n {\n schema_version: 1,\n title,\n updated: today(),\n state: 'backburner' as const,\n ...(args.ship_target ? { ship_target: args.ship_target } : {}),\n ...(args.owner ? { owner: args.owner } : {}),\n task_prefix: derivePrefix(args.slug),\n ...(worktrees ? { worktrees } : {}),\n },\n briefBody,\n BriefFrontmatterSchema,\n );\n\n await atomicWrite(\n path.join(dir, 'handoff.md'),\n buildHandoff(title, args.ref),\n );\n\n const artifacts = ArtifactsSchema.parse({});\n await atomicWrite(path.join(dir, 'artifacts.yml'), yamlStringify(artifacts));\n await atomicWrite(path.join(dir, 'sources', '.gitkeep'), '');\n\n await appendTriagedLog('track', args.ref, `slug:${args.slug}`);\n\n return { slug: args.slug, dir, ref: args.ref };\n },\n});\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const stat = await fs.stat(p);\n return stat.isDirectory();\n } catch {\n return false;\n }\n}\n\nfunction deriveTitle(slug: string): string {\n return slug\n .split('-')\n .filter(Boolean)\n .map((s) => s[0]!.toUpperCase() + s.slice(1))\n .join(' ');\n}\n\nfunction buildBriefBody(title: string, ref: string): string {\n return [\n `# ${title}`,\n '',\n `Source: ${ref}`,\n '',\n 'This initiative was scaffolded from a discover hit. Replace this',\n 'placeholder body with the actual brief before promoting from',\n 'backburner to focused.',\n '',\n ].join('\\n');\n}\n\nfunction buildHandoff(title: string, ref: string): string {\n return [\n '# Current state',\n '',\n `New initiative \\`${title}\\` tracked from discover hit \\`${ref}\\`.`,\n 'No work landed yet — fill this in after the first working session.',\n '',\n ].join('\\n');\n}\n","import { z } from 'zod';\nimport { getActiveRoot } from '../utils/paths.js';\nimport { NotFoundError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\nimport { assembleBootstrap } from '../bootstrap/prompt.js';\nimport { resolveSlug, resolveSlugFromCwd } from './_open-helpers.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1).optional(),\n offline: z.boolean().optional(),\n // Directory to resolve the initiative from when no slug is given. Falls back\n // to the interactive-surface context cwd; unset for daemon/MCP callers.\n cwd: z.string().min(1).optional(),\n // Frame the prompt as ad-hoc work on the workstream rather than a\n // continuation of its handoff / top task.\n adhoc: z.boolean().optional(),\n});\n\ntype PromptArgs = z.infer<typeof ArgsSchema>;\n\nconst promptCommand = defineCommand<PromptArgs, string>({\n name: 'prompt',\n description:\n \"Print the bootstrap prompt for an initiative — the same text `aw` feeds Claude at launch — without any side effects. Resolves the initiative from a slug or the caller's cwd. Use it to re-seed context in a running session.\",\n args: ArgsSchema,\n result: z.string(),\n cli: {\n positional: ['slug'],\n options: {\n offline: {\n long: '--offline',\n description: 'Skip the live `gh`/`git` artifact lookup; render artifacts statically.',\n },\n cwd: {\n long: '--cwd',\n description:\n 'Directory to resolve the initiative from when no slug is given (default: current directory).',\n },\n adhoc: {\n long: '--adhoc',\n description:\n 'Frame the prompt as ad-hoc work on the workstream, awaiting the user’s task, not a continuation of the handoff / top task.',\n },\n },\n usage: 'active-work prompt [slug] [--offline] [--cwd <dir>] [--adhoc]',\n },\n async run(args, ctx) {\n const activeRoot = ctx.activeRoot ?? getActiveRoot();\n\n let slug: string;\n if (args.slug) {\n slug = await resolveSlug(activeRoot, args.slug);\n } else {\n const cwd = args.cwd ?? ctx.cwd;\n const matched = cwd ? await resolveSlugFromCwd(activeRoot, cwd) : null;\n if (!matched) {\n throw new NotFoundError(\n 'Could not determine an initiative from the current directory. ' +\n 'Pass a slug: `active-work prompt <slug>`.',\n );\n }\n slug = matched.slug;\n }\n\n // Deliberately no archiveStaleTasks: `prompt` is a read-only view.\n const { prompt } = await assembleBootstrap({\n activeRoot,\n slug,\n includeLiveStatus: !args.offline,\n adhoc: args.adhoc,\n });\n return prompt;\n },\n});\n\nexport default promptCommand;\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { spawn } from 'node:child_process';\nimport type { ChildProcess, SpawnOptions } from 'node:child_process';\nimport { z } from 'zod';\nimport { BriefFrontmatterSchema } from '../schemas/brief.js';\nimport { getInitiativeDir } from '../utils/paths.js';\nimport { readFrontmatter } from '../utils/gray-matter-io.js';\nimport { NotFoundError, ValidationError } from '../errors.js';\nimport { defineCommand } from '../registry/index.js';\n\nconst ArgsSchema = z.object({\n slug: z.string().min(1),\n target: z.enum(['brief', 'handoff']),\n});\n\nconst ResultSchema = z.object({\n slug: z.string(),\n target: z.enum(['brief', 'handoff']),\n file: z.string(),\n validated: z.boolean(),\n aborted: z.boolean().optional(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\ntype Result = z.infer<typeof ResultSchema>;\n\nexport interface EditorCommand {\n command: string;\n args: string[];\n}\n\nexport type EditorResolver = (filePath: string) => Promise<EditorCommand>;\n\nexport type EditorSpawner = (\n command: string,\n args: string[],\n options: SpawnOptions,\n) => Promise<number>;\n\n/**\n * Resolve which editor to launch using the cascading fallback:\n * 1. `$EDITOR` (invoked via `sh -c` so multi-token values like\n * `nvim --noplugin` split correctly).\n * 2. `code --wait` when the `code` binary resolves on PATH.\n * 3. `vi` as the universal last resort.\n */\nexport async function resolveEditor(filePath: string): Promise<EditorCommand> {\n const editorEnv = process.env.EDITOR;\n if (editorEnv && editorEnv.length > 0) {\n return { command: 'sh', args: ['-c', '$EDITOR \"$0\"', filePath] };\n }\n if (await commandExists('code')) {\n return { command: 'code', args: ['--wait', filePath] };\n }\n return { command: 'vi', args: [filePath] };\n}\n\nasync function commandExists(name: string): Promise<boolean> {\n return new Promise((resolve) => {\n const child = spawn('/bin/sh', ['-c', `command -v ${name}`], {\n stdio: 'ignore',\n });\n child.on('exit', (code) => resolve(code === 0));\n child.on('error', () => resolve(false));\n });\n}\n\n/**\n * Default child-process spawner. Inherits stdio so the editor takes\n * over the operator's TTY, and resolves with the exit code on close.\n */\nexport const defaultSpawner: EditorSpawner = (command, args, options) => {\n return new Promise((resolve, reject) => {\n let child: ChildProcess;\n try {\n child = spawn(command, args, options);\n } catch (err) {\n reject(err);\n return;\n }\n child.on('error', reject);\n child.on('exit', (code) => resolve(code ?? 1));\n });\n};\n\nexport interface RunEditDeps {\n resolveEditor: EditorResolver;\n spawner: EditorSpawner;\n}\n\nconst defaultDeps: RunEditDeps = {\n resolveEditor,\n spawner: defaultSpawner,\n};\n\nfunction targetFile(slug: string, target: Args['target']): string {\n const dir = getInitiativeDir(slug);\n return path.join(dir, target === 'brief' ? 'brief.md' : 'handoff.md');\n}\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n await fs.access(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function runEdit(\n args: Args,\n deps: RunEditDeps = defaultDeps,\n): Promise<Result> {\n const file = targetFile(args.slug, args.target);\n if (!(await fileExists(file))) {\n throw new NotFoundError(\n `${args.target}.md not found for initiative \"${args.slug}\" (expected ${file})`,\n );\n }\n\n const editor = await deps.resolveEditor(file);\n const exitCode = await deps.spawner(editor.command, editor.args, {\n stdio: 'inherit',\n });\n\n if (exitCode !== 0) {\n return {\n slug: args.slug,\n target: args.target,\n file,\n validated: false,\n aborted: true,\n };\n }\n\n if (args.target === 'brief') {\n try {\n await readFrontmatter(file, BriefFrontmatterSchema);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n throw new ValidationError(\n `Brief frontmatter is invalid after editing. Re-run \\`active-work edit ${args.slug} brief\\` to fix.\\n${message}`,\n { cause: err },\n );\n }\n } else if (!(await fileExists(file))) {\n throw new NotFoundError(\n `handoff.md disappeared during edit (expected ${file})`,\n );\n }\n\n return {\n slug: args.slug,\n target: args.target,\n file,\n validated: true,\n };\n}\n\nconst edit = defineCommand<Args, Result>({\n name: 'edit',\n description: \"Open the operator's editor on brief.md or handoff.md.\",\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n positional: ['slug', 'target'],\n usage: 'active-work edit <slug> <brief|handoff>',\n },\n async run(args) {\n return runEdit(args);\n },\n});\n\nexport default edit;\n","import { spawn } from 'node:child_process';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { runMcpStdio } from '../server/mcp.js';\nimport { runDaemon } from '../server/daemon.js';\n\n/**\n * `active-work mcp serve` — start the MCP server.\n *\n * - `--stdio`: speak JSON-RPC over stdio (for `claude mcp add`).\n * - `--detach`: fork a child running `active-work mcp serve` in the background.\n * - default: run the HTTP daemon in the foreground on `--port` (default 7400).\n */\n\nconst ArgsSchema = z.object({\n stdio: z.boolean().optional(),\n detach: z.boolean().optional(),\n port: z.number().int().positive().optional(),\n});\n\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n mode: z.enum(['stdio', 'http', 'detached']),\n pid: z.number().optional(),\n port: z.number().optional(),\n});\n\ntype Result = z.infer<typeof ResultSchema>;\n\nfunction detachedSpawn(port: number | undefined): { pid: number; port: number } {\n const entry = process.argv[1];\n if (!entry) {\n throw new Error('Cannot determine CLI entrypoint for detach');\n }\n const args = ['mcp', 'serve'];\n if (port !== undefined) {\n args.push('--port', String(port));\n }\n const child = spawn(process.execPath, [entry, ...args], {\n detached: true,\n stdio: 'ignore',\n env: process.env,\n });\n child.unref();\n return { pid: child.pid ?? -1, port: port ?? 7400 };\n}\n\nexport default defineCommand<Args, Result>({\n name: 'mcp.serve',\n description:\n 'Start the MCP server. --stdio for stdio mode; --detach to fork the HTTP daemon; otherwise runs the HTTP daemon in the foreground.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n stdio: {\n long: '--stdio',\n description: 'Run in stdio mode for Claude Code `claude mcp add`.',\n },\n detach: {\n long: '--detach',\n description: 'Spawn the HTTP daemon in the background and return.',\n },\n port: {\n long: '--port',\n description: 'TCP port for the HTTP daemon (default 7400).',\n },\n },\n },\n async run(args) {\n if (args.stdio) {\n await runMcpStdio();\n return { mode: 'stdio' };\n }\n if (args.detach) {\n const { pid, port } = detachedSpawn(args.port);\n return { mode: 'detached', pid, port };\n }\n await runDaemon({ port: args.port });\n return { mode: 'http', port: args.port };\n },\n});\n","/**\n * MCP stdio server.\n *\n * Exposes every Command registered in `src/registry/` as an MCP tool, with\n * inputSchema derived from the command's zod args. Tool name is the\n * hierarchical command name with dots replaced by double underscores and\n * an `active__` prefix (e.g. `task.add` -> `active__task__add`).\n *\n * Wave 3 ships the stdio transport only; Wave 4 will wrap the same handlers\n * in an HTTP transport hosted by the daemon.\n */\n\nimport { z } from 'zod';\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';\nimport {\n registry,\n successEnvelope,\n errorEnvelope,\n type AnyCommand,\n type CommandContext,\n type JsonEnvelope,\n} from '../registry/index.js';\nimport '../commands/index.js'; // populates registry on import\nimport { formatError } from '../errors.js';\nimport { getActiveRoot } from '../utils/paths.js';\n\nconst TOOL_NAME_PREFIX = 'active__';\n\nexport interface McpTool {\n name: string;\n description: string;\n inputSchema: Record<string, unknown>;\n}\n\n/** Convert a command name (e.g. `task.add`) to a tool name (`active__task__add`). */\nexport function commandNameToToolName(commandName: string): string {\n return TOOL_NAME_PREFIX + commandName.replaceAll('.', '__');\n}\n\n/** Convert a tool name back to a command name. Returns null if it isn't ours. */\nexport function toolNameToCommandName(toolName: string): string | null {\n if (!toolName.startsWith(TOOL_NAME_PREFIX)) return null;\n return toolName.slice(TOOL_NAME_PREFIX.length).replaceAll('__', '.');\n}\n\n/**\n * Strip top-level `$schema` / `definitions` keys that the MCP client doesn't\n * need (and some clients reject when present at the root of inputSchema).\n */\nfunction stripJsonSchemaCruft(schema: Record<string, unknown>): Record<string, unknown> {\n const { $schema: _schema, definitions: _defs, ...rest } = schema;\n void _schema;\n void _defs;\n return rest;\n}\n\n/**\n * Build an MCP tool descriptor from a command. Uses Zod 4's native\n * `z.toJSONSchema` (the spec-mentioned `zod-to-json-schema` package only\n * supports Zod v3 schemas; this repo is on Zod 4).\n */\nexport function commandToTool(cmd: AnyCommand): McpTool {\n // z.toJSONSchema accepts any zod schema; cast away the registry's generic.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const raw = z.toJSONSchema(cmd.args as any) as Record<string, unknown>;\n const inputSchema = stripJsonSchemaCruft(raw);\n // MCP requires inputSchema.type === 'object'. Every registered command's\n // args is a z.object(...), so this is satisfied; assert defensively.\n if (inputSchema.type !== 'object') {\n inputSchema.type = 'object';\n }\n return {\n name: commandNameToToolName(cmd.name),\n description: cmd.description,\n inputSchema,\n };\n}\n\n/** List every registered command as an MCP tool. */\nexport function listTools(): McpTool[] {\n return Array.from(registry.values()).map(commandToTool);\n}\n\ninterface ToolCallOutcome {\n isError: boolean;\n envelope: JsonEnvelope<unknown>;\n}\n\n/**\n * Resolve a tool name to its command, parse args, and invoke `run()`.\n * Always returns an envelope; errors are wrapped, never thrown.\n */\nexport async function invokeTool(toolName: string, rawArgs: unknown): Promise<ToolCallOutcome> {\n const commandName = toolNameToCommandName(toolName);\n const cmd = commandName ? registry.get(commandName) : undefined;\n if (!cmd) {\n const err = formatError(new Error(`Unknown tool: ${toolName}`));\n return { isError: true, envelope: errorEnvelope(err.message, err.code) };\n }\n\n let parsedArgs: unknown;\n try {\n parsedArgs = cmd.args.parse(rawArgs ?? {});\n } catch (err) {\n const f = formatError(err);\n const message = err instanceof z.ZodError ? `Invalid arguments: ${f.message}` : f.message;\n return { isError: true, envelope: errorEnvelope(message, f.code) };\n }\n\n const ctx: CommandContext = {\n activeRoot: getActiveRoot(),\n warnings: [],\n format: 'json',\n };\n\n try {\n const result = await cmd.run(parsedArgs, ctx);\n return { isError: false, envelope: successEnvelope(result, ctx.warnings) };\n } catch (err) {\n const f = formatError(err);\n return { isError: true, envelope: errorEnvelope(f.message, f.code) };\n }\n}\n\n/** Wire MCP request handlers onto a server instance. Exposed for testing. */\nexport function attachHandlers(server: Server): void {\n server.setRequestHandler(ListToolsRequestSchema, () => {\n return { tools: listTools() };\n });\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const { isError, envelope } = await invokeTool(name, args);\n return {\n isError,\n content: [{ type: 'text', text: JSON.stringify(envelope) }],\n };\n });\n}\n\n/** Construct a fully-wired MCP server, sans transport. */\nexport function createMcpServer(): Server {\n const server = new Server(\n {\n name: '@hjewkes/active-work',\n version: '0.1.0',\n },\n {\n capabilities: {\n tools: {},\n },\n },\n );\n attachHandlers(server);\n return server;\n}\n\n/**\n * Run the MCP server over stdio. Resolves when the transport closes\n * (i.e. when the client disconnects).\n */\nexport async function runMcpStdio(): Promise<void> {\n const server = createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n await new Promise<void>((resolve) => {\n const original = transport.onclose;\n transport.onclose = () => {\n try {\n original?.();\n } finally {\n resolve();\n }\n };\n });\n}\n","/**\n * Daemon entrypoint.\n *\n * `runDaemon` binds the hono app to 127.0.0.1:<port>, writes a PID\n * file, and stays running until SIGTERM/SIGINT. It does not call\n * `process.exit` — the caller decides how the process terminates.\n */\nimport type { IncomingMessage, ServerResponse } from 'node:http';\nimport { serve, type ServerType } from '@hono/node-server';\nimport { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';\nimport { DaemonError } from '../errors.js';\nimport { getActiveRoot } from '../utils/paths.js';\nimport { buildHttpApp } from './http.js';\nimport { DAEMON_VERSION } from './health.js';\nimport { getLogger } from './logger.js';\nimport { createMcpServer } from './mcp.js';\nimport { EventHub } from './events.js';\nimport { watchTree, type TreeWatcher } from './file-watch.js';\nimport {\n isProcessAlive,\n readPidFile,\n removePidFile,\n writePidFile,\n} from './lifecycle.js';\n\nexport interface RunDaemonOptions {\n port?: number;\n}\n\nconst DEFAULT_PORT = 7400;\nconst HOSTNAME = '127.0.0.1';\n\nfunction resolvePort(options: RunDaemonOptions): number {\n if (typeof options.port === 'number' && Number.isFinite(options.port)) {\n return options.port;\n }\n const envPort = process.env.AW_PORT;\n if (envPort) {\n const n = Number.parseInt(envPort, 10);\n if (Number.isFinite(n)) return n;\n }\n return DEFAULT_PORT;\n}\n\nasync function assertNotAlreadyRunning(): Promise<void> {\n const existing = await readPidFile();\n if (existing && isProcessAlive(existing.pid)) {\n throw new DaemonError(\n `Daemon already running (pid ${existing.pid}, port ${existing.meta.port})`,\n );\n }\n if (existing) {\n // Stale PID file — clean it up so writePidFile lands cleanly.\n await removePidFile();\n }\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = [];\n req.on('data', (c: Buffer) => chunks.push(c));\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n if (raw.length === 0) {\n resolve(undefined);\n return;\n }\n try {\n resolve(JSON.parse(raw));\n } catch (err) {\n reject(err);\n }\n });\n req.on('error', reject);\n });\n}\n\n/**\n * Handle a /mcp request by spinning up a fresh MCP server + transport\n * and letting the transport write directly to the Node response. We\n * bypass hono for this route because the transport assumes ownership\n * of the response object.\n */\nasync function handleMcpRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\n const server = createMcpServer();\n const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });\n let body: unknown;\n if (req.method === 'POST') {\n try {\n body = await readJsonBody(req);\n } catch {\n res.statusCode = 400;\n res.end(JSON.stringify({ ok: false, error: 'Invalid JSON body' }));\n return;\n }\n }\n res.on('close', () => {\n void transport.close();\n void server.close();\n });\n await server.connect(transport);\n await transport.handleRequest(req, res, body);\n}\n\nfunction listenOn(app: ReturnType<typeof buildHttpApp>, port: number): Promise<ServerType> {\n return new Promise((resolve) => {\n const server = serve(\n {\n fetch: app.fetch,\n hostname: HOSTNAME,\n port,\n },\n () => resolve(server),\n );\n // Replace the request handler: route /mcp to the MCP transport\n // directly, falling through to hono for everything else.\n const honoHandler = server.listeners('request')[0] as\n | ((req: IncomingMessage, res: ServerResponse) => void)\n | undefined;\n server.removeAllListeners('request');\n server.on('request', (req: IncomingMessage, res: ServerResponse) => {\n const url = req.url ?? '';\n if (url === '/mcp' || url.startsWith('/mcp?') || url.startsWith('/mcp/')) {\n void handleMcpRequest(req, res).catch((err) => {\n if (!res.headersSent) {\n res.statusCode = 500;\n res.end(String(err));\n } else {\n res.destroy();\n }\n });\n return;\n }\n if (honoHandler) honoHandler(req, res);\n });\n });\n}\n\nfunction closeServer(server: ServerType): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((err) => {\n if (err) reject(err);\n else resolve();\n });\n });\n}\n\nexport async function runDaemon(options: RunDaemonOptions = {}): Promise<void> {\n const log = getLogger();\n await assertNotAlreadyRunning();\n\n const port = resolvePort(options);\n const hub = new EventHub();\n const app = buildHttpApp({ port, hub });\n const server = await listenOn(app, port);\n const started = new Date().toISOString();\n\n const activeRoot = getActiveRoot();\n let watcher: TreeWatcher | null = null;\n try {\n watcher = watchTree(\n activeRoot,\n () => hub.broadcast({ event: 'change', data: 'active-root' }),\n { onError: (err) => log.warn({ err }, 'file watcher error') },\n );\n log.info({ activeRoot }, 'watching active root for live reload');\n } catch (err) {\n // Live reload is a nicety; never let a watcher failure abort the daemon.\n log.warn({ err, activeRoot }, 'live-reload watcher unavailable');\n }\n\n await writePidFile(process.pid, {\n port,\n version: DAEMON_VERSION,\n started,\n });\n log.info({ pid: process.pid, port, started }, 'daemon started');\n\n await new Promise<void>((resolve) => {\n let shuttingDown = false;\n const shutdown = (signal: NodeJS.Signals): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n log.info({ signal }, 'shutting down');\n void (async () => {\n try {\n watcher?.close();\n } catch (err) {\n log.error({ err }, 'error closing file watcher');\n }\n try {\n await closeServer(server);\n } catch (err) {\n log.error({ err }, 'error closing server');\n }\n try {\n await removePidFile();\n } catch (err) {\n log.error({ err }, 'error removing pid file');\n }\n log.info('stopped');\n resolve();\n })();\n };\n\n process.once('SIGTERM', shutdown);\n process.once('SIGINT', shutdown);\n });\n}\n","/**\n * HTTP daemon: hono app that exposes the command registry, MCP-over-HTTP,\n * health/version endpoints, and a static dashboard placeholder.\n *\n * The app is intentionally pure — it constructs and returns a `Hono`\n * instance without binding a port; `daemon.ts` handles the lifecycle.\n */\nimport { Hono } from 'hono';\nimport { streamSSE } from 'hono/streaming';\nimport { z } from 'zod';\nimport { registry, successEnvelope, errorEnvelope } from '../registry/index.js';\nimport type { CommandContext } from '../registry/index.js';\nimport '../commands/index.js'; // populate the registry on import\nimport { formatError, EXIT } from '../errors.js';\nimport { getActiveRoot } from '../utils/paths.js';\nimport { buildHealthPayload, DAEMON_VERSION } from './health.js';\nimport { handleDashboard } from './dashboard-routes.js';\nimport type { EventHub } from './events.js';\n\nexport interface BuildHttpAppOptions {\n port: number;\n /**\n * Optional event hub for live-reload SSE. When present, `/events` streams\n * change notifications; when absent (e.g. unit tests), `/events` still\n * connects but only emits heartbeats.\n */\n hub?: EventHub;\n}\n\n/** Interval between SSE keep-alive comments (ms). */\nconst HEARTBEAT_MS = 25_000;\n\nexport function buildHttpApp(options: BuildHttpAppOptions): Hono {\n const app = new Hono();\n\n app.get('/health', (c) => c.json(buildHealthPayload(options.port)));\n\n app.get('/version', (c) => c.json({ version: DAEMON_VERSION }));\n\n app.get('/events', (c) =>\n streamSSE(c, async (stream) => {\n await stream.writeSSE({ event: 'ready', data: 'connected' });\n const unsubscribe = options.hub?.subscribe((message) =>\n stream.writeSSE(message),\n );\n stream.onAbort(() => unsubscribe?.());\n // Hold the connection open, emitting periodic heartbeats so proxies and\n // dead-peer detection keep the stream healthy until the client aborts.\n while (!stream.aborted) {\n await stream.sleep(HEARTBEAT_MS);\n if (stream.aborted) break;\n await stream.writeSSE({ event: 'ping', data: String(Date.now()) });\n }\n unsubscribe?.();\n }),\n );\n\n app.post('/rpc/:name', async (c) => {\n const name = c.req.param('name');\n const cmd = registry.get(name);\n if (!cmd) {\n return c.json(errorEnvelope(`Unknown command: ${name}`, EXIT.USAGE), 404);\n }\n\n let rawArgs: unknown = {};\n const contentLength = c.req.header('content-length');\n if (contentLength && contentLength !== '0') {\n try {\n rawArgs = await c.req.json();\n } catch {\n return c.json(errorEnvelope('Invalid JSON body', EXIT.USAGE), 400);\n }\n }\n\n let parsed: unknown;\n try {\n parsed = cmd.args.parse(rawArgs ?? {});\n } catch (err) {\n const f = formatError(err);\n const message =\n err instanceof z.ZodError ? `Invalid arguments: ${f.message}` : f.message;\n return c.json(errorEnvelope(message, EXIT.DATAERR), 400);\n }\n\n const ctx: CommandContext = {\n activeRoot: getActiveRoot(),\n warnings: [],\n format: 'json',\n };\n\n try {\n const result = await cmd.run(parsed, ctx);\n return c.json(successEnvelope(result, ctx.warnings));\n } catch (err) {\n const f = formatError(err);\n return c.json(errorEnvelope(f.message, f.code), 500);\n }\n });\n\n app.get('/ui', (c) => handleDashboard(c));\n app.get('/ui/*', (c) => handleDashboard(c));\n\n return app;\n}\n","/**\n * Health endpoint state.\n *\n * `startedAt` is captured at module load so `/health` can report\n * uptime relative to daemon start without threading it through the\n * route builder.\n */\n\n// TODO: read version from package.json at build time; hardcoded for v0.\nexport const DAEMON_VERSION = '0.1.0';\n\nexport const startedAt = Date.now();\n\nexport interface HealthPayload {\n ok: true;\n version: string;\n pid: number;\n uptime_ms: number;\n port: number;\n}\n\nexport function buildHealthPayload(port: number): HealthPayload {\n return {\n ok: true,\n version: DAEMON_VERSION,\n pid: process.pid,\n uptime_ms: Date.now() - startedAt,\n port,\n };\n}\n","/**\n * Dashboard static-asset handler.\n *\n * If `dist/dashboard/` exists (produced by a future `pnpm build:dashboard`),\n * we serve its contents under `/ui/*`. Otherwise we return a friendly\n * placeholder page so first-run users know what to do.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { Context } from 'hono';\n\nconst PLACEHOLDER_HTML = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <title>active-work dashboard</title>\n <style>\n body { font-family: system-ui, sans-serif; max-width: 36rem; margin: 4rem auto; padding: 0 1rem; color: #222; }\n code { background: #f4f4f5; padding: 0.1rem 0.3rem; border-radius: 4px; }\n </style>\n </head>\n <body>\n <h1>active-work</h1>\n <p>Dashboard not built yet — run <code>pnpm build:dashboard</code>.</p>\n <p>The daemon is running; use the CLI or MCP for now.</p>\n </body>\n</html>`;\n\nconst CONTENT_TYPES: Record<string, string> = {\n '.html': 'text/html; charset=utf-8',\n '.htm': 'text/html; charset=utf-8',\n '.js': 'application/javascript; charset=utf-8',\n '.css': 'text/css; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.svg': 'image/svg+xml',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n};\n\nfunction contentTypeFor(filename: string): string {\n const ext = path.extname(filename).toLowerCase();\n return CONTENT_TYPES[ext] ?? 'application/octet-stream';\n}\n\n/**\n * Candidate locations for the built dashboard bundle (`dist/dashboard/`).\n *\n * `tsup` bundles the daemon into `dist/cli.js`, so at runtime the compiled\n * file sits at `dist/` and the dashboard is a sibling (`here/dashboard`). In\n * dev (tsx) the source runs from `src/server/`, and the built dashboard lives\n * at `<repo>/dist/dashboard`. We probe both plus the legacy `dist/server`\n * layout and use the first that exists.\n */\nfunction dashboardDirCandidates(): string[] {\n const here = path.dirname(fileURLToPath(import.meta.url));\n return [\n path.resolve(here, 'dashboard'), // bundled: dist/cli.js -> dist/dashboard\n path.resolve(here, '..', 'dashboard'), // legacy: dist/server -> dist/dashboard\n path.resolve(here, '..', '..', 'dist', 'dashboard'), // dev: src/server -> dist/dashboard\n ];\n}\n\nasync function safeStat(p: string): Promise<{ exists: boolean; isFile: boolean }> {\n try {\n const stat = await fs.stat(p);\n return { exists: true, isFile: stat.isFile() };\n } catch {\n return { exists: false, isFile: false };\n }\n}\n\n/** First candidate directory that exists, or null if none is built yet. */\nasync function resolveDashboardDir(): Promise<string | null> {\n for (const dir of dashboardDirCandidates()) {\n if ((await safeStat(dir)).exists) return dir;\n }\n return null;\n}\n\nexport async function handleDashboard(c: Context): Promise<Response> {\n const root = await resolveDashboardDir();\n if (!root) {\n return c.html(PLACEHOLDER_HTML, 200);\n }\n\n // Strip the route prefix to get the asset-relative path.\n const url = new URL(c.req.url);\n const subpath = url.pathname.replace(/^\\/ui\\/?/, '');\n const relative = subpath === '' ? 'index.html' : subpath;\n\n // Guard against path traversal.\n const target = path.resolve(root, relative);\n if (!target.startsWith(root + path.sep) && target !== root) {\n return c.text('forbidden', 403);\n }\n\n const stat = await safeStat(target);\n if (!stat.exists || !stat.isFile) {\n // Fall back to index.html for SPA routing.\n const indexPath = path.join(root, 'index.html');\n const indexStat = await safeStat(indexPath);\n if (!indexStat.exists) {\n return c.html(PLACEHOLDER_HTML, 200);\n }\n const body = await fs.readFile(indexPath);\n return c.body(new Uint8Array(body), 200, {\n 'content-type': 'text/html; charset=utf-8',\n });\n }\n\n const body = await fs.readFile(target);\n return c.body(new Uint8Array(body), 200, {\n 'content-type': contentTypeFor(target),\n });\n}\n","/**\n * pino logger for the daemon.\n *\n * Logs to stderr (pretty when TTY, JSON otherwise) and additionally\n * appends a JSON record to `<state>/daemon.log`. Rotation is not yet\n * implemented; a future wave can layer pino-roll on top.\n */\nimport { mkdirSync, createWriteStream } from 'node:fs';\nimport path from 'node:path';\nimport pino, { type Logger, multistream, type StreamEntry } from 'pino';\nimport { getStateRoot } from '../utils/paths.js';\n\nlet cachedLogger: Logger | undefined;\n\nfunction buildLogger(): Logger {\n const stateRoot = getStateRoot();\n mkdirSync(stateRoot, { recursive: true });\n const logPath = path.join(stateRoot, 'daemon.log');\n\n const fileStream = createWriteStream(logPath, { flags: 'a' });\n\n const stderrIsTTY = process.stderr.isTTY === true;\n const stderrStream: NodeJS.WritableStream = stderrIsTTY\n ? (pino.transport({\n target: 'pino-pretty',\n options: { destination: 2, colorize: true },\n }) as unknown as NodeJS.WritableStream)\n : process.stderr;\n\n const streams: StreamEntry[] = [\n { stream: stderrStream },\n { stream: fileStream },\n ];\n\n return pino({ level: process.env.AW_LOG_LEVEL ?? 'info' }, multistream(streams));\n}\n\nexport function getLogger(): Logger {\n cachedLogger ??= buildLogger();\n return cachedLogger;\n}\n\n/** Reset the cached logger. Used by tests that need a clean instance. */\nexport function resetLogger(): void {\n cachedLogger = undefined;\n}\n","/**\n * Event hub: fan-out of daemon-side events to connected dashboard clients\n * over Server-Sent Events.\n *\n * The hub is transport-agnostic — a subscriber is just an async `send`\n * function. `http.ts` wires each SSE connection's `writeSSE` in as a\n * subscriber; `daemon.ts` feeds `broadcast` from the filesystem watcher.\n */\n\nexport interface SseMessage {\n event: string;\n data: string;\n}\n\nexport type Subscriber = (message: SseMessage) => void | Promise<void>;\n\nexport class EventHub {\n private readonly subscribers = new Set<Subscriber>();\n\n /** Register a subscriber; returns an unsubscribe function. */\n subscribe(send: Subscriber): () => void {\n this.subscribers.add(send);\n return () => {\n this.subscribers.delete(send);\n };\n }\n\n /** Number of currently-connected clients (exposed for /health + tests). */\n get size(): number {\n return this.subscribers.size;\n }\n\n /**\n * Push a message to every subscriber. A slow or broken subscriber never\n * blocks the others and never throws out of `broadcast`; failures drop that\n * subscriber so a dead connection can't wedge future broadcasts.\n */\n broadcast(message: SseMessage): void {\n for (const send of this.subscribers) {\n try {\n const result = send(message);\n if (result && typeof result.then === 'function') {\n result.catch(() => this.subscribers.delete(send));\n }\n } catch {\n this.subscribers.delete(send);\n }\n }\n }\n}\n","/**\n * Recursive filesystem watcher for the active root.\n *\n * Node's `fs.watch(dir, { recursive: true })` is only reliable on macOS and\n * Windows; on Linux recursive support is version-dependent. To stay portable\n * we build the recursion ourselves: watch the root plus every current\n * subdirectory, and re-scan (adding watchers for freshly-created dirs) whenever\n * a change lands. Change events are debounced into a single callback so a burst\n * of atomic writes (temp file + rename) collapses into one broadcast.\n */\nimport { watch, readdirSync, promises as fs, type FSWatcher } from 'node:fs';\nimport path from 'node:path';\n\nexport interface WatchTreeOptions {\n /** Coalesce bursts of events within this window (ms). */\n debounceMs?: number;\n /** Surface watcher errors (e.g. EMFILE) without crashing the daemon. */\n onError?: (err: unknown) => void;\n}\n\nexport interface TreeWatcher {\n close: () => void;\n}\n\nconst DEFAULT_DEBOUNCE_MS = 200;\n\n/**\n * Watch `root` and all nested directories, invoking `onChange` (debounced)\n * whenever any file or directory under the tree changes. Returns a handle\n * whose `close()` tears down every underlying watcher.\n */\nexport function watchTree(\n root: string,\n onChange: () => void,\n options: WatchTreeOptions = {},\n): TreeWatcher {\n const debounceMs = options.debounceMs ?? DEFAULT_DEBOUNCE_MS;\n const watchers = new Map<string, FSWatcher>();\n let debounceTimer: NodeJS.Timeout | null = null;\n let rescanTimer: NodeJS.Timeout | null = null;\n let closed = false;\n\n const fire = (): void => {\n if (closed) return;\n if (debounceTimer) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n if (!closed) onChange();\n }, debounceMs);\n };\n\n const watchDir = (dir: string): void => {\n if (closed || watchers.has(dir)) return;\n let w: FSWatcher;\n try {\n w = watch(dir, { persistent: false });\n } catch (err) {\n options.onError?.(err);\n return;\n }\n w.on('error', (err) => options.onError?.(err));\n w.on('change', () => {\n fire();\n // A new subdirectory may have appeared; pick it up on the next tick.\n scheduleRescan();\n });\n watchers.set(dir, w);\n };\n\n const scheduleRescan = (): void => {\n if (closed || rescanTimer) return;\n rescanTimer = setTimeout(() => {\n rescanTimer = null;\n void addNewDirs(root);\n }, debounceMs);\n };\n\n const addNewDirs = async (dir: string): Promise<void> => {\n if (closed) return;\n let entries;\n try {\n entries = await fs.readdir(dir, { withFileTypes: true });\n } catch (err) {\n options.onError?.(err);\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const child = path.join(dir, entry.name);\n const isNew = !watchers.has(child);\n watchDir(child);\n if (isNew) await addNewDirs(child);\n }\n };\n\n // Attach watchers for the whole existing tree *synchronously* so no edit can\n // slip through the gap between `watchTree` returning and an async scan\n // completing — this matters on Linux, where the root watch is non-recursive\n // and nested changes are only seen via the per-directory watchers.\n const addExistingDirsSync = (dir: string): void => {\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch (err) {\n options.onError?.(err);\n return;\n }\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const child = path.join(dir, entry.name);\n watchDir(child);\n addExistingDirsSync(child);\n }\n };\n\n watchDir(root);\n addExistingDirsSync(root);\n\n return {\n close(): void {\n closed = true;\n if (debounceTimer) clearTimeout(debounceTimer);\n if (rescanTimer) clearTimeout(rescanTimer);\n for (const w of watchers.values()) w.close();\n watchers.clear();\n },\n };\n}\n","/**\n * PID file lifecycle helpers for the daemon.\n *\n * The PID file lives at `<state>/daemon.pid`; a companion metadata JSON\n * sits at `<state>/daemon.meta.json` and carries the port, version, and\n * started-at timestamp so external callers can introspect the daemon\n * without opening an HTTP connection.\n */\nimport { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { getStateRoot } from '../utils/paths.js';\n\nexport interface DaemonMeta {\n port: number;\n version: string;\n started: string;\n}\n\nexport interface PidFileContents {\n pid: number;\n meta: DaemonMeta;\n}\n\nfunction pidPath(): string {\n return path.join(getStateRoot(), 'daemon.pid');\n}\n\nfunction metaPath(): string {\n return path.join(getStateRoot(), 'daemon.meta.json');\n}\n\nasync function ensureStateDir(): Promise<void> {\n await fs.mkdir(getStateRoot(), { recursive: true });\n}\n\nexport async function writePidFile(pid: number, meta: DaemonMeta): Promise<void> {\n await ensureStateDir();\n await fs.writeFile(pidPath(), String(pid), 'utf8');\n await fs.writeFile(metaPath(), JSON.stringify(meta, null, 2), 'utf8');\n}\n\nexport async function readPidFile(): Promise<PidFileContents | null> {\n let pidRaw: string;\n try {\n pidRaw = await fs.readFile(pidPath(), 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return null;\n throw err;\n }\n const pid = Number.parseInt(pidRaw.trim(), 10);\n if (!Number.isFinite(pid)) return null;\n\n let metaRaw: string | undefined;\n try {\n metaRaw = await fs.readFile(metaPath(), 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n const meta: DaemonMeta = metaRaw\n ? (JSON.parse(metaRaw) as DaemonMeta)\n : { port: 0, version: 'unknown', started: '' };\n return { pid, meta };\n}\n\nexport async function removePidFile(): Promise<void> {\n for (const p of [pidPath(), metaPath()]) {\n try {\n await fs.unlink(p);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n }\n}\n\nexport function isProcessAlive(pid: number): boolean {\n if (!Number.isFinite(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // EPERM means the process exists but we can't signal it.\n if (code === 'EPERM') return true;\n return false;\n }\n}\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport {\n isProcessAlive,\n readPidFile,\n removePidFile,\n} from '../server/lifecycle.js';\n\n/**\n * `active-work mcp stop` — send SIGTERM to the daemon and wait for it to exit.\n *\n * Returns `{ stopped: false, reason: 'not running' }` when no PID file\n * exists or the recorded process has already died.\n */\n\nconst ArgsSchema = z.object({});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.union([\n z.object({ stopped: z.literal(true), pid: z.number() }),\n z.object({ stopped: z.literal(false), reason: z.string() }),\n]);\ntype Result = z.infer<typeof ResultSchema>;\n\nconst SHUTDOWN_TIMEOUT_MS = 3000;\nconst POLL_INTERVAL_MS = 100;\n\nasync function waitForExit(pid: number, timeoutMs: number): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isProcessAlive(pid)) return true;\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n return !isProcessAlive(pid);\n}\n\nexport default defineCommand<Args, Result>({\n name: 'mcp.stop',\n description: 'Stop the running MCP HTTP daemon (sends SIGTERM, waits for exit).',\n args: ArgsSchema,\n result: ResultSchema,\n async run() {\n const pidEntry = await readPidFile();\n if (!pidEntry) {\n return { stopped: false, reason: 'not running' };\n }\n const { pid } = pidEntry;\n if (!isProcessAlive(pid)) {\n await removePidFile();\n return { stopped: false, reason: 'not running' };\n }\n try {\n process.kill(pid, 'SIGTERM');\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code === 'ESRCH') {\n await removePidFile();\n return { stopped: false, reason: 'not running' };\n }\n throw err;\n }\n await waitForExit(pid, SHUTDOWN_TIMEOUT_MS);\n await removePidFile();\n return { stopped: true, pid };\n },\n});\n","import { spawn } from 'node:child_process';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport {\n isProcessAlive,\n readPidFile,\n removePidFile,\n} from '../server/lifecycle.js';\n\n/**\n * `active-work mcp restart` — stop the running daemon (if any) then spawn a new\n * detached daemon. Honors the previously-bound port when not overridden.\n */\n\nconst ArgsSchema = z.object({\n port: z.number().int().positive().optional(),\n});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n pid: z.number(),\n port: z.number(),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nconst SHUTDOWN_TIMEOUT_MS = 3000;\nconst POLL_INTERVAL_MS = 100;\nconst DEFAULT_PORT = 7400;\n\nasync function waitForExit(pid: number, timeoutMs: number): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n if (!isProcessAlive(pid)) return;\n await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));\n }\n}\n\nasync function stopExisting(): Promise<number | undefined> {\n const entry = await readPidFile();\n if (!entry) return undefined;\n const { pid, meta } = entry;\n if (isProcessAlive(pid)) {\n try {\n process.kill(pid, 'SIGTERM');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ESRCH') throw err;\n }\n await waitForExit(pid, SHUTDOWN_TIMEOUT_MS);\n }\n await removePidFile();\n return meta.port;\n}\n\nfunction detachedSpawn(port: number): { pid: number; port: number } {\n const entry = process.argv[1];\n if (!entry) {\n throw new Error('Cannot determine CLI entrypoint for restart');\n }\n const child = spawn(process.execPath, [entry, 'mcp', 'serve', '--port', String(port)], {\n detached: true,\n stdio: 'ignore',\n env: process.env,\n });\n child.unref();\n return { pid: child.pid ?? -1, port };\n}\n\nexport default defineCommand<Args, Result>({\n name: 'mcp.restart',\n description: 'Restart the MCP HTTP daemon (stop, then spawn a fresh detached instance).',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n port: {\n long: '--port',\n description: 'Port for the restarted daemon (default: previous port or 7400).',\n },\n },\n },\n async run(args) {\n const prevPort = await stopExisting();\n const port = args.port ?? prevPort ?? DEFAULT_PORT;\n return detachedSpawn(port);\n },\n});\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { isProcessAlive, readPidFile } from '../server/lifecycle.js';\n\n/**\n * `active-work mcp status` — report whether the daemon is running, plus a\n * snapshot of `/health` if it answers.\n */\n\nconst ArgsSchema = z.object({});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n running: z.boolean(),\n pid: z.number().optional(),\n port: z.number().optional(),\n version: z.string().optional(),\n uptime_ms: z.number().optional(),\n healthy: z.boolean().optional(),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nconst HEALTH_TIMEOUT_MS = 500;\n\ninterface HealthResponse {\n version: string;\n pid: number;\n uptime_ms: number;\n port: number;\n}\n\nasync function probeHealth(port: number): Promise<HealthResponse | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n const res = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timer);\n if (!res.ok) return null;\n return (await res.json()) as HealthResponse;\n } catch {\n return null;\n }\n}\n\nexport default defineCommand<Args, Result>({\n name: 'mcp.status',\n description: 'Report the MCP HTTP daemon status (pid, port, version, uptime).',\n args: ArgsSchema,\n result: ResultSchema,\n async run() {\n const entry = await readPidFile();\n if (!entry) {\n return { running: false };\n }\n const { pid, meta } = entry;\n const alive = isProcessAlive(pid);\n if (!alive) {\n return { running: false, pid, port: meta.port };\n }\n const health = await probeHealth(meta.port);\n if (health) {\n return {\n running: true,\n pid: health.pid,\n port: health.port,\n version: health.version,\n uptime_ms: health.uptime_ms,\n healthy: true,\n };\n }\n return {\n running: true,\n pid,\n port: meta.port,\n version: meta.version,\n healthy: false,\n };\n },\n});\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { getStateRoot } from '../utils/paths.js';\n\n/**\n * `active-work mcp logs` — return the tail of `daemon.log`.\n *\n * No `--follow` support in v0; callers that need streaming can `tail -f`\n * the file directly.\n */\n\nconst ArgsSchema = z.object({\n lines: z.number().int().positive().optional(),\n});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n lines: z.array(z.string()),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nconst DEFAULT_LINES = 50;\n\nexport default defineCommand<Args, Result>({\n name: 'mcp.logs',\n description: 'Return the last N lines of the daemon log (default 50).',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n lines: {\n long: '--lines',\n description: 'Number of trailing lines to return (default 50).',\n },\n },\n },\n async run(args) {\n const n = args.lines ?? DEFAULT_LINES;\n const logPath = path.join(getStateRoot(), 'daemon.log');\n let content: string;\n try {\n content = await fs.readFile(logPath, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return { lines: [] };\n }\n throw err;\n }\n const allLines = content.split(/\\r?\\n/);\n // Drop trailing empty line(s) from the final newline.\n while (allLines.length > 0 && allLines[allLines.length - 1] === '') {\n allLines.pop();\n }\n return { lines: allLines.slice(-n) };\n },\n});\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { runSetup } from '../setup/steps.js';\nimport { color } from '../utils/color.js';\n\n/**\n * `active-work setup` — interactive wizard that walks a fresh machine to a working state.\n *\n * Each step runs in sequence and short-circuits on the first hard failure.\n * `--yes` skips interactive prompts (assumes no for daemon start / ingestion).\n * `--update` re-runs idempotently and may overwrite the config stub.\n */\n\nconst ArgsSchema = z.object({\n update: z.boolean().optional(),\n yes: z.boolean().optional(),\n});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst StepSchema = z.object({\n name: z.string(),\n ok: z.boolean(),\n done: z.boolean().optional(),\n message: z.string().optional(),\n error: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n banner: z.string(),\n steps: z.array(StepSchema),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nfunction printStep(step: Result['steps'][number]): void {\n if (step.ok) {\n const mark = color.green('OK');\n const msg = step.message ?? '';\n process.stderr.write(` ${mark} ${step.name}${msg ? ` — ${msg}` : ''}\\n`);\n } else {\n const mark = color.red('FAIL');\n process.stderr.write(` ${mark} ${step.name} — ${step.error ?? 'failed'}\\n`);\n }\n}\n\nexport default defineCommand<Args, Result>({\n name: 'setup',\n description:\n 'Interactive wizard: verifies Node, scaffolds directories, registers the MCP server, and optionally starts the daemon and walks through ingestion.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n update: {\n long: '--update',\n description: 'Re-run setup idempotently (may overwrite the config stub).',\n },\n yes: {\n long: '--yes',\n short: '-y',\n description: 'Skip all prompts; use defaults (no daemon, no ingestion).',\n },\n },\n },\n async run(args, ctx) {\n const banner = color.bold('active-work setup');\n if (ctx.format !== 'json') {\n process.stderr.write(banner + '\\n');\n }\n const report = await runSetup({\n yes: args.yes ?? false,\n update: args.update ?? false,\n });\n if (ctx.format !== 'json') {\n for (const step of report.steps) printStep(step);\n }\n const failed = report.steps.find((s) => !s.ok);\n if (failed) {\n throw new Error(`setup failed at step '${failed.name}': ${failed.error}`);\n }\n return report;\n },\n});\n","/**\n * Individual setup steps used by `active-work setup` and `active-work uninstall`.\n *\n * Each step is a small async function that accepts a `SetupDeps` bag\n * (filesystem, spawn, prompts, paths). Tests inject stubs; production\n * callers let everything default. Steps never throw on failure — they\n * return a tagged result so the orchestrator can short-circuit cleanly.\n */\nimport { promises as fsp, existsSync } from 'node:fs';\nimport nodePath from 'node:path';\nimport { spawn as nodeSpawn } from 'node:child_process';\nimport os from 'node:os';\nimport { fileURLToPath } from 'node:url';\nimport * as clackPrompts from '@clack/prompts';\nimport { ensureSchemaVersion } from '../schemas/state.js';\nimport {\n getActiveRoot,\n getStateRoot,\n getConfigRoot,\n} from '../utils/paths.js';\nimport { STEP_SUPERVISION } from './supervision-systemd.js';\nimport { getSupervisor } from './supervision.js';\n\nfunction findRepoRoot(): string {\n let cursor = nodePath.dirname(fileURLToPath(import.meta.url));\n for (let depth = 0; depth < 6; depth++) {\n if (existsSync(nodePath.join(cursor, 'package.json'))) return cursor;\n const parent = nodePath.dirname(cursor);\n if (parent === cursor) break;\n cursor = parent;\n }\n // Fallback: two up from current file (covers source layout).\n return nodePath.resolve(\n nodePath.dirname(fileURLToPath(import.meta.url)),\n '..',\n '..',\n );\n}\n\nexport interface StepPaths {\n activeRoot: string;\n stateRoot: string;\n configRoot: string;\n homeDir: string;\n}\n\nexport interface SetupDeps {\n fs?: typeof fsp;\n spawn?: typeof nodeSpawn;\n prompts?: typeof clackPrompts;\n paths?: StepPaths;\n /** When true, skip interactive prompts and assume yes. */\n yes?: boolean;\n /** When true, allow overwrite of existing user files. */\n update?: boolean;\n /** Optional override for repo root (where bundled skill lives). */\n repoRoot?: string;\n /** Optional override for the CLI entrypoint (for spawn calls). */\n cliEntry?: string;\n}\n\nexport interface StepOk {\n ok: true;\n name: string;\n done: boolean;\n message: string;\n}\n\nexport interface StepErr {\n ok: false;\n name: string;\n error: string;\n}\n\nexport type StepResult = StepOk | StepErr;\n\n/** Resolve every defaultable dep so each step has a complete bag. */\nfunction resolveDeps(deps: SetupDeps): Required<\n Omit<SetupDeps, 'yes' | 'update' | 'repoRoot' | 'cliEntry'>\n> & {\n yes: boolean;\n update: boolean;\n repoRoot: string;\n cliEntry: string;\n} {\n const fs = deps.fs ?? fsp;\n const spawn = deps.spawn ?? nodeSpawn;\n const prompts = deps.prompts ?? clackPrompts;\n const homeDir = deps.paths?.homeDir ?? os.homedir();\n const paths: StepPaths = deps.paths ?? {\n activeRoot: getActiveRoot(),\n stateRoot: getStateRoot(),\n configRoot: getConfigRoot(),\n homeDir,\n };\n // The bundled skill lives at `<repoRoot>/skill`. Find it by walking up\n // from this module until we hit a directory containing `package.json`\n // — works both for source (`src/setup/steps.ts`) and bundled\n // (`dist/cli.js`) layouts.\n const repoRoot = deps.repoRoot ?? findRepoRoot();\n const cliEntry = deps.cliEntry ?? process.argv[1] ?? 'active-work';\n return {\n fs,\n spawn,\n prompts,\n paths,\n yes: deps.yes ?? false,\n update: deps.update ?? false,\n repoRoot,\n cliEntry,\n };\n}\n\nconst STEP_CHECK_NODE = 'check-node';\nconst STEP_CREATE_ACTIVE = 'create-active-root';\nconst STEP_SCHEMA = 'write-schema-version';\nconst STEP_CONFIG = 'write-config-stub';\nconst STEP_SKILL = 'install-skill';\nconst STEP_COMMAND = 'install-command';\nconst STEP_MCP = 'register-mcp';\nconst STEP_DAEMON = 'start-daemon';\nconst STEP_INGEST = 'ingestion';\n\nexport const STEP_NAMES = {\n CHECK_NODE: STEP_CHECK_NODE,\n CREATE_ACTIVE: STEP_CREATE_ACTIVE,\n SCHEMA: STEP_SCHEMA,\n CONFIG: STEP_CONFIG,\n SKILL: STEP_SKILL,\n COMMAND: STEP_COMMAND,\n MCP: STEP_MCP,\n SUPERVISION: STEP_SUPERVISION,\n DAEMON: STEP_DAEMON,\n INGEST: STEP_INGEST,\n} as const;\n\nconst MIN_NODE_MAJOR = 22;\n\nfunction parseNodeMajor(version: string): number {\n const cleaned = version.startsWith('v') ? version.slice(1) : version;\n const major = Number(cleaned.split('.')[0]);\n return Number.isFinite(major) ? major : 0;\n}\n\nexport async function stepCheckNode(deps: SetupDeps = {}): Promise<StepResult> {\n void deps;\n const major = parseNodeMajor(process.versions.node);\n if (major < MIN_NODE_MAJOR) {\n return {\n ok: false,\n name: STEP_CHECK_NODE,\n error: `Node ${MIN_NODE_MAJOR}+ required, found v${process.versions.node}`,\n };\n }\n return {\n ok: true,\n name: STEP_CHECK_NODE,\n done: true,\n message: `Node v${process.versions.node} OK`,\n };\n}\n\nasync function ensureDir(\n fs: typeof fsp,\n dir: string,\n): Promise<{ created: boolean }> {\n try {\n const stat = await fs.stat(dir);\n if (stat.isDirectory()) return { created: false };\n throw new Error(`${dir} exists but is not a directory`);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT') throw err;\n }\n await fs.mkdir(dir, { recursive: true });\n return { created: true };\n}\n\nexport async function stepCreateActiveRoot(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, paths } = resolveDeps(deps);\n try {\n const created: string[] = [];\n for (const dir of [paths.activeRoot, paths.stateRoot, paths.configRoot]) {\n const { created: didCreate } = await ensureDir(fs, dir);\n if (didCreate) created.push(dir);\n }\n const message =\n created.length === 0\n ? `Active/state/config dirs already present`\n : `Created ${created.length} dir(s)`;\n return {\n ok: true,\n name: STEP_CREATE_ACTIVE,\n done: created.length > 0,\n message,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_CREATE_ACTIVE,\n error: (err as Error).message,\n };\n }\n}\n\nexport async function stepWriteSchemaVersion(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { paths } = resolveDeps(deps);\n try {\n const result = await ensureSchemaVersion(paths.activeRoot);\n const message = result.migrated\n ? `Migrated v${result.before} -> v${result.after}`\n : `Schema at v${result.after}`;\n return {\n ok: true,\n name: STEP_SCHEMA,\n done: result.migrated,\n message,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SCHEMA,\n error: (err as Error).message,\n };\n }\n}\n\nconst CONFIG_STUB = {\n discovery: {\n githubRepos: [] as string[],\n localRepos: [] as string[],\n projectsRoot: '~/Documents/projects',\n },\n};\n\nexport async function stepWriteConfigStub(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, paths, update } = resolveDeps(deps);\n const configPath = nodePath.join(paths.configRoot, 'config.json');\n try {\n await ensureDir(fs, paths.configRoot);\n let exists = false;\n try {\n await fs.stat(configPath);\n exists = true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n if (exists && !update) {\n return {\n ok: true,\n name: STEP_CONFIG,\n done: false,\n message: `Config exists at ${configPath} (left untouched)`,\n };\n }\n await fs.writeFile(configPath, JSON.stringify(CONFIG_STUB, null, 2) + '\\n', 'utf8');\n return {\n ok: true,\n name: STEP_CONFIG,\n done: true,\n message: `Wrote config stub to ${configPath}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_CONFIG,\n error: (err as Error).message,\n };\n }\n}\n\nasync function pathExists(fs: typeof fsp, p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return false;\n throw err;\n }\n}\n\nasync function copyTree(\n fs: typeof fsp,\n src: string,\n dest: string,\n): Promise<void> {\n // node:fs/promises has cp() in Node 22+.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cp = (fs as any).cp as\n | undefined\n | ((from: string, to: string, opts: { recursive: boolean }) => Promise<void>);\n if (cp) {\n await cp(src, dest, { recursive: true });\n return;\n }\n // Fallback: shallow copy of files only (test envs may stub fs).\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n for (const entry of entries) {\n const from = nodePath.join(src, entry.name);\n const to = nodePath.join(dest, entry.name);\n if (entry.isDirectory()) {\n await copyTree(fs, from, to);\n } else {\n await fs.copyFile(from, to);\n }\n }\n}\n\nexport async function stepInstallSkill(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, paths, repoRoot } = resolveDeps(deps);\n const targetDir = nodePath.join(paths.homeDir, '.claude', 'skills', 'active-work');\n const targetMarker = nodePath.join(targetDir, 'SKILL.md');\n const sourceDir = nodePath.join(repoRoot, 'skill');\n try {\n if (await pathExists(fs, targetMarker)) {\n return {\n ok: true,\n name: STEP_SKILL,\n done: false,\n message: `Skill already installed at ${targetDir}`,\n };\n }\n if (!(await pathExists(fs, sourceDir))) {\n return {\n ok: true,\n name: STEP_SKILL,\n done: false,\n message: `Skill source not found at ${sourceDir}; skipping`,\n };\n }\n await fs.mkdir(nodePath.dirname(targetDir), { recursive: true });\n await copyTree(fs, sourceDir, targetDir);\n return {\n ok: true,\n name: STEP_SKILL,\n done: true,\n message: `Installed skill to ${targetDir}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SKILL,\n error: (err as Error).message,\n };\n }\n}\n\nexport async function stepInstallCommand(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, paths, repoRoot } = resolveDeps(deps);\n const targetDir = nodePath.join(paths.homeDir, '.claude', 'commands');\n const target = nodePath.join(targetDir, 'aw-prompt.md');\n const source = nodePath.join(repoRoot, 'claude-commands', 'aw-prompt.md');\n try {\n if (!(await pathExists(fs, source))) {\n return {\n ok: true,\n name: STEP_COMMAND,\n done: false,\n message: `Command source not found at ${source}; skipping`,\n };\n }\n await fs.mkdir(targetDir, { recursive: true });\n // Overwrite unconditionally (unlike the skill step, which skips if present):\n // the command is a single version-bundled file, so setup should refresh it.\n await fs.copyFile(source, target);\n return {\n ok: true,\n name: STEP_COMMAND,\n done: true,\n message: `Installed /aw-prompt command to ${target}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_COMMAND,\n error: (err as Error).message,\n };\n }\n}\n\n/** Spawn a process and capture its exit code + stderr. */\nfunction runOnce(\n spawn: typeof nodeSpawn,\n cmd: string,\n args: string[],\n): Promise<{ code: number | null; stderr: string; spawnError?: Error }> {\n return new Promise((resolve) => {\n let stderr = '';\n let settled = false;\n try {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err });\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n resolve({ code, stderr });\n });\n } catch (err) {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err as Error });\n }\n });\n}\n\nconst MCP_FALLBACK_SNIPPET = `{\n \"active-work\": {\n \"command\": \"active-work\",\n \"args\": [\"mcp\", \"serve\", \"--stdio\"]\n }\n}`;\n\nexport async function stepRegisterMcp(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { spawn } = resolveDeps(deps);\n const result = await runOnce(spawn, 'claude', [\n 'mcp',\n 'add',\n '--user',\n '@hjewkes/active-work',\n '--',\n 'active-work',\n 'mcp',\n 'serve',\n '--stdio',\n ]);\n if (result.spawnError && (result.spawnError as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n ok: true,\n name: STEP_MCP,\n done: false,\n message:\n '`claude` CLI not found. Add this to ~/.claude.json mcpServers section:\\n' +\n MCP_FALLBACK_SNIPPET,\n };\n }\n if (result.spawnError) {\n return {\n ok: true,\n name: STEP_MCP,\n done: false,\n message: `MCP registration skipped: ${result.spawnError.message}`,\n };\n }\n if (result.code === 0) {\n return {\n ok: true,\n name: STEP_MCP,\n done: true,\n message: 'Registered MCP server with Claude Code',\n };\n }\n return {\n ok: true,\n name: STEP_MCP,\n done: false,\n message:\n `claude mcp add exited with code ${result.code ?? 'null'}. ` +\n 'If already registered, this is safe. Otherwise add manually:\\n' +\n MCP_FALLBACK_SNIPPET,\n };\n}\n\n/**\n * Offer to install a user-level supervisor (systemd on Linux, launchd on\n * macOS) that keeps the daemon running across logins. No-op on platforms\n * without an integration.\n */\nexport async function stepSupervision(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { prompts, yes } = resolveDeps(deps);\n const supervisor = getSupervisor();\n if (!supervisor) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Skipped: no daemon supervisor is integrated for ${process.platform}`,\n };\n }\n if (!yes) {\n const answer = await prompts.confirm({\n message: supervisor.installPrompt,\n initialValue: true,\n });\n if (prompts.isCancel(answer) || answer !== true) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: 'Supervision install skipped',\n };\n }\n }\n // Supervision is an optional enhancement, not a prerequisite. Like\n // `stepStartDaemon`, a runtime failure (no user session, container, CI) must\n // not abort the whole setup — the unit/plist is still written, so downgrade\n // an install failure to a non-fatal warning that tells the user how to finish\n // enabling it by hand.\n const result = await supervisor.install(deps);\n if (!result.ok) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Daemon supervision not enabled (${result.error}); run \\`${supervisor.enableHint}\\` once a user session is available`,\n };\n }\n return result;\n}\n\n/** Spawn `active-work mcp serve --detach` (best-effort). */\nexport async function stepStartDaemon(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { spawn, prompts, yes, cliEntry } = resolveDeps(deps);\n // If a supervisor already owns the daemon, skip the manual spawn — restarting\n // it is the supervisor's job (e.g. `systemctl --user restart` / `launchctl\n // kickstart`).\n const supervisor = getSupervisor();\n if (supervisor && (await supervisor.isActive(deps))) {\n return {\n ok: true,\n name: STEP_DAEMON,\n done: false,\n message: `Daemon already supervised by ${supervisor.kind}; manual start skipped`,\n };\n }\n if (!yes) {\n const answer = await prompts.confirm({\n message: 'Start the HTTP daemon now? (background process)',\n initialValue: true,\n });\n if (prompts.isCancel(answer) || answer !== true) {\n return {\n ok: true,\n name: STEP_DAEMON,\n done: false,\n message: 'Daemon start skipped',\n };\n }\n } else {\n return {\n ok: true,\n name: STEP_DAEMON,\n done: false,\n message: 'Daemon start skipped (--yes)',\n };\n }\n try {\n const child = spawn(process.execPath, [cliEntry, 'mcp', 'serve', '--detach'], {\n detached: true,\n stdio: 'ignore',\n });\n child.unref?.();\n return {\n ok: true,\n name: STEP_DAEMON,\n done: true,\n message: `Daemon launched (pid=${child.pid ?? 'unknown'})`,\n };\n } catch (err) {\n return {\n ok: true,\n name: STEP_DAEMON,\n done: false,\n message: `Daemon launch skipped: ${(err as Error).message}`,\n };\n }\n}\n\nexport async function stepIngestion(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { prompts, yes, paths } = resolveDeps(deps);\n if (yes) {\n return {\n ok: true,\n name: STEP_INGEST,\n done: false,\n message:\n `Skipped ingestion walkthrough. Run \\`claude\\` in ${paths.activeRoot} ` +\n 'and ask it to run `active-work discover` followed by `active-work fold` / `active-work drop` / `active-work track`.',\n };\n }\n const answer = await prompts.confirm({\n message: 'Walk through existing work with Claude now?',\n initialValue: false,\n });\n if (prompts.isCancel(answer) || answer !== true) {\n return {\n ok: true,\n name: STEP_INGEST,\n done: false,\n message:\n `Ingestion skipped. Later: run \\`claude\\` in ${paths.activeRoot} and ask it to ` +\n 'invoke `active-work discover` to scan your work.',\n };\n }\n return {\n ok: true,\n name: STEP_INGEST,\n done: true,\n message:\n `Run \\`claude\\` in ${paths.activeRoot} and paste this prompt: ` +\n '\"Please run `active-work discover`, then walk me through `active-work fold` / `active-work drop` / `active-work track` for each hit.\"',\n };\n}\n\nexport interface SetupReport {\n banner: string;\n steps: Array<{\n name: string;\n ok: boolean;\n done?: boolean;\n message?: string;\n error?: string;\n }>;\n}\n\n/** Run every setup step in order, short-circuiting on the first failure. */\nexport async function runSetup(deps: SetupDeps = {}): Promise<SetupReport> {\n const banner = 'active-work setup';\n const steps: SetupReport['steps'] = [];\n const ordered = [\n stepCheckNode,\n stepCreateActiveRoot,\n stepWriteSchemaVersion,\n stepWriteConfigStub,\n stepInstallSkill,\n stepInstallCommand,\n stepRegisterMcp,\n stepSupervision,\n stepStartDaemon,\n stepIngestion,\n ];\n for (const step of ordered) {\n const result = await step(deps);\n if (result.ok) {\n steps.push({\n name: result.name,\n ok: true,\n done: result.done,\n message: result.message,\n });\n } else {\n steps.push({ name: result.name, ok: false, error: result.error });\n break;\n }\n }\n return { banner, steps };\n}\n\n// ----- Uninstall ----------------------------------------------------------\n\nexport interface UninstallReport {\n steps: Array<{ name: string; done: boolean; message?: string; error?: string }>;\n activeRootPreservedAt: string;\n}\n\nasync function confirmStep(\n prompts: typeof clackPrompts,\n yes: boolean,\n message: string,\n initial = true,\n): Promise<boolean> {\n if (yes) return true;\n const answer = await prompts.confirm({ message, initialValue: initial });\n if (prompts.isCancel(answer)) return false;\n return answer === true;\n}\n\nexport async function uninstallSkill(deps: SetupDeps = {}): Promise<StepResult> {\n const { fs, paths } = resolveDeps(deps);\n const target = nodePath.join(paths.homeDir, '.claude', 'skills', 'active-work');\n try {\n if (!(await pathExists(fs, target))) {\n return {\n ok: true,\n name: STEP_SKILL,\n done: false,\n message: `Skill not present at ${target}`,\n };\n }\n await fs.rm(target, { recursive: true, force: true });\n return {\n ok: true,\n name: STEP_SKILL,\n done: true,\n message: `Removed skill from ${target}`,\n };\n } catch (err) {\n return { ok: false, name: STEP_SKILL, error: (err as Error).message };\n }\n}\n\nexport async function uninstallCommand(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, paths } = resolveDeps(deps);\n const target = nodePath.join(\n paths.homeDir,\n '.claude',\n 'commands',\n 'aw-prompt.md',\n );\n try {\n if (!(await pathExists(fs, target))) {\n return {\n ok: true,\n name: STEP_COMMAND,\n done: false,\n message: `Command not present at ${target}`,\n };\n }\n await fs.rm(target, { force: true });\n return {\n ok: true,\n name: STEP_COMMAND,\n done: true,\n message: `Removed /aw-prompt command from ${target}`,\n };\n } catch (err) {\n return { ok: false, name: STEP_COMMAND, error: (err as Error).message };\n }\n}\n\nexport async function uninstallStopDaemon(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { spawn, cliEntry } = resolveDeps(deps);\n const result = await runOnce(spawn, process.execPath, [cliEntry, 'mcp', 'stop']);\n if (result.spawnError) {\n return {\n ok: true,\n name: STEP_DAEMON,\n done: false,\n message: `Daemon stop skipped: ${result.spawnError.message}`,\n };\n }\n return {\n ok: true,\n name: STEP_DAEMON,\n done: result.code === 0,\n message:\n result.code === 0\n ? 'Daemon stopped'\n : `Daemon stop exited ${result.code ?? 'null'}`,\n };\n}\n\nexport async function uninstallMcp(deps: SetupDeps = {}): Promise<StepResult> {\n const { spawn } = resolveDeps(deps);\n const result = await runOnce(spawn, 'claude', [\n 'mcp',\n 'remove',\n '--user',\n '@hjewkes/active-work',\n ]);\n if (result.spawnError && (result.spawnError as NodeJS.ErrnoException).code === 'ENOENT') {\n return {\n ok: true,\n name: STEP_MCP,\n done: false,\n message: '`claude` CLI not found. Remove the entry manually from ~/.claude.json',\n };\n }\n if (result.spawnError) {\n return {\n ok: true,\n name: STEP_MCP,\n done: false,\n message: `MCP unregister skipped: ${result.spawnError.message}`,\n };\n }\n return {\n ok: true,\n name: STEP_MCP,\n done: result.code === 0,\n message:\n result.code === 0\n ? 'Unregistered MCP server from Claude Code'\n : `claude mcp remove exited with code ${result.code ?? 'null'}`,\n };\n}\n\nexport async function runUninstall(deps: SetupDeps = {}): Promise<UninstallReport> {\n const resolved = resolveDeps(deps);\n const steps: UninstallReport['steps'] = [];\n\n const wantSkill = await confirmStep(\n resolved.prompts,\n resolved.yes,\n 'Remove the active-work skill from ~/.claude/skills/?',\n );\n if (wantSkill) {\n const r = await uninstallSkill(deps);\n steps.push({\n name: r.name,\n done: r.ok ? r.done : false,\n ...(r.ok ? { message: r.message } : { error: r.error }),\n });\n } else {\n steps.push({ name: STEP_SKILL, done: false, message: 'Skipped' });\n }\n\n const wantCommand = await confirmStep(\n resolved.prompts,\n resolved.yes,\n 'Remove the /aw-prompt command from ~/.claude/commands/?',\n );\n if (wantCommand) {\n const r = await uninstallCommand(deps);\n steps.push({\n name: r.name,\n done: r.ok ? r.done : false,\n ...(r.ok ? { message: r.message } : { error: r.error }),\n });\n } else {\n steps.push({ name: STEP_COMMAND, done: false, message: 'Skipped' });\n }\n\n const supervisor = getSupervisor();\n if (supervisor) {\n const wantSupervision = await confirmStep(\n resolved.prompts,\n resolved.yes,\n supervisor.uninstallPrompt,\n );\n if (wantSupervision) {\n const r = await supervisor.uninstall(deps);\n steps.push({\n name: r.name,\n done: r.ok ? r.done : false,\n ...(r.ok ? { message: r.message } : { error: r.error }),\n });\n } else {\n steps.push({ name: STEP_SUPERVISION, done: false, message: 'Skipped' });\n }\n }\n\n const wantDaemon = await confirmStep(\n resolved.prompts,\n resolved.yes,\n 'Stop the daemon?',\n );\n if (wantDaemon) {\n const r = await uninstallStopDaemon(deps);\n steps.push({\n name: r.name,\n done: r.ok ? r.done : false,\n ...(r.ok ? { message: r.message } : { error: r.error }),\n });\n } else {\n steps.push({ name: STEP_DAEMON, done: false, message: 'Skipped' });\n }\n\n const wantMcp = await confirmStep(\n resolved.prompts,\n resolved.yes,\n 'Unregister MCP from Claude Code?',\n );\n if (wantMcp) {\n const r = await uninstallMcp(deps);\n steps.push({\n name: r.name,\n done: r.ok ? r.done : false,\n ...(r.ok ? { message: r.message } : { error: r.error }),\n });\n } else {\n steps.push({ name: STEP_MCP, done: false, message: 'Skipped' });\n }\n\n return {\n steps,\n activeRootPreservedAt: resolved.paths.activeRoot,\n };\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { CURRENT_VERSION, runMigrations } from '../migrations/index.js';\n\nconst SCHEMA_VERSION_FILENAME = '.schema-version';\n\nconst schemaVersionPath = (activeRoot: string): string =>\n join(activeRoot, SCHEMA_VERSION_FILENAME);\n\nconst isNodeErrnoException = (err: unknown): err is NodeJS.ErrnoException =>\n typeof err === 'object' && err !== null && 'code' in err;\n\nexport async function readSchemaVersion(activeRoot: string): Promise<number> {\n const path = schemaVersionPath(activeRoot);\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (err) {\n if (isNodeErrnoException(err) && err.code === 'ENOENT') {\n return 0;\n }\n throw err;\n }\n\n const trimmed = raw.trim();\n if (trimmed === '' || !/^\\d+$/.test(trimmed)) {\n throw new Error(\n `Invalid schema version in ${path}: expected a positive integer, got ${JSON.stringify(raw)}`,\n );\n }\n\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed <= 0) {\n throw new Error(\n `Invalid schema version in ${path}: expected a positive integer, got ${JSON.stringify(raw)}`,\n );\n }\n return parsed;\n}\n\nexport async function writeSchemaVersion(activeRoot: string, version: number): Promise<void> {\n if (!Number.isInteger(version) || version <= 0) {\n throw new Error(`Schema version must be a positive integer, got ${version}`);\n }\n await writeFile(schemaVersionPath(activeRoot), `${version}\\n`, 'utf8');\n}\n\nasync function readRawSchemaVersion(\n activeRoot: string,\n): Promise<{ present: false } | { present: true; version: number }> {\n const path = schemaVersionPath(activeRoot);\n let raw: string;\n try {\n raw = await readFile(path, 'utf8');\n } catch (err) {\n if (isNodeErrnoException(err) && err.code === 'ENOENT') {\n return { present: false };\n }\n throw err;\n }\n\n const trimmed = raw.trim();\n if (trimmed === '' || !/^\\d+$/.test(trimmed)) {\n throw new Error(\n `Invalid schema version in ${path}: expected a non-negative integer, got ${JSON.stringify(raw)}`,\n );\n }\n\n const parsed = Number(trimmed);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new Error(\n `Invalid schema version in ${path}: expected a non-negative integer, got ${JSON.stringify(raw)}`,\n );\n }\n return { present: true, version: parsed };\n}\n\n/**\n * Ensures the schema version file is present and up to date.\n *\n * - If the file is missing: writes `CURRENT_VERSION` (fresh install).\n * - If the file equals `CURRENT_VERSION`: no-op.\n * - If the file is older than `CURRENT_VERSION`: runs migrations in\n * order, then writes the new version.\n * - If the file is newer than `CURRENT_VERSION`: throws (downgrade not\n * supported).\n *\n * The summary is shaped for CLI/MCP startup logs.\n */\nexport async function ensureSchemaVersion(activeRoot: string): Promise<{\n before: number;\n after: number;\n migrated: boolean;\n ran: Array<{ from: number; to: number; description: string }>;\n}> {\n const raw = await readRawSchemaVersion(activeRoot);\n\n if (!raw.present) {\n await writeSchemaVersion(activeRoot, CURRENT_VERSION);\n return {\n before: CURRENT_VERSION,\n after: CURRENT_VERSION,\n migrated: false,\n ran: [],\n };\n }\n\n const before = raw.version;\n\n if (before === CURRENT_VERSION) {\n return { before, after: before, migrated: false, ran: [] };\n }\n\n const { ran } = await runMigrations(activeRoot, before);\n await writeSchemaVersion(activeRoot, CURRENT_VERSION);\n\n return {\n before,\n after: CURRENT_VERSION,\n migrated: ran.length > 0,\n ran: ran.map((m) => ({ from: m.from, to: m.to, description: m.description })),\n };\n}\n","import { promises as fs, type Dirent } from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { ArtifactsSchema } from '../schemas/artifacts.js';\nimport { writeYaml } from '../utils/yaml-io.js';\nimport type { Migration } from './types.js';\n\n/**\n * v1 → v2 (AW-15): collapse `artifacts.yml` to a branches+stashes-only\n * schema and surface dropped PR entries via a migration log.\n *\n * Per-file transforms:\n * - `prs:` is dropped entirely. Each entry is logged at WARN to\n * `<activeRoot>/.migrations.log` so the user can reconcile manually.\n * - `branches[].last_commit` is dropped.\n * - `stashes[].message` → `stashes[].label`; `created` is dropped; `sha`\n * is preserved if present.\n *\n * The walk covers active-root initiatives and (best-effort) archived ones\n * under `<archiveRoot>/<domain>/archive/<slug>/artifacts.yml`, where\n * `archiveRoot` is the parent directory of the active root.\n *\n * Idempotent: re-running on already-v2 files leaves them unchanged\n * (extraneous keys like `prs:` simply aren't present in the v2 input).\n */\n\ninterface V1Pr {\n number?: number;\n repo?: string;\n title?: string;\n status?: string;\n}\n\ninterface V1Branch {\n repo?: string;\n name?: string;\n last_commit?: string;\n note?: string;\n}\n\ninterface V1Stash {\n repo?: string;\n message?: string;\n label?: string;\n created?: string;\n sha?: string;\n}\n\ninterface RawArtifacts {\n prs?: V1Pr[];\n branches?: V1Branch[];\n stashes?: V1Stash[];\n [key: string]: unknown;\n}\n\nfunction asArray<T>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\nfunction normaliseBranch(b: V1Branch): { repo: string; name: string; note?: string } | null {\n if (typeof b.repo !== 'string' || typeof b.name !== 'string') return null;\n if (b.repo.length === 0 || b.name.length === 0) return null;\n const out: { repo: string; name: string; note?: string } = {\n repo: b.repo,\n name: b.name,\n };\n if (typeof b.note === 'string' && b.note.length > 0) out.note = b.note;\n return out;\n}\n\nfunction normaliseStash(\n s: V1Stash,\n): { repo: string; label: string; sha?: string } | null {\n if (typeof s.repo !== 'string' || s.repo.length === 0) return null;\n // v1 used `message`; v2 uses `label`. Prefer label if both present.\n const label =\n typeof s.label === 'string' && s.label.length > 0\n ? s.label\n : typeof s.message === 'string'\n ? s.message\n : '';\n if (label.length === 0) return null;\n const out: { repo: string; label: string; sha?: string } = { repo: s.repo, label };\n if (typeof s.sha === 'string' && s.sha.length > 0) out.sha = s.sha;\n return out;\n}\n\ninterface MigrateOneResult {\n changed: boolean;\n droppedPrs: V1Pr[];\n}\n\nasync function migrateOne(filePath: string): Promise<MigrateOneResult> {\n let raw: string;\n try {\n raw = await fs.readFile(filePath, 'utf8');\n } catch {\n return { changed: false, droppedPrs: [] };\n }\n\n let parsed: RawArtifacts;\n try {\n parsed = (YAML.parse(raw) ?? {}) as RawArtifacts;\n } catch {\n // Malformed YAML — leave it; user will see it on next read.\n return { changed: false, droppedPrs: [] };\n }\n\n const droppedPrs = asArray<V1Pr>(parsed.prs);\n const branches = asArray<V1Branch>(parsed.branches)\n .map(normaliseBranch)\n .filter((b): b is { repo: string; name: string; note?: string } => b !== null);\n const stashes = asArray<V1Stash>(parsed.stashes)\n .map(normaliseStash)\n .filter((s): s is { repo: string; label: string; sha?: string } => s !== null);\n\n // Detect a no-op: prs absent, no last_commit on branches, no message-only stashes.\n const branchHadLegacy = asArray<V1Branch>(parsed.branches).some(\n (b) => typeof b.last_commit === 'string',\n );\n const stashHadLegacy = asArray<V1Stash>(parsed.stashes).some(\n (s) => typeof s.message === 'string' || typeof s.created === 'string',\n );\n const hadPrs = droppedPrs.length > 0 || parsed.prs !== undefined;\n if (!branchHadLegacy && !stashHadLegacy && !hadPrs) {\n return { changed: false, droppedPrs: [] };\n }\n\n const next = ArtifactsSchema.parse({ branches, stashes });\n await writeYaml(filePath, next, ArtifactsSchema);\n return { changed: true, droppedPrs };\n}\n\nasync function walkArtifactsFiles(activeRoot: string): Promise<string[]> {\n const out: string[] = [];\n\n // Active initiatives: <activeRoot>/<slug>/artifacts.yml\n try {\n const entries = await fs.readdir(activeRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n if (entry.name.startsWith('.')) continue;\n const candidate = path.join(activeRoot, entry.name, 'artifacts.yml');\n try {\n await fs.access(candidate);\n out.push(candidate);\n } catch {\n // skip\n }\n }\n } catch {\n // active root may not exist; nothing to migrate.\n }\n\n // Archived initiatives: <archiveRoot>/<domain>/archive/<slug-YYYY-MM>/artifacts.yml\n const archiveRoot = path.resolve(activeRoot, '..');\n try {\n const domains = await fs.readdir(archiveRoot, { withFileTypes: true });\n for (const domain of domains) {\n if (!domain.isDirectory()) continue;\n if (domain.name.startsWith('.')) continue;\n // Skip the active root itself when scanning its parent.\n if (path.join(archiveRoot, domain.name) === path.resolve(activeRoot)) continue;\n const archiveDir = path.join(archiveRoot, domain.name, 'archive');\n let archived: Dirent[];\n try {\n archived = await fs.readdir(archiveDir, { withFileTypes: true });\n } catch {\n continue;\n }\n for (const entry of archived) {\n if (!entry.isDirectory()) continue;\n const candidate = path.join(archiveDir, entry.name, 'artifacts.yml');\n try {\n await fs.access(candidate);\n out.push(candidate);\n } catch {\n // skip\n }\n }\n }\n } catch {\n // best-effort\n }\n\n return out;\n}\n\nasync function appendMigrationLog(activeRoot: string, lines: string[]): Promise<void> {\n if (lines.length === 0) return;\n const logPath = path.join(activeRoot, '.migrations.log');\n const stamp = new Date().toISOString();\n const body = lines.map((l) => `${stamp}\\tv1->v2\\t${l}\\n`).join('');\n try {\n await fs.mkdir(activeRoot, { recursive: true });\n } catch {\n // ignore\n }\n await fs.appendFile(logPath, body, 'utf8');\n}\n\nexport const v1ToV2Artifacts: Migration = {\n from: 1,\n to: 2,\n description: 'Drop prs[] / last_commit / stash.message from artifacts.yml',\n async run(activeRoot: string): Promise<void> {\n const files = await walkArtifactsFiles(activeRoot);\n const logEntries: string[] = [];\n for (const file of files) {\n const { droppedPrs } = await migrateOne(file);\n for (const pr of droppedPrs) {\n const num = typeof pr.number === 'number' ? `#${pr.number}` : '#?';\n const repo = pr.repo ?? '(unknown repo)';\n const title = pr.title ?? '(no title)';\n logEntries.push(`${file}\\t${num} (${repo}) ${title}`);\n }\n }\n await appendMigrationLog(activeRoot, logEntries);\n },\n};\n\nexport default v1ToV2Artifacts;\n","import { ConfigError } from '../errors.js';\nimport type { Migration } from './types.js';\nimport { v1ToV2Artifacts } from './v1-to-v2-artifacts.js';\n\nexport type { Migration } from './types.js';\n\n/**\n * The schema version this build of the code expects.\n *\n * Bump this whenever the on-disk layout changes, and add a matching\n * entry to {@link MIGRATIONS} that walks data from the previous version\n * to the new one.\n */\nexport const CURRENT_VERSION = 2;\n\n/**\n * Migrations registry. Add an entry when bumping {@link CURRENT_VERSION}.\n * Keep entries sorted by `from` ascending.\n *\n * v1 is the baseline. There is intentionally no v0 -> v1 migrator: the\n * plan's fresh-start policy says v0 data is not auto-migrated. Setup\n * stamps `CURRENT_VERSION` on first run; an existing `.schema-version`\n * file containing `0` is treated as an error so the user notices.\n */\nexport const MIGRATIONS: Migration[] = [v1ToV2Artifacts];\n\n/**\n * Runs every migrator needed to bring `activeRoot` from `fromVersion`\n * to {@link CURRENT_VERSION}. Throws {@link ConfigError} if no\n * contiguous chain exists, or if `fromVersion` is newer than what this\n * build understands.\n *\n * The `migrations` parameter exists for dependency injection in tests;\n * production callers should rely on the default.\n */\nexport async function runMigrations(\n activeRoot: string,\n fromVersion: number,\n migrations: Migration[] = MIGRATIONS,\n): Promise<{ ran: Migration[] }> {\n if (fromVersion === CURRENT_VERSION) {\n return { ran: [] };\n }\n\n if (fromVersion > CURRENT_VERSION) {\n throw new ConfigError(\n `Schema version ${fromVersion} is newer than this build (${CURRENT_VERSION}); ` +\n `downgrade not supported. Upgrade the active-work CLI to match.`,\n );\n }\n\n const ran: Migration[] = [];\n let cursor = fromVersion;\n\n while (cursor < CURRENT_VERSION) {\n const next = migrations.find((m) => m.from === cursor);\n if (!next) {\n throw new ConfigError(\n `No migration registered from schema version ${cursor} to ${CURRENT_VERSION}. ` +\n `Gap at v${cursor} -> v${cursor + 1}.`,\n );\n }\n if (next.to <= next.from) {\n throw new ConfigError(\n `Invalid migration: ${next.description} (from=${next.from}, to=${next.to}) does not advance the version.`,\n );\n }\n await next.run(activeRoot);\n ran.push(next);\n cursor = next.to;\n }\n\n if (cursor !== CURRENT_VERSION) {\n throw new ConfigError(\n `Migration chain ended at v${cursor}, expected v${CURRENT_VERSION}.`,\n );\n }\n\n return { ran };\n}\n","/**\n * Linux user-level systemd supervision for the active-work daemon.\n *\n * Installs a `~/.config/systemd/user/active-work.service` unit that runs\n * `active-work mcp serve` in the foreground; systemd handles restart on\n * crash. Also enables lingering (`loginctl enable-linger`) so the daemon\n * survives logout and starts at boot. On non-Linux platforms every step here\n * is a no-op.\n */\nimport { promises as fsp } from 'node:fs';\nimport nodePath from 'node:path';\nimport { spawn as nodeSpawn } from 'node:child_process';\nimport os from 'node:os';\nimport type { SetupDeps, StepPaths, StepResult } from './steps.js';\n\nexport const UNIT_NAME = 'active-work.service';\nexport const STEP_SUPERVISION = 'install-supervision';\n\nfunction isLinux(platform: NodeJS.Platform = process.platform): boolean {\n return platform === 'linux';\n}\n\nfunction resolveLocalDeps(deps: SetupDeps): {\n fs: typeof fsp;\n spawn: typeof nodeSpawn;\n paths: StepPaths;\n cliEntry: string;\n platform: NodeJS.Platform;\n} {\n const fs = deps.fs ?? fsp;\n const spawn = deps.spawn ?? nodeSpawn;\n const homeDir = deps.paths?.homeDir ?? os.homedir();\n const paths: StepPaths =\n deps.paths ??\n ({\n activeRoot: '',\n stateRoot: '',\n configRoot: '',\n homeDir,\n } as StepPaths);\n const cliEntry = deps.cliEntry ?? process.argv[1] ?? 'active-work';\n return { fs, spawn, paths, cliEntry, platform: process.platform };\n}\n\nexport function getUnitDir(homeDir: string): string {\n return nodePath.join(homeDir, '.config', 'systemd', 'user');\n}\n\nexport function getUnitPath(homeDir: string): string {\n return nodePath.join(getUnitDir(homeDir), UNIT_NAME);\n}\n\nexport interface UnitOptions {\n cliEntry: string;\n port?: number;\n nodeBin?: string;\n}\n\n/** Render the systemd unit file content. */\nexport function renderUnit(opts: UnitOptions): string {\n const node = opts.nodeBin ?? process.execPath;\n const args = ['mcp', 'serve'];\n if (opts.port !== undefined) {\n args.push('--port', String(opts.port));\n }\n // ExecStart must use absolute paths. Quote the node binary and entrypoint\n // in case they contain spaces (common on macOS dev paths, less so on Linux,\n // but cheap insurance).\n const execStart = [\n quoteIfNeeded(node),\n quoteIfNeeded(opts.cliEntry),\n ...args,\n ].join(' ');\n return [\n '[Unit]',\n 'Description=active-work HTTP daemon (MCP + REST + dashboard)',\n 'After=network.target',\n '',\n '[Service]',\n 'Type=simple',\n `ExecStart=${execStart}`,\n 'Restart=on-failure',\n 'RestartSec=5',\n 'Environment=NODE_ENV=production',\n '',\n '[Install]',\n 'WantedBy=default.target',\n '',\n ].join('\\n');\n}\n\nfunction quoteIfNeeded(value: string): string {\n if (!/\\s/.test(value)) return value;\n // systemd unit files support double-quoted argv elements; escape any embedded\n // double quotes and backslashes.\n const escaped = value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n return `\"${escaped}\"`;\n}\n\n/** Spawn a process and capture its exit code + stderr. */\nfunction runOnce(\n spawn: typeof nodeSpawn,\n cmd: string,\n args: string[],\n): Promise<{ code: number | null; stderr: string; spawnError?: Error }> {\n return new Promise((resolve) => {\n let stderr = '';\n let settled = false;\n try {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err });\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n resolve({ code, stderr });\n });\n } catch (err) {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err as Error });\n }\n });\n}\n\n/**\n * Probe whether the user-level systemd unit is currently active.\n * Returns false (without error) on non-Linux or when `systemctl` is missing.\n */\nexport async function isUnitActive(deps: SetupDeps = {}): Promise<boolean> {\n const { spawn, platform } = resolveLocalDeps(deps);\n if (!isLinux(platform)) return false;\n const result = await runOnce(spawn, 'systemctl', [\n '--user',\n 'is-active',\n '--quiet',\n UNIT_NAME,\n ]);\n if (result.spawnError) return false;\n return result.code === 0;\n}\n\nexport interface InstallSupervisionOptions {\n /** Override the port baked into the unit's ExecStart. */\n port?: number;\n}\n\n/**\n * Install (or refresh) the user-level systemd unit and enable+start it.\n *\n * No-op on non-Linux. On Linux it writes the unit, reloads the daemon,\n * and runs `enable --now`. Idempotent: if the unit is already active and\n * its content matches, returns done:false.\n */\nexport async function stepInstallSupervision(\n deps: SetupDeps = {},\n opts: InstallSupervisionOptions = {},\n): Promise<StepResult> {\n const { fs, spawn, paths, cliEntry, platform } = resolveLocalDeps(deps);\n if (!isLinux(platform)) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Skipped: systemd supervision only applies on Linux (this host is ${platform})`,\n };\n }\n const unitDir = getUnitDir(paths.homeDir);\n const unitPath = getUnitPath(paths.homeDir);\n const desired = renderUnit({ cliEntry, port: opts.port });\n\n try {\n await fs.mkdir(unitDir, { recursive: true });\n let existing: string | null = null;\n try {\n existing = await fs.readFile(unitPath, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n const unchanged = existing === desired;\n if (!unchanged) {\n await fs.writeFile(unitPath, desired, 'utf8');\n }\n\n const reload = await runOnce(spawn, 'systemctl', [\n '--user',\n 'daemon-reload',\n ]);\n if (reload.spawnError) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Wrote ${unitPath} but \\`systemctl\\` is unavailable (${reload.spawnError.message}). Run \\`systemctl --user daemon-reload && systemctl --user enable --now ${UNIT_NAME}\\` manually.`,\n };\n }\n if (reload.code !== 0) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: `systemctl --user daemon-reload exited ${reload.code ?? 'null'}: ${reload.stderr.trim()}`,\n };\n }\n\n // Enable lingering so the user manager — and thus the daemon — persists\n // across logout and starts at boot. Without it a `--user` unit is torn down\n // when the user's last session ends, so the daemon would not survive logout.\n //\n // Pass the username explicitly: the bare `loginctl enable-linger` form needs\n // an active login session to resolve \"self\" (it errors \"No such device\" when\n // run outside one), whereas the explicit form still routes through polkit's\n // `set-self-linger` action when the target is the caller. Best-effort:\n // enabling linger can require privileges, so a failure degrades to a note\n // rather than failing the install.\n let lingerUser: string | undefined;\n try {\n lingerUser = os.userInfo().username;\n } catch {\n lingerUser = undefined;\n }\n const linger = await runOnce(spawn, 'loginctl', [\n 'enable-linger',\n ...(lingerUser ? [lingerUser] : []),\n ]);\n const lingerEnabled = !linger.spawnError && linger.code === 0;\n\n const enable = await runOnce(spawn, 'systemctl', [\n '--user',\n 'enable',\n '--now',\n UNIT_NAME,\n ]);\n if (enable.spawnError) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: `systemctl --user enable --now ${UNIT_NAME} failed to spawn: ${enable.spawnError.message}`,\n };\n }\n if (enable.code !== 0) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: `systemctl --user enable --now ${UNIT_NAME} exited ${enable.code ?? 'null'}: ${enable.stderr.trim()}`,\n };\n }\n\n const action = unchanged ? 'refreshed' : 'installed';\n const lingerCmd = `loginctl enable-linger${lingerUser ? ` ${lingerUser}` : ''}`;\n const lingerNote = lingerEnabled\n ? ' Lingering enabled — survives logout and starts at boot.'\n : ` NOTE: could not enable lingering; run \\`sudo ${lingerCmd}\\` so the daemon survives logout and starts at boot (without it, it stops when your session ends).`;\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: !unchanged,\n message: `Systemd unit ${action} at ${unitPath} and enabled.${lingerNote}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: (err as Error).message,\n };\n }\n}\n\n/**\n * Disable the user-level unit and remove the file.\n * No-op on non-Linux or when the unit is absent.\n */\nexport async function uninstallSupervision(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, spawn, paths, platform } = resolveLocalDeps(deps);\n if (!isLinux(platform)) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Skipped: systemd supervision only applies on Linux (this host is ${platform})`,\n };\n }\n const unitPath = getUnitPath(paths.homeDir);\n try {\n let present = true;\n try {\n await fs.stat(unitPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') present = false;\n else throw err;\n }\n if (!present) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `No systemd unit at ${unitPath}`,\n };\n }\n const disable = await runOnce(spawn, 'systemctl', [\n '--user',\n 'disable',\n '--now',\n UNIT_NAME,\n ]);\n if (disable.spawnError) {\n // systemctl missing — still try to remove the file so re-install is clean.\n await fs.rm(unitPath, { force: true });\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `Removed ${unitPath} (systemctl unavailable: ${disable.spawnError.message})`,\n };\n }\n // Non-zero exit from `disable` is non-fatal (unit may already be inactive).\n await fs.rm(unitPath, { force: true });\n const reload = await runOnce(spawn, 'systemctl', [\n '--user',\n 'daemon-reload',\n ]);\n if (reload.code !== 0 && !reload.spawnError) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `Removed ${unitPath}; daemon-reload exited ${reload.code ?? 'null'}`,\n };\n }\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `Disabled and removed ${unitPath}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: (err as Error).message,\n };\n }\n}\n","/**\n * macOS user-level launchd supervision for the active-work daemon (AW-2).\n *\n * Installs a `~/Library/LaunchAgents/dev.hjewkes.active-work.plist` LaunchAgent\n * that runs `active-work mcp serve`; launchd handles restart on crash and\n * relaunch at login. On non-macOS platforms every step here is a no-op — the\n * Linux equivalent lives in `supervision-systemd.ts`.\n */\nimport { promises as fsp } from 'node:fs';\nimport nodePath from 'node:path';\nimport { spawn as nodeSpawn } from 'node:child_process';\nimport os from 'node:os';\nimport { STEP_SUPERVISION } from './supervision-systemd.js';\nimport type { SetupDeps, StepPaths, StepResult } from './steps.js';\n\nexport const PLIST_LABEL = 'dev.hjewkes.active-work';\nexport const PLIST_NAME = `${PLIST_LABEL}.plist`;\n\nfunction isDarwin(platform: NodeJS.Platform = process.platform): boolean {\n return platform === 'darwin';\n}\n\nfunction resolveLocalDeps(deps: SetupDeps): {\n fs: typeof fsp;\n spawn: typeof nodeSpawn;\n paths: StepPaths;\n cliEntry: string;\n uid: number;\n platform: NodeJS.Platform;\n} {\n const fs = deps.fs ?? fsp;\n const spawn = deps.spawn ?? nodeSpawn;\n const homeDir = deps.paths?.homeDir ?? os.homedir();\n const paths: StepPaths =\n deps.paths ??\n ({\n activeRoot: '',\n stateRoot: '',\n configRoot: '',\n homeDir,\n } as StepPaths);\n const cliEntry = deps.cliEntry ?? process.argv[1] ?? 'active-work';\n const uid = process.getuid?.() ?? 0;\n return { fs, spawn, paths, cliEntry, uid, platform: process.platform };\n}\n\nexport function getAgentDir(homeDir: string): string {\n return nodePath.join(homeDir, 'Library', 'LaunchAgents');\n}\n\nexport function getPlistPath(homeDir: string): string {\n return nodePath.join(getAgentDir(homeDir), PLIST_NAME);\n}\n\nfunction getLogDir(homeDir: string): string {\n return nodePath.join(homeDir, 'Library', 'Logs', 'active-work');\n}\n\n/** The `gui/<uid>/<label>` service target used by `launchctl`. */\nfunction serviceTarget(uid: number): string {\n return `gui/${uid}/${PLIST_LABEL}`;\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nexport interface PlistOptions {\n cliEntry: string;\n homeDir: string;\n port?: number;\n nodeBin?: string;\n}\n\n/** Render the launchd plist for the daemon. */\nexport function renderPlist(opts: PlistOptions): string {\n const node = opts.nodeBin ?? process.execPath;\n const argv = [node, opts.cliEntry, 'mcp', 'serve'];\n if (opts.port !== undefined) argv.push('--port', String(opts.port));\n const logDir = getLogDir(opts.homeDir);\n const programArgs = argv\n .map((a) => ` <string>${escapeXml(a)}</string>`)\n .join('\\n');\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">',\n '<plist version=\"1.0\">',\n '<dict>',\n ' <key>Label</key>',\n ` <string>${PLIST_LABEL}</string>`,\n ' <key>ProgramArguments</key>',\n ' <array>',\n programArgs,\n ' </array>',\n ' <key>RunAtLoad</key>',\n ' <true/>',\n ' <key>KeepAlive</key>',\n ' <true/>',\n ' <key>ProcessType</key>',\n ' <string>Background</string>',\n ' <key>EnvironmentVariables</key>',\n ' <dict>',\n ' <key>NODE_ENV</key>',\n ' <string>production</string>',\n ' </dict>',\n ' <key>StandardOutPath</key>',\n ` <string>${escapeXml(nodePath.join(logDir, 'daemon.out.log'))}</string>`,\n ' <key>StandardErrorPath</key>',\n ` <string>${escapeXml(nodePath.join(logDir, 'daemon.err.log'))}</string>`,\n '</dict>',\n '</plist>',\n '',\n ].join('\\n');\n}\n\n/** Spawn a process and capture its exit code + stderr. */\nfunction runOnce(\n spawn: typeof nodeSpawn,\n cmd: string,\n args: string[],\n): Promise<{ code: number | null; stderr: string; spawnError?: Error }> {\n return new Promise((resolve) => {\n let stderr = '';\n let settled = false;\n try {\n const child = spawn(cmd, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n child.on('error', (err) => {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err });\n });\n child.on('close', (code) => {\n if (settled) return;\n settled = true;\n resolve({ code, stderr });\n });\n } catch (err) {\n if (settled) return;\n settled = true;\n resolve({ code: null, stderr, spawnError: err as Error });\n }\n });\n}\n\n/**\n * Probe whether the launchd agent is currently loaded.\n * Returns false (without error) on non-macOS or when `launchctl` is missing.\n */\nexport async function isAgentLoaded(deps: SetupDeps = {}): Promise<boolean> {\n const { spawn, uid, platform } = resolveLocalDeps(deps);\n if (!isDarwin(platform)) return false;\n const result = await runOnce(spawn, 'launchctl', [\n 'print',\n serviceTarget(uid),\n ]);\n if (result.spawnError) return false;\n return result.code === 0;\n}\n\nexport interface InstallLaunchAgentOptions {\n /** Override the port baked into the plist's ProgramArguments. */\n port?: number;\n}\n\n/**\n * Install (or refresh) the user LaunchAgent and load it.\n *\n * No-op on non-macOS. On macOS it writes the plist, boots out any stale copy,\n * and bootstraps it into the `gui/<uid>` domain. Idempotent: if the plist is\n * unchanged and already loaded, returns done:false.\n */\nexport async function installLaunchAgent(\n deps: SetupDeps = {},\n opts: InstallLaunchAgentOptions = {},\n): Promise<StepResult> {\n const { fs, spawn, paths, cliEntry, uid, platform } = resolveLocalDeps(deps);\n if (!isDarwin(platform)) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Skipped: launchd supervision only applies on macOS (this host is ${platform})`,\n };\n }\n const plistPath = getPlistPath(paths.homeDir);\n const desired = renderPlist({ cliEntry, homeDir: paths.homeDir, port: opts.port });\n\n try {\n await fs.mkdir(getAgentDir(paths.homeDir), { recursive: true });\n await fs.mkdir(getLogDir(paths.homeDir), { recursive: true });\n\n let existing: string | null = null;\n try {\n existing = await fs.readFile(plistPath, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'ENOENT') throw err;\n }\n const unchanged = existing === desired;\n if (unchanged && (await isAgentLoaded(deps))) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `launchd agent already loaded from ${plistPath}`,\n };\n }\n if (!unchanged) {\n await fs.writeFile(plistPath, desired, 'utf8');\n }\n\n // Boot out any stale instance first so bootstrap is idempotent. A missing\n // service exits non-zero (\"No such process\") — that is expected, not fatal.\n const bootout = await runOnce(spawn, 'launchctl', [\n 'bootout',\n serviceTarget(uid),\n ]);\n if (bootout.spawnError) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Wrote ${plistPath} but \\`launchctl\\` is unavailable (${bootout.spawnError.message}). Load it manually with \\`launchctl bootstrap gui/${uid} ${plistPath}\\`.`,\n };\n }\n\n const bootstrap = await runOnce(spawn, 'launchctl', [\n 'bootstrap',\n `gui/${uid}`,\n plistPath,\n ]);\n if (bootstrap.spawnError) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: `launchctl bootstrap failed to spawn: ${bootstrap.spawnError.message}`,\n };\n }\n if (bootstrap.code !== 0) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: `launchctl bootstrap gui/${uid} exited ${bootstrap.code ?? 'null'}: ${bootstrap.stderr.trim()}`,\n };\n }\n\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `launchd agent installed at ${plistPath} and loaded`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: (err as Error).message,\n };\n }\n}\n\n/**\n * Boot out the LaunchAgent and remove the plist.\n * No-op on non-macOS or when the plist is absent.\n */\nexport async function uninstallLaunchAgent(\n deps: SetupDeps = {},\n): Promise<StepResult> {\n const { fs, spawn, paths, uid, platform } = resolveLocalDeps(deps);\n if (!isDarwin(platform)) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `Skipped: launchd supervision only applies on macOS (this host is ${platform})`,\n };\n }\n const plistPath = getPlistPath(paths.homeDir);\n try {\n let present = true;\n try {\n await fs.stat(plistPath);\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') present = false;\n else throw err;\n }\n if (!present) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: false,\n message: `No launchd agent at ${plistPath}`,\n };\n }\n // Best-effort bootout; a not-loaded agent exits non-zero, which is fine.\n const bootout = await runOnce(spawn, 'launchctl', [\n 'bootout',\n serviceTarget(uid),\n ]);\n await fs.rm(plistPath, { force: true });\n if (bootout.spawnError) {\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `Removed ${plistPath} (launchctl unavailable: ${bootout.spawnError.message})`,\n };\n }\n return {\n ok: true,\n name: STEP_SUPERVISION,\n done: true,\n message: `Booted out and removed ${plistPath}`,\n };\n } catch (err) {\n return {\n ok: false,\n name: STEP_SUPERVISION,\n error: (err as Error).message,\n };\n }\n}\n","/**\n * Platform dispatcher for daemon supervision.\n *\n * `setup`/`uninstall` should not care whether a host uses systemd or launchd —\n * they ask `getSupervisor()` for the local implementation and drive it through\n * this common interface. Linux → systemd (`supervision-systemd.ts`),\n * macOS → launchd (`supervision-launchd.ts`), everything else → no supervisor.\n */\nimport {\n UNIT_NAME,\n stepInstallSupervision,\n uninstallSupervision,\n isUnitActive,\n} from './supervision-systemd.js';\nimport {\n PLIST_LABEL,\n installLaunchAgent,\n uninstallLaunchAgent,\n isAgentLoaded,\n} from './supervision-launchd.js';\nimport type { SetupDeps, StepResult } from './steps.js';\n\nexport interface Supervisor {\n readonly kind: 'systemd' | 'launchd';\n /** One-line prompt shown when offering to install supervision. */\n readonly installPrompt: string;\n /** One-line prompt shown when offering to remove supervision. */\n readonly uninstallPrompt: string;\n /** Manual command that finishes enabling if the runtime step fails. */\n readonly enableHint: string;\n install(deps: SetupDeps, opts?: { port?: number }): Promise<StepResult>;\n uninstall(deps: SetupDeps): Promise<StepResult>;\n /** True when the daemon is already supervised (so manual start is skipped). */\n isActive(deps: SetupDeps): Promise<boolean>;\n}\n\nconst systemdSupervisor: Supervisor = {\n kind: 'systemd',\n installPrompt:\n 'Install user systemd unit to keep the daemon running across logins?',\n uninstallPrompt:\n 'Disable and remove the systemd user unit (active-work.service)?',\n enableHint: `systemctl --user enable --now ${UNIT_NAME}`,\n install: (deps, opts) => stepInstallSupervision(deps, opts),\n uninstall: (deps) => uninstallSupervision(deps),\n isActive: (deps) => isUnitActive(deps),\n};\n\nconst launchdSupervisor: Supervisor = {\n kind: 'launchd',\n installPrompt:\n 'Install a launchd agent to keep the daemon running across logins?',\n uninstallPrompt: `Boot out and remove the launchd agent (${PLIST_LABEL})?`,\n enableHint: `launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/${PLIST_LABEL}.plist`,\n install: (deps, opts) => installLaunchAgent(deps, opts),\n uninstall: (deps) => uninstallLaunchAgent(deps),\n isActive: (deps) => isAgentLoaded(deps),\n};\n\n/** Return the supervisor for `platform`, or null when none is integrated. */\nexport function getSupervisor(\n platform: NodeJS.Platform = process.platform,\n): Supervisor | null {\n if (platform === 'linux') return systemdSupervisor;\n if (platform === 'darwin') return launchdSupervisor;\n return null;\n}\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { runUninstall } from '../setup/steps.js';\nimport { color } from '../utils/color.js';\n\n/**\n * `active-work uninstall` — reverse what setup did. Asks for confirmation before each\n * destructive action (or --yes to skip prompts). Does NOT touch the active\n * root: that's operator data, and removing it should be a deliberate act.\n */\n\nconst ArgsSchema = z.object({\n yes: z.boolean().optional(),\n});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst StepSchema = z.object({\n name: z.string(),\n done: z.boolean(),\n message: z.string().optional(),\n error: z.string().optional(),\n});\n\nconst ResultSchema = z.object({\n steps: z.array(StepSchema),\n activeRootPreservedAt: z.string(),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nexport default defineCommand<Args, Result>({\n name: 'uninstall',\n description:\n 'Reverse what setup did: remove the skill, stop the daemon, unregister MCP. Preserves the active root.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n yes: {\n long: '--yes',\n short: '-y',\n description: 'Skip all prompts; assume yes.',\n },\n },\n },\n async run(args, ctx) {\n const report = await runUninstall({ yes: args.yes ?? false });\n if (ctx.format !== 'json') {\n for (const step of report.steps) {\n const mark = step.error ? color.red('FAIL') : color.green('OK');\n const trailing = step.error ?? step.message ?? '';\n process.stderr.write(\n ` ${mark} ${step.name}${trailing ? ` — ${trailing}` : ''}\\n`,\n );\n }\n process.stderr.write(\n '\\n' +\n color.dim(\n `Your active root at ${report.activeRootPreservedAt} is preserved. ` +\n 'Remove manually if you want.',\n ) +\n '\\n',\n );\n }\n return report;\n },\n});\n","import { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { runDoctor, type CheckStatus } from '../doctor.js';\nimport { color } from '../utils/color.js';\n\n/**\n * `active-work doctor` — health-check the local install.\n *\n * Returns a structured report (exit 0; scripts read the `ok` field) and, in\n * human mode, prints a readable table to stderr like `active-work setup`.\n */\n\nconst ArgsSchema = z.object({});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst CheckSchema = z.object({\n name: z.string(),\n status: z.enum(['ok', 'warn', 'fail']),\n detail: z.string(),\n});\n\nconst ResultSchema = z.object({\n ok: z.boolean(),\n checks: z.array(CheckSchema),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nfunction badge(status: CheckStatus): string {\n if (status === 'ok') return color.green('OK ');\n if (status === 'warn') return color.yellow('WARN');\n return color.red('FAIL');\n}\n\nexport default defineCommand<Args, Result>({\n name: 'doctor',\n description:\n 'Health-check the install: Node, active root, daemon, MCP registration, skill, and supervision.',\n args: ArgsSchema,\n result: ResultSchema,\n async run(_args, ctx) {\n const report = await runDoctor();\n if (ctx.format !== 'json') {\n process.stderr.write(color.bold('active-work doctor') + '\\n');\n for (const check of report.checks) {\n process.stderr.write(` ${badge(check.status)} ${check.name} — ${check.detail}\\n`);\n }\n const summary = report.ok\n ? color.green('All checks passed (warnings are advisory).')\n : color.red('One or more checks failed.');\n process.stderr.write(summary + '\\n');\n }\n return report;\n },\n});\n","/**\n * `active-work doctor` — aggregate health checks for a local install (AW-4).\n *\n * Verifies the pieces `active-work setup` wires up: Node version, the active\n * root + schema version, the MCP daemon, Claude Code MCP registration, the\n * installed skill, and (if the platform supports it) daemon supervision.\n *\n * Every probe is injectable so the checks are unit-testable without a real\n * daemon, filesystem layout, or service manager.\n */\nimport { promises as fsp } from 'node:fs';\nimport nodePath from 'node:path';\nimport os from 'node:os';\nimport { getActiveRoot } from './utils/paths.js';\nimport { readPidFile, isProcessAlive } from './server/lifecycle.js';\nimport { getSupervisor } from './setup/supervision.js';\n\nexport type CheckStatus = 'ok' | 'warn' | 'fail';\n\nexport interface DoctorCheck {\n name: string;\n status: CheckStatus;\n detail: string;\n}\n\nexport interface DoctorReport {\n ok: boolean;\n checks: DoctorCheck[];\n}\n\nexport interface DaemonProbe {\n running: boolean;\n healthy: boolean;\n port?: number;\n version?: string;\n pid?: number;\n}\n\nexport interface DoctorDeps {\n fs?: typeof fsp;\n activeRoot?: string;\n homeDir?: string;\n /** Node version string like `process.version` (`v22.4.0`). */\n nodeVersion?: string;\n /** Minimum supported Node major (defaults to 22). */\n minNodeMajor?: number;\n /** Probe the daemon; defaults to reading the pid file + `/health`. */\n probeDaemon?: () => Promise<DaemonProbe>;\n /** Whether a supervisor already owns the daemon; null when unsupported. */\n supervisorActive?: () => Promise<{ kind: string; active: boolean } | null>;\n}\n\nconst HEALTH_TIMEOUT_MS = 500;\n\ninterface HealthResponse {\n version: string;\n pid: number;\n uptime_ms: number;\n port: number;\n}\n\nasync function probeHealth(port: number): Promise<HealthResponse | null> {\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), HEALTH_TIMEOUT_MS);\n const res = await fetch(`http://127.0.0.1:${port}/health`, {\n signal: controller.signal,\n });\n clearTimeout(timer);\n if (!res.ok) return null;\n return (await res.json()) as HealthResponse;\n } catch {\n return null;\n }\n}\n\nasync function defaultProbeDaemon(): Promise<DaemonProbe> {\n const entry = await readPidFile();\n if (!entry) return { running: false, healthy: false };\n const alive = isProcessAlive(entry.pid);\n if (!alive) {\n return { running: false, healthy: false, pid: entry.pid, port: entry.meta.port };\n }\n const health = await probeHealth(entry.meta.port);\n if (health) {\n return {\n running: true,\n healthy: true,\n pid: health.pid,\n port: health.port,\n version: health.version,\n };\n }\n return {\n running: true,\n healthy: false,\n pid: entry.pid,\n port: entry.meta.port,\n version: entry.meta.version,\n };\n}\n\nasync function defaultSupervisorActive(): Promise<{\n kind: string;\n active: boolean;\n} | null> {\n const supervisor = getSupervisor();\n if (!supervisor) return null;\n return { kind: supervisor.kind, active: await supervisor.isActive({}) };\n}\n\nfunction parseMajor(version: string): number {\n const match = /^v?(\\d+)\\./.exec(version);\n return match ? Number(match[1]) : 0;\n}\n\nasync function fileExists(fs: typeof fsp, target: string): Promise<boolean> {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n}\n\n// `setup` registers the server as `@hjewkes/active-work` (stdio), but users\n// commonly wire it as `active-work` (http, pointed at the daemon). Accept\n// either name.\nconst MCP_SERVER_NAMES = ['@hjewkes/active-work', 'active-work'];\n\nasync function readMcpRegistered(\n fs: typeof fsp,\n homeDir: string,\n): Promise<boolean> {\n const configPath = nodePath.join(homeDir, '.claude.json');\n try {\n const raw = await fs.readFile(configPath, 'utf8');\n const parsed = JSON.parse(raw) as {\n mcpServers?: Record<string, unknown>;\n };\n const servers = parsed.mcpServers ?? {};\n return MCP_SERVER_NAMES.some((name) => Boolean(servers[name]));\n } catch {\n return false;\n }\n}\n\nasync function checkNode(deps: DoctorDeps): Promise<DoctorCheck> {\n const version = deps.nodeVersion ?? process.version;\n const min = deps.minNodeMajor ?? 22;\n const major = parseMajor(version);\n if (major >= min) {\n return { name: 'node', status: 'ok', detail: `${version} (>= ${min})` };\n }\n return {\n name: 'node',\n status: 'fail',\n detail: `${version} is older than the required Node ${min}`,\n };\n}\n\nasync function checkActiveRoot(deps: DoctorDeps): Promise<DoctorCheck> {\n const fs = deps.fs ?? fsp;\n const activeRoot = deps.activeRoot ?? getActiveRoot();\n if (!(await fileExists(fs, activeRoot))) {\n return {\n name: 'active-root',\n status: 'fail',\n detail: `${activeRoot} does not exist — run \\`active-work setup\\``,\n };\n }\n const schemaFile = nodePath.join(activeRoot, '.schema-version');\n if (!(await fileExists(fs, schemaFile))) {\n return {\n name: 'active-root',\n status: 'warn',\n detail: `${activeRoot} exists but has no .schema-version`,\n };\n }\n return { name: 'active-root', status: 'ok', detail: activeRoot };\n}\n\nasync function checkDaemon(deps: DoctorDeps): Promise<DoctorCheck> {\n const probe = await (deps.probeDaemon ?? defaultProbeDaemon)();\n if (probe.running && probe.healthy) {\n return {\n name: 'daemon',\n status: 'ok',\n detail: `running (pid ${probe.pid ?? '?'}, port ${probe.port ?? '?'}, v${probe.version ?? '?'})`,\n };\n }\n if (probe.running && !probe.healthy) {\n return {\n name: 'daemon',\n status: 'warn',\n detail: `pid ${probe.pid ?? '?'} is alive but /health did not answer`,\n };\n }\n return {\n name: 'daemon',\n status: 'warn',\n detail: 'not running — start it with `active-work mcp serve --detach`',\n };\n}\n\nasync function checkMcp(deps: DoctorDeps): Promise<DoctorCheck> {\n const fs = deps.fs ?? fsp;\n const homeDir = deps.homeDir ?? os.homedir();\n if (await readMcpRegistered(fs, homeDir)) {\n return { name: 'mcp-registration', status: 'ok', detail: 'registered in ~/.claude.json' };\n }\n return {\n name: 'mcp-registration',\n status: 'warn',\n detail: 'not registered with Claude Code — run `active-work setup`',\n };\n}\n\nasync function checkSkill(deps: DoctorDeps): Promise<DoctorCheck> {\n const fs = deps.fs ?? fsp;\n const homeDir = deps.homeDir ?? os.homedir();\n const skill = nodePath.join(homeDir, '.claude', 'skills', 'active-work', 'SKILL.md');\n if (await fileExists(fs, skill)) {\n return { name: 'skill', status: 'ok', detail: skill };\n }\n return {\n name: 'skill',\n status: 'warn',\n detail: 'skill not installed in ~/.claude/skills — run `active-work setup`',\n };\n}\n\nasync function checkSupervisor(deps: DoctorDeps): Promise<DoctorCheck> {\n const result = await (deps.supervisorActive ?? defaultSupervisorActive)();\n if (!result) {\n return {\n name: 'supervision',\n status: 'ok',\n detail: `no supervisor integration for ${process.platform} (optional)`,\n };\n }\n if (result.active) {\n return { name: 'supervision', status: 'ok', detail: `${result.kind} agent is loaded` };\n }\n return {\n name: 'supervision',\n status: 'warn',\n detail: `${result.kind} supervisor not active — re-run \\`active-work setup\\` to enable`,\n };\n}\n\n/** Run all health checks and return a report. `ok` is false iff any check failed. */\nexport async function runDoctor(deps: DoctorDeps = {}): Promise<DoctorReport> {\n const checks = await Promise.all([\n checkNode(deps),\n checkActiveRoot(deps),\n checkDaemon(deps),\n checkMcp(deps),\n checkSkill(deps),\n checkSupervisor(deps),\n ]);\n return { ok: checks.every((c) => c.status !== 'fail'), checks };\n}\n","import os from 'node:os';\nimport { z } from 'zod';\nimport { defineCommand } from '../registry/index.js';\nimport { ActiveWorkError, UsageError } from '../errors.js';\nimport { getGitRunner, type CommandResult } from '../utils/git-gh.js';\nimport { color } from '../utils/color.js';\n\n/**\n * `active-work sync` — multi-machine git sync for the active root (AW-5).\n *\n * Runs `git pull --rebase && git push` from inside the active root so a\n * git-backed workspace stays in step across machines. Uncommitted local edits\n * are auto-committed first (this is the normal state — you just touched a\n * task), and rebase conflicts are surfaced clearly and left in place for the\n * user to resolve rather than silently aborted.\n */\n\nconst ArgsSchema = z.object({\n message: z.string().min(1).optional(),\n require_clean: z.boolean().optional(),\n});\ntype Args = z.infer<typeof ArgsSchema>;\n\nconst ResultSchema = z.object({\n branch: z.string(),\n committed: z.boolean(),\n committed_files: z.number().int(),\n rebased: z.boolean(),\n pushed: z.boolean(),\n summary: z.string(),\n});\ntype Result = z.infer<typeof ResultSchema>;\n\nexport { setGitRunner, resetRunners } from '../utils/git-gh.js';\n\n/** Run git in the active root; timeouts/spawn failures become clear errors. */\nasync function git(root: string, args: string[]): Promise<CommandResult> {\n return getGitRunner()('git', ['-C', root, ...args]);\n}\n\nasync function assertGitRepo(root: string): Promise<void> {\n let res: CommandResult;\n try {\n res = await git(root, ['rev-parse', '--is-inside-work-tree']);\n } catch (err) {\n throw new ActiveWorkError(\n `could not run git in ${root}: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n if (res.code !== 0 || res.stdout.trim() !== 'true') {\n throw new UsageError(\n `active root is not a git repository: ${root}\\n` +\n 'Initialize it and add a remote, then retry:\\n' +\n ` git -C \"${root}\" init && git -C \"${root}\" remote add origin <url>`,\n );\n }\n}\n\nasync function currentBranch(root: string): Promise<string> {\n const res = await git(root, ['rev-parse', '--abbrev-ref', 'HEAD']);\n const branch = res.stdout.trim();\n if (res.code !== 0 || !branch || branch === 'HEAD') {\n throw new UsageError(\n 'could not determine the current branch (detached HEAD?). ' +\n 'Check out a branch before syncing.',\n );\n }\n return branch;\n}\n\nasync function assertUpstream(root: string, branch: string): Promise<void> {\n const res = await git(root, [\n 'rev-parse',\n '--abbrev-ref',\n '--symbolic-full-name',\n '@{u}',\n ]);\n if (res.code !== 0) {\n throw new UsageError(\n `branch \"${branch}\" has no upstream configured.\\n` +\n `Set one, then retry:\\n` +\n ` git -C \"${root}\" push -u origin ${branch}`,\n );\n }\n}\n\n/** True when the working tree (tracked or untracked) has changes to commit. */\nasync function isDirty(root: string): Promise<boolean> {\n const res = await git(root, ['status', '--porcelain']);\n return res.stdout.trim().length > 0;\n}\n\nfunction defaultMessage(): string {\n return `aw sync: ${new Date().toISOString()} (${os.hostname()})`;\n}\n\n/** Stage and commit everything. Returns the number of files committed. */\nasync function commitAll(root: string, message: string): Promise<number> {\n const add = await git(root, ['add', '-A']);\n if (add.code !== 0) {\n throw new ActiveWorkError(`git add failed: ${add.stderr.trim() || 'unknown error'}`);\n }\n // Nothing actually staged (e.g. only ignored files touched) — skip commit.\n const staged = await git(root, ['diff', '--cached', '--name-only']);\n const files = staged.stdout.trim().split('\\n').filter(Boolean);\n if (files.length === 0) return 0;\n\n const commit = await git(root, ['commit', '-m', message]);\n if (commit.code !== 0) {\n throw new ActiveWorkError(`git commit failed: ${commit.stderr.trim() || 'unknown error'}`);\n }\n return files.length;\n}\n\n/** Names of files with unresolved merge conflicts. */\nasync function conflictedFiles(root: string): Promise<string[]> {\n const res = await git(root, ['diff', '--name-only', '--diff-filter=U']);\n return res.stdout.trim().split('\\n').filter(Boolean);\n}\n\nasync function headSha(root: string): Promise<string> {\n return (await git(root, ['rev-parse', 'HEAD'])).stdout.trim();\n}\n\nasync function pullRebase(root: string): Promise<{ rebased: boolean }> {\n // Compare HEAD before/after rather than scraping git's (version-dependent)\n // \"up to date\" wording: HEAD moves iff upstream actually had new commits.\n const before = await headSha(root);\n const res = await git(root, ['pull', '--rebase']);\n if (res.code === 0) {\n return { rebased: (await headSha(root)) !== before };\n }\n\n const conflicts = await conflictedFiles(root);\n if (conflicts.length > 0) {\n throw new ActiveWorkError(\n 'sync stopped on a rebase conflict — your local changes are committed and safe.\\n' +\n `Conflicted files:\\n${conflicts.map((f) => ` - ${f}`).join('\\n')}\\n` +\n 'Resolve them, then either continue or undo:\\n' +\n ` git -C \"${root}\" add <files> && git -C \"${root}\" rebase --continue && aw sync\\n` +\n ` git -C \"${root}\" rebase --abort # to undo the pull`,\n );\n }\n throw new ActiveWorkError(\n `git pull --rebase failed: ${res.stderr.trim() || res.stdout.trim() || 'unknown error'}`,\n );\n}\n\nasync function push(root: string): Promise<void> {\n const res = await git(root, ['push']);\n if (res.code !== 0) {\n throw new ActiveWorkError(\n `git push failed: ${res.stderr.trim() || res.stdout.trim() || 'unknown error'}`,\n );\n }\n}\n\nexport default defineCommand<Args, Result>({\n name: 'sync',\n description:\n 'Sync the active root over git: auto-commit local edits, pull --rebase, then push.',\n args: ArgsSchema,\n result: ResultSchema,\n cli: {\n options: {\n message: {\n long: '--message',\n short: '-m',\n description: 'Commit message for the auto-commit (default: timestamp + host)',\n },\n require_clean: {\n long: '--require-clean',\n description: 'Fail instead of auto-committing when the tree is dirty',\n },\n },\n },\n async run(args, ctx) {\n const root = ctx.activeRoot;\n await assertGitRepo(root);\n const branch = await currentBranch(root);\n await assertUpstream(root, branch);\n\n let committed = false;\n let committedFiles = 0;\n if (await isDirty(root)) {\n if (args.require_clean) {\n throw new UsageError(\n 'active root has uncommitted changes and --require-clean was given.\\n' +\n 'Commit or stash them, or drop --require-clean to auto-commit.',\n );\n }\n committedFiles = await commitAll(root, args.message ?? defaultMessage());\n committed = committedFiles > 0;\n }\n\n const { rebased } = await pullRebase(root);\n await push(root);\n\n const summary =\n `${committed ? `committed ${committedFiles} file(s), ` : ''}` +\n `${rebased ? 'rebased onto upstream, ' : 'already up to date, '}` +\n 'pushed';\n const result: Result = {\n branch,\n committed,\n committed_files: committedFiles,\n rebased,\n pushed: true,\n summary,\n };\n\n if (ctx.format !== 'json') {\n process.stderr.write(color.green(`✓ sync (${branch}): ${summary}`) + '\\n');\n }\n return result;\n },\n});\n","/**\n * Imports every command module and registers its default export with the\n * shared registry. The CLI dispatcher (Wave 3.1) and MCP server (Wave 3.2)\n * import this module first so the registry is populated.\n *\n * Order doesn't affect runtime behavior (the registry is a Map keyed by\n * command name), but is kept alphabetical for readability.\n */\nimport { register, type AnyCommand } from '../registry/index.js';\n\n// Lifecycle\nimport archive from './archive.js';\nimport cmdNew from './new.js';\nimport paths from './paths.js';\nimport rename from './rename.js';\nimport set from './set.js';\nimport touch from './touch.js';\n\n// Focus / pause\nimport focus from './focus.js';\nimport pause from './pause.js';\nimport unfocus from './unfocus.js';\nimport unpause from './unpause.js';\n\n// Tasks\nimport taskAdd from './task-add.js';\nimport taskDelete from './task-delete.js';\nimport taskDone from './task-done.js';\nimport taskEdit from './task-edit.js';\nimport taskList from './task-list.js';\nimport taskReorder from './task-reorder.js';\n\n// Sessions\nimport sessionList from './session-list.js';\nimport sessionRecord from './session-record.js';\nimport sessionsBrowser from './sessions-browser.js';\n\n// Sources / artifacts\nimport artifactAddBranch from './artifact-add-branch.js';\nimport artifactAddStash from './artifact-add-stash.js';\nimport artifactList from './artifact-list.js';\nimport artifactNote from './artifact-note.js';\nimport artifactPrune from './artifact-prune.js';\nimport artifactStatus from './artifact-status.js';\nimport sourceAdd from './source-add.js';\n\n// Worktree / cross-initiative reads\nimport audit from './audit.js';\nimport list from './list.js';\nimport worktreeSet from './worktree-set.js';\nimport worktreeSetDefault from './worktree-set-default.js';\n\n// Discover / triage\nimport discover from './discover.js';\nimport drop from './drop.js';\nimport fold from './fold.js';\nimport track from './track.js';\n\n// Bootstrap / picker\nimport open from './open.js';\nimport prompt from './prompt.js';\n\n// Editor\nimport edit from './edit.js';\n\n// MCP server\nimport mcpServe from './mcp-serve.js';\nimport mcpStop from './mcp-stop.js';\nimport mcpRestart from './mcp-restart.js';\nimport mcpStatus from './mcp-status.js';\nimport mcpLogs from './mcp-logs.js';\n\n// Setup / uninstall\nimport setup from './setup.js';\nimport uninstall from './uninstall.js';\nimport doctor from './doctor.js';\nimport sync from './sync.js';\n\nconst ALL_COMMANDS: AnyCommand[] = [\n // lifecycle\n cmdNew,\n set,\n touch,\n paths,\n rename,\n archive,\n // focus / pause\n focus,\n unfocus,\n pause,\n unpause,\n // tasks\n taskAdd,\n taskDone,\n taskList,\n taskEdit,\n taskReorder,\n taskDelete,\n // sessions\n sessionRecord,\n sessionList,\n sessionsBrowser,\n // sources / artifacts\n sourceAdd,\n artifactAddBranch,\n artifactAddStash,\n artifactList,\n artifactStatus,\n artifactPrune,\n artifactNote,\n // worktree / cross-initiative\n worktreeSet,\n worktreeSetDefault,\n audit,\n list,\n // discover / triage\n discover,\n fold,\n drop,\n track,\n // bootstrap\n open,\n prompt,\n // editor\n edit,\n // mcp server\n mcpServe,\n mcpStop,\n mcpRestart,\n mcpStatus,\n mcpLogs,\n // setup / uninstall\n setup,\n uninstall,\n doctor,\n sync,\n];\n\nfor (const cmd of ALL_COMMANDS) {\n register(cmd);\n}\n\nexport { ALL_COMMANDS };\n","import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { getStateRoot } from './paths.js';\n\n/**\n * Single line in `$XDG_STATE_HOME/active-work/usage.jsonl`.\n *\n * The log is fire-and-forget telemetry written by the CLI dispatcher for\n * later self-reflection. Failures to write must never break the user's\n * command, so `appendUsage` swallows all errors.\n */\nexport interface UsageRecord {\n ts: string; // ISO 8601\n command: string; // registry name\n args?: Record<string, unknown>;\n duration_ms?: number;\n success: boolean;\n exit_code: number;\n}\n\n/** Resolve the on-disk path of the usage log. */\nexport function usageLogPath(): string {\n return path.join(getStateRoot(), 'usage.jsonl');\n}\n\n/**\n * Append a single JSON-encoded record + newline to the usage log.\n *\n * Silent on any error: telemetry must never fail a user-facing command.\n */\nexport async function appendUsage(rec: UsageRecord): Promise<void> {\n try {\n const file = usageLogPath();\n await fs.mkdir(path.dirname(file), { recursive: true });\n await fs.appendFile(file, JSON.stringify(rec) + '\\n', 'utf8');\n } catch {\n // Intentionally silent.\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,SAAS,sBAAsB;;;ACDxC,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AACjB,SAAS,SAAS;AAIlB,IAAM,aAAa,EAAE,OAAO;AAAA,EAC1B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC;AAC1B,CAAC;AAED,IAAM,eAAe,EAAE,OAAO;AAAA,EAC5B,MAAM,EAAE,OAAO;AAAA,EACf,IAAI,EAAE,OAAO;AACf,CAAC;AAED,eAAe,UAAU,GAA6B;AACpD,MAAI;AACF,UAAM,OAAO,MAAM,GAAG,KAAK,CAAC;AAC5B,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAe,QAAyB;AACxD,QAAM,MAAM,KAAK,SAAS,QAAQ,KAAK;AACvC,SAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,GAAG;AACrE;AAEA,SAAS,YAAoB;AAC3B,QAAM,IAAI,oBAAI,KAAK;AACnB,QAAM,IAAI,EAAE,YAAY;AACxB,QAAM,IAAI,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AAClD,SAAO,GAAG,CAAC,IAAI,CAAC;AAClB;AAEA,IAAO,kBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,QAAQ;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,OAAO,KAAK,QAAQ,KAAK,KAAK,IAAI,YAAY,KAAK,IAAI,CAAC;AAC9D,QAAI,CAAE,MAAM,UAAU,IAAI,GAAI;AAC5B,YAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,IAC9D;AAEA,UAAM,MAAM,KAAK,QAAQ,QAAQ,IAAI,CAAC;AACtC,QAAI,SAAS,KAAK,IAAI,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,4DAA4D,IAAI;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,QAAQ,IAAI,YAAY,IAAI;AACrD,UAAM,UAAU,KAAK,KAAK,aAAa,KAAK,QAAQ,SAAS;AAC7D,UAAM,KAAK,KAAK,KAAK,SAAS,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC,EAAE;AAE3D,QAAI,MAAM,UAAU,EAAE,GAAG;AACvB,YAAM,IAAI,gBAAgB,uCAAuC,EAAE,EAAE;AAAA,IACvE;AAEA,UAAM,GAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAI;AACF,YAAM,GAAG,OAAO,MAAM,EAAE;AAAA,IAC1B,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAS;AACpB,cAAM,GAAG,GAAG,MAAM,IAAI,EAAE,WAAW,KAAK,CAAC;AACzC,cAAM,GAAG,GAAG,MAAM,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACpD,OAAO;AACL,cAAM;AAAA,MACR;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AACF,CAAC;;;ACnFD,SAAS,YAAYA,WAAU;AAC/B,OAAOC,WAAU;AACjB,OAAOC,aAAY;AACnB,SAAS,KAAAC,UAAS;;;ACHlB,SAAS,YAAYC,WAAU;AAC/B,OAAO,YAAY;AAiBnB,eAAsB,gBACpB,UACA,QAC6B;AAC7B,QAAM,MAAM,MAAMC,IAAG,SAAS,UAAU,MAAM;AAC9C,QAAM,SAAS,OAAO,GAAG;AACzB,QAAM,UAAU,YAAY,OAAO,IAAI;AACvC,QAAM,SAAS,OAAO,UAAU,OAAO;AACvC,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,qCAAqC,QAAQ,KAAK,OAAO,MAAM,OAAO;AAAA,IACxE;AAAA,EACF;AACA,SAAO,EAAE,aAAa,OAAO,MAAM,MAAM,OAAO,QAAQ;AAC1D;AAQA,eAAsB,mBACpB,UACiE;AACjE,QAAM,MAAM,MAAMA,IAAG,SAAS,UAAU,MAAM;AAC9C,QAAM,SAAS,OAAO,GAAG;AACzB,QAAM,UAAU,YAAY,OAAO,IAAI;AACvC,SAAO;AAAA,IACL,aAAa,EAAE,GAAG,QAAQ;AAAA,IAC1B,MAAM,OAAO;AAAA,EACf;AACF;AAMA,eAAsB,iBACpB,UACA,aACA,MACA,QACe;AACf,QAAM,SAAS,OAAO,UAAU,WAAW;AAC3C,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,qCAAqC,QAAQ,KAAK,OAAO,MAAM,OAAO;AAAA,IACxE;AAAA,EACF;AACA,QAAM,cAAc,OAAO,UAAU,MAAM,OAAO,IAAc;AAChE,QAAM,YAAY,UAAU,WAAW;AACzC;;;ACtEA,IAAM,eAAe;AACrB,IAAM,UAAU;AAChB,IAAM,UAAU;AAChB,IAAM,iBAAiB;AAahB,SAAS,aAAa,GAA2B;AACtD,MAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GAAG;AAC3C,WAAO,EAAE,IAAI,OAAO,OAAO,kCAAkC;AAAA,EAC/D;AACA,MAAI,EAAE,SAAS,SAAS;AACtB,WAAO,EAAE,IAAI,OAAO,OAAO,yBAAyB,OAAO,cAAc;AAAA,EAC3E;AACA,MAAI,EAAE,SAAS,SAAS;AACtB,WAAO,EAAE,IAAI,OAAO,OAAO,wBAAwB,OAAO,cAAc;AAAA,EAC1E;AACA,MAAI,EAAE,SAAS,IAAI,GAAG;AACpB,WAAO,EAAE,IAAI,OAAO,OAAO,2CAA2C;AAAA,EACxE;AACA,MAAI,CAAC,aAAa,KAAK,CAAC,GAAG;AACzB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE;AAAA,IACJ;AAAA,EACF;AACA,SAAO,EAAE,IAAI,KAAK;AACpB;AAaO,SAAS,aAAa,MAAsB;AACjD,QAAM,UAAU,KACb,MAAM,GAAG,EACT,OAAO,CAAC,YAAY,QAAQ,SAAS,CAAC,EACtC,IAAI,CAAC,YAAY,QAAQ,CAAC,EAAG,YAAY,CAAC,EAC1C,KAAK,EAAE;AACV,SAAO,QAAQ,MAAM,GAAG,cAAc;AACxC;;;AF5CA,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,aAAaA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AACvC,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,KAAKA,GAAE,OAAO;AAAA,EACd,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,aAAaA,GAAE,OAAO;AACxB,CAAC;AAED,eAAeE,WAAU,GAA6B;AACpD,MAAI;AACF,UAAM,OAAO,MAAMC,IAAG,KAAK,CAAC;AAC5B,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,gBAAgB,YAAqC;AAClE,MAAI;AACJ,MAAI;AACF,cAAU,MAAMA,IAAG,QAAQ,UAAU;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,MAAM;AACV,aAAW,SAAS,SAAS;AAC3B,QAAI,MAAM,WAAW,GAAG,EAAG;AAC3B,UAAM,YAAYC,MAAK,KAAK,YAAY,OAAO,UAAU;AACzD,QAAI;AACJ,QAAI;AACF,YAAM,MAAMD,IAAG,SAAS,WAAW,MAAM;AAAA,IAC3C,QAAQ;AACN;AAAA,IACF;AACA,UAAM,SAASE,QAAO,GAAG;AACzB,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,UAAU,aAAa,OAAO,KAAK,SAAS,YAAY,KAAK,OAAO,KAAK;AAChF,YAAM,KAAK;AAAA,IACb;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAEA,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMN;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,OAAO,EAAE,MAAM,WAAW,aAAa,oBAAoB,UAAU,KAAK;AAAA,MAC1E,aAAa,EAAE,MAAM,iBAAiB,aAAa,8BAA8B;AAAA,MACjF,OAAO,EAAE,MAAM,WAAW,aAAa,iBAAiB;AAAA,MACxD,UAAU,EAAE,MAAM,cAAc,aAAa,wBAAwB;AAAA,IACvE;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,YAAY,aAAa,KAAK,IAAI;AACxC,QAAI,CAAC,UAAU,IAAI;AACjB,YAAM,IAAI,gBAAgB,iBAAiB,KAAK,IAAI,MAAM,UAAU,KAAK,EAAE;AAAA,IAC7E;AAEA,UAAM,MAAMG,MAAK,KAAK,IAAI,YAAY,KAAK,IAAI;AAC/C,QAAI,MAAMF,WAAU,GAAG,GAAG;AACxB,YAAM,IAAI,gBAAgB,8BAA8B,KAAK,IAAI,KAAK,GAAG,GAAG;AAAA,IAC9E;AAEA,UAAM,OAAO,MAAM,gBAAgB,IAAI,UAAU;AACjD,UAAM,cAAc,aAAa,KAAK,IAAI;AAE1C,UAAM,cAAgC;AAAA,MACpC,gBAAgB;AAAA,MAChB,OAAO,KAAK;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,MAC5D,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,MAC1C,GAAI,KAAK,WACL,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,SAAS,KAAK,EAAE,EAAE,IAC9D,CAAC;AAAA,IACP;AAEA,UAAMC,IAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,UAAMA,IAAG,MAAMC,MAAK,KAAK,KAAK,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,UAAMD,IAAG,MAAMC,MAAK,KAAK,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,UAAMD,IAAG,MAAMC,MAAK,KAAK,KAAK,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAM,YAAY,KAAK,KAAK,KAAK;AAAA;AAAA;AAAA;AACjC,UAAM;AAAA,MACJA,MAAK,KAAK,KAAK,UAAU;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAc;AAAA;AAAA;AAAA;AACpB,UAAMD,IAAG,UAAUC,MAAK,KAAK,KAAK,YAAY,GAAG,aAAa,MAAM;AAEpE,UAAM;AAAA,MACJA,MAAK,KAAK,KAAK,eAAe;AAAA,MAC9B,EAAE,UAAU,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAC5B;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AGvID,SAAS,YAAYE,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AAIlB,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,OAAOA,GAAE,OAAO;AAAA,EAChB,SAASA,GAAE,OAAO;AAAA,EAClB,WAAWA,GAAE,OAAO;AAAA,EACpB,cAAcA,GAAE,OAAO;AAAA,EACvB,WAAWA,GAAE,OAAO;AAAA,EACpB,aAAaA,GAAE,OAAO;AACxB,CAAC;AAED,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,MAAMC,MAAK,KAAK,IAAI,YAAY,KAAK,IAAI;AAC/C,QAAI;AACF,YAAM,OAAO,MAAMC,IAAG,KAAK,GAAG;AAC9B,UAAI,CAAC,KAAK,YAAY,GAAG;AACvB,cAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,MAC9D;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,cAAe,OAAM;AACxC,YAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,IAC9D;AAEA,WAAO;AAAA,MACL,OAAOD,MAAK,KAAK,KAAK,UAAU;AAAA,MAChC,SAASA,MAAK,KAAK,KAAK,YAAY;AAAA,MACpC,WAAWA,MAAK,KAAK,KAAK,OAAO;AAAA,MACjC,cAAcA,MAAK,KAAK,KAAK,UAAU;AAAA,MACvC,WAAWA,MAAK,KAAK,KAAK,eAAe;AAAA,MACzC,aAAaA,MAAK,KAAK,KAAK,SAAS;AAAA,IACvC;AAAA,EACF;AACF,CAAC;;;ACjDD,SAAS,YAAYE,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AAKlB,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,UAAUA,GAAE,OAAO,EAAE,IAAI,CAAC;AAC5B,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,IAAIA,GAAE,OAAO;AACf,CAAC;AAED,eAAeE,WAAU,GAA6B;AACpD,MAAI;AACF,UAAM,OAAO,MAAMC,IAAG,KAAK,CAAC;AAC5B,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAO,iBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMJ;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,YAAY,UAAU;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,QAAQ,aAAa,KAAK,QAAQ;AACxC,QAAI,CAAC,MAAM,IAAI;AACb,YAAM,IAAI,gBAAgB,qBAAqB,KAAK,QAAQ,MAAM,MAAM,KAAK,EAAE;AAAA,IACjF;AAEA,UAAM,OAAOG,MAAK,KAAK,IAAI,YAAY,KAAK,QAAQ;AACpD,UAAM,KAAKA,MAAK,KAAK,IAAI,YAAY,KAAK,QAAQ;AAElD,QAAI,CAAE,MAAMF,WAAU,IAAI,GAAI;AAC5B,YAAM,IAAI,cAAc,yBAAyB,KAAK,QAAQ,EAAE;AAAA,IAClE;AACA,QAAI,MAAMA,WAAU,EAAE,GAAG;AACvB,YAAM,IAAI,gBAAgB,+BAA+B,KAAK,QAAQ,EAAE;AAAA,IAC1E;AAEA,UAAMC,IAAG,OAAO,MAAM,EAAE;AACxB,WAAO,EAAE,MAAM,GAAG;AAAA,EACpB;AACF,CAAC;;;ACtDD,SAAS,YAAYE,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AASlB,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAOA,GAAE,QAAQ;AACnB,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,OAAOA,GAAE,OAAO;AAAA,EAChB,OAAOA,GAAE,QAAQ;AACnB,CAAC;AAED,SAAS,QAAQ,QAAiC,QAAgB,OAAsB;AACtF,QAAM,QAAQ,OAAO,MAAM,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC1D,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI,gBAAgB,8BAA8B;AAAA,EAC1D;AACA,MAAI,SAAkC;AACtC,WAAS,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KAAK;AACzC,UAAM,MAAM,MAAM,CAAC;AACnB,UAAM,OAAO,OAAO,GAAG;AACvB,QAAI,SAAS,UAAa,SAAS,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC1F,YAAM,QAAiC,CAAC;AACxC,aAAO,GAAG,IAAI;AACd,eAAS;AAAA,IACX,OAAO;AACL,eAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO,MAAM,MAAM,SAAS,CAAC,CAAE,IAAI;AACrC;AAEA,IAAO,cAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,SAAS,OAAO;AAAA,IACrC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,MAAMC,MAAK,KAAK,IAAI,YAAY,KAAK,IAAI;AAC/C,UAAM,YAAYA,MAAK,KAAK,KAAK,UAAU;AAC3C,QAAI;AACF,YAAMC,IAAG,OAAO,SAAS;AAAA,IAC3B,QAAQ;AACN,YAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,IAC9D;AAEA,UAAM,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACrD,YAAM,EAAE,aAAa,KAAK,IAAI,MAAM,mBAAmB,SAAS;AAChE,cAAQ,aAAa,KAAK,OAAO,KAAK,KAAK;AAC3C,kBAAY,UAAU,MAAM;AAC5B,UAAI;AACF,cAAM,iBAAiB,WAAW,aAAa,MAAM,sBAAsB;AAAA,MAC7E,SAAS,KAAK;AACZ,cAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,cAAM,IAAI;AAAA,UACR,cAAc,KAAK,KAAK,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,KAAK,MAAM;AAAA,QACnE;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,OAAO,KAAK,MAAM;AAAA,EACjE;AACF,CAAC;;;AC7ED,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,UAAS;AASlB,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,SAASA,GAAE,OAAO;AACpB,CAAC;AAED,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,YAAYC,MAAK,KAAK,IAAI,YAAY,KAAK,MAAM,UAAU;AACjE,QAAI;AACF,YAAMC,IAAG,OAAO,SAAS;AAAA,IAC3B,QAAQ;AACN,YAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,IAC9D;AAEA,UAAM,UAAU,MAAM;AACtB,UAAM,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACrD,YAAM,EAAE,aAAa,KAAK,IAAI,MAAM,mBAAmB,SAAS;AAChE,kBAAY,UAAU;AACtB,YAAM,iBAAiB,WAAW,aAAa,MAAM,sBAAsB;AAAA,IAC7E,CAAC;AAED,WAAO,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,EACpC;AACF,CAAC;;;AC9CD,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AA6BjB,eAAsB,gBAA4C;AAChE,QAAM,OAAO,cAAc;AAC3B,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,IAAG,QAAQ,IAAI;AAAA,EACjC,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AAEA,QAAM,SAA4B,CAAC;AACnC,aAAW,QAAQ,SAAS;AAC1B,QAAI,KAAK,WAAW,GAAG,EAAG;AAC1B,UAAM,YAAYC,MAAK,KAAK,MAAM,MAAM,UAAU;AAClD,QAAI;AACJ,QAAI;AACF,aAAO,MAAMD,IAAG,KAAK,SAAS;AAAA,IAChC,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,KAAK,OAAO,EAAG;AACpB,UAAM,EAAE,aAAa,KAAK,IAAI,MAAM;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,EAAE,MAAM,MAAM,WAAW,aAAa,KAAK,CAAC;AAAA,EAC1D;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAClD,SAAO;AACT;AAMO,SAAS,UAAU,OAAmC;AAC3D,SAAO,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK;AAClC;;;ADlDA,IAAME,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC7C,CAAC;AAED,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EAChC,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,IAAIA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,SAASA,GAAE,MAAM,gBAAgB;AACnC,CAAC;AAUD,SAAS,aAAa,QAAyC;AAC7D,SAAO,OACJ,OAAO,CAAC,MAAM,EAAE,YAAY,UAAU,SAAS,EAC/C,IAAI,CAAC,MAAM;AAEV,UAAM,OAAO,EAAE,YAAY;AAC3B,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI;AAAA,QACR,sBAAsB,EAAE,IAAI;AAAA,MAC9B;AAAA,IACF;AACA,WAAO,EAAE,MAAM,EAAE,MAAM,KAAK;AAAA,EAC9B,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AACnC;AAEA,IAAO,gBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,EAAE,MAAM,KAAK,GAAG;AACxB,UAAM,SAAS,MAAM,cAAc;AACnC,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,cAAc,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,SAAS,aAAa,MAAM;AAClC,UAAM,cAAc,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG;AACzD,UAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAE1D,QAAI;AACJ,QAAI,SAAS,QAAW;AAEtB,gBAAU,cAAc,WAAW,IAC/B,IACA,KAAK,IAAI,GAAG,cAAc,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI;AAAA,IACtD,OAAO;AACL,YAAM,aAAa,cAAc,SAAS;AAC1C,UAAI,OAAO,YAAY;AACrB,cAAM,IAAI;AAAA,UACR,QAAQ,IAAI,uBAAuB,UAAU;AAAA,QAC/C;AAAA,MACF;AACA,gBAAU;AAAA,IACZ;AAGA,UAAM,eAA6B,cAAc,IAAI,CAAC,OAAO;AAAA,MAC3D,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,QAAQ,UAAU,EAAE,OAAO,IAAI,EAAE;AAAA,IAC3C,EAAE;AACF,iBAAa,KAAK,EAAE,MAAM,MAAM,QAAQ,CAAC;AACzC,iBAAa,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAG3C,UAAM,UAAU,oBAAI,IAA2C;AAC/D,eAAW,SAAS,cAAc;AAChC,YAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,IAAI,GAAG;AACzD,YAAM,YACJ,MAAM,SAAS,OACX,OAAO,YAAY,UAAU,aAAa,UAAU,MAAM,OAC1D,UAAU,MAAM;AACtB,UAAI,CAAC,WAAW;AACd,gBAAQ,IAAI,MAAM,MAAM,EAAE,MAAM,OAAO,IAAI,MAAM,KAAK,CAAC;AAAA,MACzD;AAAA,IACF;AAIA,QAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,cAAQ,IAAI,MAAM,EAAE,MAAM,aAAa,IAAI,QAAQ,CAAC;AAAA,IACtD;AAEA,UAAM,aAAa,MAAM;AACzB,UAAM,YAAY,UAAU,QAAQ,KAAK,CAAC;AAC1C,UAAM,YAAY,WAAW,YAAY;AACvC,iBAAW,eAAe,WAAW;AACnC,cAAM,SAAS,QAAQ,IAAI,WAAW;AACtC,YAAI,CAAC,OAAQ;AACb,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACvD,YAAI,CAAC,OAAO;AACV,gBAAM,IAAI;AAAA,YACR,cAAc,WAAW;AAAA,UAC3B;AAAA,QACF;AACA,cAAM,OAAyB;AAAA,UAC7B,GAAG,MAAM;AAAA,UACT,OAAO;AAAA,UACP,MAAM,OAAO;AAAA,UACb,SAAS;AAAA,QACX;AAGA,eAAQ,KAAmC;AAC3C,eAAQ,KAAmC;AAC3C,cAAM;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,UAAU,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAClC,OAAO,CAAC,CAAC,CAAC,MAAM,MAAM,IAAI,EAC1B,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,EACrD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE;AAE7B,WAAO,EAAE,MAAM,MAAM,SAAS,QAAQ;AAAA,EACxC;AACF,CAAC;AAED,eAAe,YACb,OACA,IACe;AAGf,QAAM,UAAU,OAAO,UAAiC;AACtD,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,GAAG;AACT;AAAA,IACF;AACA,UAAM,aAAa,YAAY,MAAM,KAAK,CAAC,GAAG,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxE;AACA,QAAM,QAAQ,CAAC;AACjB;;;AErLA,SAAS,KAAAC,UAAS;AAalB,IAAM,iBAAiB;AAEvB,IAAM,UAAUC,GACb,OAAO,EACP,MAAM,gBAAgB,0BAA0B,EAChD,OAAO,CAAC,MAAM;AACb,QAAM,SAAS,IAAI,KAAK,CAAC;AACzB,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,EAAG,QAAO;AAC3C,SAAO,OAAO,YAAY,EAAE,MAAM,GAAG,EAAE,MAAM;AAC/C,GAAG,qCAAqC;AAE1C,IAAMC,cAAaD,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO;AAAA,EACP,iBAAiBA,GAAE,OAAO,EAAE,IAAI,CAAC;AACnC,CAAC;AAED,IAAME,gBAAeF,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,cAAcA,GAAE,OAAO;AAAA,EACvB,iBAAiBA,GAAE,OAAO;AAC5B,CAAC;AAKD,IAAO,gBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMC;AAAA,EACN,QAAQC;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,mBAAmB;AAAA,QACjB,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,EAAE,MAAM,OAAO,gBAAgB,GAAG;AAC1C,UAAM,SAAS,MAAM,cAAc;AACnC,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,cAAc,yBAAyB,IAAI,EAAE;AAAA,IACzD;AAEA,UAAM,aAAa,OAAO,YAAY,UAAU;AAChD,UAAM,YAAY,aACd,OACG;AAAA,MACC,CAAC,MAAM,EAAE,YAAY,UAAU,aAAa,EAAE,SAAS;AAAA,IACzD,EACC,IAAI,CAAC,MAAM;AACV,UAAI,EAAE,YAAY,SAAS,QAAW;AACpC,cAAM,IAAI,MAAM,sBAAsB,EAAE,IAAI,eAAe;AAAA,MAC7D;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,YAAY,KAAK;AAAA,IAClD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,IACjC,CAAC;AAEL,UAAM,cAA8C,CAAC;AACrD,cAAU,QAAQ,CAAC,GAAG,MAAM;AAC1B,YAAM,UAAU,IAAI;AACpB,UAAI,EAAE,SAAS,SAAS;AACtB,oBAAY,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,MAChD;AAAA,IACF,CAAC;AAED,UAAM,aAAa,MAAM;AACzB,UAAM,cAAc,UAAU,CAAC,MAAM,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvE,UAAMC,aAAY,aAAa,YAAY;AACzC,YAAM,SAA2B;AAAA,QAC/B,GAAG,OAAO;AAAA,QACV,OAAO;AAAA,QACP,cAAc;AAAA,QACd;AAAA,QACA,SAAS;AAAA,MACX;AACA,aAAQ,OAAqC;AAC7C,YAAM;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAEA,iBAAW,MAAM,aAAa;AAC5B,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;AACnD,YAAI,CAAC,MAAO;AACZ,cAAM,OAAyB;AAAA,UAC7B,GAAG,MAAM;AAAA,UACT,OAAO;AAAA,UACP,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,QACX;AACA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,MAAM,cAAc,OAAO,gBAAgB;AAAA,EACtD;AACF,CAAC;AAED,eAAeA,aACb,OACA,IACe;AACf,QAAM,UAAU,OAAO,UAAiC;AACtD,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,GAAG;AACT;AAAA,IACF;AACA,UAAM,aAAa,YAAY,MAAM,KAAK,CAAC,GAAG,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxE;AACA,QAAM,QAAQ,CAAC;AACjB;;;AC/IA,SAAS,KAAAC,UAAS;AAalB,IAAMC,cAAaC,GAAE,OAAO;AAAA,EAC1B,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAM,sBAAsBA,GAAE,OAAO;AAAA,EACnC,MAAMA,GAAE,OAAO;AAAA,EACf,MAAMA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,IAAIA,GAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,gBAAeD,GAAE,OAAO;AAAA,EAC5B,MAAMA,GAAE,OAAO;AAAA,EACf,YAAYA,GAAE,MAAM,mBAAmB;AACzC,CAAC;AAKD,IAAO,kBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,SAAS,MAAM,cAAc;AACnC,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,cAAc,yBAAyB,IAAI,EAAE;AAAA,IACzD;AACA,QAAI,OAAO,YAAY,UAAU,WAAW;AAC1C,YAAM,IAAI;AAAA,QACR,kBAAkB,IAAI,cAAc,OAAO,YAAY,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,YAAY,OACf,OAAO,CAAC,MAAM,EAAE,YAAY,UAAU,aAAa,EAAE,SAAS,IAAI,EAClE,IAAI,CAAC,MAAM;AACV,UAAI,EAAE,YAAY,SAAS,QAAW;AACpC,cAAM,IAAI,MAAM,sBAAsB,EAAE,IAAI,eAAe;AAAA,MAC7D;AACA,aAAO,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,YAAY,KAAK;AAAA,IAClD,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;AAEjC,UAAM,cAA4D,CAAC;AACnE,cAAU,QAAQ,CAAC,GAAG,MAAM;AAC1B,YAAM,UAAU,IAAI;AACpB,UAAI,EAAE,SAAS,SAAS;AACtB,oBAAY,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,MAAM,IAAI,QAAQ,CAAC;AAAA,MAC9D;AAAA,IACF,CAAC;AAED,UAAM,aAAa,MAAM;AACzB,UAAM,cAAc,UAAU,CAAC,MAAM,GAAG,YAAY,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAEvE,UAAMC,aAAY,aAAa,YAAY;AAEzC,YAAM,UAA4B;AAAA,QAChC,GAAG,OAAO;AAAA,QACV,OAAO;AAAA,QACP,SAAS;AAAA,MACX;AACA,aAAQ,QAAsC;AAC9C,YAAM;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAGA,iBAAW,MAAM,aAAa;AAC5B,cAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;AACnD,YAAI,CAAC,MAAO;AACZ,cAAM,OAAyB;AAAA,UAC7B,GAAG,MAAM;AAAA,UACT,OAAO;AAAA,UACP,MAAM,GAAG;AAAA,UACT,SAAS;AAAA,QACX;AACA,cAAM;AAAA,UACJ,MAAM;AAAA,UACN;AAAA,UACA,MAAM;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,MAAM,YAAY,YAAY;AAAA,EACzC;AACF,CAAC;AAED,eAAeA,aACb,OACA,IACe;AACf,QAAM,UAAU,OAAO,UAAiC;AACtD,QAAI,UAAU,MAAM,QAAQ;AAC1B,YAAM,GAAG;AACT;AAAA,IACF;AACA,UAAM,aAAa,YAAY,MAAM,KAAK,CAAC,GAAG,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACxE;AACA,QAAM,QAAQ,CAAC;AACjB;;;AC3HA,SAAS,KAAAC,WAAS;AAalB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AACjB,CAAC;AAKD,IAAO,kBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,EAAE,KAAK,GAAG;AAClB,UAAM,SAAS,MAAM,cAAc;AACnC,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AACjD,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,cAAc,yBAAyB,IAAI,EAAE;AAAA,IACzD;AACA,QAAI,OAAO,YAAY,UAAU,UAAU;AACzC,YAAM,IAAI;AAAA,QACR,kBAAkB,IAAI,cAAc,OAAO,YAAY,KAAK;AAAA,MAC9D;AAAA,IACF;AAEA,UAAM,aAAa,YAAY,IAAI,GAAG,YAAY;AAChD,YAAM,OAAyB;AAAA,QAC7B,GAAG,OAAO;AAAA,QACV,OAAO;AAAA,QACP,SAAS,MAAM;AAAA,MACjB;AACA,aAAQ,KAAmC;AAC3C,aAAQ,KAAmC;AAC3C,aAAQ,KAAmC;AAC3C,YAAM;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,QACA,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,EAAE,KAAK;AAAA,EAChB;AACF,CAAC;;;AChED,SAAS,YAAYC,WAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,WAAS;AAclB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,UAAUA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,UAAUA,IAAE,KAAK,CAAC,YAAY,QAAQ,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EACjE,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACzC,WAAWA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACtC,MAAMA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,OAAOA,IAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAID,IAAM,YAAY;AAElB,eAAe,gBAAgB,MAA+B;AAC5D,QAAM,YAAYC,MAAK,KAAK,iBAAiB,IAAI,GAAG,UAAU;AAC9D,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,mBAAmB,SAAS;AAAA,EAC1C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,UAAU;AACpD,YAAM,IAAI,cAAc,yBAAyB,IAAI,EAAE;AAAA,IACzD;AACA,UAAM;AAAA,EACR;AACA,QAAM,SAAS,IAAI,YAAY;AAC/B,MAAI,OAAO,WAAW,YAAY,CAAC,UAAU,KAAK,MAAM,GAAG;AACzD,UAAM,IAAI;AAAA,MACR,YAAY,SAAS;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,cAAc,MAAiC;AAC5D,QAAM,MAAMA,MAAK,KAAK,iBAAiB,IAAI,GAAG,OAAO;AACrD,MAAI;AACF,UAAM,UAAU,MAAMC,IAAG,QAAQ,GAAG;AACpC,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC;AAAA,EACjD,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AACF;AAEA,eAAe,kBAAkB,MAA+B;AAC9D,QAAM,QAAQ,MAAM,cAAc,IAAI;AACtC,QAAM,MAAMD,MAAK,KAAK,iBAAiB,IAAI,GAAG,OAAO;AACrD,QAAM,QAAgB,CAAC;AACvB,aAAW,QAAQ,OAAO;AACxB,UAAM,OAAO,MAAM,SAASA,MAAK,KAAK,KAAK,IAAI,GAAG,UAAU;AAC5D,UAAM,KAAK,IAAI;AAAA,EACjB;AACA,SAAO;AACT;AAEA,SAAS,eAAe,QAAgB,UAA0B;AAChE,MAAI,MAAM;AACV,QAAM,KAAK,IAAI,OAAO,IAAI,MAAM,UAAU;AAC1C,aAAW,KAAK,UAAU;AACxB,UAAM,IAAI,GAAG,KAAK,EAAE,EAAE;AACtB,QAAI,GAAG;AACL,YAAM,IAAI,OAAO,SAAS,EAAE,CAAC,GAAI,EAAE;AACnC,UAAI,IAAI,IAAK,OAAM;AAAA,IACrB;AAAA,EACF;AACA,SAAO,MAAM;AACf;AAEA,SAAS,aAAa,UAA0B;AAC9C,MAAI,MAAM;AACV,aAAW,KAAK,UAAU;AACxB,QAAI,EAAE,WAAW,IAAK,OAAM,EAAE;AAAA,EAChC;AACA,SAAO,MAAM;AACf;AAEA,IAAO,mBAAQ,cAA0B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMF;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,OAAO,EAAE,MAAM,WAAW,aAAa,cAAc,UAAU,KAAK;AAAA,MACpE,UAAU,EAAE,MAAM,cAAc,aAAa,0BAA0B;AAAA,MACvE,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,UAAU,EAAE,MAAM,cAAc,aAAa,mBAAmB;AAAA,MAChE,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM,EAAE,MAAM,UAAU,aAAa,2BAA2B;AAAA,MAChE,OAAO,EAAE,MAAM,WAAW,aAAa,kBAAkB;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AAEd,kBAAc;AACd,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,SAAS,MAAM,gBAAgB,KAAK,IAAI;AAC9C,YAAM,WAAW,MAAM,kBAAkB,KAAK,IAAI;AAClD,YAAM,IAAI,eAAe,QAAQ,QAAQ;AACzC,YAAM,KAAK,GAAG,MAAM,IAAI,CAAC;AACzB,YAAM,WAAW,KAAK,YAAY,aAAa,QAAQ;AACvD,YAAM,OAAO,MAAM;AACnB,YAAM,OAAa;AAAA,QACjB;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,QACA,UAAU,KAAK;AAAA,QACf,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,QAAQ;AAAA,QACR,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AACA,YAAM,UAAUE,MAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,OAAO;AAC9D,YAAMC,IAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC3C,YAAM,UAAUD,MAAK,KAAK,SAAS,GAAG,EAAE,MAAM,GAAG,MAAM,UAAU;AACjE,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF,CAAC;;;ACnJD,SAAS,YAAYE,YAAU;AAC/B,OAAOC,WAAU;AACjB,SAAS,KAAAC,WAAS;AAMlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC;AACtB,CAAC;AAID,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,IAAIA,IAAE,OAAO;AAAA,EACb,SAASA,IAAE,QAAQ,IAAI;AACzB,CAAC;AAID,IAAO,sBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,IAAI;AAAA,EAC3B;AAAA,EACA,MAAM,IAAI,MAAM;AACd,kBAAc;AACd,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,OAAOC,MAAK;AAAA,QAChB,iBAAiB,KAAK,IAAI;AAAA,QAC1B;AAAA,QACA,GAAG,KAAK,EAAE;AAAA,MACZ;AACA,UAAI;AACF,cAAMC,KAAG,OAAO,IAAI;AAAA,MACtB,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,gBAAM,IAAI,cAAc,mBAAmB,KAAK,EAAE,EAAE;AAAA,QACtD;AACA,cAAM;AAAA,MACR;AACA,aAAO,EAAE,IAAI,KAAK,IAAI,SAAS,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC;;;ACjDD,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AASlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC;AACtB,CAAC;AAID,IAAO,oBAAQ,cAA0B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,IAAI;AAAA,EAC3B;AAAA,EACA,MAAM,IAAI,MAAM;AACd,kBAAc;AACd,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,OAAOE,OAAK;AAAA,QAChB,iBAAiB,KAAK,IAAI;AAAA,QAC1B;AAAA,QACA,GAAG,KAAK,EAAE;AAAA,MACZ;AACA,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,SAAS,MAAM,UAAU;AAAA,MACxC,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,gBAAM,IAAI,cAAc,mBAAmB,KAAK,EAAE,EAAE;AAAA,QACtD;AACA,cAAM;AAAA,MACR;AACA,YAAM,OAAO,MAAM;AACnB,YAAM,UAAgB;AAAA,QACpB,GAAG;AAAA,QACH,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AACA,YAAM,UAAU,MAAM,SAAS,UAAU;AACzC,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACF,CAAC;;;ACrDD,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AASlB,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAOA,IAAE,QAAQ;AACnB,CAAC;AAID,SAAS,WAAW,OAAuC;AACzD,SAAQ,gBAAsC,SAAS,KAAK;AAC9D;AAEA,IAAO,oBAAQ,cAA0B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,MAAM,SAAS,OAAO;AAAA,EAC7C;AAAA,EACA,MAAM,IAAI,MAAM;AACd,QAAI,CAAC,WAAW,KAAK,KAAK,GAAG;AAC3B,YAAM,IAAI;AAAA,QACR,0BAA0B,KAAK,KAAK,cAAc,gBAAgB,KAAK,IAAI,CAAC;AAAA,MAC9E;AAAA,IACF;AACA,kBAAc;AACd,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,OAAOE,OAAK;AAAA,QAChB,iBAAiB,KAAK,IAAI;AAAA,QAC1B;AAAA,QACA,GAAG,KAAK,EAAE;AAAA,MACZ;AACA,UAAI;AACJ,UAAI;AACF,eAAO,MAAM,SAAS,MAAM,UAAU;AAAA,MACxC,SAAS,KAAK;AACZ,YAAK,IAA8B,SAAS,UAAU;AACpD,gBAAM,IAAI,cAAc,mBAAmB,KAAK,EAAE,EAAE;AAAA,QACtD;AACA,cAAM;AAAA,MACR;AACA,YAAM,OAAO,MAAM;AACnB,YAAM,OAAgC,EAAE,GAAG,MAAM,CAAC,KAAK,KAAK,GAAG,KAAK,MAAM;AAC1E,WAAK,UAAU;AACf,UAAI,KAAK,UAAU,YAAY,KAAK,UAAU,QAAQ;AACpD,aAAK,UAAU;AAAA,MACjB;AACA,YAAM,SAAS,WAAW,UAAU,IAAI;AACxC,UAAI,CAAC,OAAO,SAAS;AACnB,cAAM,IAAI;AAAA,UACR,qBAAqB,KAAK,KAAK,KAAK,OAAO,MAAM,OAAO;AAAA,QAC1D;AAAA,MACF;AACA,YAAM,UAAU,MAAM,OAAO,MAAM,UAAU;AAC7C,aAAO,OAAO;AAAA,IAChB,CAAC;AAAA,EACH;AACF,CAAC;;;AClFD,SAAS,YAAYC,YAAuB;AAC5C,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAOlB,IAAM,eAAeC,IAAE,KAAK,CAAC,QAAQ,QAAQ,KAAK,CAAC,EAAE,QAAQ,MAAM;AAEnE,IAAMC,eAAaD,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,iBAAiBA,IAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,EACzB,UAAUA,IAAE,KAAK,CAAC,YAAY,QAAQ,UAAU,KAAK,CAAC,EAAE,SAAS;AAAA,EACjE,QAAQ,aAAa,SAAS;AAChC,CAAC;AAMD,IAAME,iBAAeF,IAAE,OAAO;AAAA,EAC5B,OAAOA,IAAE,MAAM,WAAW,OAAO,EAAE,MAAMA,IAAE,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC;AAID,eAAe,YAA+B;AAC5C,QAAM,OAAO,cAAc;AAC3B,MAAI;AACJ,MAAI;AACF,cAAU,MAAMG,KAAG,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AACA,SAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;AACjE;AAEA,eAAe,iBAAiB,MAAuC;AACrE,QAAM,MAAMC,OAAK,KAAK,iBAAiB,IAAI,GAAG,OAAO;AACrD,MAAI;AACJ,MAAI;AACF,YAAQ,MAAMD,KAAG,QAAQ,GAAG;AAAA,EAC9B,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AACA,QAAM,QAAwB,CAAC;AAC/B,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,MAAM,EAAG;AAC5B,UAAM,OAAO,MAAM,SAASC,OAAK,KAAK,KAAK,IAAI,GAAG,UAAU;AAC5D,UAAM,KAAK,EAAE,GAAG,MAAM,KAAK,CAAC;AAAA,EAC9B;AACA,SAAO;AACT;AAEA,IAAO,oBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMH;AAAA,EACN,QAAQC;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,KAAK,EAAE,MAAM,SAAS,aAAa,2BAA2B;AAAA,MAC9D,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,SAAS,KAAK,UAAU;AAC9B,UAAM,QAAkB,KAAK,kBACzB,MAAM,UAAU,KACf,MAAM;AACL,UAAI,CAAC,KAAK,MAAM;AACd,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AACA,aAAO,CAAC,KAAK,IAAI;AAAA,IACnB,GAAG;AAEP,QAAI,YAA4B,CAAC;AACjC,eAAW,QAAQ,OAAO;AACxB,YAAM,QAAQ,MAAM,iBAAiB,IAAI;AACzC,kBAAY,UAAU,OAAO,KAAK;AAAA,IACpC;AAEA,UAAM,WAAW,UAAU,OAAO,CAAC,MAAM;AACvC,UAAI,WAAW,SAAS,EAAE,WAAW,OAAQ,QAAO;AACpD,UAAI,KAAK,OAAO,EAAE,EAAE,QAAQ,CAAC,GAAG,SAAS,KAAK,GAAG,EAAG,QAAO;AAC3D,UAAI,KAAK,YAAY,EAAE,aAAa,KAAK,SAAU,QAAO;AAC1D,aAAO;AAAA,IACT,CAAC;AAED,aAAS,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AAC/C,WAAO,EAAE,OAAO,SAAS;AAAA,EAC3B;AACF,CAAC;;;AC/GD,SAAS,YAAYG,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AASlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,IAAIA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACpB,cAAcA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAC1C,CAAC;AAID,IAAM,gBAAgBA,IAAE,OAAO;AAAA,EAC7B,IAAIA,IAAE,OAAO;AAAA,EACb,MAAMA,IAAE,OAAO,EAAE,IAAI;AAAA,EACrB,IAAIA,IAAE,OAAO,EAAE,IAAI;AACrB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,IAAIA,IAAE,OAAO;AAAA,EACb,MAAMA,IAAE,OAAO,EAAE,IAAI;AAAA,EACrB,IAAIA,IAAE,OAAO,EAAE,IAAI;AAAA,EACnB,SAASA,IAAE,MAAM,aAAa;AAChC,CAAC;AAID,eAAe,aACb,MAC8C;AAC9C,QAAM,MAAME,OAAK,KAAK,iBAAiB,IAAI,GAAG,OAAO;AACrD,MAAI;AACJ,MAAI;AACF,YAAQ,MAAMC,KAAG,QAAQ,GAAG;AAAA,EAC9B,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AACA,QAAM,MAA2C,CAAC;AAClD,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,SAAS,MAAM,EAAG;AAC5B,UAAM,OAAOD,OAAK,KAAK,KAAK,IAAI;AAChC,QAAI,KAAK,EAAE,MAAM,MAAM,SAAS,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAEA,IAAO,uBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,MAAM,cAAc;AAAA,EAC3C;AAAA,EACA,MAAM,IAAI,MAAM;AACd,kBAAc;AACd,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,UAAU,MAAM,aAAa,KAAK,IAAI;AAC5C,YAAM,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,OAAO,KAAK,EAAE;AACxD,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI,cAAc,mBAAmB,KAAK,EAAE,EAAE;AAAA,MACtD;AACA,YAAM,cAAc,OAAO,KAAK;AAChC,YAAM,cAAc,KAAK;AACzB,YAAM,UAA2D,CAAC;AAClE,YAAM,OAAO,MAAM;AAEnB,UAAI,gBAAgB,aAAa;AAC/B,eAAO,EAAE,IAAI,KAAK,IAAI,MAAM,aAAa,IAAI,aAAa,QAAQ;AAAA,MACpE;AAEA,YAAM,SAA8C,CAAC;AAErD,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,KAAK,OAAO,KAAK,GAAI;AAC/B,YAAI,MAAM,KAAK,YAAY,aAAa;AACtC,gBAAM,SAAS,MAAM,KAAK;AAC1B,gBAAM,QAAQ,SAAS;AACvB,gBAAM,OAAa;AAAA,YACjB,GAAG,MAAM;AAAA,YACT,UAAU;AAAA,YACV,SAAS;AAAA,UACX;AACA,iBAAO,KAAK,EAAE,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC;AAC5C,kBAAQ,KAAK,EAAE,IAAI,MAAM,KAAK,IAAI,MAAM,QAAQ,IAAI,MAAM,CAAC;AAAA,QAC7D;AAAA,MACF;AAEA,YAAM,aAAmB;AAAA,QACvB,GAAG,OAAO;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AACA,aAAO,KAAK,EAAE,MAAM,YAAY,MAAM,OAAO,KAAK,CAAC;AAEnD,iBAAW,KAAK,QAAQ;AACtB,cAAM,UAAU,EAAE,MAAM,EAAE,MAAM,UAAU;AAAA,MAC5C;AAEA,aAAO,EAAE,IAAI,KAAK,IAAI,MAAM,aAAa,IAAI,aAAa,QAAQ;AAAA,IACpE,CAAC;AAAA,EACH;AACF,CAAC;;;AC9GD,SAAS,YAAYG,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAClB,OAAOC,aAAY;AAMnB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC9C,CAAC;AAED,IAAM,qBAAqBA,IAAE,OAAO;AAAA,EAClC,UAAUA,IAAE,OAAO;AAAA,EACnB,aAAa;AAAA,EACb,YAAYA,IAAE,OAAO;AACvB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,UAAUA,IAAE,MAAM,kBAAkB;AAAA,EACpC,QAAQA,IAAE,MAAMA,IAAE,OAAO,EAAE,UAAUA,IAAE,OAAO,GAAG,OAAOA,IAAE,OAAO,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,IAAM,gBAAgB;AACtB,IAAM,iBAAiB;AAEvB,SAAS,iBAAiB,MAAsB;AAC9C,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,QAAQ,WAAW,EAAG;AAC1B,WAAO,QAAQ,SAAS,iBACpB,QAAQ,MAAM,GAAG,cAAc,IAC/B;AAAA,EACN;AACA,SAAO;AACT;AAaA,eAAe,iBAAiB,KAAgC;AAC9D,MAAI;AACF,UAAM,UAAU,MAAME,KAAG,QAAQ,GAAG;AACpC,WAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,KAAK;AAAA,EACvD,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO,CAAC;AAC9D,UAAM;AAAA,EACR;AACF;AAOA,SAAS,iBACP,KACyB;AACzB,QAAM,MAA+B,EAAE,GAAG,IAAI;AAC9C,aAAW,SAAS,CAAC,WAAW,OAAO,GAAY;AACjD,UAAM,QAAQ,IAAI,KAAK;AACvB,QAAI,iBAAiB,MAAM;AACzB,UAAI,KAAK,IAAI,MAAM,YAAY,EAAE,QAAQ,aAAa,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,YACb,UAC4D;AAC5D,QAAM,MAAM,MAAMA,KAAG,SAAS,UAAU,MAAM;AAC9C,QAAM,SAASC,QAAO,GAAG;AACzB,QAAM,UAAU,iBAAiB,OAAO,IAA+B;AACvE,QAAM,SAAS,yBAAyB,UAAU,OAAO;AACzD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI;AAAA,MACR,qCAAqC,QAAQ,KAAK,OAAO,MAAM,OAAO;AAAA,IACxE;AAAA,EACF;AACA,SAAO,EAAE,aAAa,OAAO,MAAM,MAAM,OAAO,QAAQ;AAC1D;AAEA,IAAO,uBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMJ;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,uCAAuC,aAAa;AAAA,MACnE;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,cAAcG,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,UAAU;AACrE,UAAM,YAAY,MAAM,iBAAiB,WAAW;AAEpD,UAAM,UAAuB,CAAC;AAC9B,UAAM,SAAsB,CAAC;AAE7B,eAAW,YAAY,WAAW;AAChC,YAAM,WAAWA,OAAK,KAAK,aAAa,QAAQ;AAChD,UAAI;AACF,cAAM,EAAE,aAAa,KAAK,IAAI,MAAM,YAAY,QAAQ;AACxD,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,YAAY,iBAAiB,IAAI;AAAA,QACnC,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV;AAAA,UACA,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,SAAS,IAAI,KAAK,EAAE,YAAY,KAAK,EAAE,QAAQ;AACrD,YAAM,SAAS,IAAI,KAAK,EAAE,YAAY,KAAK,EAAE,QAAQ;AACrD,aAAO,SAAS;AAAA,IAClB,CAAC;AAED,WAAO,EAAE,UAAU,QAAQ,MAAM,GAAG,KAAK,GAAG,OAAO;AAAA,EACrD;AACF,CAAC;;;AC9ID,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAOlB,IAAMC,eAAaC,IAChB,OAAO;AAAA,EACN,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,YAAYA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACzB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAOA,IAAE,KAAK,CAAC,aAAa,SAAS,CAAC,EAAE,QAAQ,WAAW;AAAA,EAC3D,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAWA,IAAE,OAAO,EAAE,SAAS;AACjC,CAAC,EACA,YAAY,CAAC,OAAO,QAAQ;AAC3B,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,UAAU,MAAM,cAAc;AACpC,MAAI,CAAC,WAAW,CAAC,SAAS;AACxB,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,MAAM;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACA,MAAI,WAAW,SAAS;AACtB,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,MAAM,CAAC,MAAM;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AACF,CAAC;AAEH,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,UAAUA,IAAE,OAAO;AACrB,CAAC;AAED,SAAS,mBAAmB,SAAyB;AACnD,QAAM,SAAS,IAAI,KAAK,OAAO;AAC/B,MAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,UAAM,IAAI,gBAAgB,8BAA8B,OAAO,EAAE;AAAA,EACnE;AACA,QAAM,OAAO,OAAO,eAAe,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAC/D,QAAM,MAAM,OAAO,YAAY,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,GAAG;AAChE,QAAM,KAAK,OAAO,WAAW,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AACzD,QAAM,KAAK,OAAO,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAC1D,QAAM,MAAM,OAAO,cAAc,EAAE,SAAS,EAAE,SAAS,GAAG,GAAG;AAC7D,SAAO,GAAG,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG;AACxC;AAEA,eAAe,OAAO,GAA6B;AACjD,MAAI;AACF,UAAME,KAAG,OAAO,CAAC;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,sBACb,KACA,UACiD;AACjD,QAAM,UAAU,GAAG,QAAQ;AAC3B,QAAM,cAAcC,OAAK,KAAK,KAAK,OAAO;AAC1C,MAAI,CAAE,MAAM,OAAO,WAAW,GAAI;AAChC,WAAO,EAAE,UAAU,SAAS,UAAU,YAAY;AAAA,EACpD;AACA,WAAS,IAAI,GAAG,IAAI,KAAQ,KAAK;AAC/B,UAAM,YAAY,GAAG,QAAQ,IAAI,CAAC;AAClC,UAAM,gBAAgBA,OAAK,KAAK,KAAK,SAAS;AAC9C,QAAI,CAAE,MAAM,OAAO,aAAa,GAAI;AAClC,aAAO,EAAE,UAAU,WAAW,UAAU,cAAc;AAAA,IACxD;AAAA,EACF;AACA,QAAM,IAAI,MAAM,4CAA4C,QAAQ,EAAE;AACxE;AAEA,IAAO,yBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMJ;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,YAAY;AAAA,QACV,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,WAAW;AAAA,QACT,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,cAAcE,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,UAAU;AACrE,UAAMD,KAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAE/C,UAAM,QAAQ,mBAAmB,KAAK,OAAO;AAC7C,UAAM,WAAW,GAAG,KAAK,IAAI,KAAK,UAAU;AAC5C,UAAM,EAAE,UAAU,SAAS,IAAI,MAAM;AAAA,MACnC;AAAA,MACA;AAAA,IACF;AAEA,UAAM,OAAO,KAAK,QAAS,MAAMA,KAAG,SAAS,KAAK,WAAY,MAAM;AAEpE,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,YAAY,KAAK;AAAA,QACjB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,EAAE,MAAM,UAAU,SAAS;AAAA,EACpC;AACF,CAAC;;;ACrJD,SAAS,YAAYE,MAAI,wBAAwB;AAEjD,OAAOC,YAAU;AACjB,OAAO,QAAQ;AACf,OAAO,cAAc;AACrB,SAAS,KAAAC,WAAS;AAIlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC5C,gBAAgBA,IAAE,QAAQ,EAAE,SAAS;AACvC,CAAC;AAED,IAAMC,sBAAqBD,IAAE,OAAO;AAAA,EAClC,YAAYA,IAAE,OAAO;AAAA,EACrB,KAAKA,IAAE,OAAO;AAAA,EACd,OAAOA,IAAE,OAAO;AAAA,EAChB,SAASA,IAAE,OAAO;AACpB,CAAC;AAED,IAAME,iBAAeF,IAAE,OAAO;AAAA,EAC5B,UAAUA,IAAE,MAAMC,mBAAkB;AACtC,CAAC;AAMD,IAAME,iBAAgB;AACtB,IAAM,cAAc;AACpB,IAAM,sBAAsB;AAE5B,SAAS,qBAA6B;AACpC,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,YAAY,SAAS,SAAS,GAAG;AACnC,WAAOC,OAAK,QAAQ,YAAY,QAAQ,CAAC;AAAA,EAC3C;AACA,SAAOA,OAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AACtD;AAcA,eAAe,eAAe,MAAiC;AAC7D,MAAI;AACJ,MAAI;AACF,kBAAc,MAAMC,KAAG,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC,EAAE;AAAA,MAAK,CAAC,YAClE,QAAQ,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,IAAI,CAAC,MAAMD,OAAK,KAAK,MAAM,EAAE,IAAI,CAAC;AAAA,IAC3E;AAAA,EACF,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,MAAgB,CAAC;AACvB,aAAW,OAAO,aAAa;AAC7B,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMC,KAAG,QAAQ,GAAG;AAAA,IAC9B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,KAAK,OAAO;AACrB,UAAI,EAAE,SAAS,QAAQ,GAAG;AACxB,YAAI,KAAKD,OAAK,KAAK,KAAK,CAAC,CAAC;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAe,aAAa,UAA0C;AACpE,QAAM,SAAS,iBAAiB,UAAU,EAAE,UAAU,OAAO,CAAC;AAC9D,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,WAAW,SAAS,CAAC;AAC1E,MAAI;AACF,qBAAiB,QAAQ,IAAI;AAC3B,UAAI,CAAC,KAAK,SAAS,OAAO,EAAG;AAC7B,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,cAAM,MAAM,OAAO;AACnB,YAAI,OAAO,QAAQ,YAAY,IAAI,SAAS,GAAG;AAC7C,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT,UAAE;AACA,OAAG,MAAM;AACT,WAAO,QAAQ;AAAA,EACjB;AACF;AAEA,eAAe,YAAY,UAAkD;AAC3E,QAAM,MAAM,MAAM,aAAa,QAAQ;AACvC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,OAAO,MAAMC,KAAG,KAAK,QAAQ;AACnC,QAAM,YAAYD,OAAK,SAAS,UAAU,QAAQ;AAClD,SAAO,EAAE,WAAW,KAAK,SAAS,KAAK,SAAS,SAAS;AAC3D;AAEA,eAAe,4BAA+C;AAC5D,QAAM,aAAa,cAAc;AACjC,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAChE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,SAAO,QACJ,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,EACxD,IAAI,CAAC,MAAMD,OAAK,KAAK,YAAY,EAAE,IAAI,CAAC;AAC7C;AAEA,SAAS,aAAa,QAAgB,OAAwB;AAC5D,QAAM,IAAIA,OAAK,QAAQ,MAAM;AAC7B,QAAM,IAAIA,OAAK,QAAQ,KAAK;AAC5B,MAAI,MAAM,EAAG,QAAO;AACpB,QAAM,UAAU,EAAE,SAASA,OAAK,GAAG,IAAI,IAAI,IAAIA,OAAK;AACpD,SAAO,EAAE,WAAW,OAAO;AAC7B;AAEA,SAAS,qBAAqB,MAA6B;AACzD,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAI,OAAO,SAAS,OAAQ,QAAO;AACnC,UAAM,UAAU,OAAO;AACvB,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,UAAU,QAAQ;AACxB,QAAI,OAAO,YAAY,SAAU,QAAO;AACxC,QAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,iBAAW,QAAQ,SAAS;AAC1B,YACE,QACA,OAAO,SAAS,YAChB,UAAU,QACV,OAAQ,KAA2B,SAAS,UAC5C;AACA,iBAAQ,KAA0B;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,MAAc,KAAqB;AACnD,QAAM,UAAU,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC/C,MAAI,QAAQ,UAAU,IAAK,QAAO;AAClC,SAAO,QAAQ,MAAM,GAAG,GAAG;AAC7B;AAOA,eAAe,eAAe,UAAmC;AAC/D,QAAM,SAAS,iBAAiB,UAAU,EAAE,UAAU,OAAO,CAAC;AAC9D,QAAM,KAAK,SAAS,gBAAgB,EAAE,OAAO,QAAQ,WAAW,SAAS,CAAC;AAC1E,MAAI,qBAAoC;AACxC,MAAI,YAA2B;AAC/B,MAAI;AACF,qBAAiB,QAAQ,IAAI;AAC3B,UAAI,KAAK,SAAS,mBAAmB,GAAG;AACtC,cAAM,OAAO,qBAAqB,IAAI;AACtC,YAAI,KAAM,sBAAqB;AAAA,MACjC,WAAW,cAAc,MAAM;AAC7B,cAAM,OAAO,qBAAqB,IAAI;AACtC,YAAI,KAAM,aAAY;AAAA,MACxB;AAAA,IACF;AAAA,EACF,UAAE;AACA,OAAG,MAAM;AACT,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,MAAM,sBAAsB,aAAa;AAC/C,SAAO,SAAS,KAAK,WAAW;AAClC;AAEA,eAAsB,YAAY,MAA6B;AAC7D,QAAM,QAAQ,KAAK,SAASD;AAC5B,QAAM,gBAAgB,KAAK,kBAAkB;AAE7C,QAAM,OAAO,mBAAmB;AAChC,QAAM,QAAQ,MAAM,eAAe,IAAI;AAEvC,QAAM,UAA4B,CAAC;AACnC,aAAW,KAAK,OAAO;AACrB,QAAI;AACF,YAAM,QAAQ,MAAM,YAAY,CAAC;AACjC,UAAI,MAAO,SAAQ,KAAK,KAAK;AAAA,IAC/B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,WAAW;AACf,MAAI,CAAC,eAAe;AAClB,UAAM,cAAc,MAAM,0BAA0B;AACpD,QAAI,YAAY,SAAS,GAAG;AAC1B,iBAAW,QAAQ;AAAA,QACjB,CAAC,MAAM,CAAC,YAAY,KAAK,CAACG,UAAS,aAAaA,OAAM,EAAE,GAAG,CAAC;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAEA,WAAS,KAAK,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,OAAO;AAC7C,QAAM,MAAM,SAAS,MAAM,GAAG,KAAK;AAEnC,QAAMC,YAA2B,CAAC;AAClC,aAAW,SAAS,KAAK;AACvB,UAAM,UAAU,MAAM,eAAe,MAAM,QAAQ;AACnD,IAAAA,UAAS,KAAK;AAAA,MACZ,YAAY,MAAM;AAAA,MAClB,KAAK,MAAM;AAAA,MACX,OAAO,IAAI,KAAK,MAAM,OAAO,EAAE,YAAY;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,UAAAA,UAAS;AACpB;AAEA,IAAM,WAAW,cAA4B;AAAA,EAC3C,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMR;AAAA,EACN,QAAQG;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,OAAO,EAAE,MAAM,WAAW,aAAa,uCAAuC;AAAA,MAC9E,gBAAgB;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM;AACd,WAAO,YAAY,IAAI;AAAA,EACzB;AACF,CAAC;AAED,IAAO,2BAAQ;;;ACnQf,OAAOM,YAAU;AACjB,SAAS,KAAAC,WAAS;AAOlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC;AACH,CAAC;AAKD,IAAO,8BAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,KAAK;AAAA,MAC7E,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;AAAA,MACnE,MAAM,EAAE,MAAM,UAAU,aAAa,oCAAoC;AAAA,IAC3E;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgBC,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC5E,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,UAAU,MAAM,SAAS,eAAe,eAAe;AAC7D,YAAM,QAAQ;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,MAAM,KAAK;AAAA,QACX,GAAI,KAAK,OAAO,EAAE,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,MACzC;AACA,YAAM,MAAM,QAAQ,SAAS;AAAA,QAC3B,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,EAAE,SAAS,KAAK;AAAA,MACjD;AACA,UAAI,OAAO,GAAG;AAEZ,cAAM,QAAQ,QAAQ,SAAS,GAAG;AAClC,gBAAQ,SAAS,GAAG,IAAI;AAAA,UACtB,MAAM,KAAK;AAAA,UACX,MAAM,KAAK;AAAA,UACX,GAAI,KAAK,SAAS,SACd,EAAE,MAAM,KAAK,KAAK,IAClB,MAAM,SAAS,SACb,EAAE,MAAM,MAAM,KAAK,IACnB,CAAC;AAAA,QACT;AAAA,MACF,OAAO;AACL,gBAAQ,SAAS,KAAK,KAAK;AAAA,MAC7B;AACA,YAAM,UAAU,eAAe,SAAS,eAAe;AACvD,aAAO,EAAE,MAAM,KAAK,MAAM,QAAQ,QAAQ,SAAS,OAAO,IAAI,MAAM,QAAQ,SAAS,SAAS,CAAC,EAAG;AAAA,IACpG,CAAC;AAAA,EACH;AACF,CAAC;;;ACvED,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAOlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,KAAKA,IAAE,OAAO,EAAE,SAAS;AAC3B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAAA,IACd,MAAMA,IAAE,OAAO;AAAA,IACf,OAAOA,IAAE,OAAO;AAAA,IAChB,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,CAAC;AACH,CAAC;AAKD,IAAO,6BAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,MACjE,OAAO,EAAE,MAAM,WAAW,aAAa,eAAe,UAAU,KAAK;AAAA,MACrE,KAAK,EAAE,MAAM,SAAS,aAAa,sBAAsB;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgBC,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC5E,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,UAAU,MAAM,SAAS,eAAe,eAAe;AAC7D,YAAM,QAAQ;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,GAAI,KAAK,MAAM,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,MACtC;AACA,cAAQ,QAAQ,KAAK,KAAK;AAC1B,YAAM,UAAU,eAAe,SAAS,eAAe;AACvD,aAAO,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM;AAAA,IACzC,CAAC;AAAA,EACH;AACF,CAAC;;;ACtDD,SAAS,YAAYC,YAAuB;AAC5C,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAQlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,iBAAiBA,IAAE,QAAQ,EAAE,SAAS;AACxC,CAAC;AAED,IAAM,aAAaA,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO;AAAA,EACf,WAAW;AACb,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,OAAOA,IAAE,MAAM,UAAU;AAC3B,CAAC;AAKD,eAAe,YAAY,MAAkC;AAC3D,QAAM,gBAAgBE,OAAK,KAAK,iBAAiB,IAAI,GAAG,eAAe;AACvE,SAAO;AAAA,IAAa,YAAY,IAAI;AAAA,IAAG,MACrC,SAAS,eAAe,eAAe;AAAA,EACzC;AACF;AAEA,eAAe,sBAAyC;AACtD,QAAM,OAAO,cAAc;AAC3B,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,KAAG,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACA,QAAM,QAAkB,CAAC;AACzB,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,MAAM,KAAK,WAAW,GAAG,EAAG;AAChC,UAAM,gBAAgBD,OAAK,KAAK,MAAM,MAAM,MAAM,eAAe;AACjE,QAAI;AACF,YAAMC,KAAG,OAAO,aAAa;AAC7B,YAAM,KAAK,MAAM,IAAI;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,KAAK;AACX,SAAO;AACT;AAEA,IAAO,wBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMJ;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,iBAAiB;AAAA,QACf,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,QAAI,KAAK,iBAAiB;AACxB,YAAM,QAAQ,MAAM,oBAAoB;AACxC,YAAM,QAAuD,CAAC;AAC9D,iBAAW,QAAQ,OAAO;AACxB,cAAM,KAAK,EAAE,MAAM,WAAW,MAAM,YAAY,IAAI,EAAE,CAAC;AAAA,MACzD;AACA,aAAO,EAAE,MAAM;AAAA,IACjB;AACA,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,YAAY,MAAM,YAAY,KAAK,IAAI;AAC7C,WAAO,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,MAAM,UAAU,CAAC,EAAE;AAAA,EACnD;AACF,CAAC;;;ACzFD,OAAOG,YAAU;AACjB,SAAS,KAAAC,WAAS;AAQlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO;AAAA,IACf,MAAMA,IAAE,OAAO;AAAA,EACjB,CAAC;AACH,CAAC;AAKD,IAAO,wBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,MAAM,EAAE,MAAM,UAAU,aAAa,yBAAyB,UAAU,KAAK;AAAA,MAC7E,MAAM,EAAE,MAAM,UAAU,aAAa,eAAe,UAAU,KAAK;AAAA,MACnE,MAAM,EAAE,MAAM,UAAU,aAAa,aAAa,UAAU,KAAK;AAAA,IACnE;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgBC,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC5E,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,UAAU,MAAM,SAAS,eAAe,eAAe;AAC7D,YAAM,MAAM,QAAQ,SAAS;AAAA,QAC3B,CAAC,MAAM,EAAE,SAAS,KAAK,QAAQ,EAAE,SAAS,KAAK;AAAA,MACjD;AACA,UAAI,MAAM,GAAG;AACX,cAAM,IAAI;AAAA,UACR,sBAAsB,KAAK,IAAI,cAAc,KAAK,IAAI;AAAA,QACxD;AAAA,MACF;AACA,YAAM,UAAU,EAAE,MAAM,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AACpE,cAAQ,SAAS,GAAG,IAAI;AACxB,YAAM,UAAU,eAAe,SAAS,eAAe;AACvD,aAAO,EAAE,MAAM,KAAK,MAAM,QAAQ,QAAQ;AAAA,IAC5C,CAAC;AAAA,EACH;AACF,CAAC;;;AC3DD,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAQlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,IAAM,eAAeA,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,OAAO;AACnB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,SAASA,IAAE,QAAQ;AAAA,EACnB,QAAQA,IAAE,MAAM,YAAY;AAAA,EAC5B,YAAYA,IAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAC3C,CAAC;AAKD,eAAe,aAAa,UAAkB,MAAgC;AAC5E,QAAME,OAAM,aAAa;AACzB,MAAI;AACF,UAAM,MAAM,MAAMA,KAAI,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,IAAI;AAAA,IACpB,CAAC;AACD,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eACb,QAC2D;AAC3D,QAAM,WAAW,qBAAqB,OAAO,IAAI;AACjD,MAAI,CAAC,UAAU;AAGb,WAAO,EAAE,MAAM,KAAK;AAAA,EACtB;AACA,QAAM,UAAU,MAAM,aAAa,UAAU,OAAO,IAAI;AACxD,MAAI,QAAS,QAAO,EAAE,MAAM,KAAK;AACjC,SAAO,EAAE,MAAM,OAAO,QAAQ,+BAA+B;AAC/D;AAEA,IAAM,gBAAgB,cAA4B;AAAA,EAChD,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgBE,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC5E,UAAM,QAAQ,KAAK,SAAS;AAC5B,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,YAAM,UAAU,MAAM,SAAS,eAAe,eAAe;AAC7D,YAAM,OAAsB,CAAC;AAC7B,YAAM,SAAgE,CAAC;AACvE,iBAAW,UAAU,QAAQ,UAAU;AACrC,cAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,YAAI,QAAQ,MAAM;AAChB,eAAK,KAAK,MAAM;AAAA,QAClB,OAAO;AACL,iBAAO,KAAK,EAAE,MAAM,OAAO,MAAM,MAAM,OAAO,MAAM,QAAQ,QAAQ,OAAO,CAAC;AAAA,QAC9E;AAAA,MACF;AACA,UAAI,SAAS,OAAO,SAAS,GAAG;AAC9B,gBAAQ,WAAW;AACnB,cAAM,UAAU,eAAe,SAAS,eAAe;AAAA,MACzD;AACA,aAAO;AAAA,QACL,MAAM,KAAK;AAAA,QACX,SAAS,SAAS,OAAO,SAAS;AAAA,QAClC;AAAA,QACA,YAAY,KAAK;AAAA,MACnB;AAAA,IACF,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAO,yBAAQ;;;ACxGf,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAalB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAM,eAAeA,IAAE,OAAO;AAAA,EAC5B,QAAQA,IAAE,OAAO,EAAE,IAAI;AAAA,EACvB,OAAOA,IAAE,OAAO;AAAA,EAChB,OAAOA,IAAE,OAAO;AAAA,EAChB,KAAKA,IAAE,OAAO;AAAA,EACd,QAAQA,IAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAED,IAAM,qBAAqBA,IAAE,OAAO;AAAA,EAClC,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,IAAE,QAAQ;AAAA,EACnB,iBAAiBA,IAAE,OAAO,EAAE,SAAS;AAAA,EACrC,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACjC,QAAQA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAClC,IAAI,aAAa,SAAS;AAAA,EAC1B,OAAOA,IAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,UAAUA,IAAE,MAAM,kBAAkB;AACtC,CAAC;AAaD,IAAM,kBAAkB;AAQxB,eAAe,cACb,OACA,aACA,QACc;AACd,QAAM,UAAe,IAAI,MAAM,MAAM,MAAM;AAC3C,MAAI,SAAS;AACb,iBAAe,OAAsB;AACnC,WAAO,MAAM;AACX,YAAM,IAAI;AACV,UAAI,KAAK,MAAM,OAAQ;AACvB,cAAQ,CAAC,IAAI,MAAM,OAAO,MAAM,CAAC,GAAI,CAAC;AAAA,IACxC;AAAA,EACF;AACA,QAAM,QAAQ,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,aAAa,MAAM,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC;AACtF,QAAM,QAAQ,IAAI,KAAK;AACvB,SAAO;AACT;AAEA,eAAe,mBAAmB,UAAkB,MAAgC;AAClF,QAAME,OAAM,aAAa;AACzB,MAAI;AACF,UAAM,MAAM,MAAMA,KAAI,OAAO,CAAC,MAAM,UAAU,aAAa,YAAY,cAAc,IAAI,EAAE,CAAC;AAC5F,WAAO,IAAI,SAAS;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,cAAc,UAAkB,MAAsC;AACnF,QAAMA,OAAM,aAAa;AACzB,MAAI;AACF,UAAM,MAAM,MAAMA,KAAI,OAAO,CAAC,MAAM,UAAU,OAAO,MAAM,gBAAgB,IAAI,CAAC;AAChF,QAAI,IAAI,SAAS,EAAG,QAAO;AAC3B,UAAM,QAAQ,IAAI,OAAO,KAAK;AAC9B,WAAO,MAAM,SAAS,IAAI,QAAQ;AAAA,EACpC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBAAkB,UAA0C;AACzE,QAAMA,OAAM,aAAa;AACzB,aAAW,aAAa,CAAC,QAAQ,QAAQ,GAAG;AAC1C,QAAI;AACF,YAAM,MAAM,MAAMA,KAAI,OAAO;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,uBAAuB,SAAS;AAAA,MAClC,CAAC;AACD,UAAI,IAAI,SAAS,EAAG,QAAO;AAAA,IAC7B,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,YACb,UACA,MAC0D;AAC1D,QAAM,OAAO,MAAM,kBAAkB,QAAQ;AAC7C,MAAI,CAAC,KAAM,QAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAC9C,QAAMA,OAAM,aAAa;AACzB,MAAI;AACF,UAAM,MAAM,MAAMA,KAAI,OAAO;AAAA,MAC3B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,IAAI,MAAM,IAAI;AAAA,IAC1B,CAAC;AACD,QAAI,IAAI,SAAS,EAAG,QAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAEvD,UAAM,QAAQ,IAAI,OAAO,KAAK,EAAE,MAAM,KAAK;AAC3C,QAAI,MAAM,WAAW,EAAG,QAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAC3D,UAAM,SAAS,OAAO,MAAM,CAAC,CAAC;AAC9B,UAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,QAAI,CAAC,OAAO,SAAS,MAAM,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AACvD,aAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,IACrC;AACA,WAAO,EAAE,OAAO,OAAO;AAAA,EACzB,QAAQ;AACN,WAAO,EAAE,OAAO,MAAM,QAAQ,KAAK;AAAA,EACrC;AACF;AAEA,eAAe,YAAY,SAAiB,MAAsC;AAChF,QAAM,KAAK,YAAY;AACvB,MAAI;AACF,UAAM,MAAM,MAAM,GAAG,MAAM;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,IAAI,SAAS,EAAG,QAAO;AAC3B,UAAM,SAAS,KAAK,MAAM,IAAI,MAAM;AAOpC,QAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,EAAG,QAAO;AAC1D,UAAM,QAAQ,OAAO,CAAC;AACtB,QACE,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,UAAU,YACvB,OAAO,MAAM,QAAQ,UACrB;AACA,aAAO;AAAA,IACT;AACA,UAAM,SAAS,gBAAgB,MAAM,qBAAqB,CAAC,CAAC;AAC5D,WAAO;AAAA,MACL,QAAQ,MAAM;AAAA,MACd,OAAO,MAAM;AAAA,MACb,OAAO,MAAM;AAAA,MACb,KAAK,MAAM;AAAA,MACX,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBACP,QACoB;AACpB,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO;AACX,MAAI,OAAO;AACX,MAAI,UAAU;AACd,aAAW,SAAS,QAAQ;AAC1B,UAAM,OAAO,MAAM,cAAc,MAAM,SAAS,IAAI,YAAY;AAChE,QAAI,QAAQ,UAAW;AAAA,aACd,QAAQ,aAAa,QAAQ,eAAe,QAAQ,YAAa;AAAA,QACrE;AAAA,EACP;AACA,MAAI,OAAO,EAAG,QAAO,SAAS,IAAI,IAAI,OAAO,MAAM;AACnD,MAAI,UAAU,EAAG,QAAO,YAAY,OAAO,IAAI,OAAO,MAAM;AAC5D,SAAO,SAAS,IAAI,IAAI,OAAO,MAAM;AACvC;AAEA,eAAe,gBAAgB,QAA4C;AACzE,QAAM,MAAoB;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,IACb,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,IAC3C,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,IAAI;AAAA,EACN;AAEA,QAAM,WAAW,qBAAqB,OAAO,IAAI;AAEjD,MAAI;AACF,QAAI,UAAU;AACZ,UAAI,UAAU,MAAM,mBAAmB,UAAU,OAAO,IAAI;AAC5D,UAAI,IAAI,SAAS;AACf,YAAI,kBAAkB,MAAM,cAAc,UAAU,OAAO,IAAI;AAC/D,cAAM,EAAE,OAAO,OAAO,IAAI,MAAM,YAAY,UAAU,OAAO,IAAI;AACjE,YAAI,QAAQ;AACZ,YAAI,SAAS;AAAA,MACf;AAAA,IACF;AAEA,UAAM,UAAU,MAAM,eAAe,OAAO,IAAI;AAChD,QAAI,SAAS;AACX,UAAI,KAAK,MAAM,YAAY,SAAS,OAAO,IAAI;AAAA,IACjD;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,QAAQ,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,EAC7D;AAEA,SAAO;AACT;AAEA,IAAM,iBAAiB,cAA4B;AAAA,EACjD,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,EACrB;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgBE,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,eAAe;AAC5E,UAAM,UAAU,MAAM;AAAA,MAAa,YAAY,KAAK,IAAI;AAAA,MAAG,MACzD,SAAS,eAAe,eAAe;AAAA,IACzC;AACA,UAAM,WAAW,MAAM;AAAA,MACrB,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACA,WAAO,EAAE,MAAM,KAAK,MAAM,SAAS;AAAA,EACrC;AACF,CAAC;AAED,IAAO,0BAAQ;;;ACpRf,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAMlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,KAAK,CAAC,MAAM,YAAY,WAAW,SAAS,CAAC;AAAA,EACrD,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAChD,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,UAAUA,IAAE,OAAO;AAAA,EACnB,MAAMA,IAAE,QAAQ,EAAE,SAAS;AAC7B,CAAC;AAWM,SAAS,aAAa,OAAuB;AAClD,QAAM,UAAU,MACb,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AACzB,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;AAEA,SAAS,eAAe,MAAoB;AAC1C,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK,MAAM;AACT,UAAI,KAAK,cAAc,QAAW;AAChC,cAAM,IAAI,gBAAgB,yCAAyC;AAAA,MACrE;AACA,UAAI,CAAC,KAAK,OAAO;AACf,cAAM,IAAI,gBAAgB,qCAAqC;AAAA,MACjE;AACA,aAAO,MAAM,KAAK,SAAS,IAAI,aAAa,KAAK,KAAK,CAAC;AAAA,IACzD;AAAA,IACA,KAAK,YAAY;AACf,UAAI,CAAC,KAAK,OAAO;AACf,cAAM,IAAI,gBAAgB,2CAA2C;AAAA,MACvE;AACA,aAAO,YAAY,aAAa,KAAK,KAAK,CAAC;AAAA,IAC7C;AAAA,IACA,KAAK,WAAW;AACd,UAAI,CAAC,KAAK,OAAO;AACf,cAAM,IAAI,gBAAgB,0CAA0C;AAAA,MACtE;AACA,YAAM,OAAO,KAAK,QAAQ,MAAM;AAChC,aAAO,GAAG,IAAI,IAAI,aAAa,KAAK,KAAK,CAAC;AAAA,IAC5C;AAAA,IACA,KAAK,WAAW;AACd,UAAI,CAAC,KAAK,OAAO;AACf,cAAM,IAAI,gBAAgB,0CAA0C;AAAA,MACtE;AACA,aAAO,GAAG,aAAa,KAAK,KAAK,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAEA,eAAe,WAAW,GAA6B;AACrD,MAAI;AACF,UAAME,KAAG,OAAO,CAAC;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,SAAS,KAAa,MAA6B;AAChE,MAAI;AACF,UAAMA,KAAG,OAAO,KAAK,IAAI;AAAA,EAC3B,SAAS,KAAK;AACZ,UAAM,OAAQ,IAA8B;AAC5C,QAAI,SAAS,SAAS;AACpB,YAAMA,KAAG,SAAS,KAAK,IAAI;AAC3B,YAAMA,KAAG,OAAO,GAAG;AACnB;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,IAAO,qBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,MAAM;AAAA,IAC3B,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,EAAE,MAAM,WAAW,aAAa,wCAAwC;AAAA,MAC/E,OAAO,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MACjE,WAAW,EAAE,MAAM,eAAe,aAAa,wBAAwB;AAAA,MACvE,MAAM,EAAE,MAAM,UAAU,aAAa,mCAAmC;AAAA,MACxE,OAAO,EAAE,MAAM,WAAW,aAAa,6BAA6B;AAAA,IACtE;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,aAAaE,OAAK,QAAQ,KAAK,IAAI;AACzC,QAAI,CAAE,MAAM,WAAW,UAAU,GAAI;AACnC,YAAM,IAAI,cAAc,0BAA0B,UAAU,EAAE;AAAA,IAChE;AAEA,UAAM,WAAW,eAAe,IAAI;AACpC,UAAM,aAAaA,OAAK,KAAK,iBAAiB,KAAK,IAAI,GAAG,SAAS;AACnE,UAAM,aAAaA,OAAK,KAAK,YAAY,QAAQ;AAEjD,QAAIA,OAAK,QAAQ,UAAU,MAAMA,OAAK,QAAQ,UAAU,GAAG;AACzD,aAAO,EAAE,UAAU,YAAY,MAAM,KAAK;AAAA,IAC5C;AAEA,UAAMD,KAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAE9C,QAAK,MAAM,WAAW,UAAU,KAAM,CAAC,KAAK,OAAO;AACjD,YAAM,IAAI;AAAA,QACR,0BAA0B,UAAU;AAAA,MACtC;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,UAAU;AACrC,WAAO,EAAE,UAAU,WAAW;AAAA,EAChC;AACF,CAAC;;;AC/ID,OAAOE,YAAU;AACjB,SAAS,YAAYC,YAAU;AAE/B,SAAS,KAAAC,WAAS;AAMlB,IAAM,aAAaC,IAAE,OAAO,CAAC,CAAC,EAAE,OAAO;AAEvC,IAAM,0BAA0BA,IAAE,OAAO;AAAA,EACvC,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAAA,EAChB,OAAOA,IAAE,KAAK,CAAC,WAAW,cAAc,UAAU,MAAM,CAAC;AAAA,EACzD,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,SAASA,IAAE,OAAO;AAAA,EAClB,aAAaA,IAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAED,IAAM,mBAAmBA,IAAE,OAAO;AAAA,EAChC,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAClB,CAAC;AAED,IAAM,iBAAiBA,IAAE,OAAO;AAAA,EAC9B,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAC3B,CAAC;AAED,IAAM,eAAeA,IAAE,OAAO;AAAA,EAC5B,aAAaA,IAAE,MAAM,uBAAuB;AAAA,EAC5C,cAAcA,IAAE,MAAM,gBAAgB;AAAA,EACtC,oBAAoBA,IAAE,MAAM,cAAc;AAC5C,CAAC;AAGD,IAAM,cAAyD;AAAA,EAC7D,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AACR;AAiBA,eAAsB,gBAAgB,YAAyC;AAC7E,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,EAChE,QAAQ;AACN,WAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACnC;AAEA,QAAM,UAAuB,CAAC;AAC9B,QAAM,SAAsB,CAAC;AAE7B,aAAW,UAAU,SAAS;AAC5B,QAAI,CAAC,OAAO,YAAY,EAAG;AAC3B,QAAI,OAAO,KAAK,WAAW,GAAG,EAAG;AACjC,UAAM,OAAO,OAAO;AACpB,UAAM,YAAYC,OAAK,KAAK,YAAY,MAAM,UAAU;AACxD,QAAI;AACF,YAAMD,KAAG,OAAO,SAAS;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,QAAI;AACF,YAAM,EAAE,YAAY,IAAI,MAAM;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AACA,cAAQ,KAAK,EAAE,MAAM,YAAY,CAAC;AAAA,IACpC,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,aAAO,KAAK,EAAE,MAAM,OAAO,QAAQ,CAAC;AAAA,IACtC;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,SAAS,wBACP,SAC0C;AAC1C,QAAM,SAAS,oBAAI,IAAyB;AAC5C,aAAW,EAAE,MAAM,YAAY,KAAK,SAAS;AAC3C,UAAM,YAAY,YAAY;AAC9B,QAAI,CAAC,UAAW;AAChB,eAAW,SAAS,OAAO,OAAO,SAAS,GAAG;AAC5C,YAAM,WAAWC,OAAK,QAAQ,YAAY,MAAM,IAAI,CAAC;AACrD,UAAI,SAAS,OAAO,IAAI,QAAQ;AAChC,UAAI,CAAC,QAAQ;AACX,iBAAS,oBAAI,IAAI;AACjB,eAAO,IAAI,UAAU,MAAM;AAAA,MAC7B;AACA,aAAO,IAAI,IAAI;AAAA,IACjB;AAAA,EACF;AACA,QAAM,YAAsD,CAAC;AAC7D,aAAW,CAAC,UAAU,KAAK,KAAK,QAAQ;AACtC,QAAI,MAAM,OAAO,GAAG;AAClB,gBAAU,KAAK,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC;AAAA,IAC7D;AAAA,EACF;AACA,YAAU,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACrD,SAAO;AACT;AAEA,SAAS,mBACP,GACA,GACQ;AACR,QAAM,QAAQ,EAAE,YAAY,QAAQ,OAAO;AAC3C,QAAM,QAAQ,EAAE,YAAY,QAAQ,OAAO;AAC3C,MAAI,UAAU,MAAO,QAAO,QAAQ;AACpC,QAAM,SAAS,YAAY,EAAE,YAAY,KAAK;AAC9C,QAAM,SAAS,YAAY,EAAE,YAAY,KAAK;AAC9C,MAAI,WAAW,OAAQ,QAAO,SAAS;AACvC,SAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AACpC;AAEA,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK,CAAC;AAAA,EACN,MAAM,MAAM;AACV,UAAM,aAAa,cAAc;AACjC,UAAM,EAAE,SAAS,OAAO,IAAI,MAAM,gBAAgB,UAAU;AAC5D,UAAM,cAAc,CAAC,GAAG,OAAO,EAC5B,KAAK,kBAAkB,EACvB,IAAI,CAAC,EAAE,MAAM,YAAY,OAAO;AAAA,MAC/B;AAAA,MACA,OAAO,YAAY;AAAA,MACnB,OAAO,YAAY;AAAA,MACnB,GAAI,YAAY,SAAS,SAAY,EAAE,MAAM,YAAY,KAAK,IAAI,CAAC;AAAA,MACnE,SAAS,YAAY;AAAA,MACrB,GAAI,YAAY,gBAAgB,SAC5B,EAAE,aAAa,YAAY,YAAY,IACvC,CAAC;AAAA,IACP,EAAE;AACJ,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,MACd,oBAAoB,wBAAwB,OAAO;AAAA,IACrD;AAAA,EACF;AACF,CAAC;;;ACnKD,SAAS,KAAAC,WAAS;AAMlB,IAAMC,cAAaC,IAAE,OAAO,CAAC,CAAC,EAAE,OAAO;AAEvC,IAAM,aAAaA,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAAA,EAChB,OAAOA,IAAE,KAAK,CAAC,WAAW,cAAc,UAAU,MAAM,CAAC;AAAA,EACzD,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3C,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,EAClC,SAASA,IAAE,OAAO;AACpB,CAAC;AAED,IAAM,gBAAgBA,IAAE,OAAO;AAAA,EAC7B,SAASA,IAAE,OAAO;AAAA,EAClB,OAAOA,IAAE,MAAM,UAAU;AAC3B,CAAC;AAED,IAAMC,oBAAmBD,IAAE,OAAO;AAAA,EAChC,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAClB,CAAC;AAED,IAAME,gBAAeF,IAAE,OAAO;AAAA,EAC5B,UAAUA,IAAE,MAAM,aAAa;AAAA,EAC/B,cAAcA,IAAE,MAAMC,iBAAgB;AACxC,CAAC;AAYD,SAAS,OAAO,MAAc,IAA4B;AACxD,SAAO;AAAA,IACL;AAAA,IACA,OAAO,GAAG;AAAA,IACV,OAAO,GAAG;AAAA,IACV,GAAI,GAAG,SAAS,SAAY,EAAE,MAAM,GAAG,KAAK,IAAI,CAAC;AAAA,IACjD,GAAI,GAAG,gBAAgB,SAAY,EAAE,aAAa,GAAG,YAAY,IAAI,CAAC;AAAA,IACtE,GAAI,GAAG,iBAAiB,SAAY,EAAE,cAAc,GAAG,aAAa,IAAI,CAAC;AAAA,IACzE,SAAS,GAAG;AAAA,EACd;AACF;AAEA,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMF;AAAA,EACN,QAAQG;AAAA,EACR,KAAK;AAAA,IACH,OAAO;AAAA,EACT;AAAA,EACA,MAAM,MAAM;AACV,UAAM,aAAa,cAAc;AACjC,UAAM,EAAE,SAAS,OAAO,IAAI,MAAM,gBAAgB,UAAU;AAE5D,UAAM,UAAkB,CAAC;AACzB,UAAM,aAAqB,CAAC;AAC5B,UAAM,SAAiB,CAAC;AACxB,UAAM,OAAe,CAAC;AAEtB,eAAW,EAAE,MAAM,YAAY,KAAK,SAAS;AAC3C,YAAM,OAAO,OAAO,MAAM,WAAW;AACrC,cAAQ,YAAY,OAAO;AAAA,QACzB,KAAK;AACH,kBAAQ,KAAK,IAAI;AACjB;AAAA,QACF,KAAK;AACH,qBAAW,KAAK,IAAI;AACpB;AAAA,QACF,KAAK;AACH,iBAAO,KAAK,IAAI;AAChB;AAAA,QACF,KAAK;AACH,eAAK,KAAK,IAAI;AACd;AAAA,MACJ;AAAA,IACF;AAEA,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,QAAQ,EAAE,QAAQ,OAAO;AAC/B,YAAM,QAAQ,EAAE,QAAQ,OAAO;AAC/B,UAAI,UAAU,MAAO,QAAO,QAAQ;AACpC,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AACD,eAAW,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AACtD,WAAO,KAAK,CAAC,GAAG,MAAM;AACpB,YAAM,UAAU,EAAE,gBAAgB;AAClC,YAAM,UAAU,EAAE,gBAAgB;AAClC,UAAI,YAAY,QAAS,QAAO,QAAQ,cAAc,OAAO;AAC7D,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AACD,SAAK,KAAK,CAAC,GAAG,MAAM;AAClB,UAAI,EAAE,YAAY,EAAE,QAAS,QAAO,EAAE,QAAQ,cAAc,EAAE,OAAO;AACrE,aAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,MACL,UAAU;AAAA,QACR,EAAE,SAAS,WAAW,OAAO,QAAQ;AAAA,QACrC,EAAE,SAAS,cAAc,OAAO,WAAW;AAAA,QAC3C,EAAE,SAAS,UAAU,OAAO,OAAO;AAAA,QACnC,EAAE,SAAS,QAAQ,OAAO,KAAK;AAAA,MACjC;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,EACF;AACF,CAAC;;;ACvHD,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AASlB,IAAMC,cAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,SAASA,IAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,gBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAAA,EAChB,MAAMA,IAAE,OAAO;AAAA,EACf,SAASA,IAAE,QAAQ;AACrB,CAAC;AAED,IAAM,gBAAgB;AAEtB,IAAO,uBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,MAAM;AAAA,IAC3B,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa,4BAA4B,aAAa;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,YAAYC,OAAK,KAAK,cAAc,GAAG,KAAK,MAAM,UAAU;AAClE,WAAO,aAAa,YAAY,KAAK,IAAI,GAAG,YAAY;AACtD,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,SAAC,EAAE,aAAa,KAAK,IAAI,MAAM;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,IAAI,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC5E;AAEA,YAAM,WAAW,YAAY,aAAa,CAAC;AAG3C,YAAM,YAAY,OAAO,KAAK,QAAQ,EAAE,KAAK,CAAC,SAAS,SAAS,KAAK;AACrE,YAAM,aAAa,SAAS,KAAK,GAAG,YAAY;AAChD,YAAM,cAAc,KAAK,YAAY,QAAQ,CAAC,aAAa;AAE3D,YAAM,gBAA4D,CAAC;AACnE,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACpD,cAAM,OAAO,EAAE,GAAG,MAAM;AACxB,eAAO,KAAK;AAEZ,YAAI,eAAe,SAAS,OAAO;AACjC,wBAAc,IAAI,IAAI;AAAA,QACxB,OAAO;AACL,wBAAc,IAAI,IAAI;AAAA,QACxB;AAAA,MACF;AACA,oBAAc,KAAK,IAAI;AAAA,QACrB,MAAM,KAAK;AAAA,QACX,GAAI,cAAc,EAAE,SAAS,KAAK,IAAI,CAAC;AAAA,MACzC;AAEA,YAAM,OAAO;AAAA,QACX,GAAG;AAAA,QACH,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,MACjB;AACA,YAAM,iBAAiB,WAAW,MAAM,MAAM,sBAAsB;AACpE,aAAO,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,MAAM,SAAS,YAAY;AAAA,IACzE,CAAC;AAAA,EACH;AACF,CAAC;;;AC7FD,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AASlB,IAAMC,cAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,IAAI,CAAC;AACzB,CAAC;AAED,IAAMC,gBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,eAAeA,IAAE,OAAO;AAC1B,CAAC;AAED,IAAO,+BAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,OAAO;AAAA,EAC9B;AAAA,EACA,MAAM,IAAI,EAAE,MAAM,MAAM,GAAG;AACzB,UAAM,YAAYC,OAAK,KAAK,cAAc,GAAG,MAAM,UAAU;AAC7D,WAAO,aAAa,YAAY,IAAI,GAAG,YAAY;AACjD,UAAI;AACJ,UAAI;AACJ,UAAI;AACF,SAAC,EAAE,aAAa,KAAK,IAAI,MAAM;AAAA,UAC7B;AAAA,UACA;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,IAAI,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,MAC5E;AACA,YAAM,YAAY,YAAY;AAC9B,UAAI,CAAC,aAAa,CAAC,OAAO,UAAU,eAAe,KAAK,WAAW,KAAK,GAAG;AACzE,cAAM,IAAI;AAAA,UACR,mBAAmB,KAAK,6BAA6B,IAAI;AAAA,QAC3D;AAAA,MACF;AACA,YAAM,gBAA+C,CAAC;AACtD,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACrD,cAAM,OAAO,EAAE,GAAG,MAAM;AACxB,eAAO,KAAK;AACZ,YAAI,SAAS,OAAO;AAClB,wBAAc,IAAI,IAAI,EAAE,GAAG,MAAM,SAAS,KAAK;AAAA,QACjD,OAAO;AACL,wBAAc,IAAI,IAAI;AAAA,QACxB;AAAA,MACF;AACA,YAAM,OAAO;AAAA,QACX,GAAG;AAAA,QACH,WAAW;AAAA,QACX,SAAS,MAAM;AAAA,MACjB;AACA,YAAM,iBAAiB,WAAW,MAAM,MAAM,sBAAsB;AACpE,aAAO,EAAE,MAAM,eAAe,MAAM;AAAA,IACtC,CAAC;AAAA,EACH;AACF,CAAC;;;ACnED,SAAS,KAAAC,WAAS;;;ACAlB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;;;ACDjB,SAAS,aAAa;AA4BtB,IAAM,qBAAqB;AAEpB,IAAM,aAAyB,CAAC,KAAK,MAAM,OAAO,CAAC,MAAM;AAC9D,SAAO,IAAI,QAAuB,CAAC,SAAS,WAAW;AACrD,UAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,MAC7B,KAAK,KAAK;AAAA,MACV,KAAK,KAAK,OAAO,QAAQ;AAAA,MACzB,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,IAClC,CAAC;AACD,UAAM,eAAyB,CAAC;AAChC,UAAM,eAAyB,CAAC;AAChC,QAAI,UAAU;AAEd,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,QAAS;AACb,gBAAU;AACV,YAAM,KAAK,SAAS;AACpB,aAAO,IAAI,MAAM,GAAG,GAAG,oBAAoB,KAAK,aAAa,kBAAkB,IAAI,CAAC;AAAA,IACtF,GAAG,KAAK,aAAa,kBAAkB;AAEvC,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACpE,UAAM,QAAQ,GAAG,QAAQ,CAAC,UAAkB,aAAa,KAAK,KAAK,CAAC;AACpE,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,aAAO,GAAG;AAAA,IACZ,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,cAAQ;AAAA,QACN;AAAA,QACA,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAAA,QACnD,QAAQ,OAAO,OAAO,YAAY,EAAE,SAAS,MAAM;AAAA,MACrD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;;;AC3CA,eAAsB,eACpB,OACA,MAAkB,YACa;AAC/B,QAAM,OAAuB,CAAC;AAC9B,QAAM,SAAiC,CAAC;AAExC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,MAAM,IAAI;AAC3B,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,MAAM;AAAA,QAC7B;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,OAAO,SAAS,GAAG;AACrB,eAAO,KAAK;AAAA,UACV,QAAQ;AAAA,UACR,OAAO,OAAO,OAAO,KAAK,KAAK,uBAAuB,OAAO,IAAI;AAAA,QACnE,CAAC;AACD;AAAA,MACF;AACA,YAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AACvC,iBAAW,MAAM,QAAQ;AACvB,aAAK,KAAK;AAAA,UACR,QAAQ;AAAA,UACR,KAAK,GAAG;AAAA,UACR,QAAQ,GAAG,GAAG,UAAU,aAAa,EAAE,IAAI,GAAG,MAAM,IAAI,GAAG,KAAK;AAAA,UAChE,UAAU;AAAA,YACR;AAAA,YACA,QAAQ,GAAG;AAAA,YACX,OAAO,GAAG;AAAA,YACV,SAAS,GAAG;AAAA,YACZ,aAAa,GAAG;AAAA,YAChB,WAAW,GAAG;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,QAAQ;AAAA,QACR,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;;;AChFA,OAAOC,YAAU;AAejB,IAAM,eAAe;AAErB,eAAsB,YACpB,WACA,MAAkB,YACU;AAC5B,QAAM,OAAuB,CAAC;AAC9B,QAAM,SAAiC,CAAC;AAExC,aAAW,YAAY,WAAW;AAChC,UAAM,WAAWC,OAAK,SAAS,QAAQ;AACvC,UAAM,gBAAgB,UAAU,UAAU,MAAM,QAAQ,GAAG;AAC3D,UAAM,iBAAiB,UAAU,UAAU,MAAM,QAAQ,GAAG;AAC5D,UAAM,eAAe,UAAU,UAAU,MAAM,QAAQ,GAAG;AAAA,EAC5D;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,eAAe,gBACb,UACA,UACA,MACA,QACA,KACe;AACf,QAAM,WAAW,UAAU,QAAQ;AACnC,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,OAAO;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,YAAY;AAAA,MACvB;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,OAAO,QAAQ,OAAO,IAAI,EAAE,CAAC;AAC3E;AAAA,IACF;AACA,eAAW,QAAQ,WAAW,OAAO,MAAM,GAAG;AAC5C,YAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,KAAK,MAAM,GAAG;AAC5C,UAAI,CAAC,KAAM;AACX,YAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,WAAK,KAAK;AAAA,QACR,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,QAAQ,GAAG,IAAI,MAAM,QAAQ,EAAE,WAAM,OAAO;AAAA,QAC5C,UAAU,EAAE,MAAM,UAAU,UAAU,MAAM,MAAM,QAAQ;AAAA,MAC5D,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,EACtD;AACF;AAEA,eAAe,iBACb,UACA,UACA,MACA,QACA,KACe;AACf,QAAM,WAAW,YAAY,QAAQ;AACrC,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,UAAU,YAAY,QAAQ,aAAa,CAAC;AACnF,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,OAAO,QAAQ,OAAO,IAAI,EAAE,CAAC;AAC3E;AAAA,IACF;AACA,eAAW,SAAS,uBAAuB,OAAO,MAAM,GAAG;AAEzD,UAAI,MAAM,QAAQ,MAAM,SAAS,YAAY,MAAM,QAAQ;AACzD,aAAK,KAAK;AAAA,UACR,QAAQ;AAAA,UACR,KAAK,MAAM;AAAA,UACX,QAAQ,YAAY,MAAM,IAAI,OAAO,MAAM,MAAM;AAAA,UACjD,UAAU,EAAE,MAAM,UAAU,UAAU,GAAG,MAAM;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,EACtD;AACF;AAEA,eAAe,eACb,UACA,UACA,MACA,QACA,KACe;AACf,QAAM,WAAW,SAAS,QAAQ;AAClC,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,UAAU,SAAS,MAAM,CAAC;AACjE,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,OAAO,QAAQ,OAAO,IAAI,EAAE,CAAC;AAC3E;AAAA,IACF;AACA,eAAW,QAAQ,WAAW,OAAO,MAAM,GAAG;AAE5C,YAAM,WAAW,KAAK,MAAM,2BAA2B;AACvD,UAAI,CAAC,SAAU;AACf,YAAM,CAAC,EAAE,KAAK,OAAO,IAAI;AACzB,WAAK,KAAK;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,QAAQ,WAAW;AAAA,QACnB,UAAU,EAAE,MAAM,UAAU,UAAU,KAAK,QAAQ;AAAA,MACrD,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,KAAK,EAAE,QAAQ,UAAU,OAAO,OAAO,GAAG,EAAE,CAAC;AAAA,EACtD;AACF;AAQA,SAAS,uBAAuB,QAAiC;AAC/D,QAAM,UAA2B,CAAC;AAClC,MAAI,UAAyB,CAAC;AAC9B,aAAW,WAAW,OAAO,MAAM,IAAI,GAAG;AACxC,UAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAI,SAAS,IAAI;AACf,UAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,SAAQ,KAAK,OAAO;AACzD,gBAAU,CAAC;AACX;AAAA,IACF;AACA,QAAI,KAAK,WAAW,WAAW,EAAG,SAAQ,OAAO,KAAK,MAAM,YAAY,MAAM;AAAA,aACrE,KAAK,WAAW,OAAO,EAAG,SAAQ,OAAO,KAAK,MAAM,QAAQ,MAAM;AAAA,aAClE,KAAK,WAAW,SAAS,GAAG;AACnC,YAAM,MAAM,KAAK,MAAM,UAAU,MAAM;AACvC,cAAQ,SAAS,IAAI,QAAQ,kBAAkB,EAAE;AAAA,IACnD;AAAA,EACF;AACA,MAAI,OAAO,KAAK,OAAO,EAAE,SAAS,EAAG,SAAQ,KAAK,OAAO;AACzD,SAAO;AACT;AAEA,SAAS,WAAW,GAAqB;AACvC,SAAO,EACJ,MAAM,IAAI,EACV,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EACtB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAC/B;AAEA,SAAS,OAAO,QAAgB,MAA6B;AAC3D,SAAO,OAAO,KAAK,KAAK,wBAAwB,IAAI;AACtD;AAEA,SAAS,OAAO,KAAsB;AACpC,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;;;AC7KA,SAAS,YAAYC,YAAuB;AAC5C,OAAOC,YAAU;AAejB,IAAM,aAAa,KAAK,KAAK,KAAK;AAClC,IAAM,wBAAwB;AAE9B,eAAsB,iBACpB,cACiC;AACjC,QAAM,OAAuB,CAAC;AAC9B,QAAM,SAAiC,CAAC;AAExC,MAAI,CAAC,aAAc,QAAO,EAAE,MAAM,OAAO;AAEzC,QAAM,WAAWC,OAAK,QAAQ,YAAY,YAAY,CAAC;AACvD,MAAI;AACJ,MAAI;AACF,cAAU,MAAMC,KAAG,QAAQ,UAAU,EAAE,eAAe,KAAK,CAAC;AAAA,EAC9D,SAAS,KAAK;AACZ,WAAO,KAAK;AAAA,MACV,QAAQ;AAAA,MACR,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,IACxD,CAAC;AACD,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,QAAM,MAAM,KAAK,IAAI;AACrB,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,QAAI,MAAM,KAAK,WAAW,GAAG,EAAG;AAChC,QAAI,MAAM,SAAS,SAAU;AAE7B,UAAM,WAAWD,OAAK,KAAK,UAAU,MAAM,IAAI;AAC/C,QAAI,UAAU;AACd,QAAI;AACF,YAAM,OAAO,MAAMC,KAAG,KAAK,QAAQ;AACnC,gBAAU,KAAK;AAAA,IACjB,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,QAAQ,YAAY,MAAM,IAAI;AAAA,QAC9B,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AACD;AAAA,IACF;AACA,UAAM,WAAW,MAAM,WAAW;AAClC,UAAM,UACJ,WAAW,wBACP,aAAa,qBAAqB,UAClC;AACN,SAAK,KAAK;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,MAAM;AAAA,MACX,QAAQ,GAAG,MAAM,IAAI,KAAK,OAAO;AAAA,MACjC,UAAU;AAAA,QACR,MAAM,MAAM;AAAA,QACZ,MAAM;AAAA,QACN,OAAO,IAAI,KAAK,OAAO,EAAE,YAAY;AAAA,QACrC,SAAS,KAAK,MAAM,OAAO;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;;;AC7EA,SAAS,YAAYC,YAAuB;AAC5C,OAAOC,SAAQ;AACf,OAAOC,YAAU;AA0BjB,IAAM,iBAAiB;AACvB,IAAM,4BAA4B;AAElC,eAAsB,yBAAwD;AAC5E,QAAM,OACJ,QAAQ,IAAI,wBAAwBA,OAAK,KAAKD,IAAG,QAAQ,GAAG,WAAW,UAAU;AACnF,QAAM,OAAuB,CAAC;AAC9B,QAAM,SAAiC,CAAC;AAExC,MAAI;AACJ,MAAI;AACF,kBAAc,MAAMD,KAAG,QAAQ,MAAM,EAAE,eAAe,KAAK,CAAC;AAAA,EAC9D,SAAS,KAAK;AAEZ,UAAM,IAAI;AACV,QAAI,EAAE,SAAS,SAAU,QAAO,EAAE,MAAM,OAAO;AAC/C,WAAO,KAAK,EAAE,QAAQ,kBAAkB,OAAO,EAAE,WAAW,OAAO,GAAG,EAAE,CAAC;AACzE,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,QAAM,QAAQ,oBAAI,IAA0B;AAE5C,aAAW,OAAO,aAAa;AAC7B,QAAI,CAAC,IAAI,YAAY,EAAG;AACxB,UAAM,UAAUE,OAAK,KAAK,MAAM,IAAI,IAAI;AACxC,QAAI;AACJ,QAAI;AACF,cAAQ,MAAMF,KAAG,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC3D,SAAS,KAAK;AACZ,aAAO,KAAK;AAAA,QACV,QAAQ,kBAAkB,IAAI,IAAI;AAAA,QAClC,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,MACxD,CAAC;AACD;AAAA,IACF;AACA,eAAW,QAAQ,OAAO;AACxB,UAAI,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK,SAAS,QAAQ,EAAG;AACrD,YAAM,WAAWE,OAAK,KAAK,SAAS,KAAK,IAAI;AAC7C,UAAI;AACF,cAAM,iBAAiB,UAAU,KAAK;AAAA,MACxC,SAAS,KAAK;AACZ,eAAO,KAAK;AAAA,UACV,QAAQ,kBAAkB,KAAK,IAAI;AAAA,UACnC,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAAA,QACxD,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,aAAW,OAAO,MAAM,OAAO,GAAG;AAChC,SAAK,KAAK;AAAA,MACR,QAAQ;AAAA,MACR,KAAK,IAAI;AAAA,MACT,QAAQ,GAAG,IAAI,YAAY,kBAAkB,IAAI,GAAG,GAClD,IAAI,UAAU,WAAM,IAAI,OAAO,KAAK,EACtC;AAAA,MACA,UAAU;AAAA,QACR,KAAK,IAAI;AAAA,QACT,cAAc,IAAI;AAAA,QAClB,WAAW,IAAI,KAAK,IAAI,WAAW,EAAE,YAAY;AAAA,QACjD,eAAe,IAAI;AAAA,QACnB,SAAS,IAAI;AAAA,MACf;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,eAAe,iBACb,UACA,OACe;AACf,QAAM,OAAO,MAAMF,KAAG,KAAK,QAAQ;AAEnC,QAAM,MAAM,MAAMA,KAAG,SAAS,UAAU,MAAM;AAC9C,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,MAAM,GAAG,cAAc;AAErD,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAM;AACX,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,UAAU,OAAO,WAAW,SAAU;AAC3C,UAAM,MAAM;AACZ,QAAI,CAAC,OAAO,OAAO,IAAI,QAAQ,YAAY,IAAI,IAAI,SAAS,GAAG;AAC7D,YAAM,IAAI;AAAA,IACZ;AACA,QAAI,CAAC,kBAAkB;AACrB,YAAM,OAAO,uBAAuB,GAAG;AACvC,UAAI,KAAM,oBAAmB;AAAA,IAC/B;AACA,UAAM,UAAU,yBAAyB,GAAG;AAC5C,QAAI,QAAS,yBAAwB;AAAA,EACvC;AAEA,MAAI,CAAC,IAAK;AACV,QAAM,UAAU,wBACZ,GAAG,yBAAyB,GAAGG,UAAS,uBAAuB,GAAG,CAAC,KACnE,mBACEA,UAAS,kBAAkB,GAAG,IAC9B;AACN,QAAM,YAAYD,OAAK,SAAS,UAAU,QAAQ;AAElD,QAAM,WAAW,MAAM,IAAI,GAAG;AAC9B,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,KAAK;AAAA,MACb;AAAA,MACA,cAAc;AAAA,MACd,aAAa,KAAK;AAAA,MAClB;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AACD;AAAA,EACF;AACA,WAAS,gBAAgB;AACzB,MAAI,KAAK,UAAU,SAAS,aAAa;AACvC,aAAS,cAAc,KAAK;AAC5B,aAAS,gBAAgB;AACzB,QAAI,QAAS,UAAS,UAAU;AAAA,EAClC,WAAW,CAAC,SAAS,WAAW,SAAS;AACvC,aAAS,UAAU;AAAA,EACrB;AACF;AAEA,SAAS,uBAAuB,KAAkD;AAChF,MAAI,IAAI,SAAS,OAAQ,QAAO;AAChC,QAAM,UAAU,IAAI;AACpB,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,UAAW,QAAoC;AACrD,MAAI,OAAO,YAAY,SAAU,QAAO,QAAQ,KAAK,KAAK;AAC1D,MAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,eAAW,SAAS,SAAS;AAC3B,UACE,SACA,OAAO,UAAU,YAChB,MAAkC,SAAS,UAC5C,OAAQ,MAAkC,SAAS,UACnD;AACA,cAAM,OAAS,MAAkC,KAAgB,KAAK;AACtE,YAAI,KAAM,QAAO;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,yBAAyB,KAAkD;AAClF,MAAI,IAAI,SAAS,UAAW,QAAO;AACnC,MAAI,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,KAAK,EAAE,SAAS,GAAG;AACpE,WAAO,IAAI,QAAQ,KAAK;AAAA,EAC1B;AACA,SAAO;AACT;AAEA,SAASC,UAAS,GAAW,KAAqB;AAChD,QAAM,UAAU,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAC5C,SAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,MAAM,CAAC,CAAC,WAAM;AAClE;;;AL5KA,eAAsB,aAAa,QAAmD;AACpF,QAAM,UAA0B,CAAC;AACjC,QAAM,YAAoC,CAAC;AAE3C,QAAM,cAAc,OAAO,gBAAgB,CAAC;AAC5C,QAAM,aAAa,OAAO,eAAe,CAAC;AAC1C,QAAM,eAAe,OAAO,iBAAiB;AAE7C,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,IAAI,MAAM,eAAe,WAAW;AAC1C,YAAQ,KAAK,GAAG,EAAE,IAAI;AACtB,cAAU,KAAK,GAAG,EAAE,MAAM;AAAA,EAC5B;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,IAAI,MAAM,YAAY,UAAU;AACtC,YAAQ,KAAK,GAAG,EAAE,IAAI;AACtB,cAAU,KAAK,GAAG,EAAE,MAAM;AAAA,EAC5B;AACA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,IAAI,MAAM,iBAAiB,YAAY;AAC7C,YAAQ,KAAK,GAAG,EAAE,IAAI;AACtB,cAAU,KAAK,GAAG,EAAE,MAAM;AAAA,EAC5B;AAEA,QAAM,SAAS,MAAM,uBAAuB;AAC5C,UAAQ,KAAK,GAAG,OAAO,IAAI;AAC3B,YAAU,KAAK,GAAG,OAAO,MAAM;AAE/B,QAAM,aAAa,cAAc;AACjC,QAAM,QAAQ,MAAM,UAAU,UAAU;AACxC,QAAM,aAAa,MAAM,gBAAgB,UAAU;AAEnD,QAAM,WAA2B,CAAC;AAClC,aAAW,OAAO,SAAS;AACzB,QAAI,WAAW,IAAI,IAAI,GAAG,EAAG;AAC7B,UAAM,QAAQ,UAAU,KAAK,KAAK;AAClC,QAAI,OAAO;AACT,UAAI,aAAa;AACjB,UAAI,YAAY;AAAA,IAClB,OAAO;AACL,UAAI,YAAY;AAAA,IAClB;AACA,aAAS,KAAK,GAAG;AAAA,EACnB;AAEA,SAAO,EAAE,MAAM,UAAU,QAAQ,UAAU;AAC7C;AAEA,eAAe,UAAU,YAAuC;AAC9D,MAAI;AACF,UAAM,UAAU,MAAMC,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,WAAO,QACJ,OAAO,CAAC,MAAM,EAAE,YAAY,KAAK,CAAC,EAAE,KAAK,WAAW,GAAG,CAAC,EACxD,IAAI,CAAC,MAAM,EAAE,IAAI;AAAA,EACtB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,gBAAgB,YAA0C;AACvE,QAAM,UAAUC,OAAK,KAAK,YAAY,cAAc;AACpD,QAAM,OAAO,oBAAI,IAAY;AAC7B,MAAI;AACF,UAAM,MAAM,MAAMD,KAAG,SAAS,SAAS,MAAM;AAC7C,eAAW,QAAQ,IAAI,MAAM,IAAI,GAAG;AAClC,UAAI,CAAC,KAAK,KAAK,EAAG;AAClB,YAAM,QAAQ,KAAK,MAAM,GAAI;AAE7B,YAAM,MAAM,MAAM,CAAC;AACnB,UAAI,IAAK,MAAK,IAAI,GAAG;AAAA,IACvB;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,UAAU,KAAmB,OAAqC;AACzE,QAAM,YAAsB,CAAC,IAAI,IAAI,YAAY,CAAC;AAClD,QAAM,MAAM,IAAI,UAAU;AAC1B,MAAI,OAAO,QAAQ,SAAU,WAAU,KAAK,IAAI,YAAY,CAAC;AAC7D,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,KAAK,YAAY;AAChC,QAAI,UAAU,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,CAAC,EAAG,QAAO;AAAA,EACxD;AACA,SAAO;AACT;;;ADjGA,IAAME,eAAaC,IAAE,OAAO;AAAA,EAC1B,cAAcA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EAClD,aAAaA,IAAE,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,CAAC,EAAE,SAAS;AAAA,EACjD,eAAeA,IAAE,OAAO,EAAE,SAAS;AACrC,CAAC;AAED,IAAM,YAAYA,IAAE,OAAO;AAAA,EACzB,QAAQA,IAAE,OAAO;AAAA,EACjB,KAAKA,IAAE,OAAO;AAAA,EACd,QAAQA,IAAE,OAAO;AAAA,EACjB,UAAUA,IAAE,OAAOA,IAAE,OAAO,GAAGA,IAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACrD,YAAYA,IAAE,OAAO,EAAE,SAAS;AAAA,EAChC,WAAWA,IAAE,QAAQ,EAAE,SAAS;AAClC,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,MAAM,SAAS;AAAA,EACvB,QAAQA,IAAE,MAAMA,IAAE,OAAO,EAAE,QAAQA,IAAE,OAAO,GAAG,OAAOA,IAAE,OAAO,EAAE,CAAC,CAAC;AACrE,CAAC;AAED,IAAO,mBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,cAAc;AAAA,QACZ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,aAAa;AAAA,QACX,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,WAAO,aAAa;AAAA,MAClB,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,eAAe,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AACF,CAAC;;;AO3DD,SAAS,KAAAC,WAAS;;;ACAlB,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AAYjB,eAAsB,iBACpB,QACA,KACA,OACe;AACf,QAAM,OAAO,cAAc;AAC3B,QAAMC,KAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,UAAUC,OAAK,KAAK,MAAM,cAAc;AAC9C,MAAI,WAAW;AACf,MAAI;AACF,eAAW,MAAMD,KAAG,SAAS,SAAS,MAAM;AAAA,EAC9C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,EAC9D;AACA,QAAM,OAAO,GAAG,OAAO,CAAC,IAAK,MAAM,IAAK,GAAG,IAAK,KAAK;AAAA;AACrD,QAAM,YAAY,SAAS,WAAW,IAAI;AAC5C;;;ADpBA,IAAME,eAAaC,IAAE,OAAO;AAAA,EAC1B,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,QAAQA,IAAE,OAAO,EAAE,SAAS;AAC9B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,KAAKA,IAAE,OAAO;AAChB,CAAC;AAED,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,KAAK;AAAA,IAClB,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,iBAAiB,QAAQ,KAAK,KAAK,KAAK,UAAU,GAAG;AAC3D,WAAO,EAAE,KAAK,KAAK,IAAI;AAAA,EACzB;AACF,CAAC;;;AEpCD,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAoBlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,MAAMA,IAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,KAAKA,IAAE,OAAO;AAAA,EACd,MAAMA,IAAE,OAAO;AAAA,EACf,cAAcA,IAAE,OAAO;AACzB,CAAC;AAED,IAAO,eAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,KAAK;AAAA,IAClB,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,gBAAgB,iBAAiB,KAAK,IAAI;AAChD,QAAI;AACF,YAAM,OAAO,MAAMC,KAAG,KAAK,aAAa;AACxC,UAAI,CAAC,KAAK,YAAY,GAAG;AACvB,cAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,MAC9D;AAAA,IACF,SAAS,KAAK;AACZ,UAAI,eAAe,cAAe,OAAM;AACxC,YAAM,IAAI,cAAc,yBAAyB,KAAK,IAAI,EAAE;AAAA,IAC9D;AAEA,UAAM,cAAcC,OAAK,KAAK,eAAe,UAAU;AACvD,UAAMD,KAAG,MAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAE/C,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,qBAAqB,YAAY,KAAK,GAAG;AAC1D,UAAM,cAAcC,OAAK,KAAK,aAAa,QAAQ;AAEnD,UAAM,OAAO;AAAA,MACX,gBAAgB,KAAK,GAAG,wBAAwB,KAAK,IAAI;AAAA,MACzD;AAAA,MACA,KAAK,OAAO,KAAK,OAAO;AAAA,IAC1B,EAAE,KAAK,IAAI;AAEX,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,QACE,YAAY,UAAU,YAAY,KAAK,GAAG,CAAC;AAAA,QAC3C,SAAS;AAAA,QACT,OAAO;AAAA,QACP,OAAO;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,iBAAiB,QAAQ,KAAK,KAAK,QAAQ,KAAK,IAAI,EAAE;AAE5D,WAAO,EAAE,KAAK,KAAK,KAAK,MAAM,KAAK,MAAM,cAAc,YAAY;AAAA,EACrE;AACF,CAAC;AAED,SAAS,qBAAqB,KAAa,KAAqB;AAE9D,QAAM,QAAQ,IAAI,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG,EAAE,QAAQ,KAAK,EAAE;AAChE,SAAO,GAAG,KAAK,WAAW,YAAY,GAAG,CAAC;AAC5C;AAEA,SAAS,YAAY,KAAqB;AACxC,SACE,IACG,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,KAAK;AAEvB;;;AC9GA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAUlB,SAAS,aAAa,qBAAqB;AAa3C,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACrB,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAaA,IAAE,OAAO,EAAE,SAAS;AAAA,EACjC,OAAOA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,UAAUA,IAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,KAAKA,IAAE,OAAO;AAAA,EACd,KAAKA,IAAE,OAAO;AAChB,CAAC;AAED,IAAO,gBAAQ,cAAc;AAAA,EAC3B,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,KAAK;AAAA,IAClB,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,MACZ;AAAA,MACA,OAAO,EAAE,MAAM,WAAW,aAAa,kCAAkC;AAAA,MACzE,aAAa,EAAE,MAAM,iBAAiB,aAAa,oCAAoC;AAAA,MACvF,OAAO,EAAE,MAAM,WAAW,aAAa,0BAA0B;AAAA,MACjE,UAAU;AAAA,QACR,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,aAAa,aAAa,KAAK,IAAI;AACzC,QAAI,CAAC,WAAW,IAAI;AAClB,YAAM,IAAI,gBAAgB,WAAW,KAAK;AAAA,IAC5C;AACA,UAAM,MAAM,iBAAiB,KAAK,IAAI;AAEtC,QAAI,MAAMC,WAAU,GAAG,GAAG;AACxB,YAAM,IAAI,WAAW,8BAA8B,KAAK,IAAI,EAAE;AAAA,IAChE;AACA,UAAMC,KAAG,MAAMC,OAAK,KAAK,KAAK,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3D,UAAMD,KAAG,MAAMC,OAAK,KAAK,KAAK,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,UAAMD,KAAG,MAAMC,OAAK,KAAK,KAAK,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAE7D,UAAM,QAAQ,KAAK,SAAS,YAAY,KAAK,IAAI;AACjD,UAAM,YAAY,eAAe,OAAO,KAAK,GAAG;AAEhD,UAAM,YAAY,KAAK,WACnB,EAAE,MAAM,EAAE,MAAM,KAAK,UAAU,SAAS,KAAK,EAAE,IAC/C;AAEJ,UAAM;AAAA,MACJA,OAAK,KAAK,KAAK,UAAU;AAAA,MACzB;AAAA,QACE,gBAAgB;AAAA,QAChB;AAAA,QACA,SAAS,MAAM;AAAA,QACf,OAAO;AAAA,QACP,GAAI,KAAK,cAAc,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;AAAA,QAC5D,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;AAAA,QAC1C,aAAa,aAAa,KAAK,IAAI;AAAA,QACnC,GAAI,YAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM;AAAA,MACJA,OAAK,KAAK,KAAK,YAAY;AAAA,MAC3B,aAAa,OAAO,KAAK,GAAG;AAAA,IAC9B;AAEA,UAAM,YAAY,gBAAgB,MAAM,CAAC,CAAC;AAC1C,UAAM,YAAYA,OAAK,KAAK,KAAK,eAAe,GAAG,cAAc,SAAS,CAAC;AAC3E,UAAM,YAAYA,OAAK,KAAK,KAAK,WAAW,UAAU,GAAG,EAAE;AAE3D,UAAM,iBAAiB,SAAS,KAAK,KAAK,QAAQ,KAAK,IAAI,EAAE;AAE7D,WAAO,EAAE,MAAM,KAAK,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,EAC/C;AACF,CAAC;AAED,eAAeF,WAAU,GAA6B;AACpD,MAAI;AACF,UAAM,OAAO,MAAMC,KAAG,KAAK,CAAC;AAC5B,WAAO,KAAK,YAAY;AAAA,EAC1B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,MAAM,EAAE,CAAC,EAAG,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EAC3C,KAAK,GAAG;AACb;AAEA,SAAS,eAAe,OAAe,KAAqB;AAC1D,SAAO;AAAA,IACL,KAAK,KAAK;AAAA,IACV;AAAA,IACA,WAAW,GAAG;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,aAAa,OAAe,KAAqB;AACxD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,oBAAoB,KAAK,kCAAkC,GAAG;AAAA,IAC9D;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;;;ACxJA,SAAS,KAAAE,WAAS;AAOlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACjC,SAASA,IAAE,QAAQ,EAAE,SAAS;AAAA;AAAA;AAAA,EAG9B,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA;AAAA;AAAA,EAGhC,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAC9B,CAAC;AAID,IAAM,gBAAgB,cAAkC;AAAA,EACtD,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQC,IAAE,OAAO;AAAA,EACjB,KAAK;AAAA,IACH,YAAY,CAAC,MAAM;AAAA,IACnB,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aACE;AAAA,MACJ;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,aAAa,IAAI,cAAc,cAAc;AAEnD,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,aAAO,MAAM,YAAY,YAAY,KAAK,IAAI;AAAA,IAChD,OAAO;AACL,YAAM,MAAM,KAAK,OAAO,IAAI;AAC5B,YAAM,UAAU,MAAM,MAAM,mBAAmB,YAAY,GAAG,IAAI;AAClE,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AACA,aAAO,QAAQ;AAAA,IACjB;AAGA,UAAM,EAAE,OAAO,IAAI,MAAM,kBAAkB;AAAA,MACzC;AAAA,MACA;AAAA,MACA,mBAAmB,CAAC,KAAK;AAAA,MACzB,OAAO,KAAK;AAAA,IACd,CAAC;AACD,WAAO;AAAA,EACT;AACF,CAAC;AAED,IAAO,iBAAQ;;;AC3Ef,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,SAAAC,cAAa;AAEtB,SAAS,KAAAC,WAAS;AAOlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,QAAQA,IAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AACrC,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,KAAK,CAAC,SAAS,SAAS,CAAC;AAAA,EACnC,MAAMA,IAAE,OAAO;AAAA,EACf,WAAWA,IAAE,QAAQ;AAAA,EACrB,SAASA,IAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAyBD,eAAsB,cAAc,UAA0C;AAC5E,QAAM,YAAY,QAAQ,IAAI;AAC9B,MAAI,aAAa,UAAU,SAAS,GAAG;AACrC,WAAO,EAAE,SAAS,MAAM,MAAM,CAAC,MAAM,gBAAgB,QAAQ,EAAE;AAAA,EACjE;AACA,MAAI,MAAM,cAAc,MAAM,GAAG;AAC/B,WAAO,EAAE,SAAS,QAAQ,MAAM,CAAC,UAAU,QAAQ,EAAE;AAAA,EACvD;AACA,SAAO,EAAE,SAAS,MAAM,MAAM,CAAC,QAAQ,EAAE;AAC3C;AAEA,eAAe,cAAc,MAAgC;AAC3D,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,QAAQE,OAAM,WAAW,CAAC,MAAM,cAAc,IAAI,EAAE,GAAG;AAAA,MAC3D,OAAO;AAAA,IACT,CAAC;AACD,UAAM,GAAG,QAAQ,CAAC,SAAS,QAAQ,SAAS,CAAC,CAAC;AAC9C,UAAM,GAAG,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,EACxC,CAAC;AACH;AAMO,IAAM,iBAAgC,CAAC,SAAS,MAAM,YAAY;AACvE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,QAAI;AACJ,QAAI;AACF,cAAQA,OAAM,SAAS,MAAM,OAAO;AAAA,IACtC,SAAS,KAAK;AACZ,aAAO,GAAG;AACV;AAAA,IACF;AACA,UAAM,GAAG,SAAS,MAAM;AACxB,UAAM,GAAG,QAAQ,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC/C,CAAC;AACH;AAOA,IAAM,cAA2B;AAAA,EAC/B;AAAA,EACA,SAAS;AACX;AAEA,SAAS,WAAW,MAAc,QAAgC;AAChE,QAAM,MAAM,iBAAiB,IAAI;AACjC,SAAOC,OAAK,KAAK,KAAK,WAAW,UAAU,aAAa,YAAY;AACtE;AAEA,eAAe,WAAW,GAA6B;AACrD,MAAI;AACF,UAAMC,KAAG,OAAO,CAAC;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,QACpB,MACA,OAAoB,aACH;AACjB,QAAM,OAAO,WAAW,KAAK,MAAM,KAAK,MAAM;AAC9C,MAAI,CAAE,MAAM,WAAW,IAAI,GAAI;AAC7B,UAAM,IAAI;AAAA,MACR,GAAG,KAAK,MAAM,iCAAiC,KAAK,IAAI,eAAe,IAAI;AAAA,IAC7E;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,KAAK,cAAc,IAAI;AAC5C,QAAM,WAAW,MAAM,KAAK,QAAQ,OAAO,SAAS,OAAO,MAAM;AAAA,IAC/D,OAAO;AAAA,EACT,CAAC;AAED,MAAI,aAAa,GAAG;AAClB,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,KAAK,WAAW,SAAS;AAC3B,QAAI;AACF,YAAM,gBAAgB,MAAM,sBAAsB;AAAA,IACpD,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,IAAI;AAAA,QACR,yEAAyE,KAAK,IAAI;AAAA,EAAqB,OAAO;AAAA,QAC9G,EAAE,OAAO,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF,WAAW,CAAE,MAAM,WAAW,IAAI,GAAI;AACpC,UAAM,IAAI;AAAA,MACR,gDAAgD,IAAI;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,QAAQ,KAAK;AAAA,IACb;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEA,IAAM,OAAO,cAA4B;AAAA,EACvC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAML;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,YAAY,CAAC,QAAQ,QAAQ;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,IAAI,MAAM;AACd,WAAO,QAAQ,IAAI;AAAA,EACrB;AACF,CAAC;AAED,IAAO,eAAQ;;;AC9Kf,SAAS,SAAAI,cAAa;AACtB,SAAS,KAAAC,WAAS;;;ACWlB,SAAS,KAAAC,WAAS;AAClB,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,uBAAuB,8BAA8B;AAa9D,IAAM,mBAAmB;AASlB,SAAS,sBAAsB,aAA6B;AACjE,SAAO,mBAAmB,YAAY,WAAW,KAAK,IAAI;AAC5D;AAGO,SAAS,sBAAsB,UAAiC;AACrE,MAAI,CAAC,SAAS,WAAW,gBAAgB,EAAG,QAAO;AACnD,SAAO,SAAS,MAAM,iBAAiB,MAAM,EAAE,WAAW,MAAM,GAAG;AACrE;AAMA,SAAS,qBAAqB,QAA0D;AACtF,QAAM,EAAE,SAAS,SAAS,aAAa,OAAO,GAAG,KAAK,IAAI;AAC1D,OAAK;AACL,OAAK;AACL,SAAO;AACT;AAOO,SAAS,cAAc,KAA0B;AAGtD,QAAM,MAAMC,IAAE,aAAa,IAAI,IAAW;AAC1C,QAAM,cAAc,qBAAqB,GAAG;AAG5C,MAAI,YAAY,SAAS,UAAU;AACjC,gBAAY,OAAO;AAAA,EACrB;AACA,SAAO;AAAA,IACL,MAAM,sBAAsB,IAAI,IAAI;AAAA,IACpC,aAAa,IAAI;AAAA,IACjB;AAAA,EACF;AACF;AAGO,SAAS,YAAuB;AACrC,SAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE,IAAI,aAAa;AACxD;AAWA,eAAsB,WAAW,UAAkB,SAA4C;AAC7F,QAAM,cAAc,sBAAsB,QAAQ;AAClD,QAAM,MAAM,cAAc,SAAS,IAAI,WAAW,IAAI;AACtD,MAAI,CAAC,KAAK;AACR,UAAM,MAAM,YAAY,IAAI,MAAM,iBAAiB,QAAQ,EAAE,CAAC;AAC9D,WAAO,EAAE,SAAS,MAAM,UAAU,cAAc,IAAI,SAAS,IAAI,IAAI,EAAE;AAAA,EACzE;AAEA,MAAI;AACJ,MAAI;AACF,iBAAa,IAAI,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,EAC3C,SAAS,KAAK;AACZ,UAAM,IAAI,YAAY,GAAG;AACzB,UAAM,UAAU,eAAeA,IAAE,WAAW,sBAAsB,EAAE,OAAO,KAAK,EAAE;AAClF,WAAO,EAAE,SAAS,MAAM,UAAU,cAAc,SAAS,EAAE,IAAI,EAAE;AAAA,EACnE;AAEA,QAAM,MAAsB;AAAA,IAC1B,YAAY,cAAc;AAAA,IAC1B,UAAU,CAAC;AAAA,IACX,QAAQ;AAAA,EACV;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,IAAI,YAAY,GAAG;AAC5C,WAAO,EAAE,SAAS,OAAO,UAAU,gBAAgB,QAAQ,IAAI,QAAQ,EAAE;AAAA,EAC3E,SAAS,KAAK;AACZ,UAAM,IAAI,YAAY,GAAG;AACzB,WAAO,EAAE,SAAS,MAAM,UAAU,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE;AAAA,EACrE;AACF;AAGO,SAAS,eAAe,QAAsB;AACnD,SAAO,kBAAkB,wBAAwB,MAAM;AACrD,WAAO,EAAE,OAAO,UAAU,EAAE;AAAA,EAC9B,CAAC;AAED,SAAO,kBAAkB,uBAAuB,OAAO,YAAY;AACjE,UAAM,EAAE,MAAM,WAAW,KAAK,IAAI,QAAQ;AAC1C,UAAM,EAAE,SAAS,SAAS,IAAI,MAAM,WAAW,MAAM,IAAI;AACzD,WAAO;AAAA,MACL;AAAA,MACA,SAAS,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,UAAU,QAAQ,EAAE,CAAC;AAAA,IAC5D;AAAA,EACF,CAAC;AACH;AAGO,SAAS,kBAA0B;AACxC,QAAM,SAAS,IAAI;AAAA,IACjB;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,cAAc;AAAA,QACZ,OAAO,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,iBAAe,MAAM;AACrB,SAAO;AACT;AAMA,eAAsB,cAA6B;AACjD,QAAM,SAAS,gBAAgB;AAC/B,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAC9B,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,UAAM,WAAW,UAAU;AAC3B,cAAU,UAAU,MAAM;AACxB,UAAI;AACF,mBAAW;AAAA,MACb,UAAE;AACA,gBAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF,CAAC;AACH;;;ACzKA,SAAS,aAA8B;AACvC,SAAS,qCAAqC;;;ACF9C,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B,SAAS,KAAAC,WAAS;;;ACAX,IAAM,iBAAiB;AAEvB,IAAM,YAAY,KAAK,IAAI;AAU3B,SAAS,mBAAmB,MAA6B;AAC9D,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,SAAS;AAAA,IACT,KAAK,QAAQ;AAAA,IACb,WAAW,KAAK,IAAI,IAAI;AAAA,IACxB;AAAA,EACF;AACF;;;ACtBA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBzB,IAAM,gBAAwC;AAAA,EAC5C,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AACZ;AAEA,SAAS,eAAe,UAA0B;AAChD,QAAM,MAAMA,OAAK,QAAQ,QAAQ,EAAE,YAAY;AAC/C,SAAO,cAAc,GAAG,KAAK;AAC/B;AAWA,SAAS,yBAAmC;AAC1C,QAAM,OAAOA,OAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,SAAO;AAAA,IACLA,OAAK,QAAQ,MAAM,WAAW;AAAA;AAAA,IAC9BA,OAAK,QAAQ,MAAM,MAAM,WAAW;AAAA;AAAA,IACpCA,OAAK,QAAQ,MAAM,MAAM,MAAM,QAAQ,WAAW;AAAA;AAAA,EACpD;AACF;AAEA,eAAe,SAAS,GAA0D;AAChF,MAAI;AACF,UAAM,OAAO,MAAMD,KAAG,KAAK,CAAC;AAC5B,WAAO,EAAE,QAAQ,MAAM,QAAQ,KAAK,OAAO,EAAE;AAAA,EAC/C,QAAQ;AACN,WAAO,EAAE,QAAQ,OAAO,QAAQ,MAAM;AAAA,EACxC;AACF;AAGA,eAAe,sBAA8C;AAC3D,aAAW,OAAO,uBAAuB,GAAG;AAC1C,SAAK,MAAM,SAAS,GAAG,GAAG,OAAQ,QAAO;AAAA,EAC3C;AACA,SAAO;AACT;AAEA,eAAsB,gBAAgB,GAA+B;AACnE,QAAM,OAAO,MAAM,oBAAoB;AACvC,MAAI,CAAC,MAAM;AACT,WAAO,EAAE,KAAK,kBAAkB,GAAG;AAAA,EACrC;AAGA,QAAM,MAAM,IAAI,IAAI,EAAE,IAAI,GAAG;AAC7B,QAAM,UAAU,IAAI,SAAS,QAAQ,YAAY,EAAE;AACnD,QAAM,WAAW,YAAY,KAAK,eAAe;AAGjD,QAAM,SAASC,OAAK,QAAQ,MAAM,QAAQ;AAC1C,MAAI,CAAC,OAAO,WAAW,OAAOA,OAAK,GAAG,KAAK,WAAW,MAAM;AAC1D,WAAO,EAAE,KAAK,aAAa,GAAG;AAAA,EAChC;AAEA,QAAM,OAAO,MAAM,SAAS,MAAM;AAClC,MAAI,CAAC,KAAK,UAAU,CAAC,KAAK,QAAQ;AAEhC,UAAM,YAAYA,OAAK,KAAK,MAAM,YAAY;AAC9C,UAAM,YAAY,MAAM,SAAS,SAAS;AAC1C,QAAI,CAAC,UAAU,QAAQ;AACrB,aAAO,EAAE,KAAK,kBAAkB,GAAG;AAAA,IACrC;AACA,UAAMC,QAAO,MAAMF,KAAG,SAAS,SAAS;AACxC,WAAO,EAAE,KAAK,IAAI,WAAWE,KAAI,GAAG,KAAK;AAAA,MACvC,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,OAAO,MAAMF,KAAG,SAAS,MAAM;AACrC,SAAO,EAAE,KAAK,IAAI,WAAW,IAAI,GAAG,KAAK;AAAA,IACvC,gBAAgB,eAAe,MAAM;AAAA,EACvC,CAAC;AACH;;;AFxFA,IAAM,eAAe;AAEd,SAAS,aAAa,SAAoC;AAC/D,QAAM,MAAM,IAAI,KAAK;AAErB,MAAI,IAAI,WAAW,CAAC,MAAM,EAAE,KAAK,mBAAmB,QAAQ,IAAI,CAAC,CAAC;AAElE,MAAI,IAAI,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,eAAe,CAAC,CAAC;AAE9D,MAAI;AAAA,IAAI;AAAA,IAAW,CAAC,MAClB,UAAU,GAAG,OAAO,WAAW;AAC7B,YAAM,OAAO,SAAS,EAAE,OAAO,SAAS,MAAM,YAAY,CAAC;AAC3D,YAAM,cAAc,QAAQ,KAAK;AAAA,QAAU,CAAC,YAC1C,OAAO,SAAS,OAAO;AAAA,MACzB;AACA,aAAO,QAAQ,MAAM,cAAc,CAAC;AAGpC,aAAO,CAAC,OAAO,SAAS;AACtB,cAAM,OAAO,MAAM,YAAY;AAC/B,YAAI,OAAO,QAAS;AACpB,cAAM,OAAO,SAAS,EAAE,OAAO,QAAQ,MAAM,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;AAAA,MACnE;AACA,oBAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,MAAI,KAAK,cAAc,OAAO,MAAM;AAClC,UAAM,OAAO,EAAE,IAAI,MAAM,MAAM;AAC/B,UAAM,MAAM,SAAS,IAAI,IAAI;AAC7B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,KAAK,cAAc,oBAAoB,IAAI,IAAI,KAAK,KAAK,GAAG,GAAG;AAAA,IAC1E;AAEA,QAAI,UAAmB,CAAC;AACxB,UAAM,gBAAgB,EAAE,IAAI,OAAO,gBAAgB;AACnD,QAAI,iBAAiB,kBAAkB,KAAK;AAC1C,UAAI;AACF,kBAAU,MAAM,EAAE,IAAI,KAAK;AAAA,MAC7B,QAAQ;AACN,eAAO,EAAE,KAAK,cAAc,qBAAqB,KAAK,KAAK,GAAG,GAAG;AAAA,MACnE;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,IAAI,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,IACvC,SAAS,KAAK;AACZ,YAAM,IAAI,YAAY,GAAG;AACzB,YAAM,UACJ,eAAeG,IAAE,WAAW,sBAAsB,EAAE,OAAO,KAAK,EAAE;AACpE,aAAO,EAAE,KAAK,cAAc,SAAS,KAAK,OAAO,GAAG,GAAG;AAAA,IACzD;AAEA,UAAM,MAAsB;AAAA,MAC1B,YAAY,cAAc;AAAA,MAC1B,UAAU,CAAC;AAAA,MACX,QAAQ;AAAA,IACV;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,IAAI,IAAI,QAAQ,GAAG;AACxC,aAAO,EAAE,KAAK,gBAAgB,QAAQ,IAAI,QAAQ,CAAC;AAAA,IACrD,SAAS,KAAK;AACZ,YAAM,IAAI,YAAY,GAAG;AACzB,aAAO,EAAE,KAAK,cAAc,EAAE,SAAS,EAAE,IAAI,GAAG,GAAG;AAAA,IACrD;AAAA,EACF,CAAC;AAED,MAAI,IAAI,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;AACxC,MAAI,IAAI,SAAS,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAE1C,SAAO;AACT;;;AGhGA,SAAS,WAAW,yBAAyB;AAC7C,OAAOC,YAAU;AACjB,OAAO,QAAqB,mBAAqC;AAGjE,IAAI;AAEJ,SAAS,cAAsB;AAC7B,QAAM,YAAY,aAAa;AAC/B,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,UAAUC,OAAK,KAAK,WAAW,YAAY;AAEjD,QAAM,aAAa,kBAAkB,SAAS,EAAE,OAAO,IAAI,CAAC;AAE5D,QAAM,cAAc,QAAQ,OAAO,UAAU;AAC7C,QAAM,eAAsC,cACvC,KAAK,UAAU;AAAA,IACd,QAAQ;AAAA,IACR,SAAS,EAAE,aAAa,GAAG,UAAU,KAAK;AAAA,EAC5C,CAAC,IACD,QAAQ;AAEZ,QAAM,UAAyB;AAAA,IAC7B,EAAE,QAAQ,aAAa;AAAA,IACvB,EAAE,QAAQ,WAAW;AAAA,EACvB;AAEA,SAAO,KAAK,EAAE,OAAO,QAAQ,IAAI,gBAAgB,OAAO,GAAG,YAAY,OAAO,CAAC;AACjF;AAEO,SAAS,YAAoB;AAClC,mBAAiB,YAAY;AAC7B,SAAO;AACT;;;ACxBO,IAAM,WAAN,MAAe;AAAA,EACH,cAAc,oBAAI,IAAgB;AAAA;AAAA,EAGnD,UAAU,MAA8B;AACtC,SAAK,YAAY,IAAI,IAAI;AACzB,WAAO,MAAM;AACX,WAAK,YAAY,OAAO,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,OAAe;AACjB,WAAO,KAAK,YAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,SAA2B;AACnC,eAAW,QAAQ,KAAK,aAAa;AACnC,UAAI;AACF,cAAM,SAAS,KAAK,OAAO;AAC3B,YAAI,UAAU,OAAO,OAAO,SAAS,YAAY;AAC/C,iBAAO,MAAM,MAAM,KAAK,YAAY,OAAO,IAAI,CAAC;AAAA,QAClD;AAAA,MACF,QAAQ;AACN,aAAK,YAAY,OAAO,IAAI;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AACF;;;ACvCA,SAAS,OAAO,aAAa,YAAYC,YAA0B;AACnE,OAAOC,YAAU;AAajB,IAAM,sBAAsB;AAOrB,SAAS,UACd,MACA,UACA,UAA4B,CAAC,GAChB;AACb,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,WAAW,oBAAI,IAAuB;AAC5C,MAAI,gBAAuC;AAC3C,MAAI,cAAqC;AACzC,MAAI,SAAS;AAEb,QAAM,OAAO,MAAY;AACvB,QAAI,OAAQ;AACZ,QAAI,cAAe,cAAa,aAAa;AAC7C,oBAAgB,WAAW,MAAM;AAC/B,sBAAgB;AAChB,UAAI,CAAC,OAAQ,UAAS;AAAA,IACxB,GAAG,UAAU;AAAA,EACf;AAEA,QAAM,WAAW,CAAC,QAAsB;AACtC,QAAI,UAAU,SAAS,IAAI,GAAG,EAAG;AACjC,QAAI;AACJ,QAAI;AACF,UAAI,MAAM,KAAK,EAAE,YAAY,MAAM,CAAC;AAAA,IACtC,SAAS,KAAK;AACZ,cAAQ,UAAU,GAAG;AACrB;AAAA,IACF;AACA,MAAE,GAAG,SAAS,CAAC,QAAQ,QAAQ,UAAU,GAAG,CAAC;AAC7C,MAAE,GAAG,UAAU,MAAM;AACnB,WAAK;AAEL,qBAAe;AAAA,IACjB,CAAC;AACD,aAAS,IAAI,KAAK,CAAC;AAAA,EACrB;AAEA,QAAM,iBAAiB,MAAY;AACjC,QAAI,UAAU,YAAa;AAC3B,kBAAc,WAAW,MAAM;AAC7B,oBAAc;AACd,WAAK,WAAW,IAAI;AAAA,IACtB,GAAG,UAAU;AAAA,EACf;AAEA,QAAM,aAAa,OAAO,QAA+B;AACvD,QAAI,OAAQ;AACZ,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMD,KAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACzD,SAAS,KAAK;AACZ,cAAQ,UAAU,GAAG;AACrB;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,QAAQC,OAAK,KAAK,KAAK,MAAM,IAAI;AACvC,YAAM,QAAQ,CAAC,SAAS,IAAI,KAAK;AACjC,eAAS,KAAK;AACd,UAAI,MAAO,OAAM,WAAW,KAAK;AAAA,IACnC;AAAA,EACF;AAMA,QAAM,sBAAsB,CAAC,QAAsB;AACjD,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,IACpD,SAAS,KAAK;AACZ,cAAQ,UAAU,GAAG;AACrB;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,YAAM,QAAQA,OAAK,KAAK,KAAK,MAAM,IAAI;AACvC,eAAS,KAAK;AACd,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,WAAS,IAAI;AACb,sBAAoB,IAAI;AAExB,SAAO;AAAA,IACL,QAAc;AACZ,eAAS;AACT,UAAI,cAAe,cAAa,aAAa;AAC7C,UAAI,YAAa,cAAa,WAAW;AACzC,iBAAW,KAAK,SAAS,OAAO,EAAG,GAAE,MAAM;AAC3C,eAAS,MAAM;AAAA,IACjB;AAAA,EACF;AACF;;;ACvHA,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AAcjB,SAAS,UAAkB;AACzB,SAAOC,OAAK,KAAK,aAAa,GAAG,YAAY;AAC/C;AAEA,SAAS,WAAmB;AAC1B,SAAOA,OAAK,KAAK,aAAa,GAAG,kBAAkB;AACrD;AAEA,eAAe,iBAAgC;AAC7C,QAAMC,KAAG,MAAM,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD;AAEA,eAAsB,aAAa,KAAa,MAAiC;AAC/E,QAAM,eAAe;AACrB,QAAMA,KAAG,UAAU,QAAQ,GAAG,OAAO,GAAG,GAAG,MAAM;AACjD,QAAMA,KAAG,UAAU,SAAS,GAAG,KAAK,UAAU,MAAM,MAAM,CAAC,GAAG,MAAM;AACtE;AAEA,eAAsB,cAA+C;AACnE,MAAI;AACJ,MAAI;AACF,aAAS,MAAMA,KAAG,SAAS,QAAQ,GAAG,MAAM;AAAA,EAC9C,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACA,QAAM,MAAM,OAAO,SAAS,OAAO,KAAK,GAAG,EAAE;AAC7C,MAAI,CAAC,OAAO,SAAS,GAAG,EAAG,QAAO;AAElC,MAAI;AACJ,MAAI;AACF,cAAU,MAAMA,KAAG,SAAS,SAAS,GAAG,MAAM;AAAA,EAChD,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,EAC9D;AACA,QAAM,OAAmB,UACpB,KAAK,MAAM,OAAO,IACnB,EAAE,MAAM,GAAG,SAAS,WAAW,SAAS,GAAG;AAC/C,SAAO,EAAE,KAAK,KAAK;AACrB;AAEA,eAAsB,gBAA+B;AACnD,aAAW,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG;AACvC,QAAI;AACF,YAAMA,KAAG,OAAO,CAAC;AAAA,IACnB,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,IAC9D;AAAA,EACF;AACF;AAEO,SAAS,eAAe,KAAsB;AACnD,MAAI,CAAC,OAAO,SAAS,GAAG,KAAK,OAAO,EAAG,QAAO;AAC9C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,UAAM,OAAQ,IAA8B;AAE5C,QAAI,SAAS,QAAS,QAAO;AAC7B,WAAO;AAAA,EACT;AACF;;;APxDA,IAAM,eAAe;AACrB,IAAM,WAAW;AAEjB,SAAS,YAAY,SAAmC;AACtD,MAAI,OAAO,QAAQ,SAAS,YAAY,OAAO,SAAS,QAAQ,IAAI,GAAG;AACrE,WAAO,QAAQ;AAAA,EACjB;AACA,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,SAAS;AACX,UAAM,IAAI,OAAO,SAAS,SAAS,EAAE;AACrC,QAAI,OAAO,SAAS,CAAC,EAAG,QAAO;AAAA,EACjC;AACA,SAAO;AACT;AAEA,eAAe,0BAAyC;AACtD,QAAM,WAAW,MAAM,YAAY;AACnC,MAAI,YAAY,eAAe,SAAS,GAAG,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR,+BAA+B,SAAS,GAAG,UAAU,SAAS,KAAK,IAAI;AAAA,IACzE;AAAA,EACF;AACA,MAAI,UAAU;AAEZ,UAAM,cAAc;AAAA,EACtB;AACF;AAEA,eAAe,aAAa,KAAwC;AAClE,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAmB,CAAC;AAC1B,QAAI,GAAG,QAAQ,CAAC,MAAc,OAAO,KAAK,CAAC,CAAC;AAC5C,QAAI,GAAG,OAAO,MAAM;AAClB,YAAM,MAAM,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AACjD,UAAI,IAAI,WAAW,GAAG;AACpB,gBAAQ,MAAS;AACjB;AAAA,MACF;AACA,UAAI;AACF,gBAAQ,KAAK,MAAM,GAAG,CAAC;AAAA,MACzB,SAAS,KAAK;AACZ,eAAO,GAAG;AAAA,MACZ;AAAA,IACF,CAAC;AACD,QAAI,GAAG,SAAS,MAAM;AAAA,EACxB,CAAC;AACH;AAQA,eAAe,iBAAiB,KAAsB,KAAoC;AACxF,QAAM,SAAS,gBAAgB;AAC/B,QAAM,YAAY,IAAI,8BAA8B,EAAE,oBAAoB,OAAU,CAAC;AACrF,MAAI;AACJ,MAAI,IAAI,WAAW,QAAQ;AACzB,QAAI;AACF,aAAO,MAAM,aAAa,GAAG;AAAA,IAC/B,QAAQ;AACN,UAAI,aAAa;AACjB,UAAI,IAAI,KAAK,UAAU,EAAE,IAAI,OAAO,OAAO,oBAAoB,CAAC,CAAC;AACjE;AAAA,IACF;AAAA,EACF;AACA,MAAI,GAAG,SAAS,MAAM;AACpB,SAAK,UAAU,MAAM;AACrB,SAAK,OAAO,MAAM;AAAA,EACpB,CAAC;AACD,QAAM,OAAO,QAAQ,SAAS;AAC9B,QAAM,UAAU,cAAc,KAAK,KAAK,IAAI;AAC9C;AAEA,SAAS,SAAS,KAAsC,MAAmC;AACzF,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,SAAS;AAAA,MACb;AAAA,QACE,OAAO,IAAI;AAAA,QACX,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACA,MAAM,QAAQ,MAAM;AAAA,IACtB;AAGA,UAAM,cAAc,OAAO,UAAU,SAAS,EAAE,CAAC;AAGjD,WAAO,mBAAmB,SAAS;AACnC,WAAO,GAAG,WAAW,CAAC,KAAsB,QAAwB;AAClE,YAAM,MAAM,IAAI,OAAO;AACvB,UAAI,QAAQ,UAAU,IAAI,WAAW,OAAO,KAAK,IAAI,WAAW,OAAO,GAAG;AACxE,aAAK,iBAAiB,KAAK,GAAG,EAAE,MAAM,CAAC,QAAQ;AAC7C,cAAI,CAAC,IAAI,aAAa;AACpB,gBAAI,aAAa;AACjB,gBAAI,IAAI,OAAO,GAAG,CAAC;AAAA,UACrB,OAAO;AACL,gBAAI,QAAQ;AAAA,UACd;AAAA,QACF,CAAC;AACD;AAAA,MACF;AACA,UAAI,YAAa,aAAY,KAAK,GAAG;AAAA,IACvC,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,YAAY,QAAmC;AACtD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAO,MAAM,CAAC,QAAQ;AACpB,UAAI,IAAK,QAAO,GAAG;AAAA,UACd,SAAQ;AAAA,IACf,CAAC;AAAA,EACH,CAAC;AACH;AAEA,eAAsB,UAAU,UAA4B,CAAC,GAAkB;AAC7E,QAAM,MAAM,UAAU;AACtB,QAAM,wBAAwB;AAE9B,QAAM,OAAO,YAAY,OAAO;AAChC,QAAM,MAAM,IAAI,SAAS;AACzB,QAAM,MAAM,aAAa,EAAE,MAAM,IAAI,CAAC;AACtC,QAAM,SAAS,MAAM,SAAS,KAAK,IAAI;AACvC,QAAM,WAAU,oBAAI,KAAK,GAAE,YAAY;AAEvC,QAAM,aAAa,cAAc;AACjC,MAAI,UAA8B;AAClC,MAAI;AACF,cAAU;AAAA,MACR;AAAA,MACA,MAAM,IAAI,UAAU,EAAE,OAAO,UAAU,MAAM,cAAc,CAAC;AAAA,MAC5D,EAAE,SAAS,CAAC,QAAQ,IAAI,KAAK,EAAE,IAAI,GAAG,oBAAoB,EAAE;AAAA,IAC9D;AACA,QAAI,KAAK,EAAE,WAAW,GAAG,sCAAsC;AAAA,EACjE,SAAS,KAAK;AAEZ,QAAI,KAAK,EAAE,KAAK,WAAW,GAAG,iCAAiC;AAAA,EACjE;AAEA,QAAM,aAAa,QAAQ,KAAK;AAAA,IAC9B;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AACD,MAAI,KAAK,EAAE,KAAK,QAAQ,KAAK,MAAM,QAAQ,GAAG,gBAAgB;AAE9D,QAAM,IAAI,QAAc,CAAC,YAAY;AACnC,QAAI,eAAe;AACnB,UAAM,WAAW,CAAC,WAAiC;AACjD,UAAI,aAAc;AAClB,qBAAe;AACf,UAAI,KAAK,EAAE,OAAO,GAAG,eAAe;AACpC,YAAM,YAAY;AAChB,YAAI;AACF,mBAAS,MAAM;AAAA,QACjB,SAAS,KAAK;AACZ,cAAI,MAAM,EAAE,IAAI,GAAG,4BAA4B;AAAA,QACjD;AACA,YAAI;AACF,gBAAM,YAAY,MAAM;AAAA,QAC1B,SAAS,KAAK;AACZ,cAAI,MAAM,EAAE,IAAI,GAAG,sBAAsB;AAAA,QAC3C;AACA,YAAI;AACF,gBAAM,cAAc;AAAA,QACtB,SAAS,KAAK;AACZ,cAAI,MAAM,EAAE,IAAI,GAAG,yBAAyB;AAAA,QAC9C;AACA,YAAI,KAAK,SAAS;AAClB,gBAAQ;AAAA,MACV,GAAG;AAAA,IACL;AAEA,YAAQ,KAAK,WAAW,QAAQ;AAChC,YAAQ,KAAK,UAAU,QAAQ;AAAA,EACjC,CAAC;AACH;;;AFlMA,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,OAAOA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC5B,QAAQA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC7C,CAAC;AAID,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,MAAMA,IAAE,KAAK,CAAC,SAAS,QAAQ,UAAU,CAAC;AAAA,EAC1C,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,EACzB,MAAMA,IAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAID,SAAS,cAAc,MAAyD;AAC9E,QAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,4CAA4C;AAAA,EAC9D;AACA,QAAM,OAAO,CAAC,OAAO,OAAO;AAC5B,MAAI,SAAS,QAAW;AACtB,SAAK,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA,EAClC;AACA,QAAM,QAAQE,OAAM,QAAQ,UAAU,CAAC,OAAO,GAAG,IAAI,GAAG;AAAA,IACtD,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,QAAQ;AAAA,EACf,CAAC;AACD,QAAM,MAAM;AACZ,SAAO,EAAE,KAAK,MAAM,OAAO,IAAI,MAAM,QAAQ,KAAK;AACpD;AAEA,IAAO,oBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,QAAI,KAAK,OAAO;AACd,YAAM,YAAY;AAClB,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,EAAE,KAAK,KAAK,IAAI,cAAc,KAAK,IAAI;AAC7C,aAAO,EAAE,MAAM,YAAY,KAAK,KAAK;AAAA,IACvC;AACA,UAAM,UAAU,EAAE,MAAM,KAAK,KAAK,CAAC;AACnC,WAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AAAA,EACzC;AACF,CAAC;;;AUlFD,SAAS,KAAAE,WAAS;AAelB,IAAMC,eAAaC,IAAE,OAAO,CAAC,CAAC;AAG9B,IAAMC,iBAAeD,IAAE,MAAM;AAAA,EAC3BA,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,IAAI,GAAG,KAAKA,IAAE,OAAO,EAAE,CAAC;AAAA,EACtDA,IAAE,OAAO,EAAE,SAASA,IAAE,QAAQ,KAAK,GAAG,QAAQA,IAAE,OAAO,EAAE,CAAC;AAC5D,CAAC;AAGD,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AAEzB,eAAe,YAAY,KAAa,WAAqC;AAC3E,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,CAAC,eAAe,GAAG,EAAG,QAAO;AACjC,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,gBAAgB,CAAC;AAAA,EACtE;AACA,SAAO,CAAC,eAAe,GAAG;AAC5B;AAEA,IAAO,mBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,MAAM,MAAM;AACV,UAAM,WAAW,MAAM,YAAY;AACnC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,SAAS,OAAO,QAAQ,cAAc;AAAA,IACjD;AACA,UAAM,EAAE,IAAI,IAAI;AAChB,QAAI,CAAC,eAAe,GAAG,GAAG;AACxB,YAAM,cAAc;AACpB,aAAO,EAAE,SAAS,OAAO,QAAQ,cAAc;AAAA,IACjD;AACA,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAAA,IAC7B,SAAS,KAAK;AACZ,YAAM,OAAQ,IAA8B;AAC5C,UAAI,SAAS,SAAS;AACpB,cAAM,cAAc;AACpB,eAAO,EAAE,SAAS,OAAO,QAAQ,cAAc;AAAA,MACjD;AACA,YAAM;AAAA,IACR;AACA,UAAM,YAAY,KAAK,mBAAmB;AAC1C,UAAM,cAAc;AACpB,WAAO,EAAE,SAAS,MAAM,IAAI;AAAA,EAC9B;AACF,CAAC;;;ACjED,SAAS,SAAAC,cAAa;AACtB,SAAS,KAAAC,WAAS;AAalB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC7C,CAAC;AAGD,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,KAAKA,IAAE,OAAO;AAAA,EACd,MAAMA,IAAE,OAAO;AACjB,CAAC;AAGD,IAAME,uBAAsB;AAC5B,IAAMC,oBAAmB;AACzB,IAAMC,gBAAe;AAErB,eAAeC,aAAY,KAAa,WAAkC;AACxE,QAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,SAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,QAAI,CAAC,eAAe,GAAG,EAAG;AAC1B,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAASF,iBAAgB,CAAC;AAAA,EACtE;AACF;AAEA,eAAe,eAA4C;AACzD,QAAM,QAAQ,MAAM,YAAY;AAChC,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,EAAE,KAAK,KAAK,IAAI;AACtB,MAAI,eAAe,GAAG,GAAG;AACvB,QAAI;AACF,cAAQ,KAAK,KAAK,SAAS;AAAA,IAC7B,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,QAAS,OAAM;AAAA,IAC7D;AACA,UAAME,aAAY,KAAKH,oBAAmB;AAAA,EAC5C;AACA,QAAM,cAAc;AACpB,SAAO,KAAK;AACd;AAEA,SAASI,eAAc,MAA6C;AAClE,QAAM,QAAQ,QAAQ,KAAK,CAAC;AAC5B,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AACA,QAAM,QAAQC,OAAM,QAAQ,UAAU,CAAC,OAAO,OAAO,SAAS,UAAU,OAAO,IAAI,CAAC,GAAG;AAAA,IACrF,UAAU;AAAA,IACV,OAAO;AAAA,IACP,KAAK,QAAQ;AAAA,EACf,CAAC;AACD,QAAM,MAAM;AACZ,SAAO,EAAE,KAAK,MAAM,OAAO,IAAI,KAAK;AACtC;AAEA,IAAO,sBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMR;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,MAAM;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,WAAW,MAAM,aAAa;AACpC,UAAM,OAAO,KAAK,QAAQ,YAAYG;AACtC,WAAOE,eAAc,IAAI;AAAA,EAC3B;AACF,CAAC;;;ACrFD,SAAS,KAAAE,WAAS;AASlB,IAAMC,eAAaC,IAAE,OAAO,CAAC,CAAC;AAG9B,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,SAASA,IAAE,QAAQ;AAAA,EACnB,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,EACzB,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAWA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,SAASA,IAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAGD,IAAM,oBAAoB;AAS1B,eAAe,YAAY,MAA8C;AACvE,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,iBAAiB;AACpE,UAAM,MAAM,MAAM,MAAM,oBAAoB,IAAI,WAAW;AAAA,MACzD,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,KAAK;AAClB,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAO,qBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,MAAM,MAAM;AACV,UAAM,QAAQ,MAAM,YAAY;AAChC,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AACA,UAAM,EAAE,KAAK,KAAK,IAAI;AACtB,UAAM,QAAQ,eAAe,GAAG;AAChC,QAAI,CAAC,OAAO;AACV,aAAO,EAAE,SAAS,OAAO,KAAK,MAAM,KAAK,KAAK;AAAA,IAChD;AACA,UAAM,SAAS,MAAM,YAAY,KAAK,IAAI;AAC1C,QAAI,QAAQ;AACV,aAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK,OAAO;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,QAChB,WAAW,OAAO;AAAA,QAClB,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,IACX;AAAA,EACF;AACF,CAAC;;;AChFD,SAAS,YAAYC,YAAU;AAC/B,OAAOC,YAAU;AACjB,SAAS,KAAAC,WAAS;AAWlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,OAAOA,IAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC9C,CAAC;AAGD,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,OAAOA,IAAE,MAAMA,IAAE,OAAO,CAAC;AAC3B,CAAC;AAGD,IAAM,gBAAgB;AAEtB,IAAO,mBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aAAa;AAAA,EACb,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,OAAO;AAAA,QACL,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM;AACd,UAAM,IAAI,KAAK,SAAS;AACxB,UAAM,UAAUC,OAAK,KAAK,aAAa,GAAG,YAAY;AACtD,QAAI;AACJ,QAAI;AACF,gBAAU,MAAMC,KAAG,SAAS,SAAS,MAAM;AAAA,IAC7C,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,UAAU;AACpD,eAAO,EAAE,OAAO,CAAC,EAAE;AAAA,MACrB;AACA,YAAM;AAAA,IACR;AACA,UAAM,WAAW,QAAQ,MAAM,OAAO;AAEtC,WAAO,SAAS,SAAS,KAAK,SAAS,SAAS,SAAS,CAAC,MAAM,IAAI;AAClE,eAAS,IAAI;AAAA,IACf;AACA,WAAO,EAAE,OAAO,SAAS,MAAM,CAAC,CAAC,EAAE;AAAA,EACrC;AACF,CAAC;;;ACzDD,SAAS,KAAAC,WAAS;;;ACQlB,SAAS,YAAYC,MAAK,kBAAkB;AAC5C,OAAOC,eAAc;AACrB,SAAS,SAASC,kBAAiB;AACnC,OAAOC,SAAQ;AACf,SAAS,iBAAAC,sBAAqB;AAC9B,YAAY,kBAAkB;;;ACb9B,SAAS,UAAU,iBAAiB;AACpC,SAAS,YAAY;;;ACDrB,SAAS,YAAYC,YAAuB;AAC5C,OAAOC,YAAU;AACjB,OAAO,UAAU;AAqDjB,SAAS,QAAW,OAAqB;AACvC,SAAO,MAAM,QAAQ,KAAK,IAAK,QAAgB,CAAC;AAClD;AAEA,SAAS,gBAAgB,GAAmE;AAC1F,MAAI,OAAO,EAAE,SAAS,YAAY,OAAO,EAAE,SAAS,SAAU,QAAO;AACrE,MAAI,EAAE,KAAK,WAAW,KAAK,EAAE,KAAK,WAAW,EAAG,QAAO;AACvD,QAAM,MAAqD;AAAA,IACzD,MAAM,EAAE;AAAA,IACR,MAAM,EAAE;AAAA,EACV;AACA,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,SAAS,EAAG,KAAI,OAAO,EAAE;AAClE,SAAO;AACT;AAEA,SAAS,eACP,GACsD;AACtD,MAAI,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,WAAW,EAAG,QAAO;AAE9D,QAAM,QACJ,OAAO,EAAE,UAAU,YAAY,EAAE,MAAM,SAAS,IAC5C,EAAE,QACF,OAAO,EAAE,YAAY,WACnB,EAAE,UACF;AACR,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,QAAM,MAAqD,EAAE,MAAM,EAAE,MAAM,MAAM;AACjF,MAAI,OAAO,EAAE,QAAQ,YAAY,EAAE,IAAI,SAAS,EAAG,KAAI,MAAM,EAAE;AAC/D,SAAO;AACT;AAOA,eAAe,WAAW,UAA6C;AACrE,MAAI;AACJ,MAAI;AACF,UAAM,MAAMC,KAAG,SAAS,UAAU,MAAM;AAAA,EAC1C,QAAQ;AACN,WAAO,EAAE,SAAS,OAAO,YAAY,CAAC,EAAE;AAAA,EAC1C;AAEA,MAAI;AACJ,MAAI;AACF,aAAU,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,EAChC,QAAQ;AAEN,WAAO,EAAE,SAAS,OAAO,YAAY,CAAC,EAAE;AAAA,EAC1C;AAEA,QAAM,aAAa,QAAc,OAAO,GAAG;AAC3C,QAAM,WAAW,QAAkB,OAAO,QAAQ,EAC/C,IAAI,eAAe,EACnB,OAAO,CAAC,MAA0D,MAAM,IAAI;AAC/E,QAAM,UAAU,QAAiB,OAAO,OAAO,EAC5C,IAAI,cAAc,EAClB,OAAO,CAAC,MAA0D,MAAM,IAAI;AAG/E,QAAM,kBAAkB,QAAkB,OAAO,QAAQ,EAAE;AAAA,IACzD,CAAC,MAAM,OAAO,EAAE,gBAAgB;AAAA,EAClC;AACA,QAAM,iBAAiB,QAAiB,OAAO,OAAO,EAAE;AAAA,IACtD,CAAC,MAAM,OAAO,EAAE,YAAY,YAAY,OAAO,EAAE,YAAY;AAAA,EAC/D;AACA,QAAM,SAAS,WAAW,SAAS,KAAK,OAAO,QAAQ;AACvD,MAAI,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,QAAQ;AAClD,WAAO,EAAE,SAAS,OAAO,YAAY,CAAC,EAAE;AAAA,EAC1C;AAEA,QAAM,OAAO,gBAAgB,MAAM,EAAE,UAAU,QAAQ,CAAC;AACxD,QAAM,UAAU,UAAU,MAAM,eAAe;AAC/C,SAAO,EAAE,SAAS,MAAM,WAAW;AACrC;AAEA,eAAe,mBAAmB,YAAuC;AACvE,QAAM,MAAgB,CAAC;AAGvB,MAAI;AACF,UAAM,UAAU,MAAMA,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AACpE,eAAW,SAAS,SAAS;AAC3B,UAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,UAAI,MAAM,KAAK,WAAW,GAAG,EAAG;AAChC,YAAM,YAAYC,OAAK,KAAK,YAAY,MAAM,MAAM,eAAe;AACnE,UAAI;AACF,cAAMD,KAAG,OAAO,SAAS;AACzB,YAAI,KAAK,SAAS;AAAA,MACpB,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAGA,QAAM,cAAcC,OAAK,QAAQ,YAAY,IAAI;AACjD,MAAI;AACF,UAAM,UAAU,MAAMD,KAAG,QAAQ,aAAa,EAAE,eAAe,KAAK,CAAC;AACrE,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,OAAO,YAAY,EAAG;AAC3B,UAAI,OAAO,KAAK,WAAW,GAAG,EAAG;AAEjC,UAAIC,OAAK,KAAK,aAAa,OAAO,IAAI,MAAMA,OAAK,QAAQ,UAAU,EAAG;AACtE,YAAM,aAAaA,OAAK,KAAK,aAAa,OAAO,MAAM,SAAS;AAChE,UAAI;AACJ,UAAI;AACF,mBAAW,MAAMD,KAAG,QAAQ,YAAY,EAAE,eAAe,KAAK,CAAC;AAAA,MACjE,QAAQ;AACN;AAAA,MACF;AACA,iBAAW,SAAS,UAAU;AAC5B,YAAI,CAAC,MAAM,YAAY,EAAG;AAC1B,cAAM,YAAYC,OAAK,KAAK,YAAY,MAAM,MAAM,eAAe;AACnE,YAAI;AACF,gBAAMD,KAAG,OAAO,SAAS;AACzB,cAAI,KAAK,SAAS;AAAA,QACpB,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AAEA,SAAO;AACT;AAEA,eAAe,mBAAmB,YAAoB,OAAgC;AACpF,MAAI,MAAM,WAAW,EAAG;AACxB,QAAM,UAAUC,OAAK,KAAK,YAAY,iBAAiB;AACvD,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY;AACrC,QAAM,OAAO,MAAM,IAAI,CAAC,MAAM,GAAG,KAAK,WAAa,CAAC;AAAA,CAAI,EAAE,KAAK,EAAE;AACjE,MAAI;AACF,UAAMD,KAAG,MAAM,YAAY,EAAE,WAAW,KAAK,CAAC;AAAA,EAChD,QAAQ;AAAA,EAER;AACA,QAAMA,KAAG,WAAW,SAAS,MAAM,MAAM;AAC3C;AAEO,IAAM,kBAA6B;AAAA,EACxC,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,aAAa;AAAA,EACb,MAAM,IAAI,YAAmC;AAC3C,UAAM,QAAQ,MAAM,mBAAmB,UAAU;AACjD,UAAM,aAAuB,CAAC;AAC9B,eAAW,QAAQ,OAAO;AACxB,YAAM,EAAE,WAAW,IAAI,MAAM,WAAW,IAAI;AAC5C,iBAAW,MAAM,YAAY;AAC3B,cAAM,MAAM,OAAO,GAAG,WAAW,WAAW,IAAI,GAAG,MAAM,KAAK;AAC9D,cAAM,OAAO,GAAG,QAAQ;AACxB,cAAM,QAAQ,GAAG,SAAS;AAC1B,mBAAW,KAAK,GAAG,IAAI,IAAK,GAAG,KAAK,IAAI,KAAK,KAAK,EAAE;AAAA,MACtD;AAAA,IACF;AACA,UAAM,mBAAmB,YAAY,UAAU;AAAA,EACjD;AACF;;;AC9MO,IAAM,kBAAkB;AAWxB,IAAM,aAA0B,CAAC,eAAe;AAWvD,eAAsB,cACpB,YACA,aACA,aAA0B,YACK;AAC/B,MAAI,gBAAgB,iBAAiB;AACnC,WAAO,EAAE,KAAK,CAAC,EAAE;AAAA,EACnB;AAEA,MAAI,cAAc,iBAAiB;AACjC,UAAM,IAAI;AAAA,MACR,kBAAkB,WAAW,8BAA8B,eAAe;AAAA,IAE5E;AAAA,EACF;AAEA,QAAM,MAAmB,CAAC;AAC1B,MAAI,SAAS;AAEb,SAAO,SAAS,iBAAiB;AAC/B,UAAM,OAAO,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AACrD,QAAI,CAAC,MAAM;AACT,YAAM,IAAI;AAAA,QACR,+CAA+C,MAAM,OAAO,eAAe,aAC9D,MAAM,QAAQ,SAAS,CAAC;AAAA,MACvC;AAAA,IACF;AACA,QAAI,KAAK,MAAM,KAAK,MAAM;AACxB,YAAM,IAAI;AAAA,QACR,sBAAsB,KAAK,WAAW,UAAU,KAAK,IAAI,QAAQ,KAAK,EAAE;AAAA,MAC1E;AAAA,IACF;AACA,UAAM,KAAK,IAAI,UAAU;AACzB,QAAI,KAAK,IAAI;AACb,aAAS,KAAK;AAAA,EAChB;AAEA,MAAI,WAAW,iBAAiB;AAC9B,UAAM,IAAI;AAAA,MACR,6BAA6B,MAAM,eAAe,eAAe;AAAA,IACnE;AAAA,EACF;AAEA,SAAO,EAAE,IAAI;AACf;;;AF1EA,IAAM,0BAA0B;AAEhC,IAAM,oBAAoB,CAAC,eACzB,KAAK,YAAY,uBAAuB;AAE1C,IAAM,uBAAuB,CAAC,QAC5B,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU;AA8BvD,eAAsB,mBAAmB,YAAoB,SAAgC;AAC3F,MAAI,CAAC,OAAO,UAAU,OAAO,KAAK,WAAW,GAAG;AAC9C,UAAM,IAAI,MAAM,kDAAkD,OAAO,EAAE;AAAA,EAC7E;AACA,QAAM,UAAU,kBAAkB,UAAU,GAAG,GAAG,OAAO;AAAA,GAAM,MAAM;AACvE;AAEA,eAAe,qBACb,YACkE;AAClE,QAAME,SAAO,kBAAkB,UAAU;AACzC,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,SAASA,QAAM,MAAM;AAAA,EACnC,SAAS,KAAK;AACZ,QAAI,qBAAqB,GAAG,KAAK,IAAI,SAAS,UAAU;AACtD,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B;AACA,UAAM;AAAA,EACR;AAEA,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,YAAY,MAAM,CAAC,QAAQ,KAAK,OAAO,GAAG;AAC5C,UAAM,IAAI;AAAA,MACR,6BAA6BA,MAAI,0CAA0C,KAAK,UAAU,GAAG,CAAC;AAAA,IAChG;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,OAAO;AAC7B,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,6BAA6BA,MAAI,0CAA0C,KAAK,UAAU,GAAG,CAAC;AAAA,IAChG;AAAA,EACF;AACA,SAAO,EAAE,SAAS,MAAM,SAAS,OAAO;AAC1C;AAcA,eAAsB,oBAAoB,YAKvC;AACD,QAAM,MAAM,MAAM,qBAAqB,UAAU;AAEjD,MAAI,CAAC,IAAI,SAAS;AAChB,UAAM,mBAAmB,YAAY,eAAe;AACpD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,KAAK,CAAC;AAAA,IACR;AAAA,EACF;AAEA,QAAM,SAAS,IAAI;AAEnB,MAAI,WAAW,iBAAiB;AAC9B,WAAO,EAAE,QAAQ,OAAO,QAAQ,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,EAC3D;AAEA,QAAM,EAAE,IAAI,IAAI,MAAM,cAAc,YAAY,MAAM;AACtD,QAAM,mBAAmB,YAAY,eAAe;AAEpD,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,UAAU,IAAI,SAAS;AAAA,IACvB,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,aAAa,EAAE,YAAY,EAAE;AAAA,EAC9E;AACF;;;AGlHA,SAAS,YAAY,WAAW;AAChC,OAAO,cAAc;AACrB,SAAS,SAAS,iBAAiB;AACnC,OAAOC,SAAQ;AAGR,IAAM,YAAY;AAClB,IAAM,mBAAmB;AAEhC,SAAS,QAAQ,WAA4B,QAAQ,UAAmB;AACtE,SAAO,aAAa;AACtB;AAEA,SAAS,iBAAiB,MAMxB;AACA,QAAMC,OAAK,KAAK,MAAM;AACtB,QAAMC,SAAQ,KAAK,SAAS;AAC5B,QAAM,UAAU,KAAK,OAAO,WAAWF,IAAG,QAAQ;AAClD,QAAM,QACJ,KAAK,SACJ;AAAA,IACC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,EACF;AACF,QAAM,WAAW,KAAK,YAAY,QAAQ,KAAK,CAAC,KAAK;AACrD,SAAO,EAAE,IAAAC,MAAI,OAAAC,QAAO,OAAO,UAAU,UAAU,QAAQ,SAAS;AAClE;AAEO,SAAS,WAAW,SAAyB;AAClD,SAAO,SAAS,KAAK,SAAS,WAAW,WAAW,MAAM;AAC5D;AAEO,SAAS,YAAY,SAAyB;AACnD,SAAO,SAAS,KAAK,WAAW,OAAO,GAAG,SAAS;AACrD;AASO,SAAS,WAAW,MAA2B;AACpD,QAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,QAAM,OAAO,CAAC,OAAO,OAAO;AAC5B,MAAI,KAAK,SAAS,QAAW;AAC3B,SAAK,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC;AAAA,EACvC;AAIA,QAAM,YAAY;AAAA,IAChB,cAAc,IAAI;AAAA,IAClB,cAAc,KAAK,QAAQ;AAAA,IAC3B,GAAG;AAAA,EACL,EAAE,KAAK,GAAG;AACV,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,CAAC,KAAK,KAAK,KAAK,EAAG,QAAO;AAG9B,QAAM,UAAU,MAAM,QAAQ,OAAO,MAAM,EAAE,QAAQ,MAAM,KAAK;AAChE,SAAO,IAAI,OAAO;AACpB;AAGA,SAAS,QACPA,QACA,KACA,MACsE;AACtE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI;AACF,YAAM,QAAQA,OAAM,KAAK,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACpE,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAI,CAAC;AAAA,MACjD,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAa,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAMA,eAAsB,aAAa,OAAkB,CAAC,GAAqB;AACzE,QAAM,EAAE,OAAAA,QAAO,SAAS,IAAI,iBAAiB,IAAI;AACjD,MAAI,CAAC,QAAQ,QAAQ,EAAG,QAAO;AAC/B,QAAM,SAAS,MAAM,QAAQA,QAAO,aAAa;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,WAAY,QAAO;AAC9B,SAAO,OAAO,SAAS;AACzB;AAcA,eAAsB,uBACpB,OAAkB,CAAC,GACnB,OAAkC,CAAC,GACd;AACrB,QAAM,EAAE,IAAAD,MAAI,OAAAC,QAAO,OAAO,UAAU,SAAS,IAAI,iBAAiB,IAAI;AACtE,MAAI,CAAC,QAAQ,QAAQ,GAAG;AACtB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,oEAAoE,QAAQ;AAAA,IACvF;AAAA,EACF;AACA,QAAM,UAAU,WAAW,MAAM,OAAO;AACxC,QAAM,WAAW,YAAY,MAAM,OAAO;AAC1C,QAAM,UAAU,WAAW,EAAE,UAAU,MAAM,KAAK,KAAK,CAAC;AAExD,MAAI;AACF,UAAMD,KAAG,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAC3C,QAAI,WAA0B;AAC9B,QAAI;AACF,iBAAW,MAAMA,KAAG,SAAS,UAAU,MAAM;AAAA,IAC/C,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,IAC9D;AACA,UAAM,YAAY,aAAa;AAC/B,QAAI,CAAC,WAAW;AACd,YAAMA,KAAG,UAAU,UAAU,SAAS,MAAM;AAAA,IAC9C;AAEA,UAAM,SAAS,MAAM,QAAQC,QAAO,aAAa;AAAA,MAC/C;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,YAAY;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,SAAS,QAAQ,sCAAsC,OAAO,WAAW,OAAO,4EAA4E,SAAS;AAAA,MAChL;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,yCAAyC,OAAO,QAAQ,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,MAChG;AAAA,IACF;AAYA,QAAI;AACJ,QAAI;AACF,mBAAaF,IAAG,SAAS,EAAE;AAAA,IAC7B,QAAQ;AACN,mBAAa;AAAA,IACf;AACA,UAAM,SAAS,MAAM,QAAQE,QAAO,YAAY;AAAA,MAC9C;AAAA,MACA,GAAI,aAAa,CAAC,UAAU,IAAI,CAAC;AAAA,IACnC,CAAC;AACD,UAAM,gBAAgB,CAAC,OAAO,cAAc,OAAO,SAAS;AAE5D,UAAM,SAAS,MAAM,QAAQA,QAAO,aAAa;AAAA,MAC/C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,YAAY;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,iCAAiC,SAAS,qBAAqB,OAAO,WAAW,OAAO;AAAA,MACjG;AAAA,IACF;AACA,QAAI,OAAO,SAAS,GAAG;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,iCAAiC,SAAS,WAAW,OAAO,QAAQ,MAAM,KAAK,OAAO,OAAO,KAAK,CAAC;AAAA,MAC5G;AAAA,IACF;AAEA,UAAM,SAAS,YAAY,cAAc;AACzC,UAAM,YAAY,yBAAyB,aAAa,IAAI,UAAU,KAAK,EAAE;AAC7E,UAAM,aAAa,gBACf,kEACA,iDAAiD,SAAS;AAC9D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,CAAC;AAAA,MACP,SAAS,gBAAgB,MAAM,OAAO,QAAQ,gBAAgB,UAAU;AAAA,IAC1E;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAMA,eAAsB,qBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAD,MAAI,OAAAC,QAAO,OAAO,SAAS,IAAI,iBAAiB,IAAI;AAC5D,MAAI,CAAC,QAAQ,QAAQ,GAAG;AACtB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,oEAAoE,QAAQ;AAAA,IACvF;AAAA,EACF;AACA,QAAM,WAAW,YAAY,MAAM,OAAO;AAC1C,MAAI;AACF,QAAI,UAAU;AACd,QAAI;AACF,YAAMD,KAAG,KAAK,QAAQ;AAAA,IACxB,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,WAAU;AAAA,UAC3D,OAAM;AAAA,IACb;AACA,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,sBAAsB,QAAQ;AAAA,MACzC;AAAA,IACF;AACA,UAAM,UAAU,MAAM,QAAQC,QAAO,aAAa;AAAA,MAChD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,YAAY;AAEtB,YAAMD,KAAG,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AACrC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,WAAW,QAAQ,4BAA4B,QAAQ,WAAW,OAAO;AAAA,MACpF;AAAA,IACF;AAEA,UAAMA,KAAG,GAAG,UAAU,EAAE,OAAO,KAAK,CAAC;AACrC,UAAM,SAAS,MAAM,QAAQC,QAAO,aAAa;AAAA,MAC/C;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,OAAO,SAAS,KAAK,CAAC,OAAO,YAAY;AAC3C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,WAAW,QAAQ,0BAA0B,OAAO,QAAQ,MAAM;AAAA,MAC7E;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,wBAAwB,QAAQ;AAAA,IAC3C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;;;ACrVA,SAAS,YAAYC,YAAW;AAChC,OAAOC,eAAc;AACrB,SAAS,SAASC,kBAAiB;AACnC,OAAOC,SAAQ;AAIR,IAAM,cAAc;AACpB,IAAM,aAAa,GAAG,WAAW;AAExC,SAAS,SAAS,WAA4B,QAAQ,UAAmB;AACvE,SAAO,aAAa;AACtB;AAEA,SAASC,kBAAiB,MAOxB;AACA,QAAMC,OAAK,KAAK,MAAMC;AACtB,QAAMC,SAAQ,KAAK,SAASC;AAC5B,QAAM,UAAU,KAAK,OAAO,WAAWC,IAAG,QAAQ;AAClD,QAAM,QACJ,KAAK,SACJ;AAAA,IACC,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ;AAAA,EACF;AACF,QAAM,WAAW,KAAK,YAAY,QAAQ,KAAK,CAAC,KAAK;AACrD,QAAM,MAAM,QAAQ,SAAS,KAAK;AAClC,SAAO,EAAE,IAAAJ,MAAI,OAAAE,QAAO,OAAO,UAAU,KAAK,UAAU,QAAQ,SAAS;AACvE;AAEO,SAAS,YAAY,SAAyB;AACnD,SAAOG,UAAS,KAAK,SAAS,WAAW,cAAc;AACzD;AAEO,SAAS,aAAa,SAAyB;AACpD,SAAOA,UAAS,KAAK,YAAY,OAAO,GAAG,UAAU;AACvD;AAEA,SAAS,UAAU,SAAyB;AAC1C,SAAOA,UAAS,KAAK,SAAS,WAAW,QAAQ,aAAa;AAChE;AAGA,SAAS,cAAc,KAAqB;AAC1C,SAAO,OAAO,GAAG,IAAI,WAAW;AAClC;AAEA,SAAS,UAAU,OAAuB;AACxC,SAAO,MACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACzB;AAUO,SAAS,YAAY,MAA4B;AACtD,QAAM,OAAO,KAAK,WAAW,QAAQ;AACrC,QAAM,OAAO,CAAC,MAAM,KAAK,UAAU,OAAO,OAAO;AACjD,MAAI,KAAK,SAAS,OAAW,MAAK,KAAK,UAAU,OAAO,KAAK,IAAI,CAAC;AAClE,QAAM,SAAS,UAAU,KAAK,OAAO;AACrC,QAAM,cAAc,KACjB,IAAI,CAAC,MAAM,eAAe,UAAU,CAAC,CAAC,WAAW,EACjD,KAAK,IAAI;AACZ,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,WAAW;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,UAAUA,UAAS,KAAK,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA,aAAa,UAAUA,UAAS,KAAK,QAAQ,gBAAgB,CAAC,CAAC;AAAA,IAC/D;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAGA,SAASC,SACPJ,QACA,KACA,MACsE;AACtE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI;AACF,YAAM,QAAQA,OAAM,KAAK,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACpE,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAI,CAAC;AAAA,MACjD,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAa,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAMA,eAAsB,cAAc,OAAkB,CAAC,GAAqB;AAC1E,QAAM,EAAE,OAAAA,QAAO,KAAK,SAAS,IAAIH,kBAAiB,IAAI;AACtD,MAAI,CAAC,SAAS,QAAQ,EAAG,QAAO;AAChC,QAAM,SAAS,MAAMO,SAAQJ,QAAO,aAAa;AAAA,IAC/C;AAAA,IACA,cAAc,GAAG;AAAA,EACnB,CAAC;AACD,MAAI,OAAO,WAAY,QAAO;AAC9B,SAAO,OAAO,SAAS;AACzB;AAcA,eAAsB,mBACpB,OAAkB,CAAC,GACnB,OAAkC,CAAC,GACd;AACrB,QAAM,EAAE,IAAAF,MAAI,OAAAE,QAAO,OAAO,UAAU,KAAK,SAAS,IAAIH,kBAAiB,IAAI;AAC3E,MAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,oEAAoE,QAAQ;AAAA,IACvF;AAAA,EACF;AACA,QAAM,YAAY,aAAa,MAAM,OAAO;AAC5C,QAAM,UAAU,YAAY,EAAE,UAAU,SAAS,MAAM,SAAS,MAAM,KAAK,KAAK,CAAC;AAEjF,MAAI;AACF,UAAMC,KAAG,MAAM,YAAY,MAAM,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC9D,UAAMA,KAAG,MAAM,UAAU,MAAM,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAE5D,QAAI,WAA0B;AAC9B,QAAI;AACF,iBAAW,MAAMA,KAAG,SAAS,WAAW,MAAM;AAAA,IAChD,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,IAC9D;AACA,UAAM,YAAY,aAAa;AAC/B,QAAI,aAAc,MAAM,cAAc,IAAI,GAAI;AAC5C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,qCAAqC,SAAS;AAAA,MACzD;AAAA,IACF;AACA,QAAI,CAAC,WAAW;AACd,YAAMA,KAAG,UAAU,WAAW,SAAS,MAAM;AAAA,IAC/C;AAIA,UAAM,UAAU,MAAMM,SAAQJ,QAAO,aAAa;AAAA,MAChD;AAAA,MACA,cAAc,GAAG;AAAA,IACnB,CAAC;AACD,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,SAAS,SAAS,sCAAsC,QAAQ,WAAW,OAAO,sDAAsD,GAAG,IAAI,SAAS;AAAA,MACnK;AAAA,IACF;AAEA,UAAM,YAAY,MAAMI,SAAQJ,QAAO,aAAa;AAAA,MAClD;AAAA,MACA,OAAO,GAAG;AAAA,MACV;AAAA,IACF,CAAC;AACD,QAAI,UAAU,YAAY;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,wCAAwC,UAAU,WAAW,OAAO;AAAA,MAC7E;AAAA,IACF;AACA,QAAI,UAAU,SAAS,GAAG;AACxB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,OAAO,2BAA2B,GAAG,WAAW,UAAU,QAAQ,MAAM,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,MACtG;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,8BAA8B,SAAS;AAAA,IAClD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAMA,eAAsB,qBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAF,MAAI,OAAAE,QAAO,OAAO,KAAK,SAAS,IAAIH,kBAAiB,IAAI;AACjE,MAAI,CAAC,SAAS,QAAQ,GAAG;AACvB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,oEAAoE,QAAQ;AAAA,IACvF;AAAA,EACF;AACA,QAAM,YAAY,aAAa,MAAM,OAAO;AAC5C,MAAI;AACF,QAAI,UAAU;AACd,QAAI;AACF,YAAMC,KAAG,KAAK,SAAS;AAAA,IACzB,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,WAAU;AAAA,UAC3D,OAAM;AAAA,IACb;AACA,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,uBAAuB,SAAS;AAAA,MAC3C;AAAA,IACF;AAEA,UAAM,UAAU,MAAMM,SAAQJ,QAAO,aAAa;AAAA,MAChD;AAAA,MACA,cAAc,GAAG;AAAA,IACnB,CAAC;AACD,UAAMF,KAAG,GAAG,WAAW,EAAE,OAAO,KAAK,CAAC;AACtC,QAAI,QAAQ,YAAY;AACtB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,WAAW,SAAS,4BAA4B,QAAQ,WAAW,OAAO;AAAA,MACrF;AAAA,IACF;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,0BAA0B,SAAS;AAAA,IAC9C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;;;AClSA,IAAM,oBAAgC;AAAA,EACpC,MAAM;AAAA,EACN,eACE;AAAA,EACF,iBACE;AAAA,EACF,YAAY,iCAAiC,SAAS;AAAA,EACtD,SAAS,CAAC,MAAM,SAAS,uBAAuB,MAAM,IAAI;AAAA,EAC1D,WAAW,CAAC,SAAS,qBAAqB,IAAI;AAAA,EAC9C,UAAU,CAAC,SAAS,aAAa,IAAI;AACvC;AAEA,IAAM,oBAAgC;AAAA,EACpC,MAAM;AAAA,EACN,eACE;AAAA,EACF,iBAAiB,0CAA0C,WAAW;AAAA,EACtE,YAAY,2DAA2D,WAAW;AAAA,EAClF,SAAS,CAAC,MAAM,SAAS,mBAAmB,MAAM,IAAI;AAAA,EACtD,WAAW,CAAC,SAAS,qBAAqB,IAAI;AAAA,EAC9C,UAAU,CAAC,SAAS,cAAc,IAAI;AACxC;AAGO,SAAS,cACd,WAA4B,QAAQ,UACjB;AACnB,MAAI,aAAa,QAAS,QAAO;AACjC,MAAI,aAAa,SAAU,QAAO;AAClC,SAAO;AACT;;;AN3CA,SAAS,eAAuB;AAC9B,MAAI,SAASO,UAAS,QAAQC,eAAc,YAAY,GAAG,CAAC;AAC5D,WAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AACtC,QAAI,WAAWD,UAAS,KAAK,QAAQ,cAAc,CAAC,EAAG,QAAO;AAC9D,UAAM,SAASA,UAAS,QAAQ,MAAM;AACtC,QAAI,WAAW,OAAQ;AACvB,aAAS;AAAA,EACX;AAEA,SAAOA,UAAS;AAAA,IACdA,UAAS,QAAQC,eAAc,YAAY,GAAG,CAAC;AAAA,IAC/C;AAAA,IACA;AAAA,EACF;AACF;AAwCA,SAAS,YAAY,MAOnB;AACA,QAAMC,OAAK,KAAK,MAAMC;AACtB,QAAMC,SAAQ,KAAK,SAASC;AAC5B,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,UAAU,KAAK,OAAO,WAAWC,IAAG,QAAQ;AAClD,QAAM,QAAmB,KAAK,SAAS;AAAA,IACrC,YAAY,cAAc;AAAA,IAC1B,WAAW,aAAa;AAAA,IACxB,YAAY,cAAc;AAAA,IAC1B;AAAA,EACF;AAKA,QAAM,WAAW,KAAK,YAAY,aAAa;AAC/C,QAAM,WAAW,KAAK,YAAY,QAAQ,KAAK,CAAC,KAAK;AACrD,SAAO;AAAA,IACL,IAAAJ;AAAA,IACA,OAAAE;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,KAAK,OAAO;AAAA,IACjB,QAAQ,KAAK,UAAU;AAAA,IACvB;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,kBAAkB;AACxB,IAAM,qBAAqB;AAC3B,IAAM,cAAc;AACpB,IAAM,cAAc;AACpB,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,WAAW;AACjB,IAAM,cAAc;AACpB,IAAM,cAAc;AAepB,IAAM,iBAAiB;AAEvB,SAAS,eAAe,SAAyB;AAC/C,QAAM,UAAU,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAC7D,QAAM,QAAQ,OAAO,QAAQ,MAAM,GAAG,EAAE,CAAC,CAAC;AAC1C,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,eAAsB,cAAc,OAAkB,CAAC,GAAwB;AAC7E,OAAK;AACL,QAAM,QAAQ,eAAe,QAAQ,SAAS,IAAI;AAClD,MAAI,QAAQ,gBAAgB;AAC1B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO,QAAQ,cAAc,sBAAsB,QAAQ,SAAS,IAAI;AAAA,IAC1E;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,SAAS,QAAQ,SAAS,IAAI;AAAA,EACzC;AACF;AAEA,eAAe,UACbG,MACA,KAC+B;AAC/B,MAAI;AACF,UAAM,OAAO,MAAMA,KAAG,KAAK,GAAG;AAC9B,QAAI,KAAK,YAAY,EAAG,QAAO,EAAE,SAAS,MAAM;AAChD,UAAM,IAAI,MAAM,GAAG,GAAG,gCAAgC;AAAA,EACxD,SAAS,KAAK;AACZ,UAAM,OAAQ,IAA8B;AAC5C,QAAI,SAAS,SAAU,OAAM;AAAA,EAC/B;AACA,QAAMA,KAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC,SAAO,EAAE,SAAS,KAAK;AACzB;AAEA,eAAsB,qBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAA,MAAI,MAAM,IAAI,YAAY,IAAI;AACtC,MAAI;AACF,UAAM,UAAoB,CAAC;AAC3B,eAAW,OAAO,CAAC,MAAM,YAAY,MAAM,WAAW,MAAM,UAAU,GAAG;AACvE,YAAM,EAAE,SAAS,UAAU,IAAI,MAAM,UAAUA,MAAI,GAAG;AACtD,UAAI,UAAW,SAAQ,KAAK,GAAG;AAAA,IACjC;AACA,UAAM,UACJ,QAAQ,WAAW,IACf,6CACA,WAAW,QAAQ,MAAM;AAC/B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,QAAQ,SAAS;AAAA,MACvB;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAEA,eAAsB,uBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,MAAM,IAAI,YAAY,IAAI;AAClC,MAAI;AACF,UAAM,SAAS,MAAM,oBAAoB,MAAM,UAAU;AACzD,UAAM,UAAU,OAAO,WACnB,aAAa,OAAO,MAAM,QAAQ,OAAO,KAAK,KAC9C,cAAc,OAAO,KAAK;AAC9B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,MACb;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAEA,IAAM,cAAc;AAAA,EAClB,WAAW;AAAA,IACT,aAAa,CAAC;AAAA,IACd,YAAY,CAAC;AAAA,IACb,cAAc;AAAA,EAChB;AACF;AAEA,eAAsB,oBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAA,MAAI,OAAO,OAAO,IAAI,YAAY,IAAI;AAC9C,QAAM,aAAaC,UAAS,KAAK,MAAM,YAAY,aAAa;AAChE,MAAI;AACF,UAAM,UAAUD,MAAI,MAAM,UAAU;AACpC,QAAIE,UAAS;AACb,QAAI;AACF,YAAMF,KAAG,KAAK,UAAU;AACxB,MAAAE,UAAS;AAAA,IACX,SAAS,KAAK;AACZ,UAAK,IAA8B,SAAS,SAAU,OAAM;AAAA,IAC9D;AACA,QAAIA,WAAU,CAAC,QAAQ;AACrB,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,oBAAoB,UAAU;AAAA,MACzC;AAAA,IACF;AACA,UAAMF,KAAG,UAAU,YAAY,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI,MAAM,MAAM;AAClF,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,wBAAwB,UAAU;AAAA,IAC7C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAEA,eAAeG,YAAWH,MAAgB,GAA6B;AACrE,MAAI;AACF,UAAMA,KAAG,KAAK,CAAC;AACf,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,QAAK,IAA8B,SAAS,SAAU,QAAO;AAC7D,UAAM;AAAA,EACR;AACF;AAEA,eAAe,SACbA,MACA,KACA,MACe;AAGf,QAAM,KAAMA,KAAW;AAGvB,MAAI,IAAI;AACN,UAAM,GAAG,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AACvC;AAAA,EACF;AAEA,QAAMA,KAAG,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACxC,QAAM,UAAU,MAAMA,KAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAOC,UAAS,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,KAAKA,UAAS,KAAK,MAAM,MAAM,IAAI;AACzC,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,SAASD,MAAI,MAAM,EAAE;AAAA,IAC7B,OAAO;AACL,YAAMA,KAAG,SAAS,MAAM,EAAE;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,eAAsB,iBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAA,MAAI,OAAO,SAAS,IAAI,YAAY,IAAI;AAChD,QAAM,YAAYC,UAAS,KAAK,MAAM,SAAS,WAAW,UAAU,aAAa;AACjF,QAAM,eAAeA,UAAS,KAAK,WAAW,UAAU;AACxD,QAAM,YAAYA,UAAS,KAAK,UAAU,OAAO;AACjD,MAAI;AACF,QAAI,MAAME,YAAWH,MAAI,YAAY,GAAG;AACtC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,8BAA8B,SAAS;AAAA,MAClD;AAAA,IACF;AACA,QAAI,CAAE,MAAMG,YAAWH,MAAI,SAAS,GAAI;AACtC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,6BAA6B,SAAS;AAAA,MACjD;AAAA,IACF;AACA,UAAMA,KAAG,MAAMC,UAAS,QAAQ,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/D,UAAM,SAASD,MAAI,WAAW,SAAS;AACvC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sBAAsB,SAAS;AAAA,IAC1C;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAEA,eAAsB,mBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAA,MAAI,OAAO,SAAS,IAAI,YAAY,IAAI;AAChD,QAAM,YAAYC,UAAS,KAAK,MAAM,SAAS,WAAW,UAAU;AACpE,QAAM,SAASA,UAAS,KAAK,WAAW,cAAc;AACtD,QAAM,SAASA,UAAS,KAAK,UAAU,mBAAmB,cAAc;AACxE,MAAI;AACF,QAAI,CAAE,MAAME,YAAWH,MAAI,MAAM,GAAI;AACnC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,+BAA+B,MAAM;AAAA,MAChD;AAAA,IACF;AACA,UAAMA,KAAG,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;AAG7C,UAAMA,KAAG,SAAS,QAAQ,MAAM;AAChC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,mCAAmC,MAAM;AAAA,IACpD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAQ,IAAc;AAAA,IACxB;AAAA,EACF;AACF;AAGA,SAASI,SACPC,QACA,KACA,MACsE;AACtE,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,QAAI,SAAS;AACb,QAAI,UAAU;AACd,QAAI;AACF,YAAM,QAAQA,OAAM,KAAK,MAAM,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AACpE,YAAM,QAAQ,GAAG,QAAQ,CAAC,UAA2B;AACnD,kBAAU,MAAM,SAAS;AAAA,MAC3B,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAI,CAAC;AAAA,MACjD,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,YAAI,QAAS;AACb,kBAAU;AACV,gBAAQ,EAAE,MAAM,OAAO,CAAC;AAAA,MAC1B,CAAC;AAAA,IACH,SAAS,KAAK;AACZ,UAAI,QAAS;AACb,gBAAU;AACV,cAAQ,EAAE,MAAM,MAAM,QAAQ,YAAY,IAAa,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAEA,IAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7B,eAAsB,gBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,OAAAA,OAAM,IAAI,YAAY,IAAI;AAClC,QAAM,SAAS,MAAMD,SAAQC,QAAO,UAAU;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,cAAe,OAAO,WAAqC,SAAS,UAAU;AACvF,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SACE,6EACA;AAAA,IACJ;AAAA,EACF;AACA,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,6BAA6B,OAAO,WAAW,OAAO;AAAA,IACjE;AAAA,EACF;AACA,MAAI,OAAO,SAAS,GAAG;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SACE,mCAAmC,OAAO,QAAQ,MAAM;AAAA,IAExD;AAAA,EACJ;AACF;AAOA,eAAsB,gBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,SAAS,IAAI,IAAI,YAAY,IAAI;AACzC,QAAM,aAAa,cAAc;AACjC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,mDAAmD,QAAQ,QAAQ;AAAA,IAC9E;AAAA,EACF;AACA,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,MACnC,SAAS,WAAW;AAAA,MACpB,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,QAAQ,SAAS,MAAM,KAAK,WAAW,MAAM;AAC/C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AAMA,QAAM,SAAS,MAAM,WAAW,QAAQ,IAAI;AAC5C,MAAI,CAAC,OAAO,IAAI;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,mCAAmC,OAAO,KAAK,YAAY,WAAW,UAAU;AAAA,IAC3F;AAAA,EACF;AACA,SAAO;AACT;AAGA,eAAsB,gBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,OAAAA,QAAO,SAAS,KAAK,SAAS,IAAI,YAAY,IAAI;AAI1D,QAAM,aAAa,cAAc;AACjC,MAAI,cAAe,MAAM,WAAW,SAAS,IAAI,GAAI;AACnD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,gCAAgC,WAAW,IAAI;AAAA,IAC1D;AAAA,EACF;AACA,MAAI,CAAC,KAAK;AACR,UAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,MACnC,SAAS;AAAA,MACT,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,QAAQ,SAAS,MAAM,KAAK,WAAW,MAAM;AAC/C,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF,OAAO;AACL,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI;AACF,UAAM,QAAQA,OAAM,QAAQ,UAAU,CAAC,UAAU,OAAO,SAAS,UAAU,GAAG;AAAA,MAC5E,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,UAAM,QAAQ;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,wBAAwB,MAAM,OAAO,SAAS;AAAA,IACzD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,0BAA2B,IAAc,OAAO;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,eAAsB,cACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,SAAS,KAAK,MAAM,IAAI,YAAY,IAAI;AAChD,MAAI,KAAK;AACP,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SACE,oDAAoD,MAAM,UAAU;AAAA,IAExE;AAAA,EACF;AACA,QAAM,SAAS,MAAM,QAAQ,QAAQ;AAAA,IACnC,SAAS;AAAA,IACT,cAAc;AAAA,EAChB,CAAC;AACD,MAAI,QAAQ,SAAS,MAAM,KAAK,WAAW,MAAM;AAC/C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SACE,+CAA+C,MAAM,UAAU;AAAA,IAEnE;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SACE,qBAAqB,MAAM,UAAU;AAAA,EAEzC;AACF;AAcA,eAAsB,SAAS,OAAkB,CAAC,GAAyB;AACzE,QAAM,SAAS;AACf,QAAM,QAA8B,CAAC;AACrC,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,QAAQ,SAAS;AAC1B,UAAM,SAAS,MAAM,KAAK,IAAI;AAC9B,QAAI,OAAO,IAAI;AACb,YAAM,KAAK;AAAA,QACT,MAAM,OAAO;AAAA,QACb,IAAI;AAAA,QACJ,MAAM,OAAO;AAAA,QACb,SAAS,OAAO;AAAA,MAClB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,KAAK,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,OAAO,OAAO,MAAM,CAAC;AAChE;AAAA,IACF;AAAA,EACF;AACA,SAAO,EAAE,QAAQ,MAAM;AACzB;AASA,eAAe,YACb,SACA,KACA,SACA,UAAU,MACQ;AAClB,MAAI,IAAK,QAAO;AAChB,QAAM,SAAS,MAAM,QAAQ,QAAQ,EAAE,SAAS,cAAc,QAAQ,CAAC;AACvE,MAAI,QAAQ,SAAS,MAAM,EAAG,QAAO;AACrC,SAAO,WAAW;AACpB;AAEA,eAAsB,eAAe,OAAkB,CAAC,GAAwB;AAC9E,QAAM,EAAE,IAAAL,MAAI,MAAM,IAAI,YAAY,IAAI;AACtC,QAAM,SAASC,UAAS,KAAK,MAAM,SAAS,WAAW,UAAU,aAAa;AAC9E,MAAI;AACF,QAAI,CAAE,MAAME,YAAWH,MAAI,MAAM,GAAI;AACnC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,wBAAwB,MAAM;AAAA,MACzC;AAAA,IACF;AACA,UAAMA,KAAG,GAAG,QAAQ,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACpD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,sBAAsB,MAAM;AAAA,IACvC;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,MAAM,YAAY,OAAQ,IAAc,QAAQ;AAAA,EACtE;AACF;AAEA,eAAsB,iBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,IAAAA,MAAI,MAAM,IAAI,YAAY,IAAI;AACtC,QAAM,SAASC,UAAS;AAAA,IACtB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI;AACF,QAAI,CAAE,MAAME,YAAWH,MAAI,MAAM,GAAI;AACnC,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,0BAA0B,MAAM;AAAA,MAC3C;AAAA,IACF;AACA,UAAMA,KAAG,GAAG,QAAQ,EAAE,OAAO,KAAK,CAAC;AACnC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,mCAAmC,MAAM;AAAA,IACpD;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,EAAE,IAAI,OAAO,MAAM,cAAc,OAAQ,IAAc,QAAQ;AAAA,EACxE;AACF;AAEA,eAAsB,oBACpB,OAAkB,CAAC,GACE;AACrB,QAAM,EAAE,OAAAK,QAAO,SAAS,IAAI,YAAY,IAAI;AAC5C,QAAM,SAAS,MAAMD,SAAQC,QAAO,QAAQ,UAAU,CAAC,UAAU,OAAO,MAAM,CAAC;AAC/E,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,wBAAwB,OAAO,WAAW,OAAO;AAAA,IAC5D;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO,SAAS;AAAA,IACtB,SACE,OAAO,SAAS,IACZ,mBACA,sBAAsB,OAAO,QAAQ,MAAM;AAAA,EACnD;AACF;AAEA,eAAsB,aAAa,OAAkB,CAAC,GAAwB;AAC5E,QAAM,EAAE,OAAAA,OAAM,IAAI,YAAY,IAAI;AAClC,QAAM,SAAS,MAAMD,SAAQC,QAAO,UAAU;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,OAAO,cAAe,OAAO,WAAqC,SAAS,UAAU;AACvF,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,EACF;AACA,MAAI,OAAO,YAAY;AACrB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,2BAA2B,OAAO,WAAW,OAAO;AAAA,IAC/D;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,MAAM,OAAO,SAAS;AAAA,IACtB,SACE,OAAO,SAAS,IACZ,6CACA,sCAAsC,OAAO,QAAQ,MAAM;AAAA,EACnE;AACF;AAEA,eAAsB,aAAa,OAAkB,CAAC,GAA6B;AACjF,QAAM,WAAW,YAAY,IAAI;AACjC,QAAM,QAAkC,CAAC;AAEzC,QAAM,YAAY,MAAM;AAAA,IACtB,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACA,MAAI,WAAW;AACb,UAAM,IAAI,MAAM,eAAe,IAAI;AACnC,UAAM,KAAK;AAAA,MACT,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,KAAK,EAAE,OAAO;AAAA,MACtB,GAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,IACvD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK,EAAE,MAAM,YAAY,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA,EAClE;AAEA,QAAM,cAAc,MAAM;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACA,MAAI,aAAa;AACf,UAAM,IAAI,MAAM,iBAAiB,IAAI;AACrC,UAAM,KAAK;AAAA,MACT,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,KAAK,EAAE,OAAO;AAAA,MACtB,GAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,IACvD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK,EAAE,MAAM,cAAc,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA,EACpE;AAEA,QAAM,aAAa,cAAc;AACjC,MAAI,YAAY;AACd,UAAM,kBAAkB,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,MACT,WAAW;AAAA,IACb;AACA,QAAI,iBAAiB;AACnB,YAAM,IAAI,MAAM,WAAW,UAAU,IAAI;AACzC,YAAM,KAAK;AAAA,QACT,MAAM,EAAE;AAAA,QACR,MAAM,EAAE,KAAK,EAAE,OAAO;AAAA,QACtB,GAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,MACvD,CAAC;AAAA,IACH,OAAO;AACL,YAAM,KAAK,EAAE,MAAM,kBAAkB,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA,IACxE;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AAAA,IACvB,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACA,MAAI,YAAY;AACd,UAAM,IAAI,MAAM,oBAAoB,IAAI;AACxC,UAAM,KAAK;AAAA,MACT,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,KAAK,EAAE,OAAO;AAAA,MACtB,GAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,IACvD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK,EAAE,MAAM,aAAa,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA,EACnE;AAEA,QAAM,UAAU,MAAM;AAAA,IACpB,SAAS;AAAA,IACT,SAAS;AAAA,IACT;AAAA,EACF;AACA,MAAI,SAAS;AACX,UAAM,IAAI,MAAM,aAAa,IAAI;AACjC,UAAM,KAAK;AAAA,MACT,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,KAAK,EAAE,OAAO;AAAA,MACtB,GAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,EAAE,OAAO,EAAE,MAAM;AAAA,IACvD,CAAC;AAAA,EACH,OAAO;AACL,UAAM,KAAK,EAAE,MAAM,UAAU,MAAM,OAAO,SAAS,UAAU,CAAC;AAAA,EAChE;AAEA,SAAO;AAAA,IACL;AAAA,IACA,uBAAuB,SAAS,MAAM;AAAA,EACxC;AACF;;;ADp3BA,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,QAAQA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,KAAKA,IAAE,QAAQ,EAAE,SAAS;AAC5B,CAAC;AAGD,IAAM,aAAaA,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO;AAAA,EACf,IAAIA,IAAE,QAAQ;AAAA,EACd,MAAMA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,IAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,QAAQA,IAAE,OAAO;AAAA,EACjB,OAAOA,IAAE,MAAM,UAAU;AAC3B,CAAC;AAGD,SAAS,UAAU,MAAqC;AACtD,MAAI,KAAK,IAAI;AACX,UAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,UAAM,MAAM,KAAK,WAAW;AAC5B,YAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,MAAM,WAAM,GAAG,KAAK,EAAE;AAAA,CAAI;AAAA,EAC1E,OAAO;AACL,UAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,YAAQ,OAAO,MAAM,KAAK,IAAI,IAAI,KAAK,IAAI,WAAM,KAAK,SAAS,QAAQ;AAAA,CAAI;AAAA,EAC7E;AACF;AAEA,IAAO,gBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,MACA,KAAK;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,SAAS,MAAM,KAAK,mBAAmB;AAC7C,QAAI,IAAI,WAAW,QAAQ;AACzB,cAAQ,OAAO,MAAM,SAAS,IAAI;AAAA,IACpC;AACA,UAAM,SAAS,MAAM,SAAS;AAAA,MAC5B,KAAK,KAAK,OAAO;AAAA,MACjB,QAAQ,KAAK,UAAU;AAAA,IACzB,CAAC;AACD,QAAI,IAAI,WAAW,QAAQ;AACzB,iBAAW,QAAQ,OAAO,MAAO,WAAU,IAAI;AAAA,IACjD;AACA,UAAM,SAAS,OAAO,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE;AAC7C,QAAI,QAAQ;AACV,YAAM,IAAI,MAAM,yBAAyB,OAAO,IAAI,MAAM,OAAO,KAAK,EAAE;AAAA,IAC1E;AACA,WAAO;AAAA,EACT;AACF,CAAC;;;AQjFD,SAAS,KAAAC,WAAS;AAWlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,KAAKA,IAAE,QAAQ,EAAE,SAAS;AAC5B,CAAC;AAGD,IAAMC,cAAaD,IAAE,OAAO;AAAA,EAC1B,MAAMA,IAAE,OAAO;AAAA,EACf,MAAMA,IAAE,QAAQ;AAAA,EAChB,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,IAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAME,iBAAeF,IAAE,OAAO;AAAA,EAC5B,OAAOA,IAAE,MAAMC,WAAU;AAAA,EACzB,uBAAuBD,IAAE,OAAO;AAClC,CAAC;AAGD,IAAO,oBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQG;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,KAAK;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,SAAS,MAAM,aAAa,EAAE,KAAK,KAAK,OAAO,MAAM,CAAC;AAC5D,QAAI,IAAI,WAAW,QAAQ;AACzB,iBAAW,QAAQ,OAAO,OAAO;AAC/B,cAAM,OAAO,KAAK,QAAQ,MAAM,IAAI,MAAM,IAAI,MAAM,MAAM,IAAI;AAC9D,cAAM,WAAW,KAAK,SAAS,KAAK,WAAW;AAC/C,gBAAQ,OAAO;AAAA,UACb,KAAK,IAAI,IAAI,KAAK,IAAI,GAAG,WAAW,WAAM,QAAQ,KAAK,EAAE;AAAA;AAAA,QAC3D;AAAA,MACF;AACA,cAAQ,OAAO;AAAA,QACb,OACE,MAAM;AAAA,UACJ,uBAAuB,OAAO,qBAAqB;AAAA,QAErD,IACA;AAAA,MACJ;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF,CAAC;;;ACjED,SAAS,KAAAC,WAAS;;;ACUlB,SAAS,YAAYC,YAAW;AAChC,OAAOC,eAAc;AACrB,OAAOC,SAAQ;AAwCf,IAAMC,qBAAoB;AAS1B,eAAeC,aAAY,MAA8C;AACvE,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAGD,kBAAiB;AACpE,UAAM,MAAM,MAAM,MAAM,oBAAoB,IAAI,WAAW;AAAA,MACzD,QAAQ,WAAW;AAAA,IACrB,CAAC;AACD,iBAAa,KAAK;AAClB,QAAI,CAAC,IAAI,GAAI,QAAO;AACpB,WAAQ,MAAM,IAAI,KAAK;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,qBAA2C;AACxD,QAAM,QAAQ,MAAM,YAAY;AAChC,MAAI,CAAC,MAAO,QAAO,EAAE,SAAS,OAAO,SAAS,MAAM;AACpD,QAAM,QAAQ,eAAe,MAAM,GAAG;AACtC,MAAI,CAAC,OAAO;AACV,WAAO,EAAE,SAAS,OAAO,SAAS,OAAO,KAAK,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK;AAAA,EACjF;AACA,QAAM,SAAS,MAAMC,aAAY,MAAM,KAAK,IAAI;AAChD,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS;AAAA,MACT,KAAK,OAAO;AAAA,MACZ,MAAM,OAAO;AAAA,MACb,SAAS,OAAO;AAAA,IAClB;AAAA,EACF;AACA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,IACT,KAAK,MAAM;AAAA,IACX,MAAM,MAAM,KAAK;AAAA,IACjB,SAAS,MAAM,KAAK;AAAA,EACtB;AACF;AAEA,eAAe,0BAGL;AACR,QAAM,aAAa,cAAc;AACjC,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,MAAM,WAAW,SAAS,CAAC,CAAC,EAAE;AACxE;AAEA,SAAS,WAAW,SAAyB;AAC3C,QAAM,QAAQ,aAAa,KAAK,OAAO;AACvC,SAAO,QAAQ,OAAO,MAAM,CAAC,CAAC,IAAI;AACpC;AAEA,eAAeC,YAAWC,MAAgB,QAAkC;AAC1E,MAAI;AACF,UAAMA,KAAG,OAAO,MAAM;AACtB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,IAAM,mBAAmB,CAAC,wBAAwB,aAAa;AAE/D,eAAe,kBACbA,MACA,SACkB;AAClB,QAAM,aAAaC,UAAS,KAAK,SAAS,cAAc;AACxD,MAAI;AACF,UAAM,MAAM,MAAMD,KAAG,SAAS,YAAY,MAAM;AAChD,UAAM,SAAS,KAAK,MAAM,GAAG;AAG7B,UAAM,UAAU,OAAO,cAAc,CAAC;AACtC,WAAO,iBAAiB,KAAK,CAAC,SAAS,QAAQ,QAAQ,IAAI,CAAC,CAAC;AAAA,EAC/D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,UAAU,MAAwC;AAC/D,QAAM,UAAU,KAAK,eAAe,QAAQ;AAC5C,QAAM,MAAM,KAAK,gBAAgB;AACjC,QAAM,QAAQ,WAAW,OAAO;AAChC,MAAI,SAAS,KAAK;AAChB,WAAO,EAAE,MAAM,QAAQ,QAAQ,MAAM,QAAQ,GAAG,OAAO,QAAQ,GAAG,IAAI;AAAA,EACxE;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,GAAG,OAAO,oCAAoC,GAAG;AAAA,EAC3D;AACF;AAEA,eAAe,gBAAgB,MAAwC;AACrE,QAAMA,OAAK,KAAK,MAAME;AACtB,QAAM,aAAa,KAAK,cAAc,cAAc;AACpD,MAAI,CAAE,MAAMH,YAAWC,MAAI,UAAU,GAAI;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,GAAG,UAAU;AAAA,IACvB;AAAA,EACF;AACA,QAAM,aAAaC,UAAS,KAAK,YAAY,iBAAiB;AAC9D,MAAI,CAAE,MAAMF,YAAWC,MAAI,UAAU,GAAI;AACvC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,GAAG,UAAU;AAAA,IACvB;AAAA,EACF;AACA,SAAO,EAAE,MAAM,eAAe,QAAQ,MAAM,QAAQ,WAAW;AACjE;AAEA,eAAe,YAAY,MAAwC;AACjE,QAAM,QAAQ,OAAO,KAAK,eAAe,oBAAoB;AAC7D,MAAI,MAAM,WAAW,MAAM,SAAS;AAClC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,gBAAgB,MAAM,OAAO,GAAG,UAAU,MAAM,QAAQ,GAAG,MAAM,MAAM,WAAW,GAAG;AAAA,IAC/F;AAAA,EACF;AACA,MAAI,MAAM,WAAW,CAAC,MAAM,SAAS;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,OAAO,MAAM,OAAO,GAAG;AAAA,IACjC;AAAA,EACF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,SAAS,MAAwC;AAC9D,QAAMA,OAAK,KAAK,MAAME;AACtB,QAAM,UAAU,KAAK,WAAWC,IAAG,QAAQ;AAC3C,MAAI,MAAM,kBAAkBH,MAAI,OAAO,GAAG;AACxC,WAAO,EAAE,MAAM,oBAAoB,QAAQ,MAAM,QAAQ,+BAA+B;AAAA,EAC1F;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,WAAW,MAAwC;AAChE,QAAMA,OAAK,KAAK,MAAME;AACtB,QAAM,UAAU,KAAK,WAAWC,IAAG,QAAQ;AAC3C,QAAM,QAAQF,UAAS,KAAK,SAAS,WAAW,UAAU,eAAe,UAAU;AACnF,MAAI,MAAMF,YAAWC,MAAI,KAAK,GAAG;AAC/B,WAAO,EAAE,MAAM,SAAS,QAAQ,MAAM,QAAQ,MAAM;AAAA,EACtD;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,gBAAgB,MAAwC;AACrE,QAAM,SAAS,OAAO,KAAK,oBAAoB,yBAAyB;AACxE,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,iCAAiC,QAAQ,QAAQ;AAAA,IAC3D;AAAA,EACF;AACA,MAAI,OAAO,QAAQ;AACjB,WAAO,EAAE,MAAM,eAAe,QAAQ,MAAM,QAAQ,GAAG,OAAO,IAAI,mBAAmB;AAAA,EACvF;AACA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ,GAAG,OAAO,IAAI;AAAA,EACxB;AACF;AAGA,eAAsB,UAAU,OAAmB,CAAC,GAA0B;AAC5E,QAAM,SAAS,MAAM,QAAQ,IAAI;AAAA,IAC/B,UAAU,IAAI;AAAA,IACd,gBAAgB,IAAI;AAAA,IACpB,YAAY,IAAI;AAAA,IAChB,SAAS,IAAI;AAAA,IACb,WAAW,IAAI;AAAA,IACf,gBAAgB,IAAI;AAAA,EACtB,CAAC;AACD,SAAO,EAAE,IAAI,OAAO,MAAM,CAAC,MAAM,EAAE,WAAW,MAAM,GAAG,OAAO;AAChE;;;AD1PA,IAAMI,eAAaC,IAAE,OAAO,CAAC,CAAC;AAG9B,IAAM,cAAcA,IAAE,OAAO;AAAA,EAC3B,MAAMA,IAAE,OAAO;AAAA,EACf,QAAQA,IAAE,KAAK,CAAC,MAAM,QAAQ,MAAM,CAAC;AAAA,EACrC,QAAQA,IAAE,OAAO;AACnB,CAAC;AAED,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,IAAIA,IAAE,QAAQ;AAAA,EACd,QAAQA,IAAE,MAAM,WAAW;AAC7B,CAAC;AAGD,SAAS,MAAM,QAA6B;AAC1C,MAAI,WAAW,KAAM,QAAO,MAAM,MAAM,MAAM;AAC9C,MAAI,WAAW,OAAQ,QAAO,MAAM,OAAO,MAAM;AACjD,SAAO,MAAM,IAAI,MAAM;AACzB;AAEA,IAAO,iBAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMD;AAAA,EACN,QAAQE;AAAA,EACR,MAAM,IAAI,OAAO,KAAK;AACpB,UAAM,SAAS,MAAM,UAAU;AAC/B,QAAI,IAAI,WAAW,QAAQ;AACzB,cAAQ,OAAO,MAAM,MAAM,KAAK,oBAAoB,IAAI,IAAI;AAC5D,iBAAW,SAAS,OAAO,QAAQ;AACjC,gBAAQ,OAAO,MAAM,KAAK,MAAM,MAAM,MAAM,CAAC,IAAI,MAAM,IAAI,WAAM,MAAM,MAAM;AAAA,CAAI;AAAA,MACnF;AACA,YAAM,UAAU,OAAO,KACnB,MAAM,MAAM,4CAA4C,IACxD,MAAM,IAAI,4BAA4B;AAC1C,cAAQ,OAAO,MAAM,UAAU,IAAI;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACF,CAAC;;;AErDD,OAAOC,SAAQ;AACf,SAAS,KAAAC,WAAS;AAgBlB,IAAMC,eAAaC,IAAE,OAAO;AAAA,EAC1B,SAASA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACpC,eAAeA,IAAE,QAAQ,EAAE,SAAS;AACtC,CAAC;AAGD,IAAMC,iBAAeD,IAAE,OAAO;AAAA,EAC5B,QAAQA,IAAE,OAAO;AAAA,EACjB,WAAWA,IAAE,QAAQ;AAAA,EACrB,iBAAiBA,IAAE,OAAO,EAAE,IAAI;AAAA,EAChC,SAASA,IAAE,QAAQ;AAAA,EACnB,QAAQA,IAAE,QAAQ;AAAA,EAClB,SAASA,IAAE,OAAO;AACpB,CAAC;AAMD,eAAe,IAAI,MAAc,MAAwC;AACvE,SAAO,aAAa,EAAE,OAAO,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC;AACpD;AAEA,eAAe,cAAc,MAA6B;AACxD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,IAAI,MAAM,CAAC,aAAa,uBAAuB,CAAC;AAAA,EAC9D,SAAS,KAAK;AACZ,UAAM,IAAI;AAAA,MACR,wBAAwB,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACnF;AAAA,EACF;AACA,MAAI,IAAI,SAAS,KAAK,IAAI,OAAO,KAAK,MAAM,QAAQ;AAClD,UAAM,IAAI;AAAA,MACR,wCAAwC,IAAI;AAAA;AAAA,YAE7B,IAAI,qBAAqB,IAAI;AAAA,IAC9C;AAAA,EACF;AACF;AAEA,eAAe,cAAc,MAA+B;AAC1D,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,aAAa,gBAAgB,MAAM,CAAC;AACjE,QAAM,SAAS,IAAI,OAAO,KAAK;AAC/B,MAAI,IAAI,SAAS,KAAK,CAAC,UAAU,WAAW,QAAQ;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IAEF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,eAAe,MAAc,QAA+B;AACzE,QAAM,MAAM,MAAM,IAAI,MAAM;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,IAAI;AAAA,MACR,WAAW,MAAM;AAAA;AAAA,YAEF,IAAI,oBAAoB,MAAM;AAAA,IAC/C;AAAA,EACF;AACF;AAGA,eAAe,QAAQ,MAAgC;AACrD,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,UAAU,aAAa,CAAC;AACrD,SAAO,IAAI,OAAO,KAAK,EAAE,SAAS;AACpC;AAEA,SAAS,iBAAyB;AAChC,SAAO,aAAY,oBAAI,KAAK,GAAE,YAAY,CAAC,KAAKE,IAAG,SAAS,CAAC;AAC/D;AAGA,eAAe,UAAU,MAAc,SAAkC;AACvE,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,IAAI,CAAC;AACzC,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,IAAI,gBAAgB,mBAAmB,IAAI,OAAO,KAAK,KAAK,eAAe,EAAE;AAAA,EACrF;AAEA,QAAM,SAAS,MAAM,IAAI,MAAM,CAAC,QAAQ,YAAY,aAAa,CAAC;AAClE,QAAM,QAAQ,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAC7D,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,SAAS,MAAM,IAAI,MAAM,CAAC,UAAU,MAAM,OAAO,CAAC;AACxD,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,IAAI,gBAAgB,sBAAsB,OAAO,OAAO,KAAK,KAAK,eAAe,EAAE;AAAA,EAC3F;AACA,SAAO,MAAM;AACf;AAGA,eAAe,gBAAgB,MAAiC;AAC9D,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,eAAe,iBAAiB,CAAC;AACtE,SAAO,IAAI,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AACrD;AAEA,eAAe,QAAQ,MAA+B;AACpD,UAAQ,MAAM,IAAI,MAAM,CAAC,aAAa,MAAM,CAAC,GAAG,OAAO,KAAK;AAC9D;AAEA,eAAe,WAAW,MAA6C;AAGrE,QAAM,SAAS,MAAM,QAAQ,IAAI;AACjC,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,QAAQ,UAAU,CAAC;AAChD,MAAI,IAAI,SAAS,GAAG;AAClB,WAAO,EAAE,SAAU,MAAM,QAAQ,IAAI,MAAO,OAAO;AAAA,EACrD;AAEA,QAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,IAAI;AAAA,MACR;AAAA;AAAA,EACwB,UAAU,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,YAEpD,IAAI,4BAA4B,IAAI;AAAA,YACpC,IAAI;AAAA,IACrB;AAAA,EACF;AACA,QAAM,IAAI;AAAA,IACR,6BAA6B,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,eAAe;AAAA,EACxF;AACF;AAEA,eAAe,KAAK,MAA6B;AAC/C,QAAM,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;AACpC,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,IAAI;AAAA,MACR,oBAAoB,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,eAAe;AAAA,IAC/E;AAAA,EACF;AACF;AAEA,IAAO,eAAQ,cAA4B;AAAA,EACzC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAMH;AAAA,EACN,QAAQE;AAAA,EACR,KAAK;AAAA,IACH,SAAS;AAAA,MACP,SAAS;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,aAAa;AAAA,MACf;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,IAAI,MAAM,KAAK;AACnB,UAAM,OAAO,IAAI;AACjB,UAAM,cAAc,IAAI;AACxB,UAAM,SAAS,MAAM,cAAc,IAAI;AACvC,UAAM,eAAe,MAAM,MAAM;AAEjC,QAAI,YAAY;AAChB,QAAI,iBAAiB;AACrB,QAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,UAAI,KAAK,eAAe;AACtB,cAAM,IAAI;AAAA,UACR;AAAA,QAEF;AAAA,MACF;AACA,uBAAiB,MAAM,UAAU,MAAM,KAAK,WAAW,eAAe,CAAC;AACvE,kBAAY,iBAAiB;AAAA,IAC/B;AAEA,UAAM,EAAE,QAAQ,IAAI,MAAM,WAAW,IAAI;AACzC,UAAM,KAAK,IAAI;AAEf,UAAM,UACJ,GAAG,YAAY,aAAa,cAAc,eAAe,EAAE,GACxD,UAAU,4BAA4B,sBAAsB;AAEjE,UAAM,SAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA,iBAAiB;AAAA,MACjB;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,IACF;AAEA,QAAI,IAAI,WAAW,QAAQ;AACzB,cAAQ,OAAO,MAAM,MAAM,MAAM,gBAAW,MAAM,MAAM,OAAO,EAAE,IAAI,IAAI;AAAA,IAC3E;AACA,WAAO;AAAA,EACT;AACF,CAAC;;;AC1ID,IAAM,eAA6B;AAAA;AAAA,EAEjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,WAAW,OAAO,cAAc;AAC9B,WAAS,GAAG;AACd;;;AC5IA,SAAS,YAAYE,YAAU;AAC/B,OAAOC,YAAU;AAoBV,SAAS,eAAuB;AACrC,SAAOC,OAAK,KAAK,aAAa,GAAG,aAAa;AAChD;AAOA,eAAsB,YAAY,KAAiC;AACjE,MAAI;AACF,UAAM,OAAO,aAAa;AAC1B,UAAMC,KAAG,MAAMD,OAAK,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAMC,KAAG,WAAW,MAAM,KAAK,UAAU,GAAG,IAAI,MAAM,MAAM;AAAA,EAC9D,QAAQ;AAAA,EAER;AACF;;;A1EdA,SAAS,cAAc,QAAoD;AACzE,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,MAAO,QAAgB,MAAM;AACjC,SAAO,QAAQ,IAAI,SAAS,cAAc,IAAI,SAAS,cAAc,IAAI,SAAS,YAAY;AAC5F,UAAM,IAAI,WAAW,MAAM;AAAA,EAC7B;AACA,SAAO,KAAK;AACd;AAQA,SAAS,YAAY,MAAiB,MAAsC;AAE1E,QAAM,QAAS,MAAc,MAAM,KAAK;AACxC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,MAAM,IAAI;AACnB;AAGA,SAAS,OAAO,OAAgB,SAAsC;AACpE,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,YAAY,WAAW;AACzB,WAAO,UAAU,QAAQ,UAAU;AAAA,EACrC;AACA,MAAI,YAAY,UAAU;AACxB,QAAI,OAAO,UAAU,SAAU,QAAO;AACtC,UAAM,IAAI,OAAO,KAAK;AACtB,WAAO,OAAO,MAAM,CAAC,IAAI,QAAQ;AAAA,EACnC;AACA,MAAI,YAAY,SAAS;AACvB,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO;AACjC,WAAO,OAAO,KAAK,EAChB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC;AAAA,EAC/B;AACA,SAAO;AACT;AAGA,SAAS,UAAU,MAAwB;AACzC,SAAO,KAAK,MAAM,GAAG;AACvB;AAOA,SAAS,YAAY,MAAe,OAA0B;AAC5D,MAAI,UAAU;AACd,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,IAAI;AAC/D,QAAI,UAAU;AACZ,gBAAU;AACV;AAAA,IACF;AACA,UAAM,OAAO,QACV,QAAQ,IAAI,EACZ,YAAY,GAAG,IAAI,WAAW;AACjC,cAAU;AAAA,EACZ;AACA,SAAO;AACT;AAGA,SAAS,UAAU,MAAsB;AAGvC,SAAO,KAAK,QAAQ,OAAO,EAAE,EAAE,QAAQ,MAAM,GAAG;AAClD;AAOA,eAAe,YACb,KACA,QACA,KACe;AACf,MAAI,IAAI,WAAW,QAAQ;AACzB,YAAQ,OAAO;AAAA,MACb,KAAK,UAAU,gBAAgB,QAAQ,IAAI,QAAQ,CAAC,IAAI;AAAA,IAC1D;AACA;AAAA,EACF;AAIA,MAAI,OAAO,WAAW,UAAU;AAC9B,YAAQ,OAAO,MAAM,OAAO,SAAS,IAAI,IAAI,SAAS,SAAS,IAAI;AAAA,EACrE,WAAW,WAAW,UAAa,WAAW,MAAM;AAClD,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,MAAM,CAAC,IAAI,IAAI;AAAA,EAC7D;AAEA,OAAK;AACP;AAEA,SAAS,UAAU,SAAiB,MAAc,QAAgC;AAChF,MAAI,WAAW,QAAQ;AACrB,YAAQ,OAAO,MAAM,KAAK,UAAU,cAAc,SAAS,IAAI,CAAC,IAAI,IAAI;AACxE;AAAA,EACF;AACA,UAAQ,OAAO,MAAM,MAAM,IAAI,YAAY,OAAO,IAAI,IAAI;AAC5D;AAUA,SAAS,WACP,KACA,aAC8C;AAC9C,QAAM,OAAgB,IAAI,OAAO,CAAC;AAClC,QAAM,kBAAkB,KAAK,cAAc,CAAC;AAE5C,SAAO,UAAU,gBAA2B;AAC1C,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,oBAAqB,YAAY,gBAAgB,MAAM,KAC3D,CAAC;AACH,UAAM,WAAW,YAAY,KAAK;AAClC,UAAM,SAA2B,SAAS,OAAO,SAAS;AAE1D,UAAM,MAA+B,CAAC;AAGtC,oBAAgB,QAAQ,CAAC,OAAO,MAAM;AACpC,YAAM,QAAQ,YAAY,CAAC;AAC3B,UAAI,UAAU,QAAW;AACvB,cAAM,IAAI,cAAc,YAAY,IAAI,MAAM,KAAK,CAAC;AACpD,YAAI,KAAK,IAAI,OAAO,OAAO,CAAC;AAAA,MAC9B;AAAA,IACF,CAAC;AAGD,QAAI,KAAK,SAAS;AAChB,iBAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACrD,cAAM,UAAU,UAAU,IAAI,IAAI;AAElC,cAAM,eAAe,QAAQ;AAAA,UAAQ;AAAA,UAAa,CAAC,GAAG,MACpD,EAAE,YAAY;AAAA,QAChB;AACA,cAAM,QACJ,kBAAkB,YAAY,KAAK,kBAAkB,OAAO;AAC9D,YAAI,UAAU,QAAW;AACvB,gBAAM,IAAI,cAAc,YAAY,IAAI,MAAM,GAAG,CAAC;AAClD,cAAI,GAAG,IAAI,OAAO,OAAO,CAAC;AAAA,QAC5B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,MAAsB;AAAA,MAC1B,YAAY,cAAc;AAAA,MAC1B,UAAU,CAAC;AAAA,MACX;AAAA,MACA,KAAK,QAAQ,IAAI;AAAA,IACnB;AAEA,UAAM,SAAS,MAAM,OAAO,KAAK,KAAK,KAAK,MAAM;AACjD,UAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,UAAM,YAAY;AAAA,MAChB,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC3B,SAAS,IAAI;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,MACb,SAAS,OAAO;AAAA,MAChB,WAAW,OAAO;AAAA,IACpB,CAAC;AACD,YAAQ,KAAK,OAAO,QAAQ;AAAA,EAC9B;AACF;AAEA,eAAe,OACb,KACA,KACA,KACA,QAC2B;AAC3B,MAAI;AACJ,MAAI;AACF,aAAS,IAAI,KAAK,MAAM,GAAG;AAAA,EAC7B,SAAS,KAAK;AACZ,UAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,cAAU,sBAAsB,OAAO,IAAI,KAAK,OAAO,MAAM;AAC7D,WAAO,EAAE,UAAU,KAAK,OAAO,SAAS,MAAM;AAAA,EAChD;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,IAAI,IAAI,QAAQ,GAAG;AACxC,UAAM,YAAY,KAAK,QAAQ,GAAG;AAClC,WAAO,EAAE,UAAU,KAAK,IAAI,SAAS,KAAK;AAAA,EAC5C,SAAS,KAAK;AACZ,UAAM,EAAE,SAAS,KAAK,IAAI,YAAY,GAAG;AACzC,cAAU,SAAS,MAAM,MAAM;AAC/B,WAAO,EAAE,UAAU,MAAM,SAAS,MAAM;AAAA,EAC1C;AACF;AAOA,SAAS,iBACP,KACA,KACA,KAKQ;AACR,QAAM,UAAU,cAAc,YAAY,IAAI,MAAM,GAAG,CAAC;AACxD,QAAM,QAAQ,IAAI,QAAQ,GAAG,IAAI,KAAK,OAAO;AAC7C,MAAI,YAAY,WAAW;AACzB,WAAO,GAAG,KAAK,GAAG,IAAI,IAAI;AAAA,EAC5B;AACA,SAAO,GAAG,KAAK,GAAG,IAAI,IAAI;AAC5B;AAGA,SAAS,cAAc,MAAe,KAAuB;AAC3D,QAAM,QAAQ,UAAU,IAAI,IAAI;AAChC,QAAM,WAAW,MAAM,MAAM,SAAS,CAAC;AACvC,QAAM,SAAS,YAAY,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AACnD,QAAM,MAAM,OAAO,QAAQ,QAAQ,EAAE,YAAY,IAAI,WAAW;AAEhE,QAAM,OAAgB,IAAI,OAAO,CAAC;AAClC,aAAW,SAAS,KAAK,cAAc,CAAC,GAAG;AACzC,UAAM,QAAQ,cAAc,YAAY,IAAI,MAAM,KAAK,CAAC;AACxD,UAAM;AAAA;AAAA,MAEH,YAAY,IAAI,MAAM,KAAK,GAAW,MAAM,KAAK,SAAS;AAAA;AAC7D,UAAM,UAAU,WAAW,IAAI,KAAK,MAAM,IAAI,KAAK;AACnD,QAAI,SAAS,SAAS,GAAG,KAAK,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE,EAAE;AAAA,EAC/D;AAEA,MAAI,KAAK,SAAS;AAChB,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACrD,YAAM,QAAQ,iBAAiB,KAAK,KAAK,GAAG;AAC5C,UAAI,IAAI,UAAU;AAChB,YAAI,eAAe,OAAO,IAAI,WAAW;AAAA,MAC3C,OAAO;AACL,YAAI,OAAO,OAAO,IAAI,WAAW;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,WAAW,KAAK,IAAI,CAAC;AAClC;AAEA,SAAS,eAAwB;AAC/B,QAAM,UAAU,IAAI,QAAQ;AAI5B,UAAQ,aAAa;AACrB,UACG,KAAK,aAAa,EAClB,YAAY,qEAAgE,EAC5E,QAAQ,OAAO,EACf,OAAO,UAAU,+CAA+C,EAChE;AAAA,IACC;AAAA,IACA;AAAA,EAEF;AAGF,QAAM,OAAO,MAAM,KAAK,SAAS,OAAO,CAAC,EAAE;AAAA,IAAK,CAAC,GAAG,MAClD,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EAC7B;AACA,aAAW,OAAO,MAAM;AACtB,kBAAc,SAAS,GAAG;AAAA,EAC5B;AAEA,SAAO;AACT;AAOA,eAAsB,KAAK,MAA+B;AACxD,QAAM,UAAU,aAAa;AAC7B,MAAI;AACF,UAAM,QAAQ,WAAW,IAAI;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAI,eAAe,gBAAgB;AAEjC,UAAI,IAAI,SAAS,6BAA6B,IAAI,SAAS,qBAAqB;AAC9E,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,cAAQ,KAAK,KAAK,KAAK;AAAA,IACzB;AACA,UAAM,EAAE,SAAS,KAAK,IAAI,YAAY,GAAG;AACzC,cAAU,SAAS,MAAM,OAAO;AAChC,YAAQ,KAAK,IAAI;AAAA,EACnB;AACF;AAEA,KAAK,KAAK,QAAQ,IAAI;","names":["fs","path","matter","z","fs","fs","ArgsSchema","z","ResultSchema","dirExists","fs","path","matter","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","fs","path","z","ArgsSchema","z","ResultSchema","dirExists","fs","path","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","z","fs","path","fs","path","ArgsSchema","z","ResultSchema","z","z","ArgsSchema","ResultSchema","applyLocked","z","ArgsSchema","z","ResultSchema","applyLocked","z","ArgsSchema","z","ResultSchema","fs","path","z","ArgsSchema","z","path","fs","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","path","z","ArgsSchema","z","path","path","z","ArgsSchema","z","path","fs","path","z","z","ArgsSchema","ResultSchema","fs","path","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","fs","path","z","matter","ArgsSchema","z","ResultSchema","fs","matter","path","fs","path","z","ArgsSchema","z","ResultSchema","fs","path","fs","path","z","ArgsSchema","z","SessionEntrySchema","ResultSchema","DEFAULT_LIMIT","path","fs","root","sessions","path","z","ArgsSchema","z","ResultSchema","path","path","z","ArgsSchema","z","ResultSchema","path","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","path","z","ArgsSchema","z","ResultSchema","path","path","z","ArgsSchema","z","ResultSchema","git","path","path","z","ArgsSchema","z","ResultSchema","git","path","fs","path","z","ArgsSchema","z","ResultSchema","fs","path","path","fs","z","z","fs","path","z","argsSchema","z","parseErrorSchema","resultSchema","path","z","argsSchema","z","resultSchema","path","path","z","argsSchema","z","resultSchema","path","z","fs","path","path","path","fs","path","path","fs","fs","os","path","truncate","fs","path","ArgsSchema","z","ResultSchema","z","fs","path","fs","path","ArgsSchema","z","ResultSchema","fs","path","z","ArgsSchema","z","ResultSchema","fs","path","fs","path","z","ArgsSchema","z","ResultSchema","dirExists","fs","path","z","ArgsSchema","z","fs","path","spawn","z","ArgsSchema","z","ResultSchema","spawn","path","fs","spawn","z","z","z","z","fs","path","body","z","path","path","fs","path","fs","path","path","fs","ArgsSchema","z","ResultSchema","spawn","z","ArgsSchema","z","ResultSchema","spawn","z","ArgsSchema","z","ResultSchema","SHUTDOWN_TIMEOUT_MS","POLL_INTERVAL_MS","DEFAULT_PORT","waitForExit","detachedSpawn","spawn","z","ArgsSchema","z","ResultSchema","fs","path","z","ArgsSchema","z","ResultSchema","path","fs","z","fsp","nodePath","nodeSpawn","os","fileURLToPath","fs","path","fs","path","path","os","fs","spawn","fsp","nodePath","nodeSpawn","os","resolveLocalDeps","fs","fsp","spawn","nodeSpawn","os","nodePath","runOnce","nodePath","fileURLToPath","fs","fsp","spawn","nodeSpawn","os","fs","nodePath","exists","pathExists","runOnce","spawn","ArgsSchema","z","ResultSchema","z","ArgsSchema","z","StepSchema","ResultSchema","z","fsp","nodePath","os","HEALTH_TIMEOUT_MS","probeHealth","fileExists","fs","nodePath","fsp","os","ArgsSchema","z","ResultSchema","os","z","ArgsSchema","z","ResultSchema","os","fs","path","path","fs"]}
|