@samboyd/bep-cli 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/fs/init.ts","../src/providers/config.ts","../src/hooks/install.ts","../src/hooks/discovery.ts","../src/hooks/claude.ts","../src/hooks/types.ts","../src/ui/initHooks.ts","../src/commands/init.ts","../src/commands/check.ts","../src/bep/id.ts","../src/bep/status.ts","../src/fs/bets.ts","../src/providers/manual.ts","../src/ui/checkPrompt.ts","../src/providers/mixpanel.ts","../src/providers/registry.ts","../src/commands/new.ts","../src/bep/template.ts","../src/ui/newWizard.ts","../src/ui/newBetName.ts","../src/state/state.ts","../src/commands/start.ts","../src/commands/stop.ts","../src/commands/status.ts","../src/commands/hook.ts","../src/hooks/events.ts","../src/tracking/context.ts","../src/tracking/decision.ts","../src/tracking/enforcement.ts","../src/tracking/selector.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { runInit } from \"./commands/init\";\nimport { runCheck } from \"./commands/check\";\nimport { runNew } from \"./commands/new\";\nimport { runStart } from \"./commands/start\";\nimport { runStop } from \"./commands/stop\";\nimport { runStatus } from \"./commands/status\";\nimport { runHook } from \"./commands/hook\";\n\nexport async function main(argv: string[]): Promise<void> {\n const program = new Command();\n\n program.name(\"bep\").description(\"Budgeted Engineering Proposals CLI\");\n\n program\n .command(\"init\")\n .description(\"Initialize BEP directories in the current repository\")\n .option(\"--install-hooks\", \"Install agent tracking hooks\")\n .option(\"--no-install-hooks\", \"Skip agent tracking hook setup\")\n .option(\"--agent <agent>\", \"Agent target for hook setup (currently: claude-code)\")\n .action(async (options: { installHooks?: boolean; agent?: string }) => {\n const exitCode = await runInit({\n installHooks: options.installHooks,\n agent: options.agent,\n });\n process.exitCode = exitCode;\n });\n\n program\n .command(\"new [id...]\")\n .description(\"Create a new BEP markdown file\")\n .action(async (idParts?: string[]) => {\n const id = idParts && idParts.length > 0 ? [\"new\", ...idParts].join(\" \") : undefined;\n const exitCode = await runNew(id);\n process.exitCode = exitCode;\n });\n\n program\n .command(\"start <id>\")\n .description(\"Start work on an existing BEP\")\n .action(async (id: string) => {\n const exitCode = await runStart(id);\n process.exitCode = exitCode;\n });\n\n program\n .command(\"stop <id>\")\n .description(\"Stop work on an active BEP and log session exposure\")\n .action(async (id: string) => {\n const exitCode = await runStop(id);\n process.exitCode = exitCode;\n });\n\n program\n .command(\"status\")\n .description(\"Show status for current bets\")\n .action(async () => {\n const exitCode = await runStatus();\n process.exitCode = exitCode;\n });\n\n program\n .command(\"check <id>\")\n .description(\"Capture validation evidence for a BEP\")\n .option(\"-f, --force\", \"Re-run provider check even if bet status is passed\")\n .action(async (id: string, options: { force?: boolean }) => {\n const exitCode = await runCheck(id, { force: options.force });\n process.exitCode = exitCode;\n });\n\n program\n .command(\"hook <agent> <event>\")\n .description(\"Internal command used by agent hook integrations\")\n .action(async (agent: string, event: string) => {\n const exitCode = await runHook(agent, event);\n process.exitCode = exitCode;\n });\n\n await program.parseAsync(argv);\n}\n\nif (require.main === module) {\n void main(process.argv);\n}\n","import { access, mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { PROVIDER_CONFIG_PATH } from \"../providers/config\";\n\nexport const BETS_DIR = \"bets\";\nexport const LOGS_DIR = path.join(BETS_DIR, \"_logs\");\nexport const EVIDENCE_DIR = path.join(BETS_DIR, \"_evidence\");\nexport const STATE_PATH = path.join(BETS_DIR, \"_state.json\");\nconst GITIGNORE_PATH = \".gitignore\";\nconst PROVIDER_GITIGNORE_ENTRY = \".bep.providers.json\";\n\nexport type InitResult = {\n createdPaths: string[];\n alreadyInitialized: boolean;\n};\n\nconst DEFAULT_STATE = {\n active: [],\n};\nconst DEFAULT_PROVIDER_CONFIG = {\n mixpanel: {\n service_account_creds: \"<serviceaccount_username>:<serviceaccount_secret>\",\n },\n};\n\nconst REQUIRED_INIT_PATHS = [BETS_DIR, LOGS_DIR, EVIDENCE_DIR, STATE_PATH] as const;\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function initRepo(rootDir: string): Promise<InitResult> {\n const createdPaths: string[] = [];\n\n for (const relativeDir of [BETS_DIR, LOGS_DIR, EVIDENCE_DIR]) {\n const absoluteDir = path.join(rootDir, relativeDir);\n const existed = await pathExists(absoluteDir);\n await mkdir(absoluteDir, { recursive: true });\n if (!existed) {\n createdPaths.push(relativeDir);\n }\n }\n\n const statePath = path.join(rootDir, STATE_PATH);\n const stateExists = await pathExists(statePath);\n if (!stateExists) {\n await writeFile(statePath, `${JSON.stringify(DEFAULT_STATE, null, 2)}\\n`, \"utf8\");\n createdPaths.push(STATE_PATH);\n }\n\n const providerConfigPath = path.join(rootDir, PROVIDER_CONFIG_PATH);\n const providerConfigExists = await pathExists(providerConfigPath);\n if (!providerConfigExists) {\n await writeFile(providerConfigPath, `${JSON.stringify(DEFAULT_PROVIDER_CONFIG, null, 2)}\\n`, \"utf8\");\n createdPaths.push(PROVIDER_CONFIG_PATH);\n }\n\n const gitRoot = await findGitRepoRoot(rootDir);\n if (gitRoot) {\n await ensureGitignoreEntry(gitRoot, createdPaths);\n }\n\n return {\n createdPaths,\n alreadyInitialized: createdPaths.length === 0,\n };\n}\n\nasync function findGitRepoRoot(startDir: string): Promise<string | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n if (await pathExists(path.join(currentDir, \".git\"))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n currentDir = parentDir;\n }\n}\n\nasync function ensureGitignoreEntry(gitRoot: string, createdPaths: string[]): Promise<void> {\n const gitignorePath = path.join(gitRoot, GITIGNORE_PATH);\n const exists = await pathExists(gitignorePath);\n if (!exists) {\n await writeFile(gitignorePath, `${PROVIDER_GITIGNORE_ENTRY}\\n`, \"utf8\");\n createdPaths.push(GITIGNORE_PATH);\n return;\n }\n\n const raw = await readFile(gitignorePath, \"utf8\");\n const lines = raw.split(/\\r?\\n/);\n if (lines.includes(PROVIDER_GITIGNORE_ENTRY)) {\n return;\n }\n\n const suffix = raw.length === 0 || raw.endsWith(\"\\n\") ? \"\" : \"\\n\";\n await writeFile(gitignorePath, `${raw}${suffix}${PROVIDER_GITIGNORE_ENTRY}\\n`, \"utf8\");\n}\n\nasync function isInitializedRepoRoot(candidateRootDir: string): Promise<boolean> {\n for (const relativePath of REQUIRED_INIT_PATHS) {\n const absolutePath = path.join(candidateRootDir, relativePath);\n if (!(await pathExists(absolutePath))) {\n return false;\n }\n }\n\n return true;\n}\n\nexport async function findInitializedRepo(startDir: string): Promise<{ rootDir: string; betsDir: string } | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n if (await isInitializedRepoRoot(currentDir)) {\n return {\n rootDir: currentDir,\n betsDir: path.join(currentDir, BETS_DIR),\n };\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n\nexport async function ensureInitializedRepo(startDir: string): Promise<{ rootDir: string; betsDir: string }> {\n const found = await findInitializedRepo(startDir);\n if (!found) {\n throw new Error(\"fatal: not a bep repository (or any of the parent directories): bets\");\n }\n\n return found;\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport const PROVIDER_CONFIG_PATH = \".bep.providers.json\";\n\nexport type ProviderConfig = {\n mixpanel?: {\n service_account_creds?: string;\n };\n};\n\nexport type ProviderConfigResult =\n | { ok: true; value: ProviderConfig }\n | { ok: false; error: string };\n\nexport async function readProviderConfig(rootDir: string): Promise<ProviderConfigResult> {\n const configPath = path.join(rootDir, PROVIDER_CONFIG_PATH);\n\n let raw: string;\n try {\n raw = await readFile(configPath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return {\n ok: false,\n error: `Missing provider config at ${PROVIDER_CONFIG_PATH}. Run 'bep init' to scaffold it.`,\n };\n }\n\n return {\n ok: false,\n error: `Failed to read provider config at ${PROVIDER_CONFIG_PATH}: ${(error as Error).message}`,\n };\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch (error) {\n return {\n ok: false,\n error: `Invalid JSON in ${PROVIDER_CONFIG_PATH}: ${(error as Error).message}`,\n };\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n return { ok: false, error: `${PROVIDER_CONFIG_PATH} must contain a JSON object.` };\n }\n\n const config = parsed as ProviderConfig;\n return { ok: true, value: config };\n}\n\nexport function getMixpanelServiceAccountCreds(\n config: ProviderConfig,\n): { ok: true; value: string } | { ok: false; error: string } {\n if (!config.mixpanel || typeof config.mixpanel !== \"object\") {\n return {\n ok: false,\n error: `Missing \"mixpanel\" object in ${PROVIDER_CONFIG_PATH}.`,\n };\n }\n\n if (\n typeof config.mixpanel.service_account_creds !== \"string\" ||\n config.mixpanel.service_account_creds.trim().length === 0\n ) {\n return {\n ok: false,\n error: `Missing non-empty \"mixpanel.service_account_creds\" in ${PROVIDER_CONFIG_PATH}.`,\n };\n }\n\n const creds = config.mixpanel.service_account_creds.trim();\n const colonIndex = creds.indexOf(\":\");\n if (colonIndex <= 0 || colonIndex !== creds.lastIndexOf(\":\") || colonIndex === creds.length - 1) {\n return {\n ok: false,\n error:\n `Invalid \"mixpanel.service_account_creds\" in ${PROVIDER_CONFIG_PATH}. ` +\n 'Expected \"<serviceaccount_username>:<serviceaccount_secret>\".',\n };\n }\n\n return { ok: true, value: creds };\n}\n","import path from \"node:path\";\nimport { findNearestClaudeDir } from \"./discovery\";\nimport { installClaudeCodeHooks } from \"./claude\";\nimport { formatAgentLabel, isHookAgent, isSupportedHookAgent, type HookAgent } from \"./types\";\n\nexport type InstallHooksResult =\n | {\n ok: true;\n agent: HookAgent;\n settingsPathRelative: string;\n alreadyInstalled: boolean;\n }\n | {\n ok: false;\n error: string;\n };\n\nfunction resolveAgent(agent: string): { ok: true; value: HookAgent } | { ok: false; error: string } {\n if (!isHookAgent(agent)) {\n return {\n ok: false,\n error:\n `Unknown agent '${agent}'. Valid values: claude-code, cursor, codex, windsurf.`,\n };\n }\n\n if (!isSupportedHookAgent(agent)) {\n return {\n ok: false,\n error: `${formatAgentLabel(agent)} hook installation is not supported yet. Choose 'claude-code'.`,\n };\n }\n\n return { ok: true, value: agent };\n}\n\nfunction quoteShellArg(value: string): string {\n if (/^[A-Za-z0-9_./:@-]+$/.test(value)) {\n return value;\n }\n\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nexport function resolveHookCommandBase(startDir: string): string {\n const argv1 = process.argv[1]?.trim();\n if (!argv1) {\n return \"bep\";\n }\n\n const resolved = path.isAbsolute(argv1) ? argv1 : path.resolve(startDir, argv1);\n return quoteShellArg(resolved);\n}\n\nexport async function installAgentHooks(startDir: string, agent: string): Promise<InstallHooksResult> {\n const resolved = resolveAgent(agent);\n if (!resolved.ok) {\n return resolved;\n }\n\n const claudeDir = await findNearestClaudeDir(startDir);\n if (!claudeDir) {\n return {\n ok: false,\n error:\n \"No .claude directory found in the current directory or any parent directory. Create one first, then rerun 'bep init --install-hooks --agent claude-code'.\",\n };\n }\n\n const hookCommandBase = resolveHookCommandBase(startDir);\n const installed = await installClaudeCodeHooks(claudeDir, hookCommandBase);\n const settingsPathRelative = path.relative(startDir, installed.settingsPath) || path.basename(installed.settingsPath);\n\n return {\n ok: true,\n agent: resolved.value,\n settingsPathRelative,\n alreadyInstalled: installed.addedCommands === 0,\n };\n}\n","import { stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function findNearestClaudeDir(startDir: string): Promise<string | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n const candidate = path.join(currentDir, \".claude\");\n\n try {\n const stats = await stat(candidate);\n if (stats.isDirectory()) {\n return candidate;\n }\n } catch {\n // Keep walking up.\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n\n currentDir = parentDir;\n }\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nconst CLAUDE_SETTINGS_FILE = \"settings.json\";\nconst HOOK_EVENTS = [\n { event: \"UserPromptSubmit\", suffix: \"user-prompt-submit\" },\n { event: \"PostToolUse\", suffix: \"post-tool-use\" },\n { event: \"PostToolUseFailure\", suffix: \"post-tool-use-failure\" },\n { event: \"SessionEnd\", suffix: \"session-end\" },\n] as const;\n\ntype HookCommand = {\n type: string;\n command: string;\n};\n\ntype HookMatcher = {\n matcher: string;\n hooks: HookCommand[];\n};\n\ntype ClaudeSettings = {\n hooks?: Record<string, HookMatcher[]>;\n [key: string]: unknown;\n};\n\nexport type ClaudeHookInstallResult = {\n claudeDir: string;\n settingsPath: string;\n addedCommands: number;\n};\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\";\n}\n\nfunction parseSettings(raw: string): ClaudeSettings {\n const parsed = JSON.parse(raw) as unknown;\n if (!isObject(parsed)) {\n throw new Error(\".claude/settings.json must be a JSON object.\");\n }\n\n return parsed as ClaudeSettings;\n}\n\nfunction ensureCommand(settings: ClaudeSettings, event: string, command: string): boolean {\n if (!isObject(settings.hooks)) {\n settings.hooks = {};\n }\n\n const hooksByEvent = settings.hooks as Record<string, unknown>;\n const rawMatchers = hooksByEvent[event];\n\n if (!Array.isArray(rawMatchers)) {\n const entry: HookMatcher = {\n matcher: \"\",\n hooks: [{ type: \"command\", command }],\n };\n hooksByEvent[event] = [entry];\n return true;\n }\n\n let target = rawMatchers.find(\n (matcher) =>\n isObject(matcher) &&\n typeof matcher.matcher === \"string\" &&\n matcher.matcher.length === 0 &&\n Array.isArray(matcher.hooks),\n ) as HookMatcher | undefined;\n\n if (!target) {\n target = { matcher: \"\", hooks: [] };\n rawMatchers.push(target);\n }\n\n const exists = target.hooks.some(\n (candidate) => candidate && candidate.type === \"command\" && candidate.command === command,\n );\n\n if (exists) {\n return false;\n }\n\n target.hooks.push({ type: \"command\", command });\n return true;\n}\n\nexport async function installClaudeCodeHooks(\n claudeDir: string,\n hookCommandBase: string,\n): Promise<ClaudeHookInstallResult> {\n const settingsPath = path.join(claudeDir, CLAUDE_SETTINGS_FILE);\n\n let settings: ClaudeSettings = {};\n try {\n const raw = await readFile(settingsPath, \"utf8\");\n settings = parseSettings(raw);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== \"ENOENT\") {\n throw error;\n }\n }\n\n let addedCommands = 0;\n for (const hook of HOOK_EVENTS) {\n const command = `${hookCommandBase} hook claude-code ${hook.suffix}`;\n if (ensureCommand(settings, hook.event, command)) {\n addedCommands += 1;\n }\n }\n\n await writeFile(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`, \"utf8\");\n\n return {\n claudeDir,\n settingsPath,\n addedCommands,\n };\n}\n","export const SUPPORTED_HOOK_AGENT = \"claude-code\";\n\nexport const AGENT_CHOICES = [\"claude-code\", \"cursor\", \"codex\", \"windsurf\"] as const;\n\nexport type HookAgent = (typeof AGENT_CHOICES)[number];\n\nexport function isHookAgent(value: string): value is HookAgent {\n return (AGENT_CHOICES as readonly string[]).includes(value);\n}\n\nexport function isSupportedHookAgent(value: string): value is typeof SUPPORTED_HOOK_AGENT {\n return value === SUPPORTED_HOOK_AGENT;\n}\n\nexport function formatAgentLabel(agent: HookAgent): string {\n switch (agent) {\n case \"claude-code\":\n return \"Claude Code\";\n case \"cursor\":\n return \"Cursor\";\n case \"codex\":\n return \"Codex\";\n case \"windsurf\":\n return \"Windsurf\";\n }\n}\n","import { confirm, isCancel, select } from \"@clack/prompts\";\nimport { type HookAgent, formatAgentLabel } from \"../hooks/types\";\n\nconst COMING_SOON_AGENTS: HookAgent[] = [\"cursor\", \"codex\", \"windsurf\"];\n\nexport type InitHookPromptResult =\n | { kind: \"cancel\" }\n | { kind: \"skip\" }\n | { kind: \"install\"; agent: HookAgent };\n\nexport type InitHookPromptClient = {\n promptInstallNow(): Promise<boolean | \"cancel\">;\n promptAgent(): Promise<HookAgent | \"cancel\">;\n showComingSoon(agent: HookAgent): void;\n};\n\nexport async function runInitHookPrompt(client: InitHookPromptClient = createInitHookPromptClient()): Promise<InitHookPromptResult> {\n const shouldInstall = await client.promptInstallNow();\n if (shouldInstall === \"cancel\") {\n return { kind: \"cancel\" };\n }\n\n if (!shouldInstall) {\n return { kind: \"skip\" };\n }\n\n while (true) {\n const selected = await client.promptAgent();\n if (selected === \"cancel\") {\n return { kind: \"cancel\" };\n }\n\n if (selected === \"claude-code\") {\n return { kind: \"install\", agent: selected };\n }\n\n client.showComingSoon(selected);\n }\n}\n\nexport function createInitHookPromptClient(): InitHookPromptClient {\n return {\n async promptInstallNow() {\n const value = await confirm({\n message: \"Install agent tracking hooks now?\",\n initialValue: true,\n });\n\n if (isCancel(value)) {\n return \"cancel\";\n }\n\n return value;\n },\n async promptAgent() {\n const value = await select<HookAgent>({\n message: \"Choose an agent\",\n options: [\n { label: \"Claude Code\", value: \"claude-code\" },\n { label: \"Cursor\", value: \"cursor\", hint: \"coming soon\" },\n { label: \"Codex\", value: \"codex\", hint: \"coming soon\" },\n { label: \"Windsurf\", value: \"windsurf\", hint: \"coming soon\" },\n ],\n initialValue: \"claude-code\",\n });\n\n if (isCancel(value)) {\n return \"cancel\";\n }\n\n return value;\n },\n showComingSoon(agent: HookAgent) {\n if (COMING_SOON_AGENTS.includes(agent)) {\n console.log(`${formatAgentLabel(agent)} support is coming soon. Choose Claude Code for now.`);\n }\n },\n };\n}\n","import { initRepo } from \"../fs/init\";\nimport { installAgentHooks } from \"../hooks/install\";\nimport { runInitHookPrompt } from \"../ui/initHooks\";\n\nexport type RunInitOptions = {\n installHooks?: boolean;\n agent?: string;\n};\n\nfunction isInteractiveTty(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nexport async function runInit(options: RunInitOptions = {}): Promise<number> {\n const cwd = process.cwd();\n const result = await initRepo(cwd);\n\n if (result.alreadyInitialized) {\n console.log(\"BEP is already initialized.\");\n } else {\n console.log(`Initialized BEP in this repository (${result.createdPaths.length} items created).`);\n }\n\n let shouldInstallHooks = options.installHooks;\n if (shouldInstallHooks === undefined && options.agent !== undefined) {\n shouldInstallHooks = true;\n }\n\n if (shouldInstallHooks === false && options.agent) {\n console.error(\"Cannot use --agent with --no-install-hooks.\");\n return 1;\n }\n\n if (shouldInstallHooks === false) {\n return 0;\n }\n\n let selectedAgent = options.agent;\n if (shouldInstallHooks === undefined && isInteractiveTty()) {\n const promptResult = await runInitHookPrompt();\n if (promptResult.kind === \"cancel\") {\n console.error(\"Cancelled hook setup.\");\n return 1;\n }\n\n if (promptResult.kind === \"skip\") {\n return 0;\n }\n\n selectedAgent = promptResult.agent;\n }\n\n if (shouldInstallHooks === undefined && !selectedAgent) {\n return 0;\n }\n\n const installResult = await installAgentHooks(cwd, selectedAgent ?? \"claude-code\");\n if (!installResult.ok) {\n console.error(installResult.error);\n return 1;\n }\n\n if (installResult.alreadyInstalled) {\n console.log(`Claude Code tracking hooks are already installed (${installResult.settingsPathRelative}).`);\n return 0;\n }\n\n console.log(`Installed Claude Code tracking hooks in ${installResult.settingsPathRelative}.`);\n return 0;\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isCancel, select } from \"@clack/prompts\";\nimport { isValidBetId } from \"../bep/id\";\nimport { normalizeValidationStatus } from \"../bep/status\";\nimport { getBetAbsolutePath, getBetRelativePath, pathExists, readBetFile, writeBetFile } from \"../fs/bets\";\nimport { EVIDENCE_DIR, ensureInitializedRepo } from \"../fs/init\";\nimport { listRegisteredProviderTypes, resolveProviderModule } from \"../providers/registry\";\nimport { formatManualComparisonOperator } from \"../providers/manual\";\nimport type { LeadingIndicator } from \"../providers/types\";\n\ntype EvidenceSnapshot = {\n id: string;\n checked_at: string;\n mode: string;\n leading_indicator: LeadingIndicator;\n observed_value: number;\n meets_target: boolean;\n notes?: string;\n meta?: Record<string, unknown>;\n};\n\nfunction getLeadingIndicatorType(value: unknown): string | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n\n const type = (value as { type?: unknown }).type;\n return typeof type === \"string\" && type.length > 0 ? type : null;\n}\n\nfunction formatComparisonLabel(indicator: LeadingIndicator, observedValue: number): string {\n if (indicator.type === \"manual\" || indicator.type === \"mixpanel\") {\n return `${observedValue} ${formatManualComparisonOperator(indicator.operator)} ${indicator.target}`;\n }\n\n return String(observedValue);\n}\n\ntype CheckOptions = {\n force?: boolean;\n rootDir?: string;\n};\n\nfunction hasPassedStatusInFrontmatter(markdown: string): boolean {\n const trimmed = markdown.trimStart();\n if (!trimmed.startsWith(\"---\")) {\n return false;\n }\n\n const lines = trimmed.split(/\\r?\\n/);\n if (lines.length < 3 || lines[0]?.trim() !== \"---\") {\n return false;\n }\n\n const endIndex = lines.slice(1).findIndex((line) => line.trim() === \"---\");\n if (endIndex === -1) {\n return false;\n }\n\n const frontmatterLines = lines.slice(1, endIndex + 1);\n return frontmatterLines.some((line) => /^status:\\s*passed\\s*$/i.test(line.trim()));\n}\n\nasync function hasPassingEvidence(rootDir: string, id: string): Promise<boolean> {\n const evidencePath = path.join(rootDir, EVIDENCE_DIR, `${id}.json`);\n if (!(await pathExists(evidencePath))) {\n return false;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(evidencePath, \"utf8\"));\n } catch {\n return false;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n return false;\n }\n\n return (parsed as { meets_target?: unknown }).meets_target === true;\n}\n\nfunction isInteractiveTty(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nasync function maybePromptUnpass(id: string): Promise<\"keep\" | \"unpass\" | \"cancel\"> {\n const value = await select({\n message: `Bet '${id}' is currently status: passed, but the forced check FAILED. Update status?`,\n options: [\n { label: \"Keep status: passed\", value: \"keep\" },\n { label: \"Set status: pending\", value: \"unpass\" },\n ],\n initialValue: \"keep\",\n });\n\n if (isCancel(value)) {\n return \"cancel\";\n }\n\n return value as \"keep\" | \"unpass\";\n}\n\nexport async function runCheck(id: string, options: CheckOptions = {}): Promise<number> {\n if (!isValidBetId(id)) {\n console.error(`Invalid bet id '${id}'. Use lowercase id format like 'landing-page' or 'landing_page'.`);\n return 1;\n }\n\n let rootDir: string;\n try {\n if (options.rootDir) {\n const ensured = await ensureInitializedRepo(options.rootDir);\n if (ensured.rootDir !== options.rootDir) {\n throw new Error(`Expected BEP repo root at ${options.rootDir}, found ${ensured.rootDir}.`);\n }\n rootDir = ensured.rootDir;\n } else {\n const cwd = process.cwd();\n ({ rootDir } = await ensureInitializedRepo(cwd));\n }\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const relativeBetPath = getBetRelativePath(id);\n const absoluteBetPath = getBetAbsolutePath(rootDir, id);\n\n if (!(await pathExists(absoluteBetPath))) {\n console.error(`Bet '${id}' does not exist at ${relativeBetPath}. Run 'bep new ${id}' first.`);\n return 1;\n }\n\n let bet;\n try {\n bet = await readBetFile(rootDir, id);\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const validationStatus = normalizeValidationStatus(bet.bet.data.status);\n const isPassed = hasPassedStatusInFrontmatter(bet.markdown) || validationStatus === \"passed\";\n if (isPassed && !options.force) {\n if (await hasPassingEvidence(rootDir, id)) {\n console.log(`Bet '${id}' is status: passed; skipping validation check.`);\n return 0;\n }\n }\n\n const rawLeadingIndicator = bet.bet.data.leading_indicator;\n const leadingIndicatorType = getLeadingIndicatorType(rawLeadingIndicator);\n if (!leadingIndicatorType) {\n console.error(\"Bet has invalid leading_indicator: missing string field 'type'.\");\n return 1;\n }\n\n const module = resolveProviderModule(leadingIndicatorType);\n if (!module) {\n const knownTypes = listRegisteredProviderTypes().join(\", \");\n console.error(\n `Bet has unsupported leading_indicator.type '${leadingIndicatorType}'. Supported types: ${knownTypes}.`,\n );\n return 1;\n }\n\n const parsedIndicator = module.adapter.parseIndicator(rawLeadingIndicator);\n if (!parsedIndicator.ok) {\n console.error(`Bet '${id}' has invalid leading_indicator: ${parsedIndicator.error}`);\n return 1;\n }\n\n let checkResult: Awaited<ReturnType<typeof module.adapter.runCheck>>;\n try {\n checkResult = await module.adapter.runCheck(parsedIndicator.value, {\n rootDir,\n betId: id,\n nowIso: new Date().toISOString(),\n });\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n if (\"cancelled\" in checkResult) {\n console.error(\"Cancelled. No evidence was written.\");\n return 1;\n }\n\n const snapshot: EvidenceSnapshot = {\n id,\n checked_at: new Date().toISOString(),\n mode: parsedIndicator.value.type,\n leading_indicator: parsedIndicator.value,\n observed_value: checkResult.observedValue,\n meets_target: checkResult.meetsTarget,\n notes: checkResult.notes,\n meta: checkResult.meta,\n };\n\n const relativeEvidencePath = path.join(EVIDENCE_DIR, `${id}.json`);\n const absoluteEvidencePath = path.join(rootDir, relativeEvidencePath);\n\n try {\n await writeFile(absoluteEvidencePath, `${JSON.stringify(snapshot, null, 2)}\\n`, \"utf8\");\n } catch (error) {\n console.error(`Failed to write evidence at ${relativeEvidencePath}: ${(error as Error).message}`);\n return 1;\n }\n\n const comparisonLabel = formatComparisonLabel(parsedIndicator.value, checkResult.observedValue);\n console.log(\n `Captured ${parsedIndicator.value.type} evidence for '${id}' at ${relativeEvidencePath}. Result: ${checkResult.meetsTarget ? \"PASS\" : \"FAIL\"} (${comparisonLabel}).`,\n );\n\n if (checkResult.meetsTarget) {\n bet.bet.data.status = \"passed\";\n try {\n await writeBetFile(rootDir, id, bet.bet);\n } catch (error) {\n console.error(`Failed to mark bet '${id}' as passed: ${(error as Error).message}`);\n return 1;\n }\n\n console.log(`Marked bet '${id}' as status: passed.`);\n return 0;\n }\n\n if (options.force && isPassed) {\n if (!isInteractiveTty()) {\n console.log(\n `Note: Bet '${id}' remains status: passed. To unpass, edit bets/${id}.md and set status: pending.`,\n );\n return 0;\n }\n\n const result = await maybePromptUnpass(id);\n if (result === \"cancel\") {\n console.log(`Cancelled; bet '${id}' remains status: passed.`);\n return 0;\n }\n\n if (result === \"unpass\") {\n bet.bet.data.status = \"pending\";\n try {\n await writeBetFile(rootDir, id, bet.bet);\n } catch (error) {\n console.error(`Failed to update bet '${id}' status: ${(error as Error).message}`);\n return 1;\n }\n console.log(`Updated bet '${id}' to status: pending.`);\n }\n }\n\n return 0;\n}\n","export const BET_ID_REGEX = /^[a-z0-9]+(?:[-_][a-z0-9]+)*$/;\n\nexport function isValidBetId(id: string): boolean {\n return BET_ID_REGEX.test(id);\n}\n","export type ValidationStatus = \"pending\" | \"passed\";\n\nexport function normalizeValidationStatus(value: unknown): ValidationStatus {\n return value === \"passed\" ? \"passed\" : \"pending\";\n}\n\n","import { access, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport matter from \"gray-matter\";\nimport type { BetFile, BetFrontmatter } from \"../bep/file\";\nimport { BETS_DIR } from \"./init\";\n\nexport type ReadBetFileResult = {\n relativePath: string;\n absolutePath: string;\n markdown: string;\n bet: BetFile;\n};\n\nexport function getBetRelativePath(idOrFileName: string): string {\n const fileName = idOrFileName.endsWith(\".md\") ? idOrFileName : `${idOrFileName}.md`;\n return path.join(BETS_DIR, fileName);\n}\n\nexport function getBetAbsolutePath(rootDir: string, idOrFileName: string): string {\n return path.join(rootDir, getBetRelativePath(idOrFileName));\n}\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readBetFile(rootDir: string, idOrFileName: string): Promise<ReadBetFileResult> {\n const relativePath = getBetRelativePath(idOrFileName);\n const absolutePath = getBetAbsolutePath(rootDir, idOrFileName);\n\n let markdown: string;\n try {\n markdown = await readFile(absolutePath, \"utf8\");\n } catch (error) {\n throw new Error(`Failed to parse BEP file at ${relativePath}: ${(error as Error).message}`);\n }\n\n let parsed: matter.GrayMatterFile<string>;\n try {\n parsed = matter(markdown);\n } catch (error) {\n throw new Error(`Failed to parse BEP file at ${relativePath}: ${(error as Error).message}`);\n }\n\n return {\n relativePath,\n absolutePath,\n markdown,\n bet: {\n content: parsed.content,\n data: parsed.data as BetFrontmatter,\n },\n };\n}\n\nexport async function listBetMarkdownFiles(rootDir: string): Promise<string[]> {\n const betsDir = path.join(rootDir, BETS_DIR);\n const entries = await readdir(betsDir, { withFileTypes: true });\n\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n}\n\nexport async function writeBetFile(rootDir: string, idOrFileName: string, bet: BetFile): Promise<void> {\n const absolutePath = getBetAbsolutePath(rootDir, idOrFileName);\n await writeFile(absolutePath, matter.stringify(bet.content, bet.data), \"utf8\");\n}\n","import { select, text, isCancel } from \"@clack/prompts\";\nimport { runCheckPrompt } from \"../ui/checkPrompt\";\nimport type {\n ManualComparisonOperator,\n ManualLeadingIndicator,\n ProviderAdapter,\n ProviderModule,\n ProviderParseResult,\n ProviderSetupAdapter,\n ProviderSetupContext,\n ProviderSetupResult,\n} from \"./types\";\n\nconst BACK_VALUE = \"__back__\";\nconst DIM = \"\\u001b[2m\";\nconst RESET = \"\\u001b[0m\";\n\nexport type ManualOperatorPromptResult =\n | { kind: \"value\"; value: ManualComparisonOperator }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type ManualTargetPromptResult =\n | { kind: \"value\"; value: number }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type ManualSetupPromptClient = {\n promptManualOperator(params: {\n initialValue?: ManualComparisonOperator;\n allowBack: boolean;\n }): Promise<ManualOperatorPromptResult>;\n promptManualTarget(params: { initialValue?: number; allowBack: boolean }): Promise<ManualTargetPromptResult>;\n};\n\nfunction isManualComparisonOperator(value: unknown): value is ManualComparisonOperator {\n return value === \"lt\" || value === \"lte\" || value === \"eq\" || value === \"gte\" || value === \"gt\";\n}\n\nexport function parseManualLeadingIndicator(input: unknown): ProviderParseResult<ManualLeadingIndicator> {\n if (!input || typeof input !== \"object\") {\n return { ok: false, error: \"leading_indicator must be an object.\" };\n }\n\n const candidate = input as { type?: unknown; operator?: unknown; target?: unknown };\n\n if (candidate.type !== \"manual\") {\n return { ok: false, error: 'leading_indicator.type must equal \"manual\".' };\n }\n\n if (!isManualComparisonOperator(candidate.operator)) {\n return { ok: false, error: 'leading_indicator.operator must be one of \"lt\", \"lte\", \"eq\", \"gte\", \"gt\".' };\n }\n\n if (typeof candidate.target !== \"number\" || !Number.isFinite(candidate.target)) {\n return { ok: false, error: \"leading_indicator.target must be a finite number.\" };\n }\n\n return {\n ok: true,\n value: {\n type: \"manual\",\n operator: candidate.operator,\n target: candidate.target,\n },\n };\n}\n\nexport function evaluateManualComparison(\n observedValue: number,\n operator: ManualComparisonOperator,\n target: number,\n): boolean {\n if (operator === \"lt\") {\n return observedValue < target;\n }\n\n if (operator === \"lte\") {\n return observedValue <= target;\n }\n\n if (operator === \"eq\") {\n return observedValue === target;\n }\n\n if (operator === \"gte\") {\n return observedValue >= target;\n }\n\n return observedValue > target;\n}\n\nexport function formatManualComparisonOperator(operator: ManualComparisonOperator): string {\n if (operator === \"lt\") {\n return \"<\";\n }\n\n if (operator === \"lte\") {\n return \"<=\";\n }\n\n if (operator === \"eq\") {\n return \"=\";\n }\n\n if (operator === \"gte\") {\n return \">=\";\n }\n\n return \">\";\n}\n\nexport function createClackManualSetupPromptClient(): ManualSetupPromptClient {\n return {\n async promptManualOperator({ initialValue, allowBack }) {\n const options: Array<{ label: string; value: ManualComparisonOperator | typeof BACK_VALUE }> = [\n { label: \"lt (less than)\", value: \"lt\" },\n { label: \"lte (less than or equal)\", value: \"lte\" },\n { label: \"eq (equal)\", value: \"eq\" },\n { label: \"gte (greater than or equal)\", value: \"gte\" },\n { label: \"gt (greater than)\", value: \"gt\" },\n ];\n\n if (allowBack) {\n options.unshift({ label: \"Back\", value: BACK_VALUE });\n }\n\n const value = await select({\n message: \"Leading indicator comparison operator\",\n options,\n initialValue,\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n if (value === BACK_VALUE) {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value };\n },\n\n async promptManualTarget({ initialValue, allowBack }) {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Leading indicator numeric target (required).${backHint}`,\n initialValue: typeof initialValue === \"number\" ? String(initialValue) : undefined,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0 || !Number.isFinite(Number(trimmed))) {\n return \"Enter a valid number.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: Number(trimmed) };\n },\n };\n}\n\nexport const manualAdapter: ProviderAdapter<ManualLeadingIndicator> = {\n type: \"manual\",\n parseIndicator(input) {\n return parseManualLeadingIndicator(input);\n },\n async runCheck(indicator) {\n const promptResult = await runCheckPrompt();\n if (promptResult.cancelled) {\n return { cancelled: true };\n }\n\n return {\n observedValue: promptResult.observedValue,\n meetsTarget: evaluateManualComparison(promptResult.observedValue, indicator.operator, indicator.target),\n notes: promptResult.notes,\n };\n },\n};\n\nfunction getManualSetupClient(\n ctx: ProviderSetupContext<ManualLeadingIndicator>,\n): ManualSetupPromptClient {\n if (ctx.client && typeof ctx.client === \"object\") {\n const candidate = ctx.client as Partial<ManualSetupPromptClient>;\n if (typeof candidate.promptManualOperator === \"function\" && typeof candidate.promptManualTarget === \"function\") {\n return candidate as ManualSetupPromptClient;\n }\n }\n\n return createClackManualSetupPromptClient();\n}\n\nexport const manualSetup: ProviderSetupAdapter<ManualLeadingIndicator> = {\n type: \"manual\",\n async collectNewWizardInput(ctx): Promise<ProviderSetupResult<ManualLeadingIndicator>> {\n const client = getManualSetupClient(ctx);\n let stepIndex = 0;\n const values: Partial<ManualLeadingIndicator> = {\n type: \"manual\",\n operator: ctx.initialValue?.operator,\n target: ctx.initialValue?.target,\n };\n\n while (stepIndex < 2) {\n if (stepIndex === 0) {\n const result = await client.promptManualOperator({\n initialValue: values.operator,\n allowBack: ctx.allowBack,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n\n if (result.kind === \"back\") {\n return { kind: \"back\" };\n }\n\n values.operator = result.value;\n stepIndex += 1;\n continue;\n }\n\n const result = await client.promptManualTarget({\n initialValue: values.target,\n allowBack: true,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n\n if (result.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n values.target = result.value;\n stepIndex += 1;\n }\n\n if (!values.operator || typeof values.target !== \"number\") {\n return { kind: \"cancel\" };\n }\n\n return {\n kind: \"value\",\n value: {\n type: \"manual\",\n operator: values.operator,\n target: values.target,\n },\n };\n },\n};\n\nexport const manualProviderModule: ProviderModule<ManualLeadingIndicator> = {\n adapter: manualAdapter,\n setup: manualSetup,\n};\n","import { isCancel, text } from \"@clack/prompts\";\n\nexport type CheckPromptResult =\n | { cancelled: true }\n | { cancelled: false; observedValue: number; notes?: string };\n\nexport type CheckPromptClient = {\n promptObservedValue(): Promise<string | symbol>;\n promptNotes(): Promise<string | symbol>;\n};\n\nexport function createClackCheckPromptClient(): CheckPromptClient {\n return {\n async promptObservedValue() {\n return text({\n message: \"Observed value (required, numeric)\",\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (trimmed.length === 0 || !Number.isFinite(Number(trimmed))) {\n return \"Enter a valid number.\";\n }\n },\n });\n },\n async promptNotes() {\n return text({\n message: \"Notes (optional)\",\n });\n },\n };\n}\n\nexport async function runCheckPrompt(\n client: CheckPromptClient = createClackCheckPromptClient(),\n): Promise<CheckPromptResult> {\n const observed = await client.promptObservedValue();\n if (isCancel(observed)) {\n return { cancelled: true };\n }\n\n const notes = await client.promptNotes();\n if (isCancel(notes)) {\n return { cancelled: true };\n }\n\n const observedValue = Number(observed.trim());\n const trimmedNotes = (notes || \"\").trim();\n\n return {\n cancelled: false,\n observedValue,\n notes: trimmedNotes.length > 0 ? trimmedNotes : undefined,\n };\n}\n","import { Buffer } from \"node:buffer\";\n\nimport { isCancel, select, text } from \"@clack/prompts\";\nimport { evaluateManualComparison } from \"./manual\";\nimport { getMixpanelServiceAccountCreds, readProviderConfig } from \"./config\";\nimport type {\n ManualComparisonOperator,\n MixpanelLeadingIndicator,\n ProviderAdapter,\n ProviderModule,\n ProviderParseResult,\n ProviderSetupAdapter,\n ProviderSetupContext,\n ProviderSetupResult,\n} from \"./types\";\n\nconst BACK_VALUE = \"__back__\";\nconst DIM = \"\\u001b[2m\";\nconst RESET = \"\\u001b[0m\";\nconst MIXPANEL_REPORT_ENDPOINT = \"https://mixpanel.com/api/query/insights\";\nconst MIXPANEL_URL_HINT =\n \"Values come from report URL: /project/<PROJECT_ID>/view/<WORKSPACE_ID>/...#...report-<BOOKMARK_ID>.\";\n\ntype MixpanelProjectPromptResult =\n | { kind: \"value\"; value: string }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\ntype MixpanelWorkspacePromptResult =\n | { kind: \"value\"; value: string }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\ntype MixpanelBookmarkPromptResult =\n | { kind: \"value\"; value: string }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\ntype MixpanelOperatorPromptResult =\n | { kind: \"value\"; value: ManualComparisonOperator }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\ntype MixpanelTargetPromptResult =\n | { kind: \"value\"; value: number }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type MixpanelSetupPromptClient = {\n promptMixpanelProjectId(params: { initialValue?: string; allowBack: boolean }): Promise<MixpanelProjectPromptResult>;\n promptMixpanelWorkspaceId(params: {\n initialValue?: string;\n allowBack: boolean;\n }): Promise<MixpanelWorkspacePromptResult>;\n promptMixpanelBookmarkId(params: {\n initialValue?: string;\n allowBack: boolean;\n }): Promise<MixpanelBookmarkPromptResult>;\n promptMixpanelOperator(params: {\n initialValue?: ManualComparisonOperator;\n allowBack: boolean;\n }): Promise<MixpanelOperatorPromptResult>;\n promptMixpanelTarget(params: { initialValue?: number; allowBack: boolean }): Promise<MixpanelTargetPromptResult>;\n};\n\nfunction isManualComparisonOperator(value: unknown): value is ManualComparisonOperator {\n return value === \"lt\" || value === \"lte\" || value === \"eq\" || value === \"gte\" || value === \"gt\";\n}\n\nexport function parseMixpanelLeadingIndicator(input: unknown): ProviderParseResult<MixpanelLeadingIndicator> {\n if (!input || typeof input !== \"object\") {\n return { ok: false, error: \"leading_indicator must be an object.\" };\n }\n\n const candidate = input as {\n type?: unknown;\n project_id?: unknown;\n workspace_id?: unknown;\n bookmark_id?: unknown;\n operator?: unknown;\n target?: unknown;\n };\n\n if (candidate.type !== \"mixpanel\") {\n return { ok: false, error: 'leading_indicator.type must equal \"mixpanel\".' };\n }\n\n if (typeof candidate.project_id !== \"string\" || candidate.project_id.trim().length === 0) {\n return { ok: false, error: \"leading_indicator.project_id must be a non-empty string.\" };\n }\n\n if (typeof candidate.workspace_id !== \"string\" || candidate.workspace_id.trim().length === 0) {\n return { ok: false, error: \"leading_indicator.workspace_id must be a non-empty string.\" };\n }\n\n if (typeof candidate.bookmark_id !== \"string\" || candidate.bookmark_id.trim().length === 0) {\n return { ok: false, error: \"leading_indicator.bookmark_id must be a non-empty string.\" };\n }\n\n if (!isManualComparisonOperator(candidate.operator)) {\n return { ok: false, error: 'leading_indicator.operator must be one of \"lt\", \"lte\", \"eq\", \"gte\", \"gt\".' };\n }\n\n if (typeof candidate.target !== \"number\" || !Number.isFinite(candidate.target)) {\n return { ok: false, error: \"leading_indicator.target must be a finite number.\" };\n }\n\n return {\n ok: true,\n value: {\n type: \"mixpanel\",\n project_id: candidate.project_id.trim(),\n workspace_id: candidate.workspace_id.trim(),\n bookmark_id: candidate.bookmark_id.trim(),\n operator: candidate.operator,\n target: candidate.target,\n },\n };\n}\n\nfunction getMixpanelSetupClient(ctx: ProviderSetupContext<MixpanelLeadingIndicator>): MixpanelSetupPromptClient {\n if (ctx.client && typeof ctx.client === \"object\") {\n const candidate = ctx.client as Partial<MixpanelSetupPromptClient>;\n if (\n typeof candidate.promptMixpanelProjectId === \"function\" &&\n typeof candidate.promptMixpanelWorkspaceId === \"function\" &&\n typeof candidate.promptMixpanelBookmarkId === \"function\" &&\n typeof candidate.promptMixpanelOperator === \"function\" &&\n typeof candidate.promptMixpanelTarget === \"function\"\n ) {\n return candidate as MixpanelSetupPromptClient;\n }\n }\n\n return createClackMixpanelSetupPromptClient();\n}\n\nexport function createClackMixpanelSetupPromptClient(): MixpanelSetupPromptClient {\n return {\n async promptMixpanelProjectId({ initialValue, allowBack }) {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Mixpanel project id (required). ${MIXPANEL_URL_HINT}${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a project id.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptMixpanelWorkspaceId({ initialValue, allowBack }) {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Mixpanel workspace id (required). ${MIXPANEL_URL_HINT}${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a workspace id.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptMixpanelBookmarkId({ initialValue, allowBack }) {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Mixpanel bookmark id (required). ${MIXPANEL_URL_HINT}${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a bookmark id.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptMixpanelOperator({ initialValue, allowBack }) {\n const options: Array<{ label: string; value: ManualComparisonOperator | typeof BACK_VALUE }> = [\n { label: \"lt (less than)\", value: \"lt\" },\n { label: \"lte (less than or equal)\", value: \"lte\" },\n { label: \"eq (equal)\", value: \"eq\" },\n { label: \"gte (greater than or equal)\", value: \"gte\" },\n { label: \"gt (greater than)\", value: \"gt\" },\n ];\n\n if (allowBack) {\n options.unshift({ label: \"Back\", value: BACK_VALUE });\n }\n\n const value = await select({\n message: \"Mixpanel comparison operator\",\n options,\n initialValue,\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n if (value === BACK_VALUE) {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value };\n },\n\n async promptMixpanelTarget({ initialValue, allowBack }) {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Mixpanel target value (required).${backHint}`,\n initialValue: typeof initialValue === \"number\" ? String(initialValue) : undefined,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0 || !Number.isFinite(Number(trimmed))) {\n return \"Enter a valid number.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: Number(trimmed) };\n },\n };\n}\n\nfunction collectNumericLeaves(value: unknown): number[] {\n const numbers: number[] = [];\n const stack: unknown[] = [value];\n\n while (stack.length > 0) {\n const current = stack.pop();\n if (typeof current === \"number\" && Number.isFinite(current)) {\n numbers.push(current);\n continue;\n }\n\n if (!current || typeof current !== \"object\") {\n continue;\n }\n\n for (const nested of Object.values(current)) {\n stack.push(nested);\n }\n }\n\n return numbers;\n}\n\nfunction parseObservedValue(payload: unknown): { value: number | null; seriesNumericLeafCount: number | null } {\n if (!payload || typeof payload !== \"object\") {\n return { value: null, seriesNumericLeafCount: null };\n }\n\n const candidate = payload as { value?: unknown; result?: unknown; series?: unknown };\n if (typeof candidate.value === \"number\" && Number.isFinite(candidate.value)) {\n return { value: candidate.value, seriesNumericLeafCount: null };\n }\n\n if (candidate.result && typeof candidate.result === \"object\") {\n const maybeResult = candidate.result as { value?: unknown };\n if (typeof maybeResult.value === \"number\" && Number.isFinite(maybeResult.value)) {\n return { value: maybeResult.value, seriesNumericLeafCount: null };\n }\n }\n\n if (candidate.series && typeof candidate.series === \"object\") {\n const numericLeaves = collectNumericLeaves(candidate.series);\n if (numericLeaves.length === 1) {\n return { value: numericLeaves[0], seriesNumericLeafCount: 1 };\n }\n\n return {\n value: null,\n seriesNumericLeafCount: numericLeaves.length,\n };\n }\n\n return { value: null, seriesNumericLeafCount: null };\n}\n\nexport const mixpanelAdapter: ProviderAdapter<MixpanelLeadingIndicator> = {\n type: \"mixpanel\",\n parseIndicator(input) {\n return parseMixpanelLeadingIndicator(input);\n },\n async runCheck(indicator, ctx) {\n const configResult = await readProviderConfig(ctx.rootDir);\n if (!configResult.ok) {\n throw new Error(configResult.error);\n }\n\n const credsResult = getMixpanelServiceAccountCreds(configResult.value);\n if (!credsResult.ok) {\n throw new Error(credsResult.error);\n }\n\n const params = new URLSearchParams({\n project_id: indicator.project_id,\n workspace_id: indicator.workspace_id,\n bookmark_id: indicator.bookmark_id,\n });\n const url = `${MIXPANEL_REPORT_ENDPOINT}?${params.toString()}`;\n const encodedCreds = Buffer.from(credsResult.value, \"utf8\").toString(\"base64\");\n\n let response: Response;\n try {\n response = await fetch(url, {\n headers: {\n authorization: `Basic ${encodedCreds}`,\n accept: \"application/json\",\n },\n });\n } catch (error) {\n throw new Error(`Failed to query Mixpanel insights API: ${(error as Error).message}`);\n }\n\n if (!response.ok) {\n throw new Error(`Mixpanel insights API returned ${response.status} ${response.statusText}.`);\n }\n\n let payload: unknown;\n try {\n payload = await response.json();\n } catch (error) {\n throw new Error(`Failed to parse Mixpanel response JSON: ${(error as Error).message}`);\n }\n\n const observed = parseObservedValue(payload);\n if (observed.value === null) {\n if (observed.seriesNumericLeafCount !== null) {\n throw new Error(\n observed.seriesNumericLeafCount === 0\n ? \"Mixpanel response series must contain exactly one numeric value; found 0.\"\n : `Mixpanel response series must contain exactly one numeric value; found ${observed.seriesNumericLeafCount}. Use a single-value insight/report.`,\n );\n }\n\n throw new Error(\"Mixpanel response did not include a numeric value field.\");\n }\n\n const observedValue = observed.value;\n\n return {\n observedValue,\n meetsTarget: evaluateManualComparison(observedValue, indicator.operator, indicator.target),\n meta: {\n provider: \"mixpanel\",\n project_id: indicator.project_id,\n workspace_id: indicator.workspace_id,\n bookmark_id: indicator.bookmark_id,\n },\n };\n },\n};\n\nexport const mixpanelSetup: ProviderSetupAdapter<MixpanelLeadingIndicator> = {\n type: \"mixpanel\",\n async collectNewWizardInput(ctx): Promise<ProviderSetupResult<MixpanelLeadingIndicator>> {\n const client = getMixpanelSetupClient(ctx);\n let stepIndex = 0;\n const values: Partial<MixpanelLeadingIndicator> = {\n type: \"mixpanel\",\n project_id: ctx.initialValue?.project_id,\n workspace_id: ctx.initialValue?.workspace_id,\n bookmark_id: ctx.initialValue?.bookmark_id,\n operator: ctx.initialValue?.operator,\n target: ctx.initialValue?.target,\n };\n\n while (stepIndex < 5) {\n if (stepIndex === 0) {\n const result = await client.promptMixpanelProjectId({\n initialValue: values.project_id,\n allowBack: ctx.allowBack,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n if (result.kind === \"back\") {\n return { kind: \"back\" };\n }\n\n values.project_id = result.value;\n stepIndex += 1;\n continue;\n }\n\n if (stepIndex === 1) {\n const result = await client.promptMixpanelWorkspaceId({\n initialValue: values.workspace_id,\n allowBack: true,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n if (result.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n values.workspace_id = result.value;\n stepIndex += 1;\n continue;\n }\n\n if (stepIndex === 2) {\n const result = await client.promptMixpanelBookmarkId({\n initialValue: values.bookmark_id,\n allowBack: true,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n if (result.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n values.bookmark_id = result.value;\n stepIndex += 1;\n continue;\n }\n\n if (stepIndex === 3) {\n const result = await client.promptMixpanelOperator({\n initialValue: values.operator,\n allowBack: true,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n if (result.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n values.operator = result.value;\n stepIndex += 1;\n continue;\n }\n\n const result = await client.promptMixpanelTarget({\n initialValue: values.target,\n allowBack: true,\n });\n\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n if (result.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n values.target = result.value;\n stepIndex += 1;\n }\n\n if (\n !values.project_id ||\n !values.workspace_id ||\n !values.bookmark_id ||\n !values.operator ||\n typeof values.target !== \"number\"\n ) {\n return { kind: \"cancel\" };\n }\n\n return {\n kind: \"value\",\n value: {\n type: \"mixpanel\",\n project_id: values.project_id,\n workspace_id: values.workspace_id,\n bookmark_id: values.bookmark_id,\n operator: values.operator,\n target: values.target,\n },\n };\n },\n};\n\nexport const mixpanelProviderModule: ProviderModule<MixpanelLeadingIndicator> = {\n adapter: mixpanelAdapter,\n setup: mixpanelSetup,\n};\n","import { manualProviderModule } from \"./manual\";\nimport { mixpanelProviderModule } from \"./mixpanel\";\nimport type { LeadingIndicator, ProviderModule, ProviderRegistry } from \"./types\";\n\nexport const providerRegistry: ProviderRegistry = {\n manual: manualProviderModule,\n mixpanel: mixpanelProviderModule,\n};\n\nexport function resolveProviderModule(type: string): ProviderModule<LeadingIndicator> | undefined {\n return providerRegistry[type];\n}\n\nexport function listRegisteredProviderTypes(): string[] {\n return Object.keys(providerRegistry);\n}\n","import { access, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isValidBetId } from \"../bep/id\";\nimport { renderNewBetMarkdown } from \"../bep/template\";\nimport { BETS_DIR, ensureInitializedRepo } from \"../fs/init\";\nimport { runNewWizard } from \"../ui/newWizard\";\nimport { normalizeBetName, promptNewBetName } from \"../ui/newBetName\";\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction isInteractiveTty(): boolean {\n return process.stdin.isTTY === true && process.stdout.isTTY === true;\n}\n\nfunction invalidIdError(id: string): string {\n return `Invalid bet id '${id}'. Use id format like 'landing-page' or 'landing_page'.`;\n}\n\nexport async function runNew(rawId?: string): Promise<number> {\n let id = rawId ? normalizeBetName(rawId) : undefined;\n if (!id) {\n if (!isInteractiveTty()) {\n console.error(\"Missing bet name. Run 'bep new <name>' or use an interactive terminal.\");\n return 1;\n }\n\n const nameResult = await promptNewBetName();\n if (nameResult.cancelled) {\n console.error(\"Cancelled. No files were created.\");\n return 1;\n }\n\n id = normalizeBetName(nameResult.value);\n }\n\n if (!isValidBetId(id)) {\n console.error(invalidIdError(id));\n return 1;\n }\n\n let rootDir: string;\n try {\n const cwd = process.cwd();\n ({ rootDir } = await ensureInitializedRepo(cwd));\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const relativePath = path.join(BETS_DIR, `${id}.md`);\n const absolutePath = path.join(rootDir, relativePath);\n\n if (await pathExists(absolutePath)) {\n console.error(`Bet '${id}' already exists at ${relativePath}. Choose a unique id.`);\n return 1;\n }\n\n const wizardResult = await runNewWizard();\n if (wizardResult.cancelled) {\n console.error(\"Cancelled. No files were created.\");\n return 1;\n }\n\n const markdown = renderNewBetMarkdown({\n id,\n createdAt: new Date().toISOString(),\n leadingIndicator: wizardResult.values.leadingIndicator,\n maxHours: wizardResult.values.maxHours,\n maxCalendarDays: wizardResult.values.maxCalendarDays,\n primaryAssumption: wizardResult.values.primaryAssumption,\n rationale: wizardResult.values.rationale,\n validationPlan: wizardResult.values.validationPlan,\n notes: wizardResult.values.notes,\n });\n\n try {\n await writeFile(absolutePath, markdown, { encoding: \"utf8\", flag: \"wx\" });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n console.error(`Bet '${id}' already exists at ${relativePath}. Choose a unique id.`);\n return 1;\n }\n\n throw error;\n }\n\n console.log(`\\nCreated ${relativePath}.`);\n return 0;\n}\n","import matter from \"gray-matter\";\nimport type { LeadingIndicator } from \"../providers/types\";\n\nexport type NewBetTemplateInput = {\n id: string;\n createdAt: string;\n leadingIndicator: LeadingIndicator;\n maxHours?: number;\n maxCalendarDays?: number;\n primaryAssumption: string;\n rationale: string;\n validationPlan: string;\n notes: string;\n};\n\nexport function renderNewBetMarkdown(input: NewBetTemplateInput): string {\n const frontmatter: Record<string, unknown> = {\n id: input.id,\n status: \"pending\",\n created_at: input.createdAt,\n leading_indicator: input.leadingIndicator,\n };\n\n if (typeof input.maxHours === \"number\") {\n frontmatter.max_hours = input.maxHours;\n }\n\n if (typeof input.maxCalendarDays === \"number\") {\n frontmatter.max_calendar_days = input.maxCalendarDays;\n }\n\n const body = [\n \"# Budgeted Engineering Proposal\",\n \"\",\n \"## 1. Primary Assumption\",\n \"\",\n input.primaryAssumption,\n \"\",\n \"## 2. Rationale\",\n \"\",\n input.rationale,\n \"\",\n \"## 3. Validation Plan\",\n \"\",\n input.validationPlan,\n \"\",\n \"## 4. Notes\",\n \"\",\n input.notes,\n \"\",\n ].join(\"\\n\");\n\n return `${matter.stringify(body, frontmatter)}`;\n}\n","import { isCancel, select, text } from \"@clack/prompts\";\nimport { listRegisteredProviderTypes, resolveProviderModule } from \"../providers/registry\";\nimport type { ManualSetupPromptClient, ManualOperatorPromptResult, ManualTargetPromptResult } from \"../providers/manual\";\nimport { createClackMixpanelSetupPromptClient } from \"../providers/mixpanel\";\nimport type { MixpanelSetupPromptClient } from \"../providers/mixpanel\";\nimport type { LeadingIndicator, LeadingIndicatorType, ManualComparisonOperator } from \"../providers/types\";\n\nconst BACK_VALUE = \"__back__\";\nconst DIM = \"\\u001b[2m\";\nconst RESET = \"\\u001b[0m\";\n\ntype OptionalNumberField = \"max_hours\" | \"max_calendar_days\";\n\nexport type CapTypePromptResult =\n | { kind: \"value\"; value: OptionalNumberField }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type NumberPromptResult =\n | { kind: \"value\"; value: number }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type LeadingIndicatorTypePromptResult =\n | { kind: \"value\"; value: LeadingIndicatorType }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type MarkdownSectionPromptResult =\n | { kind: \"value\"; value: string }\n | { kind: \"back\" }\n | { kind: \"cancel\" };\n\nexport type NewWizardValues = {\n maxHours?: number;\n maxCalendarDays?: number;\n leadingIndicator: LeadingIndicator;\n primaryAssumption: string;\n rationale: string;\n validationPlan: string;\n notes: string;\n};\n\nexport type NewWizardResult = { cancelled: true } | { cancelled: false; values: NewWizardValues };\n\nexport type WizardPromptClient = ManualSetupPromptClient &\n MixpanelSetupPromptClient & {\n promptCapType(params: {\n initialValue?: OptionalNumberField;\n allowBack: boolean;\n }): Promise<CapTypePromptResult>;\n promptCapValue(params: {\n field: OptionalNumberField;\n initialValue?: number;\n allowBack: boolean;\n }): Promise<NumberPromptResult>;\n promptLeadingIndicatorType(params: {\n initialValue?: LeadingIndicatorType;\n allowBack: boolean;\n }): Promise<LeadingIndicatorTypePromptResult>;\n promptPrimaryAssumption(params: { initialValue?: string; allowBack: boolean }): Promise<MarkdownSectionPromptResult>;\n promptRationale(params: { initialValue?: string; allowBack: boolean }): Promise<MarkdownSectionPromptResult>;\n promptValidationPlan(params: { initialValue?: string; allowBack: boolean }): Promise<MarkdownSectionPromptResult>;\n promptNotes(params: { initialValue?: string; allowBack: boolean }): Promise<MarkdownSectionPromptResult>;\n};\n\ntype WizardLog = (message: string) => void;\n\nconst STEP_ORDER = [\n \"cap_type\",\n \"cap_value\",\n \"leading_indicator_type\",\n \"leading_indicator_setup\",\n \"primary_assumption\",\n \"rationale\",\n \"validation_plan\",\n \"notes\",\n] as const;\ntype Step = (typeof STEP_ORDER)[number];\ntype StepFlowResult = { kind: \"next\" } | { kind: \"back\" } | { kind: \"cancel\" };\ntype PromptFlowResult<T> = { kind: \"value\"; value: T } | { kind: \"back\" } | { kind: \"cancel\" };\ntype StepHandlerContext = {\n client: WizardPromptClient;\n values: MutableWizardValues;\n stepIndex: number;\n};\ntype StepHandler = (context: StepHandlerContext) => Promise<StepFlowResult>;\n\ntype MutableWizardValues = {\n capType?: OptionalNumberField;\n capValue?: number;\n leadingIndicatorType?: LeadingIndicatorType;\n leadingIndicator?: LeadingIndicator;\n primaryAssumption?: string;\n rationale?: string;\n validationPlan?: string;\n notes?: string;\n};\n\nfunction applyPromptResult<T>(result: PromptFlowResult<T>, onValue: (value: T) => void): StepFlowResult {\n if (result.kind === \"cancel\") {\n return { kind: \"cancel\" };\n }\n\n if (result.kind === \"back\") {\n return { kind: \"back\" };\n }\n\n onValue(result.value);\n return { kind: \"next\" };\n}\n\nfunction finalizeWizardValues(values: MutableWizardValues): NewWizardValues | null {\n if (\n !values.capType ||\n typeof values.capValue !== \"number\" ||\n !values.leadingIndicator ||\n !values.primaryAssumption ||\n !values.rationale ||\n !values.validationPlan ||\n values.notes === undefined\n ) {\n return null;\n }\n\n const maxHours = values.capType === \"max_hours\" ? values.capValue : undefined;\n const maxCalendarDays = values.capType === \"max_calendar_days\" ? values.capValue : undefined;\n\n return {\n maxHours,\n maxCalendarDays,\n leadingIndicator: values.leadingIndicator,\n primaryAssumption: values.primaryAssumption,\n rationale: values.rationale,\n validationPlan: values.validationPlan,\n notes: values.notes,\n };\n}\n\nconst STEP_HANDLERS: Record<Step, StepHandler> = {\n async cap_type({ client, values, stepIndex }) {\n const result = await client.promptCapType({\n initialValue: values.capType,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n const previousCapType = values.capType;\n values.capType = value;\n if (previousCapType !== value) {\n values.capValue = undefined;\n }\n });\n },\n\n async cap_value({ client, values, stepIndex }) {\n if (!values.capType) {\n return { kind: \"cancel\" };\n }\n\n const result = await client.promptCapValue({\n field: values.capType,\n initialValue: values.capValue,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n values.capValue = value;\n });\n },\n\n async leading_indicator_type({ client, values, stepIndex }) {\n const result = await client.promptLeadingIndicatorType({\n initialValue: values.leadingIndicatorType,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n if (values.leadingIndicatorType !== value) {\n values.leadingIndicator = undefined;\n }\n values.leadingIndicatorType = value;\n });\n },\n\n async leading_indicator_setup({ client, values, stepIndex }) {\n if (!values.leadingIndicatorType) {\n return { kind: \"cancel\" };\n }\n\n const module = resolveProviderModule(values.leadingIndicatorType);\n if (!module || !module.setup) {\n return { kind: \"cancel\" };\n }\n\n const setupResult = await module.setup.collectNewWizardInput({\n allowBack: stepIndex > 0,\n initialValue:\n values.leadingIndicator && values.leadingIndicator.type === values.leadingIndicatorType\n ? values.leadingIndicator\n : undefined,\n client,\n });\n\n return applyPromptResult(setupResult, (value) => {\n values.leadingIndicator = value;\n });\n },\n\n async primary_assumption({ client, values, stepIndex }) {\n const result = await client.promptPrimaryAssumption({\n initialValue: values.primaryAssumption,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n values.primaryAssumption = value;\n });\n },\n\n async rationale({ client, values, stepIndex }) {\n const result = await client.promptRationale({\n initialValue: values.rationale,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n values.rationale = value;\n });\n },\n\n async validation_plan({ client, values, stepIndex }) {\n const result = await client.promptValidationPlan({\n initialValue: values.validationPlan,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n values.validationPlan = value;\n });\n },\n\n async notes({ client, values, stepIndex }) {\n const result = await client.promptNotes({\n initialValue: values.notes,\n allowBack: stepIndex > 0,\n });\n\n return applyPromptResult(result, (value) => {\n values.notes = value;\n });\n },\n};\n\nexport async function runNewWizard(\n client: WizardPromptClient = createClackPromptClient(),\n log: WizardLog = console.log,\n): Promise<NewWizardResult> {\n let stepIndex = 0;\n const values: MutableWizardValues = {};\n\n while (stepIndex < STEP_ORDER.length) {\n const step: Step = STEP_ORDER[stepIndex];\n const handler = STEP_HANDLERS[step];\n if (!handler) {\n throw new Error(`No wizard step handler registered for '${step}'.`);\n }\n\n const flow = await handler({ client, values, stepIndex });\n if (flow.kind === \"cancel\") {\n return { cancelled: true };\n }\n\n if (flow.kind === \"back\") {\n stepIndex = Math.max(0, stepIndex - 1);\n continue;\n }\n\n stepIndex += 1;\n }\n\n const finalizedValues = finalizeWizardValues(values);\n if (!finalizedValues) {\n return { cancelled: true };\n }\n\n return {\n cancelled: false,\n values: finalizedValues,\n };\n}\n\nexport function createClackPromptClient(): WizardPromptClient {\n const mixpanelPromptClient = createClackMixpanelSetupPromptClient();\n\n return {\n async promptCapType({ initialValue, allowBack }) {\n const options: Array<{ label: string; value: OptionalNumberField | typeof BACK_VALUE }> = [\n { label: \"Cap by hours\", value: \"max_hours\" },\n { label: \"Cap by calendar days\", value: \"max_calendar_days\" },\n ];\n\n if (allowBack) {\n options.unshift({ label: \"Back\", value: BACK_VALUE });\n }\n\n const value = await select({\n message: \"Choose your exposure cap type\",\n options,\n initialValue,\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n if (value === BACK_VALUE) {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value };\n },\n\n async promptCapValue({ field, initialValue, allowBack }) {\n const label = field === \"max_hours\" ? \"Max hours\" : \"Max calendar days\";\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n\n const value = await text({\n message: `${label} (required).${backHint}`,\n initialValue: typeof initialValue === \"number\" ? String(initialValue) : undefined,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a positive number.\";\n }\n\n const parsed = Number(trimmed);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return \"Enter a positive number.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: Number(trimmed) };\n },\n\n async promptLeadingIndicatorType({ initialValue, allowBack }) {\n const options: Array<{ label: string; value: LeadingIndicatorType | typeof BACK_VALUE }> = listRegisteredProviderTypes()\n .map((type) => ({ label: type, value: type as LeadingIndicatorType }));\n\n if (allowBack) {\n options.unshift({ label: \"Back\", value: BACK_VALUE });\n }\n\n const value = await select({\n message: \"Leading indicator provider type\",\n options,\n initialValue,\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n if (value === BACK_VALUE) {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value };\n },\n\n async promptManualOperator({ initialValue, allowBack }): Promise<ManualOperatorPromptResult> {\n const options: Array<{ label: string; value: ManualComparisonOperator | typeof BACK_VALUE }> = [\n { label: \"lt (less than)\", value: \"lt\" },\n { label: \"lte (less than or equal)\", value: \"lte\" },\n { label: \"eq (equal)\", value: \"eq\" },\n { label: \"gte (greater than or equal)\", value: \"gte\" },\n { label: \"gt (greater than)\", value: \"gt\" },\n ];\n\n if (allowBack) {\n options.unshift({ label: \"Back\", value: BACK_VALUE });\n }\n\n const value = await select({\n message: \"Leading indicator comparison operator\",\n options,\n initialValue,\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n if (value === BACK_VALUE) {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value };\n },\n\n async promptManualTarget({ initialValue, allowBack }): Promise<ManualTargetPromptResult> {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Leading indicator numeric target (required).${backHint}`,\n initialValue: typeof initialValue === \"number\" ? String(initialValue) : undefined,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0 || !Number.isFinite(Number(trimmed))) {\n return \"Enter a valid number.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: Number(trimmed) };\n },\n\n async promptMixpanelProjectId({ initialValue, allowBack }) {\n return mixpanelPromptClient.promptMixpanelProjectId({ initialValue, allowBack });\n },\n\n async promptMixpanelWorkspaceId({ initialValue, allowBack }) {\n return mixpanelPromptClient.promptMixpanelWorkspaceId({ initialValue, allowBack });\n },\n\n async promptMixpanelBookmarkId({ initialValue, allowBack }) {\n return mixpanelPromptClient.promptMixpanelBookmarkId({ initialValue, allowBack });\n },\n\n async promptMixpanelOperator({ initialValue, allowBack }) {\n return mixpanelPromptClient.promptMixpanelOperator({ initialValue, allowBack });\n },\n\n async promptMixpanelTarget({ initialValue, allowBack }) {\n return mixpanelPromptClient.promptMixpanelTarget({ initialValue, allowBack });\n },\n\n async promptPrimaryAssumption({ initialValue, allowBack }): Promise<MarkdownSectionPromptResult> {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Primary assumption (required).${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a value.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptRationale({ initialValue, allowBack }): Promise<MarkdownSectionPromptResult> {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Rationale (required).${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a value.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptValidationPlan({ initialValue, allowBack }): Promise<MarkdownSectionPromptResult> {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Validation plan (required).${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = rawValue.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n if (trimmed.length === 0) {\n return \"Enter a value.\";\n }\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = value.trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n\n async promptNotes({ initialValue, allowBack }): Promise<MarkdownSectionPromptResult> {\n const backHint = allowBack ? ` ${DIM}(type b to go back)${RESET}` : \"\";\n const value = await text({\n message: `Notes (optional).${backHint}`,\n initialValue,\n validate(rawValue) {\n const trimmed = (rawValue || '').trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return;\n }\n\n return undefined;\n },\n });\n\n if (isCancel(value)) {\n return { kind: \"cancel\" };\n }\n\n const trimmed = (value || '').trim();\n if (allowBack && trimmed.toLowerCase() === \"b\") {\n return { kind: \"back\" };\n }\n\n return { kind: \"value\", value: trimmed };\n },\n };\n}\n","import { isCancel, text } from \"@clack/prompts\";\n\ntype NewBetNameResult = { cancelled: true } | { cancelled: false; value: string };\n\nexport function normalizeBetName(value: string): string {\n return value.trim().replace(/\\s+/g, \"_\").toLowerCase();\n}\n\nexport async function promptNewBetName(): Promise<NewBetNameResult> {\n const response = await text({\n message: \"Bet name\",\n placeholder: \"Landing page iteration\",\n validate(input) {\n return input.trim().length > 0 ? undefined : \"Bet name is required.\";\n },\n });\n\n if (isCancel(response)) {\n return { cancelled: true };\n }\n\n return {\n cancelled: false,\n value: normalizeBetName(response),\n };\n}\n","import { readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { STATE_PATH } from \"../fs/init\";\n\nexport type ActiveSession = {\n id: string;\n started_at: string;\n};\n\nexport type BepState = {\n active: ActiveSession[];\n};\n\nfunction isValidActiveSession(value: unknown): value is ActiveSession {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Partial<ActiveSession>;\n return typeof candidate.id === \"string\" && candidate.id.length > 0 && typeof candidate.started_at === \"string\";\n}\n\nfunction parseState(raw: string): BepState {\n const parsed = JSON.parse(raw) as unknown;\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"State file must contain a JSON object.\");\n }\n\n const active = (parsed as { active?: unknown }).active;\n if (!Array.isArray(active)) {\n throw new Error(\"State file field 'active' must be an array.\");\n }\n\n for (const [index, session] of active.entries()) {\n if (!isValidActiveSession(session)) {\n throw new Error(`State file has invalid active session at index ${index}.`);\n }\n }\n\n return { active };\n}\n\nexport async function readState(rootDir: string): Promise<BepState> {\n const statePath = path.join(rootDir, STATE_PATH);\n const raw = await readFile(statePath, \"utf8\");\n\n return parseState(raw);\n}\n\nexport async function writeState(rootDir: string, state: BepState): Promise<void> {\n const statePath = path.join(rootDir, STATE_PATH);\n await writeFile(statePath, `${JSON.stringify(state, null, 2)}\\n`, \"utf8\");\n}\n\nexport function addActiveSession(\n state: BepState,\n id: string,\n startedAt: string,\n): { state: BepState; alreadyActive: boolean } {\n const alreadyActive = state.active.some((session) => session.id === id);\n if (alreadyActive) {\n return { state, alreadyActive: true };\n }\n\n return {\n alreadyActive: false,\n state: {\n active: [...state.active, { id, started_at: startedAt }],\n },\n };\n}\n\nexport function removeActiveSessions(state: BepState, id: string): { state: BepState; removed: ActiveSession[] } {\n const removed = state.active.filter((session) => session.id === id);\n if (removed.length === 0) {\n return { state, removed };\n }\n\n return {\n removed,\n state: {\n active: state.active.filter((session) => session.id !== id),\n },\n };\n}\n","import { getBetAbsolutePath, getBetRelativePath, pathExists, readBetFile } from \"../fs/bets\";\nimport { isValidBetId } from \"../bep/id\";\nimport { ensureInitializedRepo } from \"../fs/init\";\nimport { addActiveSession, readState, writeState } from \"../state/state\";\n\nexport async function runStart(id: string): Promise<number> {\n if (!isValidBetId(id)) {\n console.error(`Invalid bet id '${id}'. Use lowercase id format like 'landing-page' or 'landing_page'.`);\n return 1;\n }\n\n let rootDir: string;\n try {\n const cwd = process.cwd();\n ({ rootDir } = await ensureInitializedRepo(cwd));\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const relativePath = getBetRelativePath(id);\n const absolutePath = getBetAbsolutePath(rootDir, id);\n\n if (!(await pathExists(absolutePath))) {\n console.error(`Bet '${id}' does not exist at ${relativePath}. Run 'bep new ${id}' first.`);\n return 1;\n }\n\n try {\n await readBetFile(rootDir, id);\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n let state;\n try {\n state = await readState(rootDir);\n } catch (error) {\n console.error(`Failed to read state file at bets/_state.json: ${(error as Error).message}`);\n return 1;\n }\n\n const now = new Date().toISOString();\n const next = addActiveSession(state, id, now);\n\n if (next.alreadyActive) {\n console.log(`Bet '${id}' is already active.`);\n return 0;\n }\n\n try {\n await writeState(rootDir, next.state);\n } catch (error) {\n console.error(`Failed to start bet '${id}': ${(error as Error).message}`);\n return 1;\n }\n\n console.log(`Started bet '${id}'.`);\n return 0;\n}\n","import { appendFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isValidBetId } from \"../bep/id\";\nimport { getBetAbsolutePath, getBetRelativePath, pathExists, readBetFile } from \"../fs/bets\";\nimport { LOGS_DIR, ensureInitializedRepo } from \"../fs/init\";\nimport { readState, removeActiveSessions, writeState } from \"../state/state\";\n\ntype StopLogEntry = {\n id: string;\n started_at: string;\n stopped_at: string;\n duration_seconds: number;\n};\n\nexport async function runStop(id: string): Promise<number> {\n if (!isValidBetId(id)) {\n console.error(`Invalid bet id '${id}'. Use lowercase id format like 'landing-page' or 'landing_page'.`);\n return 1;\n }\n\n let rootDir: string;\n try {\n const cwd = process.cwd();\n ({ rootDir } = await ensureInitializedRepo(cwd));\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n let state;\n try {\n state = await readState(rootDir);\n } catch (error) {\n console.error(`Failed to read state file at bets/_state.json: ${(error as Error).message}`);\n return 1;\n }\n\n const next = removeActiveSessions(state, id);\n if (next.removed.length === 0) {\n console.log(`Bet '${id}' is not active.`);\n return 0;\n }\n\n const stoppedAt = new Date();\n const stoppedAtIso = stoppedAt.toISOString();\n const logs: StopLogEntry[] = [];\n\n for (const session of next.removed) {\n const startedMs = Date.parse(session.started_at);\n if (Number.isNaN(startedMs)) {\n console.error(`Active session for '${id}' has invalid started_at: '${session.started_at}'.`);\n return 1;\n }\n\n const durationSeconds = Math.max(0, Math.floor((stoppedAt.getTime() - startedMs) / 1000));\n logs.push({\n id,\n started_at: session.started_at,\n stopped_at: stoppedAtIso,\n duration_seconds: durationSeconds,\n });\n }\n\n const relativeBetPath = getBetRelativePath(id);\n const absoluteBetPath = getBetAbsolutePath(rootDir, id);\n\n const hasBetFile = await pathExists(absoluteBetPath);\n if (hasBetFile) {\n try {\n await readBetFile(rootDir, id);\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n }\n\n const logPath = path.join(rootDir, LOGS_DIR, `${id}.jsonl`);\n const serializedLogs = logs.map((line) => JSON.stringify(line)).join(\"\\n\").concat(\"\\n\");\n\n try {\n await appendFile(logPath, serializedLogs, \"utf8\");\n await writeState(rootDir, next.state);\n } catch (error) {\n console.error(`Failed to stop bet '${id}': ${(error as Error).message}`);\n return 1;\n }\n\n if (!hasBetFile) {\n console.error(`Warning: Bet file '${relativeBetPath}' is missing. Session was stopped and logged.`);\n }\n\n console.log(`Stopped bet '${id}' (${next.removed.length} session(s) logged).`);\n return 0;\n}\n","import { readFile, readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { normalizeValidationStatus } from \"../bep/status\";\nimport { formatManualComparisonOperator } from \"../providers/manual\";\nimport { pathExists, readBetFile } from \"../fs/bets\";\nimport { BETS_DIR, EVIDENCE_DIR, LOGS_DIR, ensureInitializedRepo } from \"../fs/init\";\nimport { readState } from \"../state/state\";\n\ntype StatusRow = {\n id: string;\n status: string;\n active: string;\n exposureHours: string;\n cap: string;\n capPercent: string;\n warning: string;\n validation: string;\n};\n\ntype ValidationSnapshot = {\n meets_target?: unknown;\n observed_value?: unknown;\n leading_indicator?: unknown;\n};\n\nconst STATUS_COLUMNS: Array<keyof StatusRow> = [\n \"id\",\n \"status\",\n \"active\",\n \"exposureHours\",\n \"cap\",\n \"capPercent\",\n \"warning\",\n \"validation\",\n];\n\nconst STATUS_HEADERS: Record<keyof StatusRow, string> = {\n id: \"id\",\n status: \"status\",\n active: \"active\",\n exposureHours: \"time_h\",\n cap: \"cap\",\n capPercent: \"cap_%\",\n warning: \"warning\",\n validation: \"validation\",\n};\n\nfunction formatHours(value: number): string {\n return value.toFixed(2);\n}\n\nfunction formatPercent(value: number): string {\n return `${value.toFixed(2)}%`;\n}\n\nfunction parseMaxHours(frontmatter: Record<string, unknown>): number | null {\n const value = frontmatter.max_hours;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n\n return value;\n}\n\nfunction parseMaxCalendarDays(frontmatter: Record<string, unknown>): number | null {\n const value = frontmatter.max_calendar_days;\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n\n return value;\n}\n\nfunction parseCreatedAtMs(frontmatter: Record<string, unknown>): number | null {\n const value = frontmatter.created_at;\n if (value instanceof Date) {\n const millis = value.getTime();\n return Number.isNaN(millis) ? null : millis;\n }\n\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return null;\n }\n\n const millis = Date.parse(value);\n if (Number.isNaN(millis)) {\n return null;\n }\n\n return millis;\n}\n\nfunction formatValidation(snapshot: ValidationSnapshot): string {\n const meetsTarget = snapshot.meets_target;\n const observedValue = snapshot.observed_value;\n const leadingIndicator = snapshot.leading_indicator;\n\n if (typeof meetsTarget !== \"boolean\" || typeof observedValue !== \"number\" || !Number.isFinite(observedValue)) {\n return \"N/A\";\n }\n\n const resultLabel = meetsTarget ? \"PASS\" : \"FAIL\";\n if (!leadingIndicator || typeof leadingIndicator !== \"object\") {\n return `${resultLabel} ${observedValue}`;\n }\n\n const candidate = leadingIndicator as { type?: unknown; operator?: unknown; target?: unknown };\n if (\n (candidate.type === \"manual\" || candidate.type === \"mixpanel\") &&\n typeof candidate.target === \"number\" &&\n Number.isFinite(candidate.target) &&\n (candidate.operator === \"lt\" ||\n candidate.operator === \"lte\" ||\n candidate.operator === \"eq\" ||\n candidate.operator === \"gte\" ||\n candidate.operator === \"gt\")\n ) {\n return `${resultLabel} ${observedValue} ${formatManualComparisonOperator(candidate.operator)} ${candidate.target}`;\n }\n\n return `${resultLabel} ${observedValue}`;\n}\n\nasync function sumLoggedExposureSeconds(rootDir: string, id: string): Promise<number> {\n const relativePath = path.join(LOGS_DIR, `${id}.jsonl`);\n const absolutePath = path.join(rootDir, relativePath);\n if (!(await pathExists(absolutePath))) {\n return 0;\n }\n\n const raw = await readFile(absolutePath, \"utf8\");\n if (raw.trim().length === 0) {\n return 0;\n }\n\n let total = 0;\n const lines = raw.split(/\\r?\\n/);\n for (const [index, line] of lines.entries()) {\n if (line.trim().length === 0) {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n throw new Error(`Failed to parse log file at ${relativePath}: invalid JSON on line ${index + 1}.`);\n }\n\n const duration = (parsed as { duration_seconds?: unknown }).duration_seconds;\n if (typeof duration !== \"number\" || !Number.isFinite(duration) || duration < 0) {\n throw new Error(\n `Failed to parse log file at ${relativePath}: missing numeric duration_seconds on line ${index + 1}.`,\n );\n }\n\n total += duration;\n }\n\n return total;\n}\n\nasync function readValidationLabel(rootDir: string, id: string): Promise<string> {\n const relativePath = path.join(EVIDENCE_DIR, `${id}.json`);\n const absolutePath = path.join(rootDir, relativePath);\n if (!(await pathExists(absolutePath))) {\n return \"N/A\";\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(await readFile(absolutePath, \"utf8\"));\n } catch (error) {\n throw new Error(`Failed to parse evidence file at ${relativePath}: ${(error as Error).message}`);\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n return \"N/A\";\n }\n\n return formatValidation(parsed as ValidationSnapshot);\n}\n\nfunction renderStatusTable(rows: StatusRow[]): string {\n const matrix = [\n STATUS_COLUMNS.map((column) => STATUS_HEADERS[column]),\n ...rows.map((row) => STATUS_COLUMNS.map((column) => row[column])),\n ];\n\n const widths = STATUS_COLUMNS.map((_column, columnIndex) =>\n matrix.reduce((max, currentRow) => Math.max(max, currentRow[columnIndex].length), 0),\n );\n\n const rendered = matrix.map((row) => row.map((cell, index) => cell.padEnd(widths[index])).join(\" \"));\n return rendered.join(\"\\n\");\n}\n\nexport async function runStatus(): Promise<number> {\n let rootDir: string;\n try {\n const cwd = process.cwd();\n ({ rootDir } = await ensureInitializedRepo(cwd));\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const betDir = path.join(rootDir, BETS_DIR);\n\n let dirEntries;\n try {\n dirEntries = await readdir(betDir, { withFileTypes: true });\n } catch (error) {\n console.error(`Failed to read bets directory at ${BETS_DIR}: ${(error as Error).message}`);\n return 1;\n }\n\n const betFiles = dirEntries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".md\") && !entry.name.startsWith(\"_\"))\n .map((entry) => entry.name)\n .sort((a, b) => a.localeCompare(b));\n\n if (betFiles.length === 0) {\n console.log(\"No bets found.\");\n return 0;\n }\n\n let activeBetIds: Set<string>;\n try {\n const state = await readState(rootDir);\n activeBetIds = new Set(state.active.map((session) => session.id));\n } catch (error) {\n console.error(`Failed to read state file at bets/_state.json: ${(error as Error).message}`);\n return 1;\n }\n\n const rows: StatusRow[] = [];\n const nowMs = Date.now();\n for (const fileName of betFiles) {\n const id = fileName.slice(0, -\".md\".length);\n let bet;\n try {\n bet = (await readBetFile(rootDir, fileName)).bet;\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n let exposureSeconds: number;\n try {\n exposureSeconds = await sumLoggedExposureSeconds(rootDir, id);\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n let validationLabel: string;\n try {\n validationLabel = await readValidationLabel(rootDir, id);\n } catch (error) {\n console.error((error as Error).message);\n return 1;\n }\n\n const frontmatter = bet.data;\n const status = normalizeValidationStatus(frontmatter.status);\n const maxHours = parseMaxHours(frontmatter);\n const maxCalendarDays = maxHours === null ? parseMaxCalendarDays(frontmatter) : null;\n const createdAtMs = maxCalendarDays === null ? null : parseCreatedAtMs(frontmatter);\n const exposureHours = exposureSeconds / 3600;\n let cap = \"-\";\n let capPercent: number | null = null;\n\n if (maxHours !== null) {\n cap = `${formatHours(maxHours)}h`;\n capPercent = (exposureHours / maxHours) * 100;\n } else if (maxCalendarDays !== null) {\n cap = `${maxCalendarDays.toFixed(2)}d`;\n if (createdAtMs !== null) {\n const elapsedCalendarDays = Math.max(0, (nowMs - createdAtMs) / (24 * 60 * 60 * 1000));\n capPercent = (elapsedCalendarDays / maxCalendarDays) * 100;\n }\n }\n\n const warning = capPercent === null ? \"-\" : capPercent >= 100 ? \"AT_CAP\" : capPercent >= 70 ? \"NEARING_CAP\" : \"-\";\n\n rows.push({\n id,\n status,\n active: activeBetIds.has(id) ? \"yes\" : \"no\",\n exposureHours: formatHours(exposureHours),\n cap,\n capPercent: capPercent === null ? \"-\" : formatPercent(capPercent),\n warning,\n validation: validationLabel,\n });\n }\n\n console.log(renderStatusTable(rows));\n return 0;\n}\n","import { appendFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { findInitializedRepo, LOGS_DIR } from \"../fs/init\";\nimport { parseHookStdin, readHookStdin } from \"../hooks/events\";\nimport { isSupportedHookAgent } from \"../hooks/types\";\nimport { buildBetSelectionContext } from \"../tracking/context\";\nimport { applySelectionDecision } from \"../tracking/decision\";\nimport { evaluateCapGate } from \"../tracking/enforcement\";\nimport { selectBetWithClaude } from \"../tracking/selector\";\nimport type { AppliedDecisionResult, HookEvent, SelectionResult } from \"../tracking/types\";\n\ntype HookLogEntry = {\n agent: \"claude-code\";\n event: HookEvent;\n at: string;\n session_id?: string;\n bet_id?: string;\n confidence?: number;\n applied: boolean;\n};\n\ntype AttributionLogEntry = {\n at: string;\n agent: \"claude-code\";\n event: HookEvent;\n session_id?: string;\n decision?: AppliedDecisionResult[\"decision\"];\n applied: boolean;\n applied_steps: string[];\n error: string | null;\n};\n\ntype BlockLogEntry = {\n at: string;\n agent: \"claude-code\";\n event: HookEvent;\n session_id?: string;\n bet_id?: string;\n cap_type?: \"max_hours\" | \"max_calendar_days\";\n cap_value?: number;\n used_value?: number;\n percent_used?: number;\n over_cap: boolean;\n enforced: boolean;\n reason: string;\n};\n\ntype HookDependencies = {\n readInput: () => Promise<string>;\n select: typeof selectBetWithClaude;\n apply: typeof applySelectionDecision;\n append: typeof appendFile;\n writeOutput?: (output: string) => void | boolean;\n};\n\nconst defaultDeps: HookDependencies = {\n readInput: readHookStdin,\n select: selectBetWithClaude,\n apply: applySelectionDecision,\n append: appendFile,\n writeOutput: (output: string) => process.stdout.write(output),\n};\n\nfunction isHookEvent(value: string): value is HookEvent {\n return (\n value === \"user-prompt-submit\" ||\n value === \"post-tool-use\" ||\n value === \"post-tool-use-failure\" ||\n value === \"session-end\"\n );\n}\n\nfunction selectLogDecision(selection: SelectionResult, applied: AppliedDecisionResult | null): AppliedDecisionResult[\"decision\"] {\n if (applied) {\n return applied.decision;\n }\n\n if (selection.ok) {\n return selection.decision;\n }\n\n return {\n action: \"none\",\n confidence: 0,\n reason: selection.error,\n };\n}\n\nexport async function runHook(agent: string, event: string, deps: HookDependencies = defaultDeps): Promise<number> {\n if (!isSupportedHookAgent(agent)) {\n console.error(`Unsupported hook agent '${agent}'. Only 'claude-code' is supported.`);\n return 1;\n }\n\n if (!isHookEvent(event)) {\n console.error(\n `Unsupported hook event '${event}'. Use one of: user-prompt-submit, post-tool-use, post-tool-use-failure, session-end.`,\n );\n return 1;\n }\n\n const found = await findInitializedRepo(process.cwd());\n if (!found) {\n return 0;\n }\n\n const at = new Date().toISOString();\n const writeOutput = deps.writeOutput ?? defaultDeps.writeOutput;\n const rawInput = await deps.readInput().catch(() => \"\");\n const payload = parseHookStdin(rawInput, event);\n\n let selection: SelectionResult;\n let applied: AppliedDecisionResult | null = null;\n let error: string | null = null;\n let promptDenied = false;\n let promptDenyReason: string | null = null;\n let blockLine: BlockLogEntry | null = null;\n\n try {\n const context = await buildBetSelectionContext(found.rootDir, event, payload);\n const debugLogPath = path.join(found.rootDir, LOGS_DIR, \"hook_debug.log\");\n selection = await deps.select(context, { debugLogPath });\n\n if (selection.ok) {\n const gate = await evaluateCapGate(found.rootDir, context, selection.decision);\n if (gate.overCap) {\n blockLine = {\n at,\n agent,\n event,\n session_id: payload?.sessionId,\n bet_id: gate.targetBetId,\n cap_type: gate.capType,\n cap_value: gate.capValue,\n used_value: gate.usedValue,\n percent_used: gate.percentUsed,\n over_cap: true,\n enforced: event === \"user-prompt-submit\",\n reason: gate.reason,\n };\n }\n\n if (event === \"user-prompt-submit\" && gate.overCap) {\n promptDenied = true;\n promptDenyReason = `Bet '${gate.targetBetId ?? \"unknown\"}' is at cap (${(gate.usedValue ?? 0).toFixed(2)} ${gate.capType === \"max_calendar_days\" ? \"days\" : \"hours\"} / ${(gate.capValue ?? 0).toFixed(2)} ${gate.capType === \"max_calendar_days\" ? \"days\" : \"hours\"}, ${(gate.percentUsed ?? 0).toFixed(2)}%). Update bets/${gate.targetBetId}.md to extend cap or change status before continuing.`;\n } else {\n applied = await deps.apply(context, selection.decision);\n if (applied.error) {\n error = applied.error;\n }\n }\n } else {\n error = selection.error;\n }\n } catch (caught) {\n const message = (caught as Error).message;\n selection = {\n ok: false,\n error: `Hook attribution failed: ${message}`,\n };\n error = selection.error;\n }\n\n const decision = selectLogDecision(selection, applied);\n\n const attributionLine: AttributionLogEntry = {\n at,\n agent,\n event,\n session_id: payload?.sessionId,\n decision,\n applied: applied?.applied ?? false,\n applied_steps: applied?.appliedSteps ?? [],\n error,\n };\n\n const sessionLine: HookLogEntry = {\n agent,\n event,\n at,\n session_id: payload?.sessionId,\n bet_id: decision.bet_id,\n confidence: decision.confidence,\n applied: applied?.applied ?? false,\n };\n\n const attributionPath = path.join(found.rootDir, LOGS_DIR, \"agent-attribution.jsonl\");\n const sessionPath = path.join(found.rootDir, LOGS_DIR, \"agent-sessions.jsonl\");\n const blocksPath = path.join(found.rootDir, LOGS_DIR, \"agent-blocks.jsonl\");\n\n if (blockLine) {\n await deps.append(blocksPath, `${JSON.stringify(blockLine)}\\n`, \"utf8\");\n }\n\n await deps.append(attributionPath, `${JSON.stringify(attributionLine)}\\n`, \"utf8\");\n await deps.append(sessionPath, `${JSON.stringify(sessionLine)}\\n`, \"utf8\");\n\n if (event === \"user-prompt-submit\" && promptDenied) {\n writeOutput?.(JSON.stringify({ continue: false, stopReason: promptDenyReason ?? \"Bet is hard-blocked at cap.\" }));\n return 0;\n }\n\n if (event === \"user-prompt-submit\") {\n writeOutput?.(JSON.stringify({ continue: true }));\n return 0;\n }\n\n writeOutput?.(JSON.stringify({ continue: true }));\n return 0;\n}\n","import type { HookEvent, ParsedHookPayload } from \"../tracking/types\";\n\nconst MAX_FIELD_LENGTH = 2000;\n\nfunction truncate(value: string | undefined): string | undefined {\n if (!value) {\n return undefined;\n }\n\n return value.length > MAX_FIELD_LENGTH ? `${value.slice(0, MAX_FIELD_LENGTH)}...` : value;\n}\n\nfunction pickString(source: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction stringifyJson(value: unknown): string | undefined {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return undefined;\n }\n}\n\nexport function parseHookStdin(raw: string, event: HookEvent): ParsedHookPayload | null {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return null;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n return null;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n return null;\n }\n\n const source = parsed as Record<string, unknown>;\n\n const prompt =\n event === \"user-prompt-submit\"\n ? pickString(source, [\"prompt\", \"user_prompt\", \"message\"]) ?? stringifyJson(source[\"prompt\"])\n : undefined;\n\n const toolName =\n event === \"post-tool-use\" || event === \"post-tool-use-failure\"\n ? pickString(source, [\"tool_name\", \"toolName\", \"tool\"]) ?? pickString(source, [\"matcher\"])\n : undefined;\n\n const toolInput =\n event === \"post-tool-use\" || event === \"post-tool-use-failure\"\n ? stringifyJson(source[\"tool_input\"] ?? source[\"input\"] ?? source[\"toolInput\"])\n : undefined;\n\n const toolOutput =\n event === \"post-tool-use\" || event === \"post-tool-use-failure\"\n ? stringifyJson(source[\"tool_output\"] ?? source[\"output\"] ?? source[\"toolOutput\"] ?? source[\"error\"])\n : undefined;\n\n return {\n sessionId: pickString(source, [\"session_id\", \"sessionId\"]),\n prompt: truncate(prompt),\n toolName: truncate(toolName),\n toolInput: truncate(toolInput),\n toolOutput: truncate(toolOutput),\n transcriptPath: truncate(pickString(source, [\"transcript_path\", \"transcriptPath\"])),\n cwd: truncate(pickString(source, [\"cwd\", \"working_directory\", \"workingDirectory\"])),\n raw: source,\n };\n}\n\nexport async function readHookStdin(): Promise<string> {\n if (process.stdin.isTTY) {\n return \"\";\n }\n\n return new Promise<string>((resolve, reject) => {\n let data = \"\";\n process.stdin.setEncoding(\"utf8\");\n process.stdin.on(\"data\", (chunk: string) => {\n data += chunk;\n });\n process.stdin.on(\"end\", () => resolve(data));\n process.stdin.on(\"error\", (error) => reject(error));\n });\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { normalizeValidationStatus } from \"../bep/status\";\nimport { listBetMarkdownFiles, readBetFile } from \"../fs/bets\";\nimport { LOGS_DIR } from \"../fs/init\";\nimport { readState } from \"../state/state\";\nimport type { AttributionHistoryEntry, BetCatalogEntry, HookEvent, ParsedHookPayload, SelectionContext } from \"./types\";\n\nconst MAX_BET_SUMMARY_CHARS = 800;\nconst MAX_HISTORY_ENTRIES = 20;\n\nfunction summarizeContent(content: string): string {\n const compact = content.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_BET_SUMMARY_CHARS) {\n return compact;\n }\n\n return `${compact.slice(0, MAX_BET_SUMMARY_CHARS)}...`;\n}\n\nfunction extractSection(content: string, heading: string): string | undefined {\n const pattern = new RegExp(`##\\\\s*${heading}\\\\s*\\\\n([\\\\s\\\\S]*?)(?=\\\\n##\\\\s|$)`, \"i\");\n const match = content.match(pattern);\n if (!match || !match[1]) {\n return undefined;\n }\n\n return summarizeContent(match[1]);\n}\n\nasync function readBetCatalog(rootDir: string): Promise<BetCatalogEntry[]> {\n const files = await listBetMarkdownFiles(rootDir);\n\n const result: BetCatalogEntry[] = [];\n for (const fileName of files) {\n try {\n const parsed = await readBetFile(rootDir, fileName);\n const id = String(parsed.bet.data.id ?? fileName.replace(/\\.md$/, \"\"));\n const status = normalizeValidationStatus(parsed.bet.data.status);\n const content = parsed.bet.content || \"\";\n\n result.push({\n id,\n status,\n assumption: extractSection(content, \"1\\\\. Primary Assumption\"),\n rationale: extractSection(content, \"2\\\\. Rationale\"),\n validationPlan: extractSection(content, \"3\\\\. Validation Plan\"),\n notes: extractSection(content, \"4\\\\. Notes\"),\n summary: summarizeContent(content),\n });\n } catch {\n // Skip malformed bet files for inference context; do not block hook processing.\n }\n }\n\n return result;\n}\n\nasync function readRecentAttribution(rootDir: string): Promise<AttributionHistoryEntry[]> {\n const filePath = path.join(rootDir, LOGS_DIR, \"agent-attribution.jsonl\");\n\n let raw: string;\n try {\n raw = await readFile(filePath, \"utf8\");\n } catch {\n return [];\n }\n\n const lines = raw\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n\n const recent = lines.slice(-MAX_HISTORY_ENTRIES);\n const parsed: AttributionHistoryEntry[] = [];\n\n for (const line of recent) {\n try {\n const value = JSON.parse(line) as AttributionHistoryEntry;\n parsed.push(value);\n } catch {\n // Ignore malformed history entries.\n }\n }\n\n return parsed;\n}\n\nexport async function buildBetSelectionContext(\n rootDir: string,\n event: HookEvent,\n payload: ParsedHookPayload | null,\n): Promise<SelectionContext> {\n const [state, bets, recentAttribution] = await Promise.all([\n readState(rootDir),\n readBetCatalog(rootDir),\n readRecentAttribution(rootDir),\n ]);\n\n return {\n event,\n payload,\n activeBetIds: state.active.map((session) => session.id),\n bets,\n recentAttribution,\n };\n}\n","import { isValidBetId } from \"../bep/id\";\nimport { runStart } from \"../commands/start\";\nimport { runStop } from \"../commands/stop\";\nimport type { AppliedDecisionResult, SelectionDecision, SelectionContext } from \"./types\";\n\nconst DEFAULT_CONFIDENCE_THRESHOLD = 0.75;\n\ntype ActionDeps = {\n start: (id: string) => Promise<number>;\n stop: (id: string) => Promise<number>;\n};\n\nconst defaultDeps: ActionDeps = {\n start: runStart,\n stop: runStop,\n};\n\nfunction noOp(decision: SelectionDecision): AppliedDecisionResult {\n return {\n applied: false,\n appliedSteps: [],\n decision,\n };\n}\n\nfunction hasValidBet(decision: SelectionDecision, knownBetIds: Set<string>, key: \"bet_id\" | \"stop_bet_id\"): boolean {\n const id = decision[key];\n if (!id) {\n return false;\n }\n\n return isValidBetId(id) && knownBetIds.has(id);\n}\n\nexport async function applySelectionDecision(\n context: SelectionContext,\n rawDecision: SelectionDecision,\n deps: ActionDeps = defaultDeps,\n): Promise<AppliedDecisionResult> {\n const confidence = Number.isFinite(rawDecision.confidence) ? rawDecision.confidence : 0;\n const decision: SelectionDecision = {\n ...rawDecision,\n confidence,\n };\n\n const knownBetIds = new Set(context.bets.map((bet) => bet.id));\n\n if (decision.confidence < DEFAULT_CONFIDENCE_THRESHOLD) {\n return noOp({\n ...decision,\n action: \"none\",\n reason: `${decision.reason} (below confidence threshold)`,\n });\n }\n\n if (decision.action === \"none\" || decision.action === \"keep\") {\n return noOp(decision);\n }\n\n if (decision.action === \"start\") {\n if (!hasValidBet(decision, knownBetIds, \"bet_id\")) {\n return noOp({ ...decision, action: \"none\", reason: `${decision.reason} (invalid start bet)` });\n }\n\n const code = await deps.start(decision.bet_id as string);\n if (code !== 0) {\n return {\n applied: false,\n appliedSteps: [],\n decision,\n error: `Failed to start bet '${decision.bet_id}'.`,\n };\n }\n\n return {\n applied: true,\n appliedSteps: [`start:${decision.bet_id}`],\n decision,\n };\n }\n\n if (decision.action === \"stop\") {\n if (!hasValidBet(decision, knownBetIds, \"bet_id\")) {\n return noOp({ ...decision, action: \"none\", reason: `${decision.reason} (invalid stop bet)` });\n }\n\n const code = await deps.stop(decision.bet_id as string);\n if (code !== 0) {\n return {\n applied: false,\n appliedSteps: [],\n decision,\n error: `Failed to stop bet '${decision.bet_id}'.`,\n };\n }\n\n return {\n applied: true,\n appliedSteps: [`stop:${decision.bet_id}`],\n decision,\n };\n }\n\n if (decision.action === \"switch\") {\n const hasStart = hasValidBet(decision, knownBetIds, \"bet_id\");\n if (!hasStart) {\n return noOp({ ...decision, action: \"none\", reason: `${decision.reason} (invalid switch target)` });\n }\n\n const stopId = hasValidBet(decision, knownBetIds, \"stop_bet_id\")\n ? (decision.stop_bet_id as string)\n : context.activeBetIds.find((id) => id !== decision.bet_id);\n\n if (stopId && stopId === decision.bet_id) {\n return noOp({ ...decision, action: \"keep\", reason: `${decision.reason} (switch target already active)` });\n }\n\n const appliedSteps: string[] = [];\n\n if (stopId) {\n const stopCode = await deps.stop(stopId);\n if (stopCode !== 0) {\n return {\n applied: false,\n appliedSteps,\n decision,\n error: `Failed to stop bet '${stopId}' during switch.`,\n };\n }\n appliedSteps.push(`stop:${stopId}`);\n }\n\n const startCode = await deps.start(decision.bet_id as string);\n if (startCode !== 0) {\n return {\n applied: false,\n appliedSteps,\n decision,\n error: `Failed to start bet '${decision.bet_id}' during switch.`,\n };\n }\n appliedSteps.push(`start:${decision.bet_id}`);\n\n return {\n applied: true,\n appliedSteps,\n decision,\n };\n }\n\n return noOp({ ...decision, action: \"none\", reason: `${decision.reason} (unsupported action)` });\n}\n","import { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isValidBetId } from \"../bep/id\";\nimport { pathExists, readBetFile } from \"../fs/bets\";\nimport { LOGS_DIR } from \"../fs/init\";\nimport type { SelectionContext, SelectionDecision } from \"./types\";\n\nexport type CapType = \"max_hours\" | \"max_calendar_days\";\n\nexport type CapGateResult = {\n targetBetId?: string;\n capType?: CapType;\n capValue?: number;\n usedValue?: number;\n percentUsed?: number;\n overCap: boolean;\n reason: string;\n};\n\ntype Exposure = {\n hours: number;\n calendarDays: number | null;\n};\n\nfunction parsePositiveNumber(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return null;\n }\n\n return value;\n}\n\nfunction parseCreatedAtMs(value: unknown): number | null {\n if (value instanceof Date) {\n const millis = value.getTime();\n return Number.isNaN(millis) ? null : millis;\n }\n\n if (typeof value !== \"string\" || value.trim().length === 0) {\n return null;\n }\n\n const millis = Date.parse(value);\n if (Number.isNaN(millis)) {\n return null;\n }\n\n return millis;\n}\n\nasync function sumLoggedExposureSeconds(rootDir: string, betId: string): Promise<number> {\n const relativePath = path.join(LOGS_DIR, `${betId}.jsonl`);\n const absolutePath = path.join(rootDir, relativePath);\n if (!(await pathExists(absolutePath))) {\n return 0;\n }\n\n const raw = await readFile(absolutePath, \"utf8\");\n if (raw.trim().length === 0) {\n return 0;\n }\n\n let total = 0;\n const lines = raw.split(/\\r?\\n/);\n for (const [index, line] of lines.entries()) {\n if (line.trim().length === 0) {\n continue;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n throw new Error(`invalid_json_line_${index + 1}`);\n }\n\n const duration = (parsed as { duration_seconds?: unknown }).duration_seconds;\n if (typeof duration !== \"number\" || !Number.isFinite(duration) || duration < 0) {\n throw new Error(`invalid_duration_line_${index + 1}`);\n }\n\n total += duration;\n }\n\n return total;\n}\n\nexport async function calculateExposureForBet(rootDir: string, betId: string, createdAt: unknown): Promise<Exposure> {\n const seconds = await sumLoggedExposureSeconds(rootDir, betId);\n const hours = seconds / 3600;\n\n const createdAtMs = parseCreatedAtMs(createdAt);\n if (createdAtMs === null) {\n return {\n hours,\n calendarDays: null,\n };\n }\n\n const calendarDays = Math.max(0, (Date.now() - createdAtMs) / (24 * 60 * 60 * 1000));\n return {\n hours,\n calendarDays,\n };\n}\n\nexport function selectGateTargetBet(context: SelectionContext, decision: SelectionDecision): string | null {\n if (decision.bet_id && isValidBetId(decision.bet_id)) {\n return decision.bet_id;\n }\n\n if (decision.action === \"switch\" && decision.bet_id && isValidBetId(decision.bet_id)) {\n return decision.bet_id;\n }\n\n if (context.activeBetIds.length === 1) {\n const active = context.activeBetIds[0];\n return isValidBetId(active) ? active : null;\n }\n\n return null;\n}\n\nexport async function evaluateCapGate(\n rootDir: string,\n context: SelectionContext,\n decision: SelectionDecision,\n): Promise<CapGateResult> {\n const targetBetId = selectGateTargetBet(context, decision);\n if (!targetBetId) {\n return {\n overCap: false,\n reason: \"no_target_bet\",\n };\n }\n\n const catalogEntry = context.bets.find((bet) => bet.id === targetBetId);\n if (catalogEntry?.status === \"passed\") {\n return {\n targetBetId,\n overCap: false,\n reason: \"bet_passed\",\n };\n }\n\n let bet;\n try {\n bet = (await readBetFile(rootDir, targetBetId)).bet;\n } catch {\n return {\n targetBetId,\n overCap: false,\n reason: \"target_bet_unreadable\",\n };\n }\n\n const maxHours = parsePositiveNumber(bet.data.max_hours);\n const maxCalendarDays = maxHours === null ? parsePositiveNumber(bet.data.max_calendar_days) : null;\n\n if (maxHours === null && maxCalendarDays === null) {\n return {\n targetBetId,\n overCap: false,\n reason: \"no_cap_configured\",\n };\n }\n\n let exposure: Exposure;\n try {\n exposure = await calculateExposureForBet(rootDir, targetBetId, bet.data.created_at);\n } catch (error) {\n return {\n targetBetId,\n overCap: false,\n reason: `cap_eval_failed:${(error as Error).message}`,\n };\n }\n\n if (maxHours !== null) {\n const usedValue = exposure.hours;\n const percentUsed = (usedValue / maxHours) * 100;\n return {\n targetBetId,\n capType: \"max_hours\",\n capValue: maxHours,\n usedValue,\n percentUsed,\n overCap: percentUsed >= 100,\n reason: percentUsed >= 100 ? \"at_or_over_cap\" : \"under_cap\",\n };\n }\n\n const usedValue = exposure.calendarDays;\n if (usedValue === null || maxCalendarDays === null) {\n return {\n targetBetId,\n capType: \"max_calendar_days\",\n capValue: maxCalendarDays ?? undefined,\n overCap: false,\n reason: \"calendar_cap_missing_created_at\",\n };\n }\n\n const percentUsed = (usedValue / maxCalendarDays) * 100;\n return {\n targetBetId,\n capType: \"max_calendar_days\",\n capValue: maxCalendarDays,\n usedValue,\n percentUsed,\n overCap: percentUsed >= 100,\n reason: percentUsed >= 100 ? \"at_or_over_cap\" : \"under_cap\",\n };\n}\n","import { spawn } from \"node:child_process\";\nimport { appendFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { isValidBetId } from \"../bep/id\";\nimport type { SelectionContext, SelectionDecision, SelectionResult } from \"./types\";\n\nconst DEBUG = true;\nconst SELECTION_TIMEOUT_MS = 60000;\nconst OUTPUT_FORMAT_INSTRUCTION =\n \"Return only one JSON object. Do not include markdown fences, commentary, or extra keys.\";\n\ntype ClaudeEnvelope = {\n result?: string;\n};\n\ntype ClaudeArrayEvent = {\n type?: unknown;\n result?: unknown;\n message?: {\n content?: Array<{ type?: unknown; text?: unknown }>;\n };\n};\n\ntype RunClaudeArgs = {\n prompt: string;\n timeoutMs: number;\n onDebug?: (stage: DebugStage, message: string, data?: Record<string, unknown>) => void;\n};\n\ntype RunClaudeFn = (args: RunClaudeArgs) => Promise<string>;\ntype DebugStage =\n | \"build_prompt\"\n | \"spawn_start\"\n | \"spawn_stdout_chunk\"\n | \"spawn_stderr_chunk\"\n | \"spawn_close\"\n | \"parse_outer_json\"\n | \"parse_result_json\"\n | \"validate_decision\"\n | \"return_ok\"\n | \"return_error\";\n\nexport type SelectBetOptions = {\n debugLogPath?: string;\n};\n\ntype DebugEntry = {\n at: string;\n stage: DebugStage;\n event: SelectionContext[\"event\"];\n session_id?: string;\n message: string;\n data?: Record<string, unknown>;\n};\n\nfunction sanitizeForJson(value: unknown): unknown {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n\n if (typeof value === \"bigint\") {\n return String(value);\n }\n\n return value;\n}\n\nasync function writeDebug(debugLogPath: string | undefined, entry: DebugEntry): Promise<void> {\n if (!DEBUG || !debugLogPath) {\n return;\n }\n\n try {\n await appendFile(\n debugLogPath,\n `${JSON.stringify({\n ...entry,\n data: entry.data\n ? Object.fromEntries(Object.entries(entry.data).map(([key, value]) => [key, sanitizeForJson(value)]))\n : undefined,\n })}\\n`,\n \"utf8\",\n );\n } catch {\n // Debug logging must never affect selector behavior.\n }\n}\n\nfunction stripGitEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const next: NodeJS.ProcessEnv = {};\n\n for (const [key, value] of Object.entries(env)) {\n if (key.startsWith(\"GIT_\")) {\n continue;\n }\n next[key] = value;\n }\n\n return next;\n}\n\nasync function defaultRunClaude({ prompt, timeoutMs, onDebug }: RunClaudeArgs): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n void onDebug?.(\"spawn_start\", \"Starting claude selector subprocess.\", {\n command: \"claude\",\n args: [\"--print\", \"--output-format\", \"json\", \"--model\", \"sonnet\", \"--setting-sources\", \"\"],\n cwd: os.tmpdir(),\n timeoutMs,\n });\n\n const child = spawn(\n \"claude\",\n [\"--print\", \"--output-format\", \"json\", \"--model\", \"sonnet\", \"--setting-sources\", \"\"],\n {\n cwd: os.tmpdir(),\n env: stripGitEnv(process.env),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n },\n );\n\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n\n const timer = setTimeout(() => {\n timedOut = true;\n child.kill(\"SIGTERM\");\n }, timeoutMs);\n\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n stdout += chunk;\n void onDebug?.(\"spawn_stdout_chunk\", \"Received stdout chunk from claude selector.\", { chunk });\n });\n\n child.stderr.setEncoding(\"utf8\");\n child.stderr.on(\"data\", (chunk: string) => {\n stderr += chunk;\n void onDebug?.(\"spawn_stderr_chunk\", \"Received stderr chunk from claude selector.\", { chunk });\n });\n\n child.on(\"error\", (error) => {\n clearTimeout(timer);\n reject(error);\n });\n\n child.on(\"close\", (code) => {\n clearTimeout(timer);\n void onDebug?.(\"spawn_close\", \"Claude selector subprocess closed.\", { code, timedOut, stderr });\n if (timedOut) {\n reject(new Error(`Claude selector timed out after ${timeoutMs}ms.`));\n return;\n }\n\n if (code !== 0) {\n reject(new Error(`Claude selector failed with exit code ${code}: ${stderr.trim()}`));\n return;\n }\n\n resolve(stdout);\n });\n\n child.stdin.end(prompt);\n });\n}\n\nfunction maybeExtractJsonFromMarkdown(value: string): string {\n const trimmed = value.trim();\n const match = trimmed.match(/^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i);\n if (match && match[1]) {\n return match[1].trim();\n }\n\n return trimmed;\n}\n\nfunction extractDecisionFromArrayEnvelope(events: unknown[]): unknown | null {\n const typed = events.filter((entry) => entry && typeof entry === \"object\") as ClaudeArrayEvent[];\n\n const resultEvent = typed.find((entry) => entry.type === \"result\" && typeof entry.result === \"string\");\n if (resultEvent && typeof resultEvent.result === \"string\") {\n const body = maybeExtractJsonFromMarkdown(resultEvent.result);\n return JSON.parse(body);\n }\n\n const assistantEvent = typed.find((entry) => entry.type === \"assistant\" && Array.isArray(entry.message?.content));\n if (!assistantEvent || !Array.isArray(assistantEvent.message?.content)) {\n return null;\n }\n\n for (const block of assistantEvent.message.content) {\n if (block?.type !== \"text\" || typeof block.text !== \"string\") {\n continue;\n }\n\n const body = maybeExtractJsonFromMarkdown(block.text);\n return JSON.parse(body);\n }\n\n return null;\n}\n\nfunction toDecision(raw: unknown, knownIds: Set<string>): SelectionDecision | null {\n if (!raw || typeof raw !== \"object\") {\n return null;\n }\n\n const candidate = raw as Record<string, unknown>;\n const action = candidate.action;\n const confidence = candidate.confidence;\n const reason = candidate.reason;\n\n if (\n action !== \"start\" &&\n action !== \"stop\" &&\n action !== \"switch\" &&\n action !== \"keep\" &&\n action !== \"none\"\n ) {\n return null;\n }\n\n if (typeof confidence !== \"number\" || !Number.isFinite(confidence)) {\n return null;\n }\n\n if (typeof reason !== \"string\" || reason.trim().length === 0) {\n return null;\n }\n\n const betId = typeof candidate.bet_id === \"string\" ? candidate.bet_id : undefined;\n const stopBetId = typeof candidate.stop_bet_id === \"string\" ? candidate.stop_bet_id : undefined;\n\n if (betId && (!isValidBetId(betId) || !knownIds.has(betId))) {\n return null;\n }\n\n if (stopBetId && (!isValidBetId(stopBetId) || !knownIds.has(stopBetId))) {\n return null;\n }\n\n return {\n action,\n bet_id: betId,\n stop_bet_id: stopBetId,\n confidence,\n reason: reason.trim(),\n };\n}\n\nfunction buildPrompt(context: SelectionContext): string {\n const bets = context.bets\n .map((bet) => ({\n id: bet.id,\n status: bet.status,\n assumption: bet.assumption,\n rationale: bet.rationale,\n validation_plan: bet.validationPlan,\n notes: bet.notes,\n summary: bet.summary,\n }))\n .slice(0, 50);\n\n const payload = context.payload\n ? {\n session_id: context.payload.sessionId,\n prompt: context.payload.prompt,\n tool_name: context.payload.toolName,\n tool_input: context.payload.toolInput,\n tool_output: context.payload.toolOutput,\n transcript_path: context.payload.transcriptPath,\n cwd: context.payload.cwd,\n }\n : null;\n\n const recent = context.recentAttribution.map((entry) => ({\n at: entry.at,\n event: entry.event,\n session_id: entry.session_id,\n decision: entry.decision,\n }));\n\n const eventSpecificPolicy =\n context.event === \"session-end\"\n ? [\n \"Event-specific policy for session-end:\",\n \"- If an active bet exists, prefer action 'stop' for the current/inferred active bet.\",\n \"- Action 'keep' is generally incorrect at session end unless there is a strong explicit reason.\",\n \"- Use action 'none' only when no active/inferable bet can be identified.\",\n ]\n : context.event === \"user-prompt-submit\"\n ? [\n \"Event-specific policy for user-prompt-submit:\",\n \"- Use 'start' or 'switch' only when intent is explicit or strongly inferred.\",\n \"- Prefer 'none' when intent is weak or ambiguous.\",\n ]\n : [\n \"Event-specific policy for tool events:\",\n \"- Treat tool events as reinforcement signals, not sole evidence for high-confidence switches.\",\n \"- Prefer 'none' when evidence is insufficient.\",\n ];\n\n return [\n \"You are selecting BEP bet attribution actions for a coding session.\",\n \"Constraints:\",\n \"- Choose only bet IDs listed in provided bets.\",\n \"- Prefer action 'none' when uncertain.\",\n \"- Never invent bet IDs.\",\n \"- Output must follow the required JSON schema.\",\n OUTPUT_FORMAT_INSTRUCTION,\n \"\",\n \"Action semantics:\",\n \"- start: begin tracking a specific bet.\",\n \"- stop: pause tracking a specific active bet.\",\n \"- switch: stop old bet and start new bet when shift is clear.\",\n \"- keep: tracking should remain unchanged (discouraged for session-end).\",\n \"- none: insufficient evidence or no valid target.\",\n \"\",\n ...eventSpecificPolicy,\n \"\",\n \"Required JSON schema:\",\n '{\"action\":\"start|stop|switch|keep|none\",\"bet_id\":\"optional\",\"stop_bet_id\":\"optional\",\"confidence\":0-1,\"reason\":\"short\"}',\n \"\",\n \"Context JSON:\",\n JSON.stringify(\n {\n event: context.event,\n active_bets: context.activeBetIds,\n payload,\n bets,\n recent_attribution: recent,\n },\n null,\n 2,\n ),\n ].join(\"\\n\");\n}\n\nexport async function selectBetWithClaude(\n context: SelectionContext,\n runClaudeOrOptions: RunClaudeFn | SelectBetOptions = defaultRunClaude,\n maybeOptions: SelectBetOptions = {},\n): Promise<SelectionResult> {\n const runClaude = typeof runClaudeOrOptions === \"function\" ? runClaudeOrOptions : defaultRunClaude;\n const options = typeof runClaudeOrOptions === \"function\" ? maybeOptions : runClaudeOrOptions;\n\n const debugLog = (stage: DebugStage, message: string, data?: Record<string, unknown>): Promise<void> =>\n writeDebug(options.debugLogPath, {\n at: new Date().toISOString(),\n stage,\n event: context.event,\n session_id: context.payload?.sessionId,\n message,\n data,\n });\n\n if (context.bets.length === 0) {\n await debugLog(\"return_ok\", \"No bets available. Returning no-op decision.\");\n return {\n ok: true,\n decision: {\n action: \"none\",\n confidence: 1,\n reason: \"No bets available for attribution.\",\n },\n rawText: \"\",\n };\n }\n\n const prompt = buildPrompt(context);\n await debugLog(\"build_prompt\", \"Built Claude selector prompt.\", {\n prompt,\n activeBetIds: context.activeBetIds,\n betIds: context.bets.map((bet) => bet.id),\n });\n\n let rawText = \"\";\n try {\n rawText = await runClaude({\n prompt,\n timeoutMs: SELECTION_TIMEOUT_MS,\n onDebug: (stage, message, data) => {\n void debugLog(stage, message, data);\n },\n });\n } catch (error) {\n await debugLog(\"return_error\", \"Claude selector subprocess failed.\", {\n error,\n });\n return {\n ok: false,\n error: `Failed to run Claude selector: ${(error as Error).message}`,\n };\n }\n\n const trimmed = rawText.trim();\n if (trimmed.length === 0) {\n await debugLog(\"return_error\", \"Claude selector returned empty output.\");\n return {\n ok: false,\n error: \"Claude selector returned empty output.\",\n rawText,\n };\n }\n\n let outer: unknown;\n try {\n await debugLog(\"parse_outer_json\", \"Parsing outer Claude output JSON.\", { rawText });\n outer = JSON.parse(trimmed);\n } catch {\n await debugLog(\"return_error\", \"Failed to parse outer Claude output as JSON.\", { rawText });\n return {\n ok: false,\n error: \"Claude selector returned non-JSON output.\",\n rawText,\n };\n }\n\n let decisionValue: unknown = outer;\n if (Array.isArray(outer)) {\n try {\n await debugLog(\"parse_result_json\", \"Parsing Claude array envelope.\", { eventCount: outer.length });\n decisionValue = extractDecisionFromArrayEnvelope(outer);\n } catch {\n await debugLog(\"return_error\", \"Failed to parse decision from Claude array envelope.\", { rawText });\n return {\n ok: false,\n error: \"Claude selector array envelope did not contain valid JSON decision.\",\n rawText,\n };\n }\n\n if (!decisionValue) {\n await debugLog(\"return_error\", \"Claude array envelope missing decision payload.\", { rawText });\n return {\n ok: false,\n error: \"Claude selector array envelope did not include a decision payload.\",\n rawText,\n };\n }\n } else if (outer && typeof outer === \"object\" && typeof (outer as ClaudeEnvelope).result === \"string\") {\n const body = maybeExtractJsonFromMarkdown((outer as ClaudeEnvelope).result ?? \"\");\n try {\n await debugLog(\"parse_result_json\", \"Parsing Claude envelope result JSON.\", { body });\n decisionValue = JSON.parse(body);\n } catch {\n await debugLog(\"return_error\", \"Failed to parse Claude envelope result JSON.\", { body, rawText });\n return {\n ok: false,\n error: \"Claude selector result field did not contain valid JSON decision.\",\n rawText,\n };\n }\n }\n\n const knownIds = new Set(context.bets.map((bet) => bet.id));\n const parsedDecision = toDecision(decisionValue, knownIds);\n await debugLog(\"validate_decision\", \"Validating selector decision schema.\", {\n decisionValue,\n knownIds: Array.from(knownIds),\n valid: parsedDecision !== null,\n });\n if (!parsedDecision) {\n await debugLog(\"return_error\", \"Selector decision failed schema validation.\", { decisionValue, rawText });\n return {\n ok: false,\n error: \"Claude selector decision failed schema validation.\",\n rawText,\n };\n }\n\n if (context.event === \"session-end\" && parsedDecision.action === \"keep\") {\n await debugLog(\"validate_decision\", \"Session-end returned keep; this conflicts with preferred stop policy.\", {\n decision: parsedDecision,\n activeBetIds: context.activeBetIds,\n });\n }\n\n await debugLog(\"return_ok\", \"Selector decision parsed successfully.\", {\n decision: parsedDecision,\n });\n return {\n ok: true,\n decision: parsedDecision,\n rawText,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAwB;;;ACAxB,IAAAA,mBAAmD;AACnD,IAAAC,oBAAiB;;;ACDjB,sBAAyB;AACzB,uBAAiB;AAEV,IAAM,uBAAuB;AAYpC,eAAsB,mBAAmB,SAAgD;AACvF,QAAM,aAAa,iBAAAC,QAAK,KAAK,SAAS,oBAAoB;AAE1D,MAAI;AACJ,MAAI;AACF,UAAM,UAAM,0BAAS,YAAY,MAAM;AAAA,EACzC,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO,8BAA8B,oBAAoB;AAAA,MAC3D;AAAA,IACF;AAEA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,qCAAqC,oBAAoB,KAAM,MAAgB,OAAO;AAAA,IAC/F;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,SAAS,OAAO;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,mBAAmB,oBAAoB,KAAM,MAAgB,OAAO;AAAA,IAC7E;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,WAAO,EAAE,IAAI,OAAO,OAAO,GAAG,oBAAoB,+BAA+B;AAAA,EACnF;AAEA,QAAM,SAAS;AACf,SAAO,EAAE,IAAI,MAAM,OAAO,OAAO;AACnC;AAEO,SAAS,+BACd,QAC4D;AAC5D,MAAI,CAAC,OAAO,YAAY,OAAO,OAAO,aAAa,UAAU;AAC3D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,gCAAgC,oBAAoB;AAAA,IAC7D;AAAA,EACF;AAEA,MACE,OAAO,OAAO,SAAS,0BAA0B,YACjD,OAAO,SAAS,sBAAsB,KAAK,EAAE,WAAW,GACxD;AACA,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,yDAAyD,oBAAoB;AAAA,IACtF;AAAA,EACF;AAEA,QAAM,QAAQ,OAAO,SAAS,sBAAsB,KAAK;AACzD,QAAM,aAAa,MAAM,QAAQ,GAAG;AACpC,MAAI,cAAc,KAAK,eAAe,MAAM,YAAY,GAAG,KAAK,eAAe,MAAM,SAAS,GAAG;AAC/F,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,+CAA+C,oBAAoB;AAAA,IAEvE;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,OAAO,MAAM;AAClC;;;ADjFO,IAAM,WAAW;AACjB,IAAM,WAAW,kBAAAC,QAAK,KAAK,UAAU,OAAO;AAC5C,IAAM,eAAe,kBAAAA,QAAK,KAAK,UAAU,WAAW;AACpD,IAAM,aAAa,kBAAAA,QAAK,KAAK,UAAU,aAAa;AAC3D,IAAM,iBAAiB;AACvB,IAAM,2BAA2B;AAOjC,IAAM,gBAAgB;AAAA,EACpB,QAAQ,CAAC;AACX;AACA,IAAM,0BAA0B;AAAA,EAC9B,UAAU;AAAA,IACR,uBAAuB;AAAA,EACzB;AACF;AAEA,IAAM,sBAAsB,CAAC,UAAU,UAAU,cAAc,UAAU;AAEzE,eAAe,WAAW,UAAoC;AAC5D,MAAI;AACF,cAAM,yBAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,SAAS,SAAsC;AACnE,QAAM,eAAyB,CAAC;AAEhC,aAAW,eAAe,CAAC,UAAU,UAAU,YAAY,GAAG;AAC5D,UAAM,cAAc,kBAAAA,QAAK,KAAK,SAAS,WAAW;AAClD,UAAM,UAAU,MAAM,WAAW,WAAW;AAC5C,cAAM,wBAAM,aAAa,EAAE,WAAW,KAAK,CAAC;AAC5C,QAAI,CAAC,SAAS;AACZ,mBAAa,KAAK,WAAW;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,YAAY,kBAAAA,QAAK,KAAK,SAAS,UAAU;AAC/C,QAAM,cAAc,MAAM,WAAW,SAAS;AAC9C,MAAI,CAAC,aAAa;AAChB,cAAM,4BAAU,WAAW,GAAG,KAAK,UAAU,eAAe,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAChF,iBAAa,KAAK,UAAU;AAAA,EAC9B;AAEA,QAAM,qBAAqB,kBAAAA,QAAK,KAAK,SAAS,oBAAoB;AAClE,QAAM,uBAAuB,MAAM,WAAW,kBAAkB;AAChE,MAAI,CAAC,sBAAsB;AACzB,cAAM,4BAAU,oBAAoB,GAAG,KAAK,UAAU,yBAAyB,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AACnG,iBAAa,KAAK,oBAAoB;AAAA,EACxC;AAEA,QAAM,UAAU,MAAM,gBAAgB,OAAO;AAC7C,MAAI,SAAS;AACX,UAAM,qBAAqB,SAAS,YAAY;AAAA,EAClD;AAEA,SAAO;AAAA,IACL;AAAA,IACA,oBAAoB,aAAa,WAAW;AAAA,EAC9C;AACF;AAEA,eAAe,gBAAgB,UAA0C;AACvE,MAAI,aAAa,kBAAAA,QAAK,QAAQ,QAAQ;AAEtC,SAAO,MAAM;AACX,QAAI,MAAM,WAAW,kBAAAA,QAAK,KAAK,YAAY,MAAM,CAAC,GAAG;AACnD,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,kBAAAA,QAAK,QAAQ,UAAU;AACzC,QAAI,cAAc,YAAY;AAC5B,aAAO;AAAA,IACT;AACA,iBAAa;AAAA,EACf;AACF;AAEA,eAAe,qBAAqB,SAAiB,cAAuC;AAC1F,QAAM,gBAAgB,kBAAAA,QAAK,KAAK,SAAS,cAAc;AACvD,QAAM,SAAS,MAAM,WAAW,aAAa;AAC7C,MAAI,CAAC,QAAQ;AACX,cAAM,4BAAU,eAAe,GAAG,wBAAwB;AAAA,GAAM,MAAM;AACtE,iBAAa,KAAK,cAAc;AAChC;AAAA,EACF;AAEA,QAAM,MAAM,UAAM,2BAAS,eAAe,MAAM;AAChD,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,MAAI,MAAM,SAAS,wBAAwB,GAAG;AAC5C;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,WAAW,KAAK,IAAI,SAAS,IAAI,IAAI,KAAK;AAC7D,YAAM,4BAAU,eAAe,GAAG,GAAG,GAAG,MAAM,GAAG,wBAAwB;AAAA,GAAM,MAAM;AACvF;AAEA,eAAe,sBAAsB,kBAA4C;AAC/E,aAAW,gBAAgB,qBAAqB;AAC9C,UAAM,eAAe,kBAAAA,QAAK,KAAK,kBAAkB,YAAY;AAC7D,QAAI,CAAE,MAAM,WAAW,YAAY,GAAI;AACrC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,oBAAoB,UAAwE;AAChH,MAAI,aAAa,kBAAAA,QAAK,QAAQ,QAAQ;AAEtC,SAAO,MAAM;AACX,QAAI,MAAM,sBAAsB,UAAU,GAAG;AAC3C,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,kBAAAA,QAAK,KAAK,YAAY,QAAQ;AAAA,MACzC;AAAA,IACF;AAEA,UAAM,YAAY,kBAAAA,QAAK,QAAQ,UAAU;AACzC,QAAI,cAAc,YAAY;AAC5B,aAAO;AAAA,IACT;AAEA,iBAAa;AAAA,EACf;AACF;AAEA,eAAsB,sBAAsB,UAAiE;AAC3G,QAAM,QAAQ,MAAM,oBAAoB,QAAQ;AAChD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,MAAM,sEAAsE;AAAA,EACxF;AAEA,SAAO;AACT;;;AElJA,IAAAC,oBAAiB;;;ACAjB,IAAAC,mBAAqB;AACrB,IAAAC,oBAAiB;AAEjB,eAAsB,qBAAqB,UAA0C;AACnF,MAAI,aAAa,kBAAAC,QAAK,QAAQ,QAAQ;AAEtC,SAAO,MAAM;AACX,UAAM,YAAY,kBAAAA,QAAK,KAAK,YAAY,SAAS;AAEjD,QAAI;AACF,YAAM,QAAQ,UAAM,uBAAK,SAAS;AAClC,UAAI,MAAM,YAAY,GAAG;AACvB,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,YAAY,kBAAAA,QAAK,QAAQ,UAAU;AACzC,QAAI,cAAc,YAAY;AAC5B,aAAO;AAAA,IACT;AAEA,iBAAa;AAAA,EACf;AACF;;;ACzBA,IAAAC,mBAAoC;AACpC,IAAAC,oBAAiB;AAEjB,IAAM,uBAAuB;AAC7B,IAAM,cAAc;AAAA,EAClB,EAAE,OAAO,oBAAoB,QAAQ,qBAAqB;AAAA,EAC1D,EAAE,OAAO,eAAe,QAAQ,gBAAgB;AAAA,EAChD,EAAE,OAAO,sBAAsB,QAAQ,wBAAwB;AAAA,EAC/D,EAAE,OAAO,cAAc,QAAQ,cAAc;AAC/C;AAuBA,SAAS,SAAS,OAAkD;AAClE,SAAO,UAAU,QAAQ,OAAO,UAAU;AAC5C;AAEA,SAAS,cAAc,KAA6B;AAClD,QAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,MAAI,CAAC,SAAS,MAAM,GAAG;AACrB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,UAA0B,OAAe,SAA0B;AACxF,MAAI,CAAC,SAAS,SAAS,KAAK,GAAG;AAC7B,aAAS,QAAQ,CAAC;AAAA,EACpB;AAEA,QAAM,eAAe,SAAS;AAC9B,QAAM,cAAc,aAAa,KAAK;AAEtC,MAAI,CAAC,MAAM,QAAQ,WAAW,GAAG;AAC/B,UAAM,QAAqB;AAAA,MACzB,SAAS;AAAA,MACT,OAAO,CAAC,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,IACtC;AACA,iBAAa,KAAK,IAAI,CAAC,KAAK;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI,SAAS,YAAY;AAAA,IACvB,CAAC,YACC,SAAS,OAAO,KAChB,OAAO,QAAQ,YAAY,YAC3B,QAAQ,QAAQ,WAAW,KAC3B,MAAM,QAAQ,QAAQ,KAAK;AAAA,EAC/B;AAEA,MAAI,CAAC,QAAQ;AACX,aAAS,EAAE,SAAS,IAAI,OAAO,CAAC,EAAE;AAClC,gBAAY,KAAK,MAAM;AAAA,EACzB;AAEA,QAAM,SAAS,OAAO,MAAM;AAAA,IAC1B,CAAC,cAAc,aAAa,UAAU,SAAS,aAAa,UAAU,YAAY;AAAA,EACpF;AAEA,MAAI,QAAQ;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AAC9C,SAAO;AACT;AAEA,eAAsB,uBACpB,WACA,iBACkC;AAClC,QAAM,eAAe,kBAAAC,QAAK,KAAK,WAAW,oBAAoB;AAE9D,MAAI,WAA2B,CAAC;AAChC,MAAI;AACF,UAAM,MAAM,UAAM,2BAAS,cAAc,MAAM;AAC/C,eAAW,cAAc,GAAG;AAAA,EAC9B,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,UAAU;AACrB,YAAM;AAAA,IACR;AAAA,EACF;AAEA,MAAI,gBAAgB;AACpB,aAAW,QAAQ,aAAa;AAC9B,UAAM,UAAU,GAAG,eAAe,qBAAqB,KAAK,MAAM;AAClE,QAAI,cAAc,UAAU,KAAK,OAAO,OAAO,GAAG;AAChD,uBAAiB;AAAA,IACnB;AAAA,EACF;AAEA,YAAM,4BAAU,cAAc,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAE9E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACvHO,IAAM,uBAAuB;AAE7B,IAAM,gBAAgB,CAAC,eAAe,UAAU,SAAS,UAAU;AAInE,SAAS,YAAY,OAAmC;AAC7D,SAAQ,cAAoC,SAAS,KAAK;AAC5D;AAEO,SAAS,qBAAqB,OAAqD;AACxF,SAAO,UAAU;AACnB;AAEO,SAAS,iBAAiB,OAA0B;AACzD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;;;AHRA,SAAS,aAAa,OAA8E;AAClG,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE,kBAAkB,KAAK;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,GAAG,iBAAiB,KAAK,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,OAAO,MAAM;AAClC;AAEA,SAAS,cAAc,OAAuB;AAC5C,MAAI,uBAAuB,KAAK,KAAK,GAAG;AACtC,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEO,SAAS,uBAAuB,UAA0B;AAC/D,QAAM,QAAQ,QAAQ,KAAK,CAAC,GAAG,KAAK;AACpC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,kBAAAC,QAAK,WAAW,KAAK,IAAI,QAAQ,kBAAAA,QAAK,QAAQ,UAAU,KAAK;AAC9E,SAAO,cAAc,QAAQ;AAC/B;AAEA,eAAsB,kBAAkB,UAAkB,OAA4C;AACpG,QAAM,WAAW,aAAa,KAAK;AACnC,MAAI,CAAC,SAAS,IAAI;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,MAAM,qBAAqB,QAAQ;AACrD,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OACE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,kBAAkB,uBAAuB,QAAQ;AACvD,QAAM,YAAY,MAAM,uBAAuB,WAAW,eAAe;AACzE,QAAM,uBAAuB,kBAAAA,QAAK,SAAS,UAAU,UAAU,YAAY,KAAK,kBAAAA,QAAK,SAAS,UAAU,YAAY;AAEpH,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO,SAAS;AAAA,IAChB;AAAA,IACA,kBAAkB,UAAU,kBAAkB;AAAA,EAChD;AACF;;;AI/EA,qBAA0C;AAG1C,IAAM,qBAAkC,CAAC,UAAU,SAAS,UAAU;AAatE,eAAsB,kBAAkB,SAA+B,2BAA2B,GAAkC;AAClI,QAAM,gBAAgB,MAAM,OAAO,iBAAiB;AACpD,MAAI,kBAAkB,UAAU;AAC9B,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,MAAI,CAAC,eAAe;AAClB,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,SAAO,MAAM;AACX,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,QAAI,aAAa,UAAU;AACzB,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,QAAI,aAAa,eAAe;AAC9B,aAAO,EAAE,MAAM,WAAW,OAAO,SAAS;AAAA,IAC5C;AAEA,WAAO,eAAe,QAAQ;AAAA,EAChC;AACF;AAEO,SAAS,6BAAmD;AACjE,SAAO;AAAA,IACL,MAAM,mBAAmB;AACvB,YAAM,QAAQ,UAAM,wBAAQ;AAAA,QAC1B,SAAS;AAAA,QACT,cAAc;AAAA,MAChB,CAAC;AAED,cAAI,yBAAS,KAAK,GAAG;AACnB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,MAAM,cAAc;AAClB,YAAM,QAAQ,UAAM,uBAAkB;AAAA,QACpC,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,UAC7C,EAAE,OAAO,UAAU,OAAO,UAAU,MAAM,cAAc;AAAA,UACxD,EAAE,OAAO,SAAS,OAAO,SAAS,MAAM,cAAc;AAAA,UACtD,EAAE,OAAO,YAAY,OAAO,YAAY,MAAM,cAAc;AAAA,QAC9D;AAAA,QACA,cAAc;AAAA,MAChB,CAAC;AAED,cAAI,yBAAS,KAAK,GAAG;AACnB,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,eAAe,OAAkB;AAC/B,UAAI,mBAAmB,SAAS,KAAK,GAAG;AACtC,gBAAQ,IAAI,GAAG,iBAAiB,KAAK,CAAC,sDAAsD;AAAA,MAC9F;AAAA,IACF;AAAA,EACF;AACF;;;ACrEA,SAAS,mBAA4B;AACnC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,eAAsB,QAAQ,UAA0B,CAAC,GAAoB;AAC3E,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,SAAS,MAAM,SAAS,GAAG;AAEjC,MAAI,OAAO,oBAAoB;AAC7B,YAAQ,IAAI,6BAA6B;AAAA,EAC3C,OAAO;AACL,YAAQ,IAAI,uCAAuC,OAAO,aAAa,MAAM,kBAAkB;AAAA,EACjG;AAEA,MAAI,qBAAqB,QAAQ;AACjC,MAAI,uBAAuB,UAAa,QAAQ,UAAU,QAAW;AACnE,yBAAqB;AAAA,EACvB;AAEA,MAAI,uBAAuB,SAAS,QAAQ,OAAO;AACjD,YAAQ,MAAM,6CAA6C;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,OAAO;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,gBAAgB,QAAQ;AAC5B,MAAI,uBAAuB,UAAa,iBAAiB,GAAG;AAC1D,UAAM,eAAe,MAAM,kBAAkB;AAC7C,QAAI,aAAa,SAAS,UAAU;AAClC,cAAQ,MAAM,uBAAuB;AACrC,aAAO;AAAA,IACT;AAEA,QAAI,aAAa,SAAS,QAAQ;AAChC,aAAO;AAAA,IACT;AAEA,oBAAgB,aAAa;AAAA,EAC/B;AAEA,MAAI,uBAAuB,UAAa,CAAC,eAAe;AACtD,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,MAAM,kBAAkB,KAAK,iBAAiB,aAAa;AACjF,MAAI,CAAC,cAAc,IAAI;AACrB,YAAQ,MAAM,cAAc,KAAK;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,kBAAkB;AAClC,YAAQ,IAAI,qDAAqD,cAAc,oBAAoB,IAAI;AACvG,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,2CAA2C,cAAc,oBAAoB,GAAG;AAC5F,SAAO;AACT;;;ACrEA,IAAAC,mBAAoC;AACpC,IAAAC,oBAAiB;AACjB,IAAAC,kBAAiC;;;ACF1B,IAAM,eAAe;AAErB,SAAS,aAAa,IAAqB;AAChD,SAAO,aAAa,KAAK,EAAE;AAC7B;;;ACFO,SAAS,0BAA0B,OAAkC;AAC1E,SAAO,UAAU,WAAW,WAAW;AACzC;;;ACJA,IAAAC,mBAAqD;AACrD,IAAAC,oBAAiB;AACjB,yBAAmB;AAWZ,SAAS,mBAAmB,cAA8B;AAC/D,QAAM,WAAW,aAAa,SAAS,KAAK,IAAI,eAAe,GAAG,YAAY;AAC9E,SAAO,kBAAAC,QAAK,KAAK,UAAU,QAAQ;AACrC;AAEO,SAAS,mBAAmB,SAAiB,cAA8B;AAChF,SAAO,kBAAAA,QAAK,KAAK,SAAS,mBAAmB,YAAY,CAAC;AAC5D;AAEA,eAAsBC,YAAW,UAAoC;AACnE,MAAI;AACF,cAAM,yBAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,YAAY,SAAiB,cAAkD;AACnG,QAAM,eAAe,mBAAmB,YAAY;AACpD,QAAM,eAAe,mBAAmB,SAAS,YAAY;AAE7D,MAAI;AACJ,MAAI;AACF,eAAW,UAAM,2BAAS,cAAc,MAAM;AAAA,EAChD,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,+BAA+B,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,EAC5F;AAEA,MAAI;AACJ,MAAI;AACF,iBAAS,mBAAAC,SAAO,QAAQ;AAAA,EAC1B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,+BAA+B,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH,SAAS,OAAO;AAAA,MAChB,MAAM,OAAO;AAAA,IACf;AAAA,EACF;AACF;AAEA,eAAsB,qBAAqB,SAAoC;AAC7E,QAAM,UAAU,kBAAAF,QAAK,KAAK,SAAS,QAAQ;AAC3C,QAAM,UAAU,UAAM,0BAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;AAE9D,SAAO,QACJ,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,CAAC,EAC7F,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACtC;AAEA,eAAsB,aAAa,SAAiB,cAAsB,KAA6B;AACrG,QAAM,eAAe,mBAAmB,SAAS,YAAY;AAC7D,YAAM,4BAAU,cAAc,mBAAAE,QAAO,UAAU,IAAI,SAAS,IAAI,IAAI,GAAG,MAAM;AAC/E;;;ACzEA,IAAAC,kBAAuC;;;ACAvC,IAAAC,kBAA+B;AAWxB,SAAS,+BAAkD;AAChE,SAAO;AAAA,IACL,MAAM,sBAAsB;AAC1B,iBAAO,sBAAK;AAAA,QACV,SAAS;AAAA,QACT,SAAS,UAAU;AACjB,gBAAM,UAAU,SAAS,KAAK;AAC9B,cAAI,QAAQ,WAAW,KAAK,CAAC,OAAO,SAAS,OAAO,OAAO,CAAC,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,MAAM,cAAc;AAClB,iBAAO,sBAAK;AAAA,QACV,SAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,SAA4B,6BAA6B,GAC7B;AAC5B,QAAM,WAAW,MAAM,OAAO,oBAAoB;AAClD,UAAI,0BAAS,QAAQ,GAAG;AACtB,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAEA,QAAM,QAAQ,MAAM,OAAO,YAAY;AACvC,UAAI,0BAAS,KAAK,GAAG;AACnB,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAEA,QAAM,gBAAgB,OAAO,SAAS,KAAK,CAAC;AAC5C,QAAM,gBAAgB,SAAS,IAAI,KAAK;AAExC,SAAO;AAAA,IACL,WAAW;AAAA,IACX;AAAA,IACA,OAAO,aAAa,SAAS,IAAI,eAAe;AAAA,EAClD;AACF;;;ADxCA,IAAM,aAAa;AACnB,IAAM,MAAM;AACZ,IAAM,QAAQ;AAoBd,SAAS,2BAA2B,OAAmD;AACrF,SAAO,UAAU,QAAQ,UAAU,SAAS,UAAU,QAAQ,UAAU,SAAS,UAAU;AAC7F;AAEO,SAAS,4BAA4B,OAA6D;AACvG,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,EAAE,IAAI,OAAO,OAAO,uCAAuC;AAAA,EACpE;AAEA,QAAM,YAAY;AAElB,MAAI,UAAU,SAAS,UAAU;AAC/B,WAAO,EAAE,IAAI,OAAO,OAAO,8CAA8C;AAAA,EAC3E;AAEA,MAAI,CAAC,2BAA2B,UAAU,QAAQ,GAAG;AACnD,WAAO,EAAE,IAAI,OAAO,OAAO,4EAA4E;AAAA,EACzG;AAEA,MAAI,OAAO,UAAU,WAAW,YAAY,CAAC,OAAO,SAAS,UAAU,MAAM,GAAG;AAC9E,WAAO,EAAE,IAAI,OAAO,OAAO,oDAAoD;AAAA,EACjF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU,UAAU;AAAA,MACpB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,yBACd,eACA,UACA,QACS;AACT,MAAI,aAAa,MAAM;AACrB,WAAO,gBAAgB;AAAA,EACzB;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO,iBAAiB;AAAA,EAC1B;AAEA,MAAI,aAAa,MAAM;AACrB,WAAO,kBAAkB;AAAA,EAC3B;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO,iBAAiB;AAAA,EAC1B;AAEA,SAAO,gBAAgB;AACzB;AAEO,SAAS,+BAA+B,UAA4C;AACzF,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,MAAM;AACrB,WAAO;AAAA,EACT;AAEA,MAAI,aAAa,OAAO;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,qCAA8D;AAC5E,SAAO;AAAA,IACL,MAAM,qBAAqB,EAAE,cAAc,UAAU,GAAG;AACtD,YAAM,UAAyF;AAAA,QAC7F,EAAE,OAAO,kBAAkB,OAAO,KAAK;AAAA,QACvC,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,QAClD,EAAE,OAAO,cAAc,OAAO,KAAK;AAAA,QACnC,EAAE,OAAO,+BAA+B,OAAO,MAAM;AAAA,QACrD,EAAE,OAAO,qBAAqB,OAAO,KAAK;AAAA,MAC5C;AAEA,UAAI,WAAW;AACb,gBAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAO,WAAW,CAAC;AAAA,MACtD;AAEA,YAAM,QAAQ,UAAM,wBAAO;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,UAAU,YAAY;AACxB,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,mBAAmB,EAAE,cAAc,UAAU,GAAG;AACpD,YAAM,WAAW,YAAY,IAAI,GAAG,sBAAsB,KAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,+CAA+C,QAAQ;AAAA,QAChE,cAAc,OAAO,iBAAiB,WAAW,OAAO,YAAY,IAAI;AAAA,QACxE,SAAS,UAAU;AACjB,gBAAMC,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,KAAK,CAAC,OAAO,SAAS,OAAOA,QAAO,CAAC,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,EAAE;AAAA,IACjD;AAAA,EACF;AACF;AAEO,IAAM,gBAAyD;AAAA,EACpE,MAAM;AAAA,EACN,eAAe,OAAO;AACpB,WAAO,4BAA4B,KAAK;AAAA,EAC1C;AAAA,EACA,MAAM,SAAS,WAAW;AACxB,UAAM,eAAe,MAAM,eAAe;AAC1C,QAAI,aAAa,WAAW;AAC1B,aAAO,EAAE,WAAW,KAAK;AAAA,IAC3B;AAEA,WAAO;AAAA,MACL,eAAe,aAAa;AAAA,MAC5B,aAAa,yBAAyB,aAAa,eAAe,UAAU,UAAU,UAAU,MAAM;AAAA,MACtG,OAAO,aAAa;AAAA,IACtB;AAAA,EACF;AACF;AAEA,SAAS,qBACP,KACyB;AACzB,MAAI,IAAI,UAAU,OAAO,IAAI,WAAW,UAAU;AAChD,UAAM,YAAY,IAAI;AACtB,QAAI,OAAO,UAAU,yBAAyB,cAAc,OAAO,UAAU,uBAAuB,YAAY;AAC9G,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,mCAAmC;AAC5C;AAEO,IAAM,cAA4D;AAAA,EACvE,MAAM;AAAA,EACN,MAAM,sBAAsB,KAA2D;AACrF,UAAM,SAAS,qBAAqB,GAAG;AACvC,QAAI,YAAY;AAChB,UAAM,SAA0C;AAAA,MAC9C,MAAM;AAAA,MACN,UAAU,IAAI,cAAc;AAAA,MAC5B,QAAQ,IAAI,cAAc;AAAA,IAC5B;AAEA,WAAO,YAAY,GAAG;AACpB,UAAI,cAAc,GAAG;AACnB,cAAMC,UAAS,MAAM,OAAO,qBAAqB;AAAA,UAC/C,cAAc,OAAO;AAAA,UACrB,WAAW,IAAI;AAAA,QACjB,CAAC;AAED,YAAIA,QAAO,SAAS,UAAU;AAC5B,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AAEA,YAAIA,QAAO,SAAS,QAAQ;AAC1B,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB;AAEA,eAAO,WAAWA,QAAO;AACzB,qBAAa;AACb;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,OAAO,mBAAmB;AAAA,QAC7C,cAAc,OAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC;AAED,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,OAAO,SAAS,QAAQ;AAC1B,oBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,MACF;AAEA,aAAO,SAAS,OAAO;AACvB,mBAAa;AAAA,IACf;AAEA,QAAI,CAAC,OAAO,YAAY,OAAO,OAAO,WAAW,UAAU;AACzD,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,uBAA+D;AAAA,EAC1E,SAAS;AAAA,EACT,OAAO;AACT;;;AElRA,yBAAuB;AAEvB,IAAAC,kBAAuC;AAcvC,IAAMC,cAAa;AACnB,IAAMC,OAAM;AACZ,IAAMC,SAAQ;AACd,IAAM,2BAA2B;AACjC,IAAM,oBACJ;AA4CF,SAASC,4BAA2B,OAAmD;AACrF,SAAO,UAAU,QAAQ,UAAU,SAAS,UAAU,QAAQ,UAAU,SAAS,UAAU;AAC7F;AAEO,SAAS,8BAA8B,OAA+D;AAC3G,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO,EAAE,IAAI,OAAO,OAAO,uCAAuC;AAAA,EACpE;AAEA,QAAM,YAAY;AASlB,MAAI,UAAU,SAAS,YAAY;AACjC,WAAO,EAAE,IAAI,OAAO,OAAO,gDAAgD;AAAA,EAC7E;AAEA,MAAI,OAAO,UAAU,eAAe,YAAY,UAAU,WAAW,KAAK,EAAE,WAAW,GAAG;AACxF,WAAO,EAAE,IAAI,OAAO,OAAO,2DAA2D;AAAA,EACxF;AAEA,MAAI,OAAO,UAAU,iBAAiB,YAAY,UAAU,aAAa,KAAK,EAAE,WAAW,GAAG;AAC5F,WAAO,EAAE,IAAI,OAAO,OAAO,6DAA6D;AAAA,EAC1F;AAEA,MAAI,OAAO,UAAU,gBAAgB,YAAY,UAAU,YAAY,KAAK,EAAE,WAAW,GAAG;AAC1F,WAAO,EAAE,IAAI,OAAO,OAAO,4DAA4D;AAAA,EACzF;AAEA,MAAI,CAACA,4BAA2B,UAAU,QAAQ,GAAG;AACnD,WAAO,EAAE,IAAI,OAAO,OAAO,4EAA4E;AAAA,EACzG;AAEA,MAAI,OAAO,UAAU,WAAW,YAAY,CAAC,OAAO,SAAS,UAAU,MAAM,GAAG;AAC9E,WAAO,EAAE,IAAI,OAAO,OAAO,oDAAoD;AAAA,EACjF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY,UAAU,WAAW,KAAK;AAAA,MACtC,cAAc,UAAU,aAAa,KAAK;AAAA,MAC1C,aAAa,UAAU,YAAY,KAAK;AAAA,MACxC,UAAU,UAAU;AAAA,MACpB,QAAQ,UAAU;AAAA,IACpB;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,KAAgF;AAC9G,MAAI,IAAI,UAAU,OAAO,IAAI,WAAW,UAAU;AAChD,UAAM,YAAY,IAAI;AACtB,QACE,OAAO,UAAU,4BAA4B,cAC7C,OAAO,UAAU,8BAA8B,cAC/C,OAAO,UAAU,6BAA6B,cAC9C,OAAO,UAAU,2BAA2B,cAC5C,OAAO,UAAU,yBAAyB,YAC1C;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,qCAAqC;AAC9C;AAEO,SAAS,uCAAkE;AAChF,SAAO;AAAA,IACL,MAAM,wBAAwB,EAAE,cAAc,UAAU,GAAG;AACzD,YAAM,WAAW,YAAY,IAAIF,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,mCAAmC,iBAAiB,GAAG,QAAQ;AAAA,QACxE;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,0BAA0B,EAAE,cAAc,UAAU,GAAG;AAC3D,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,qCAAqC,iBAAiB,GAAG,QAAQ;AAAA,QAC1E;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,yBAAyB,EAAE,cAAc,UAAU,GAAG;AAC1D,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,oCAAoC,iBAAiB,GAAG,QAAQ;AAAA,QACzE;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,uBAAuB,EAAE,cAAc,UAAU,GAAG;AACxD,YAAM,UAAyF;AAAA,QAC7F,EAAE,OAAO,kBAAkB,OAAO,KAAK;AAAA,QACvC,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,QAClD,EAAE,OAAO,cAAc,OAAO,KAAK;AAAA,QACnC,EAAE,OAAO,+BAA+B,OAAO,MAAM;AAAA,QACrD,EAAE,OAAO,qBAAqB,OAAO,KAAK;AAAA,MAC5C;AAEA,UAAI,WAAW;AACb,gBAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAOJ,YAAW,CAAC;AAAA,MACtD;AAEA,YAAM,QAAQ,UAAM,wBAAO;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,UAAUA,aAAY;AACxB,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,qBAAqB,EAAE,cAAc,UAAU,GAAG;AACtD,YAAM,WAAW,YAAY,IAAIC,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,oCAAoC,QAAQ;AAAA,QACrD,cAAc,OAAO,iBAAiB,WAAW,OAAO,YAAY,IAAI;AAAA,QACxE,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,KAAK,CAAC,OAAO,SAAS,OAAOA,QAAO,CAAC,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,EAAE;AAAA,IACjD;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,OAA0B;AACtD,QAAM,UAAoB,CAAC;AAC3B,QAAM,QAAmB,CAAC,KAAK;AAE/B,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI,OAAO,YAAY,YAAY,OAAO,SAAS,OAAO,GAAG;AAC3D,cAAQ,KAAK,OAAO;AACpB;AAAA,IACF;AAEA,QAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C;AAAA,IACF;AAEA,eAAW,UAAU,OAAO,OAAO,OAAO,GAAG;AAC3C,YAAM,KAAK,MAAM;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAmF;AAC7G,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO,EAAE,OAAO,MAAM,wBAAwB,KAAK;AAAA,EACrD;AAEA,QAAM,YAAY;AAClB,MAAI,OAAO,UAAU,UAAU,YAAY,OAAO,SAAS,UAAU,KAAK,GAAG;AAC3E,WAAO,EAAE,OAAO,UAAU,OAAO,wBAAwB,KAAK;AAAA,EAChE;AAEA,MAAI,UAAU,UAAU,OAAO,UAAU,WAAW,UAAU;AAC5D,UAAM,cAAc,UAAU;AAC9B,QAAI,OAAO,YAAY,UAAU,YAAY,OAAO,SAAS,YAAY,KAAK,GAAG;AAC/E,aAAO,EAAE,OAAO,YAAY,OAAO,wBAAwB,KAAK;AAAA,IAClE;AAAA,EACF;AAEA,MAAI,UAAU,UAAU,OAAO,UAAU,WAAW,UAAU;AAC5D,UAAM,gBAAgB,qBAAqB,UAAU,MAAM;AAC3D,QAAI,cAAc,WAAW,GAAG;AAC9B,aAAO,EAAE,OAAO,cAAc,CAAC,GAAG,wBAAwB,EAAE;AAAA,IAC9D;AAEA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,wBAAwB,cAAc;AAAA,IACxC;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,MAAM,wBAAwB,KAAK;AACrD;AAEO,IAAM,kBAA6D;AAAA,EACxE,MAAM;AAAA,EACN,eAAe,OAAO;AACpB,WAAO,8BAA8B,KAAK;AAAA,EAC5C;AAAA,EACA,MAAM,SAAS,WAAW,KAAK;AAC7B,UAAM,eAAe,MAAM,mBAAmB,IAAI,OAAO;AACzD,QAAI,CAAC,aAAa,IAAI;AACpB,YAAM,IAAI,MAAM,aAAa,KAAK;AAAA,IACpC;AAEA,UAAM,cAAc,+BAA+B,aAAa,KAAK;AACrE,QAAI,CAAC,YAAY,IAAI;AACnB,YAAM,IAAI,MAAM,YAAY,KAAK;AAAA,IACnC;AAEA,UAAM,SAAS,IAAI,gBAAgB;AAAA,MACjC,YAAY,UAAU;AAAA,MACtB,cAAc,UAAU;AAAA,MACxB,aAAa,UAAU;AAAA,IACzB,CAAC;AACD,UAAM,MAAM,GAAG,wBAAwB,IAAI,OAAO,SAAS,CAAC;AAC5D,UAAM,eAAe,0BAAO,KAAK,YAAY,OAAO,MAAM,EAAE,SAAS,QAAQ;AAE7E,QAAI;AACJ,QAAI;AACF,iBAAW,MAAM,MAAM,KAAK;AAAA,QAC1B,SAAS;AAAA,UACP,eAAe,SAAS,YAAY;AAAA,UACpC,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,0CAA2C,MAAgB,OAAO,EAAE;AAAA,IACtF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,kCAAkC,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG;AAAA,IAC7F;AAEA,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM,SAAS,KAAK;AAAA,IAChC,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,2CAA4C,MAAgB,OAAO,EAAE;AAAA,IACvF;AAEA,UAAM,WAAW,mBAAmB,OAAO;AAC3C,QAAI,SAAS,UAAU,MAAM;AAC3B,UAAI,SAAS,2BAA2B,MAAM;AAC5C,cAAM,IAAI;AAAA,UACR,SAAS,2BAA2B,IAChC,8EACA,0EAA0E,SAAS,sBAAsB;AAAA,QAC/G;AAAA,MACF;AAEA,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAEA,UAAM,gBAAgB,SAAS;AAE/B,WAAO;AAAA,MACL;AAAA,MACA,aAAa,yBAAyB,eAAe,UAAU,UAAU,UAAU,MAAM;AAAA,MACzF,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,YAAY,UAAU;AAAA,QACtB,cAAc,UAAU;AAAA,QACxB,aAAa,UAAU;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,gBAAgE;AAAA,EAC3E,MAAM;AAAA,EACN,MAAM,sBAAsB,KAA6D;AACvF,UAAM,SAAS,uBAAuB,GAAG;AACzC,QAAI,YAAY;AAChB,UAAM,SAA4C;AAAA,MAChD,MAAM;AAAA,MACN,YAAY,IAAI,cAAc;AAAA,MAC9B,cAAc,IAAI,cAAc;AAAA,MAChC,aAAa,IAAI,cAAc;AAAA,MAC/B,UAAU,IAAI,cAAc;AAAA,MAC5B,QAAQ,IAAI,cAAc;AAAA,IAC5B;AAEA,WAAO,YAAY,GAAG;AACpB,UAAI,cAAc,GAAG;AACnB,cAAMC,UAAS,MAAM,OAAO,wBAAwB;AAAA,UAClD,cAAc,OAAO;AAAA,UACrB,WAAW,IAAI;AAAA,QACjB,CAAC;AAED,YAAIA,QAAO,SAAS,UAAU;AAC5B,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AACA,YAAIA,QAAO,SAAS,QAAQ;AAC1B,iBAAO,EAAE,MAAM,OAAO;AAAA,QACxB;AAEA,eAAO,aAAaA,QAAO;AAC3B,qBAAa;AACb;AAAA,MACF;AAEA,UAAI,cAAc,GAAG;AACnB,cAAMA,UAAS,MAAM,OAAO,0BAA0B;AAAA,UACpD,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAED,YAAIA,QAAO,SAAS,UAAU;AAC5B,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AACA,YAAIA,QAAO,SAAS,QAAQ;AAC1B,sBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,QACF;AAEA,eAAO,eAAeA,QAAO;AAC7B,qBAAa;AACb;AAAA,MACF;AAEA,UAAI,cAAc,GAAG;AACnB,cAAMA,UAAS,MAAM,OAAO,yBAAyB;AAAA,UACnD,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAED,YAAIA,QAAO,SAAS,UAAU;AAC5B,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AACA,YAAIA,QAAO,SAAS,QAAQ;AAC1B,sBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,QACF;AAEA,eAAO,cAAcA,QAAO;AAC5B,qBAAa;AACb;AAAA,MACF;AAEA,UAAI,cAAc,GAAG;AACnB,cAAMA,UAAS,MAAM,OAAO,uBAAuB;AAAA,UACjD,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAED,YAAIA,QAAO,SAAS,UAAU;AAC5B,iBAAO,EAAE,MAAM,SAAS;AAAA,QAC1B;AACA,YAAIA,QAAO,SAAS,QAAQ;AAC1B,sBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,QACF;AAEA,eAAO,WAAWA,QAAO;AACzB,qBAAa;AACb;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,OAAO,qBAAqB;AAAA,QAC/C,cAAc,OAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC;AAED,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AACA,UAAI,OAAO,SAAS,QAAQ;AAC1B,oBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,MACF;AAEA,aAAO,SAAS,OAAO;AACvB,mBAAa;AAAA,IACf;AAEA,QACE,CAAC,OAAO,cACR,CAAC,OAAO,gBACR,CAAC,OAAO,eACR,CAAC,OAAO,YACR,OAAO,OAAO,WAAW,UACzB;AACA,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,MAAM;AAAA,QACN,YAAY,OAAO;AAAA,QACnB,cAAc,OAAO;AAAA,QACrB,aAAa,OAAO;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,QAAQ,OAAO;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,yBAAmE;AAAA,EAC9E,SAAS;AAAA,EACT,OAAO;AACT;;;ACniBO,IAAM,mBAAqC;AAAA,EAChD,QAAQ;AAAA,EACR,UAAU;AACZ;AAEO,SAAS,sBAAsB,MAA4D;AAChG,SAAO,iBAAiB,IAAI;AAC9B;AAEO,SAAS,8BAAwC;AACtD,SAAO,OAAO,KAAK,gBAAgB;AACrC;;;APOA,SAAS,wBAAwB,OAA+B;AAC9D,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,OAAQ,MAA6B;AAC3C,SAAO,OAAO,SAAS,YAAY,KAAK,SAAS,IAAI,OAAO;AAC9D;AAEA,SAAS,sBAAsB,WAA6B,eAA+B;AACzF,MAAI,UAAU,SAAS,YAAY,UAAU,SAAS,YAAY;AAChE,WAAO,GAAG,aAAa,IAAI,+BAA+B,UAAU,QAAQ,CAAC,IAAI,UAAU,MAAM;AAAA,EACnG;AAEA,SAAO,OAAO,aAAa;AAC7B;AAOA,SAAS,6BAA6B,UAA2B;AAC/D,QAAM,UAAU,SAAS,UAAU;AACnC,MAAI,CAAC,QAAQ,WAAW,KAAK,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,MAAI,MAAM,SAAS,KAAK,MAAM,CAAC,GAAG,KAAK,MAAM,OAAO;AAClD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,MAAM,CAAC,EAAE,UAAU,CAAC,SAAS,KAAK,KAAK,MAAM,KAAK;AACzE,MAAI,aAAa,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,MAAM,MAAM,GAAG,WAAW,CAAC;AACpD,SAAO,iBAAiB,KAAK,CAAC,SAAS,yBAAyB,KAAK,KAAK,KAAK,CAAC,CAAC;AACnF;AAEA,eAAe,mBAAmB,SAAiB,IAA8B;AAC/E,QAAM,eAAe,kBAAAC,QAAK,KAAK,SAAS,cAAc,GAAG,EAAE,OAAO;AAClE,MAAI,CAAE,MAAMC,YAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,UAAM,2BAAS,cAAc,MAAM,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,SAAQ,OAAsC,iBAAiB;AACjE;AAEA,SAASC,oBAA4B;AACnC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,eAAe,kBAAkB,IAAmD;AAClF,QAAM,QAAQ,UAAM,wBAAO;AAAA,IACzB,SAAS,QAAQ,EAAE;AAAA,IACnB,SAAS;AAAA,MACP,EAAE,OAAO,uBAAuB,OAAO,OAAO;AAAA,MAC9C,EAAE,OAAO,uBAAuB,OAAO,SAAS;AAAA,IAClD;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,UAAI,0BAAS,KAAK,GAAG;AACnB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,SAAS,IAAY,UAAwB,CAAC,GAAoB;AACtF,MAAI,CAAC,aAAa,EAAE,GAAG;AACrB,YAAQ,MAAM,mBAAmB,EAAE,mEAAmE;AACtG,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,QAAI,QAAQ,SAAS;AACnB,YAAM,UAAU,MAAM,sBAAsB,QAAQ,OAAO;AAC3D,UAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,cAAM,IAAI,MAAM,6BAA6B,QAAQ,OAAO,WAAW,QAAQ,OAAO,GAAG;AAAA,MAC3F;AACA,gBAAU,QAAQ;AAAA,IACpB,OAAO;AACL,YAAM,MAAM,QAAQ,IAAI;AACxB,OAAC,EAAE,QAAQ,IAAI,MAAM,sBAAsB,GAAG;AAAA,IAChD;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,mBAAmB,EAAE;AAC7C,QAAM,kBAAkB,mBAAmB,SAAS,EAAE;AAEtD,MAAI,CAAE,MAAMD,YAAW,eAAe,GAAI;AACxC,YAAQ,MAAM,QAAQ,EAAE,uBAAuB,eAAe,kBAAkB,EAAE,UAAU;AAC5F,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,YAAY,SAAS,EAAE;AAAA,EACrC,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,0BAA0B,IAAI,IAAI,KAAK,MAAM;AACtE,QAAM,WAAW,6BAA6B,IAAI,QAAQ,KAAK,qBAAqB;AACpF,MAAI,YAAY,CAAC,QAAQ,OAAO;AAC9B,QAAI,MAAM,mBAAmB,SAAS,EAAE,GAAG;AACzC,cAAQ,IAAI,QAAQ,EAAE,iDAAiD;AACvE,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,sBAAsB,IAAI,IAAI,KAAK;AACzC,QAAM,uBAAuB,wBAAwB,mBAAmB;AACxE,MAAI,CAAC,sBAAsB;AACzB,YAAQ,MAAM,iEAAiE;AAC/E,WAAO;AAAA,EACT;AAEA,QAAME,UAAS,sBAAsB,oBAAoB;AACzD,MAAI,CAACA,SAAQ;AACX,UAAM,aAAa,4BAA4B,EAAE,KAAK,IAAI;AAC1D,YAAQ;AAAA,MACN,+CAA+C,oBAAoB,uBAAuB,UAAU;AAAA,IACtG;AACA,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkBA,QAAO,QAAQ,eAAe,mBAAmB;AACzE,MAAI,CAAC,gBAAgB,IAAI;AACvB,YAAQ,MAAM,QAAQ,EAAE,oCAAoC,gBAAgB,KAAK,EAAE;AACnF,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,kBAAc,MAAMA,QAAO,QAAQ,SAAS,gBAAgB,OAAO;AAAA,MACjE;AAAA,MACA,OAAO;AAAA,MACP,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,IACjC,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,aAAa;AAC9B,YAAQ,MAAM,qCAAqC;AACnD,WAAO;AAAA,EACT;AAEA,QAAM,WAA6B;AAAA,IACjC;AAAA,IACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IACnC,MAAM,gBAAgB,MAAM;AAAA,IAC5B,mBAAmB,gBAAgB;AAAA,IACnC,gBAAgB,YAAY;AAAA,IAC5B,cAAc,YAAY;AAAA,IAC1B,OAAO,YAAY;AAAA,IACnB,MAAM,YAAY;AAAA,EACpB;AAEA,QAAM,uBAAuB,kBAAAH,QAAK,KAAK,cAAc,GAAG,EAAE,OAAO;AACjE,QAAM,uBAAuB,kBAAAA,QAAK,KAAK,SAAS,oBAAoB;AAEpE,MAAI;AACF,cAAM,4BAAU,sBAAsB,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAAA,EACxF,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,oBAAoB,KAAM,MAAgB,OAAO,EAAE;AAChG,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,sBAAsB,gBAAgB,OAAO,YAAY,aAAa;AAC9F,UAAQ;AAAA,IACN,YAAY,gBAAgB,MAAM,IAAI,kBAAkB,EAAE,QAAQ,oBAAoB,aAAa,YAAY,cAAc,SAAS,MAAM,KAAK,eAAe;AAAA,EAClK;AAEA,MAAI,YAAY,aAAa;AAC3B,QAAI,IAAI,KAAK,SAAS;AACtB,QAAI;AACF,YAAM,aAAa,SAAS,IAAI,IAAI,GAAG;AAAA,IACzC,SAAS,OAAO;AACd,cAAQ,MAAM,uBAAuB,EAAE,gBAAiB,MAAgB,OAAO,EAAE;AACjF,aAAO;AAAA,IACT;AAEA,YAAQ,IAAI,eAAe,EAAE,sBAAsB;AACnD,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,SAAS,UAAU;AAC7B,QAAI,CAACE,kBAAiB,GAAG;AACvB,cAAQ;AAAA,QACN,cAAc,EAAE,kDAAkD,EAAE;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,kBAAkB,EAAE;AACzC,QAAI,WAAW,UAAU;AACvB,cAAQ,IAAI,mBAAmB,EAAE,2BAA2B;AAC5D,aAAO;AAAA,IACT;AAEA,QAAI,WAAW,UAAU;AACvB,UAAI,IAAI,KAAK,SAAS;AACtB,UAAI;AACF,cAAM,aAAa,SAAS,IAAI,IAAI,GAAG;AAAA,MACzC,SAAS,OAAO;AACd,gBAAQ,MAAM,yBAAyB,EAAE,aAAc,MAAgB,OAAO,EAAE;AAChF,eAAO;AAAA,MACT;AACA,cAAQ,IAAI,gBAAgB,EAAE,uBAAuB;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AACT;;;AQlQA,IAAAE,mBAAkC;AAClC,IAAAC,oBAAiB;;;ACDjB,IAAAC,sBAAmB;AAeZ,SAAS,qBAAqB,OAAoC;AACvE,QAAM,cAAuC;AAAA,IAC3C,IAAI,MAAM;AAAA,IACV,QAAQ;AAAA,IACR,YAAY,MAAM;AAAA,IAClB,mBAAmB,MAAM;AAAA,EAC3B;AAEA,MAAI,OAAO,MAAM,aAAa,UAAU;AACtC,gBAAY,YAAY,MAAM;AAAA,EAChC;AAEA,MAAI,OAAO,MAAM,oBAAoB,UAAU;AAC7C,gBAAY,oBAAoB,MAAM;AAAA,EACxC;AAEA,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF,EAAE,KAAK,IAAI;AAEX,SAAO,GAAG,oBAAAC,QAAO,UAAU,MAAM,WAAW,CAAC;AAC/C;;;ACrDA,IAAAC,kBAAuC;AAOvC,IAAMC,cAAa;AACnB,IAAMC,OAAM;AACZ,IAAMC,SAAQ;AA2Dd,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAsBA,SAAS,kBAAqB,QAA6B,SAA6C;AACtG,MAAI,OAAO,SAAS,UAAU;AAC5B,WAAO,EAAE,MAAM,SAAS;AAAA,EAC1B;AAEA,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO,EAAE,MAAM,OAAO;AAAA,EACxB;AAEA,UAAQ,OAAO,KAAK;AACpB,SAAO,EAAE,MAAM,OAAO;AACxB;AAEA,SAAS,qBAAqB,QAAqD;AACjF,MACE,CAAC,OAAO,WACR,OAAO,OAAO,aAAa,YAC3B,CAAC,OAAO,oBACR,CAAC,OAAO,qBACR,CAAC,OAAO,aACR,CAAC,OAAO,kBACR,OAAO,UAAU,QACjB;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,OAAO,YAAY,cAAc,OAAO,WAAW;AACpE,QAAM,kBAAkB,OAAO,YAAY,sBAAsB,OAAO,WAAW;AAEnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,OAAO;AAAA,IACzB,mBAAmB,OAAO;AAAA,IAC1B,WAAW,OAAO;AAAA,IAClB,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,EAChB;AACF;AAEA,IAAM,gBAA2C;AAAA,EAC/C,MAAM,SAAS,EAAE,QAAQ,QAAQ,UAAU,GAAG;AAC5C,UAAM,SAAS,MAAM,OAAO,cAAc;AAAA,MACxC,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,YAAM,kBAAkB,OAAO;AAC/B,aAAO,UAAU;AACjB,UAAI,oBAAoB,OAAO;AAC7B,eAAO,WAAW;AAAA,MACpB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,EAAE,QAAQ,QAAQ,UAAU,GAAG;AAC7C,QAAI,CAAC,OAAO,SAAS;AACnB,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,UAAM,SAAS,MAAM,OAAO,eAAe;AAAA,MACzC,OAAO,OAAO;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,aAAO,WAAW;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,uBAAuB,EAAE,QAAQ,QAAQ,UAAU,GAAG;AAC1D,UAAM,SAAS,MAAM,OAAO,2BAA2B;AAAA,MACrD,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,UAAI,OAAO,yBAAyB,OAAO;AACzC,eAAO,mBAAmB;AAAA,MAC5B;AACA,aAAO,uBAAuB;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,wBAAwB,EAAE,QAAQ,QAAQ,UAAU,GAAG;AAC3D,QAAI,CAAC,OAAO,sBAAsB;AAChC,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,UAAMC,UAAS,sBAAsB,OAAO,oBAAoB;AAChE,QAAI,CAACA,WAAU,CAACA,QAAO,OAAO;AAC5B,aAAO,EAAE,MAAM,SAAS;AAAA,IAC1B;AAEA,UAAM,cAAc,MAAMA,QAAO,MAAM,sBAAsB;AAAA,MAC3D,WAAW,YAAY;AAAA,MACvB,cACE,OAAO,oBAAoB,OAAO,iBAAiB,SAAS,OAAO,uBAC/D,OAAO,mBACP;AAAA,MACN;AAAA,IACF,CAAC;AAED,WAAO,kBAAkB,aAAa,CAAC,UAAU;AAC/C,aAAO,mBAAmB;AAAA,IAC5B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,EAAE,QAAQ,QAAQ,UAAU,GAAG;AACtD,UAAM,SAAS,MAAM,OAAO,wBAAwB;AAAA,MAClD,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,aAAO,oBAAoB;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,EAAE,QAAQ,QAAQ,UAAU,GAAG;AAC7C,UAAM,SAAS,MAAM,OAAO,gBAAgB;AAAA,MAC1C,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,aAAO,YAAY;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,gBAAgB,EAAE,QAAQ,QAAQ,UAAU,GAAG;AACnD,UAAM,SAAS,MAAM,OAAO,qBAAqB;AAAA,MAC/C,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,aAAO,iBAAiB;AAAA,IAC1B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,EAAE,QAAQ,QAAQ,UAAU,GAAG;AACzC,UAAM,SAAS,MAAM,OAAO,YAAY;AAAA,MACtC,cAAc,OAAO;AAAA,MACrB,WAAW,YAAY;AAAA,IACzB,CAAC;AAED,WAAO,kBAAkB,QAAQ,CAAC,UAAU;AAC1C,aAAO,QAAQ;AAAA,IACjB,CAAC;AAAA,EACH;AACF;AAEA,eAAsB,aACpB,SAA6B,wBAAwB,GACrD,MAAiB,QAAQ,KACC;AAC1B,MAAI,YAAY;AAChB,QAAM,SAA8B,CAAC;AAErC,SAAO,YAAY,WAAW,QAAQ;AACpC,UAAM,OAAa,WAAW,SAAS;AACvC,UAAM,UAAU,cAAc,IAAI;AAClC,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,0CAA0C,IAAI,IAAI;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,QAAQ,EAAE,QAAQ,QAAQ,UAAU,CAAC;AACxD,QAAI,KAAK,SAAS,UAAU;AAC1B,aAAO,EAAE,WAAW,KAAK;AAAA,IAC3B;AAEA,QAAI,KAAK,SAAS,QAAQ;AACxB,kBAAY,KAAK,IAAI,GAAG,YAAY,CAAC;AACrC;AAAA,IACF;AAEA,iBAAa;AAAA,EACf;AAEA,QAAM,kBAAkB,qBAAqB,MAAM;AACnD,MAAI,CAAC,iBAAiB;AACpB,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AACF;AAEO,SAAS,0BAA8C;AAC5D,QAAM,uBAAuB,qCAAqC;AAElE,SAAO;AAAA,IACL,MAAM,cAAc,EAAE,cAAc,UAAU,GAAG;AAC/C,YAAM,UAAoF;AAAA,QACxF,EAAE,OAAO,gBAAgB,OAAO,YAAY;AAAA,QAC5C,EAAE,OAAO,wBAAwB,OAAO,oBAAoB;AAAA,MAC9D;AAEA,UAAI,WAAW;AACb,gBAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAOH,YAAW,CAAC;AAAA,MACtD;AAEA,YAAM,QAAQ,UAAM,wBAAO;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,UAAUA,aAAY;AACxB,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,eAAe,EAAE,OAAO,cAAc,UAAU,GAAG;AACvD,YAAM,QAAQ,UAAU,cAAc,cAAc;AACpD,YAAM,WAAW,YAAY,IAAIC,IAAG,sBAAsBC,MAAK,KAAK;AAEpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,GAAG,KAAK,eAAe,QAAQ;AAAA,QACxC,cAAc,OAAO,iBAAiB,WAAW,OAAO,YAAY,IAAI;AAAA,QACxE,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAEA,gBAAM,SAAS,OAAOA,QAAO;AAC7B,cAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,EAAE;AAAA,IACjD;AAAA,IAEA,MAAM,2BAA2B,EAAE,cAAc,UAAU,GAAG;AAC5D,YAAM,UAAqF,4BAA4B,EACpH,IAAI,CAAC,UAAU,EAAE,OAAO,MAAM,OAAO,KAA6B,EAAE;AAEvE,UAAI,WAAW;AACb,gBAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAOJ,YAAW,CAAC;AAAA,MACtD;AAEA,YAAM,QAAQ,UAAM,wBAAO;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,UAAUA,aAAY;AACxB,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,qBAAqB,EAAE,cAAc,UAAU,GAAwC;AAC3F,YAAM,UAAyF;AAAA,QAC7F,EAAE,OAAO,kBAAkB,OAAO,KAAK;AAAA,QACvC,EAAE,OAAO,4BAA4B,OAAO,MAAM;AAAA,QAClD,EAAE,OAAO,cAAc,OAAO,KAAK;AAAA,QACnC,EAAE,OAAO,+BAA+B,OAAO,MAAM;AAAA,QACrD,EAAE,OAAO,qBAAqB,OAAO,KAAK;AAAA,MAC5C;AAEA,UAAI,WAAW;AACb,gBAAQ,QAAQ,EAAE,OAAO,QAAQ,OAAOA,YAAW,CAAC;AAAA,MACtD;AAEA,YAAM,QAAQ,UAAM,wBAAO;AAAA,QACzB,SAAS;AAAA,QACT;AAAA,QACA;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,UAAI,UAAUA,aAAY;AACxB,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,MAAM;AAAA,IAChC;AAAA,IAEA,MAAM,mBAAmB,EAAE,cAAc,UAAU,GAAsC;AACvF,YAAM,WAAW,YAAY,IAAIC,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,+CAA+C,QAAQ;AAAA,QAChE,cAAc,OAAO,iBAAiB,WAAW,OAAO,YAAY,IAAI;AAAA,QACxE,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,KAAK,CAAC,OAAO,SAAS,OAAOA,QAAO,CAAC,GAAG;AAC7D,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,OAAO,OAAO,EAAE;AAAA,IACjD;AAAA,IAEA,MAAM,wBAAwB,EAAE,cAAc,UAAU,GAAG;AACzD,aAAO,qBAAqB,wBAAwB,EAAE,cAAc,UAAU,CAAC;AAAA,IACjF;AAAA,IAEA,MAAM,0BAA0B,EAAE,cAAc,UAAU,GAAG;AAC3D,aAAO,qBAAqB,0BAA0B,EAAE,cAAc,UAAU,CAAC;AAAA,IACnF;AAAA,IAEA,MAAM,yBAAyB,EAAE,cAAc,UAAU,GAAG;AAC1D,aAAO,qBAAqB,yBAAyB,EAAE,cAAc,UAAU,CAAC;AAAA,IAClF;AAAA,IAEA,MAAM,uBAAuB,EAAE,cAAc,UAAU,GAAG;AACxD,aAAO,qBAAqB,uBAAuB,EAAE,cAAc,UAAU,CAAC;AAAA,IAChF;AAAA,IAEA,MAAM,qBAAqB,EAAE,cAAc,UAAU,GAAG;AACtD,aAAO,qBAAqB,qBAAqB,EAAE,cAAc,UAAU,CAAC;AAAA,IAC9E;AAAA,IAEA,MAAM,wBAAwB,EAAE,cAAc,UAAU,GAAyC;AAC/F,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,iCAAiC,QAAQ;AAAA,QAClD;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,gBAAgB,EAAE,cAAc,UAAU,GAAyC;AACvF,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,wBAAwB,QAAQ;AAAA,QACzC;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,qBAAqB,EAAE,cAAc,UAAU,GAAyC;AAC5F,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,8BAA8B,QAAQ;AAAA,QAC/C;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,WAAU,SAAS,KAAK;AAC9B,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,cAAIA,SAAQ,WAAW,GAAG;AACxB,mBAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,UAAU,MAAM,KAAK;AAC3B,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,IAEA,MAAM,YAAY,EAAE,cAAc,UAAU,GAAyC;AACnF,YAAM,WAAW,YAAY,IAAIH,IAAG,sBAAsBC,MAAK,KAAK;AACpE,YAAM,QAAQ,UAAM,sBAAK;AAAA,QACvB,SAAS,oBAAoB,QAAQ;AAAA,QACrC;AAAA,QACA,SAAS,UAAU;AACjB,gBAAME,YAAW,YAAY,IAAI,KAAK;AACtC,cAAI,aAAaA,SAAQ,YAAY,MAAM,KAAK;AAC9C;AAAA,UACF;AAEA,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAED,cAAI,0BAAS,KAAK,GAAG;AACnB,eAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAEA,YAAM,WAAW,SAAS,IAAI,KAAK;AACnC,UAAI,aAAa,QAAQ,YAAY,MAAM,KAAK;AAC9C,eAAO,EAAE,MAAM,OAAO;AAAA,MACxB;AAEA,aAAO,EAAE,MAAM,SAAS,OAAO,QAAQ;AAAA,IACzC;AAAA,EACF;AACF;;;ACjkBA,IAAAC,kBAA+B;AAIxB,SAAS,iBAAiB,OAAuB;AACtD,SAAO,MAAM,KAAK,EAAE,QAAQ,QAAQ,GAAG,EAAE,YAAY;AACvD;AAEA,eAAsB,mBAA8C;AAClE,QAAM,WAAW,UAAM,sBAAK;AAAA,IAC1B,SAAS;AAAA,IACT,aAAa;AAAA,IACb,SAAS,OAAO;AACd,aAAO,MAAM,KAAK,EAAE,SAAS,IAAI,SAAY;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,UAAI,0BAAS,QAAQ,GAAG;AACtB,WAAO,EAAE,WAAW,KAAK;AAAA,EAC3B;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,OAAO,iBAAiB,QAAQ;AAAA,EAClC;AACF;;;AHjBA,eAAeC,YAAW,UAAoC;AAC5D,MAAI;AACF,cAAM,yBAAO,QAAQ;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,oBAA4B;AACnC,SAAO,QAAQ,MAAM,UAAU,QAAQ,QAAQ,OAAO,UAAU;AAClE;AAEA,SAAS,eAAe,IAAoB;AAC1C,SAAO,mBAAmB,EAAE;AAC9B;AAEA,eAAsB,OAAO,OAAiC;AAC5D,MAAI,KAAK,QAAQ,iBAAiB,KAAK,IAAI;AAC3C,MAAI,CAAC,IAAI;AACP,QAAI,CAACA,kBAAiB,GAAG;AACvB,cAAQ,MAAM,wEAAwE;AACtF,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,MAAM,iBAAiB;AAC1C,QAAI,WAAW,WAAW;AACxB,cAAQ,MAAM,mCAAmC;AACjD,aAAO;AAAA,IACT;AAEA,SAAK,iBAAiB,WAAW,KAAK;AAAA,EACxC;AAEA,MAAI,CAAC,aAAa,EAAE,GAAG;AACrB,YAAQ,MAAM,eAAe,EAAE,CAAC;AAChC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,KAAC,EAAE,QAAQ,IAAI,MAAM,sBAAsB,GAAG;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,kBAAAC,QAAK,KAAK,UAAU,GAAG,EAAE,KAAK;AACnD,QAAM,eAAe,kBAAAA,QAAK,KAAK,SAAS,YAAY;AAEpD,MAAI,MAAMF,YAAW,YAAY,GAAG;AAClC,YAAQ,MAAM,QAAQ,EAAE,uBAAuB,YAAY,uBAAuB;AAClF,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,MAAM,aAAa;AACxC,MAAI,aAAa,WAAW;AAC1B,YAAQ,MAAM,mCAAmC;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,qBAAqB;AAAA,IACpC;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,kBAAkB,aAAa,OAAO;AAAA,IACtC,UAAU,aAAa,OAAO;AAAA,IAC9B,iBAAiB,aAAa,OAAO;AAAA,IACrC,mBAAmB,aAAa,OAAO;AAAA,IACvC,WAAW,aAAa,OAAO;AAAA,IAC/B,gBAAgB,aAAa,OAAO;AAAA,IACpC,OAAO,aAAa,OAAO;AAAA,EAC7B,CAAC;AAED,MAAI;AACF,cAAM,4BAAU,cAAc,UAAU,EAAE,UAAU,QAAQ,MAAM,KAAK,CAAC;AAAA,EAC1E,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,cAAQ,MAAM,QAAQ,EAAE,uBAAuB,YAAY,uBAAuB;AAClF,aAAO;AAAA,IACT;AAEA,UAAM;AAAA,EACR;AAEA,UAAQ,IAAI;AAAA,UAAa,YAAY,GAAG;AACxC,SAAO;AACT;;;AI/FA,IAAAG,mBAAoC;AACpC,IAAAC,oBAAiB;AAYjB,SAAS,qBAAqB,OAAwC;AACpE,MAAI,CAAC,SAAS,OAAO,UAAU,UAAU;AACvC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,SAAO,OAAO,UAAU,OAAO,YAAY,UAAU,GAAG,SAAS,KAAK,OAAO,UAAU,eAAe;AACxG;AAEA,SAAS,WAAW,KAAuB;AACzC,QAAM,SAAS,KAAK,MAAM,GAAG;AAE7B,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAEA,QAAM,SAAU,OAAgC;AAChD,MAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,UAAM,IAAI,MAAM,6CAA6C;AAAA,EAC/D;AAEA,aAAW,CAAC,OAAO,OAAO,KAAK,OAAO,QAAQ,GAAG;AAC/C,QAAI,CAAC,qBAAqB,OAAO,GAAG;AAClC,YAAM,IAAI,MAAM,kDAAkD,KAAK,GAAG;AAAA,IAC5E;AAAA,EACF;AAEA,SAAO,EAAE,OAAO;AAClB;AAEA,eAAsB,UAAU,SAAoC;AAClE,QAAM,YAAY,kBAAAC,QAAK,KAAK,SAAS,UAAU;AAC/C,QAAM,MAAM,UAAM,2BAAS,WAAW,MAAM;AAE5C,SAAO,WAAW,GAAG;AACvB;AAEA,eAAsB,WAAW,SAAiB,OAAgC;AAChF,QAAM,YAAY,kBAAAA,QAAK,KAAK,SAAS,UAAU;AAC/C,YAAM,4BAAU,WAAW,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC1E;AAEO,SAAS,iBACd,OACA,IACA,WAC6C;AAC7C,QAAM,gBAAgB,MAAM,OAAO,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE;AACtE,MAAI,eAAe;AACjB,WAAO,EAAE,OAAO,eAAe,KAAK;AAAA,EACtC;AAEA,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO;AAAA,MACL,QAAQ,CAAC,GAAG,MAAM,QAAQ,EAAE,IAAI,YAAY,UAAU,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,OAAiB,IAA2D;AAC/G,QAAM,UAAU,MAAM,OAAO,OAAO,CAAC,YAAY,QAAQ,OAAO,EAAE;AAClE,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO,EAAE,OAAO,QAAQ;AAAA,EAC1B;AAEA,SAAO;AAAA,IACL;AAAA,IACA,OAAO;AAAA,MACL,QAAQ,MAAM,OAAO,OAAO,CAAC,YAAY,QAAQ,OAAO,EAAE;AAAA,IAC5D;AAAA,EACF;AACF;;;AChFA,eAAsB,SAAS,IAA6B;AAC1D,MAAI,CAAC,aAAa,EAAE,GAAG;AACrB,YAAQ,MAAM,mBAAmB,EAAE,mEAAmE;AACtG,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,KAAC,EAAE,QAAQ,IAAI,MAAM,sBAAsB,GAAG;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,eAAe,mBAAmB,EAAE;AAC1C,QAAM,eAAe,mBAAmB,SAAS,EAAE;AAEnD,MAAI,CAAE,MAAMC,YAAW,YAAY,GAAI;AACrC,YAAQ,MAAM,QAAQ,EAAE,uBAAuB,YAAY,kBAAkB,EAAE,UAAU;AACzF,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,SAAS,EAAE;AAAA,EAC/B,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,UAAU,OAAO;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,MAAM,kDAAmD,MAAgB,OAAO,EAAE;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,OAAM,oBAAI,KAAK,GAAE,YAAY;AACnC,QAAM,OAAO,iBAAiB,OAAO,IAAI,GAAG;AAE5C,MAAI,KAAK,eAAe;AACtB,YAAQ,IAAI,QAAQ,EAAE,sBAAsB;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,WAAW,SAAS,KAAK,KAAK;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,MAAM,wBAAwB,EAAE,MAAO,MAAgB,OAAO,EAAE;AACxE,WAAO;AAAA,EACT;AAEA,UAAQ,IAAI,gBAAgB,EAAE,IAAI;AAClC,SAAO;AACT;;;AC5DA,IAAAC,mBAA2B;AAC3B,IAAAC,qBAAiB;AAajB,eAAsB,QAAQ,IAA6B;AACzD,MAAI,CAAC,aAAa,EAAE,GAAG;AACrB,YAAQ,MAAM,mBAAmB,EAAE,mEAAmE;AACtG,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,KAAC,EAAE,QAAQ,IAAI,MAAM,sBAAsB,GAAG;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,YAAQ,MAAM,UAAU,OAAO;AAAA,EACjC,SAAS,OAAO;AACd,YAAQ,MAAM,kDAAmD,MAAgB,OAAO,EAAE;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,qBAAqB,OAAO,EAAE;AAC3C,MAAI,KAAK,QAAQ,WAAW,GAAG;AAC7B,YAAQ,IAAI,QAAQ,EAAE,kBAAkB;AACxC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,oBAAI,KAAK;AAC3B,QAAM,eAAe,UAAU,YAAY;AAC3C,QAAM,OAAuB,CAAC;AAE9B,aAAW,WAAW,KAAK,SAAS;AAClC,UAAM,YAAY,KAAK,MAAM,QAAQ,UAAU;AAC/C,QAAI,OAAO,MAAM,SAAS,GAAG;AAC3B,cAAQ,MAAM,uBAAuB,EAAE,8BAA8B,QAAQ,UAAU,IAAI;AAC3F,aAAO;AAAA,IACT;AAEA,UAAM,kBAAkB,KAAK,IAAI,GAAG,KAAK,OAAO,UAAU,QAAQ,IAAI,aAAa,GAAI,CAAC;AACxF,SAAK,KAAK;AAAA,MACR;AAAA,MACA,YAAY,QAAQ;AAAA,MACpB,YAAY;AAAA,MACZ,kBAAkB;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,mBAAmB,EAAE;AAC7C,QAAM,kBAAkB,mBAAmB,SAAS,EAAE;AAEtD,QAAM,aAAa,MAAMC,YAAW,eAAe;AACnD,MAAI,YAAY;AACd,QAAI;AACF,YAAM,YAAY,SAAS,EAAE;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ,MAAO,MAAgB,OAAO;AACtC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,UAAU,mBAAAC,QAAK,KAAK,SAAS,UAAU,GAAG,EAAE,QAAQ;AAC1D,QAAM,iBAAiB,KAAK,IAAI,CAAC,SAAS,KAAK,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,OAAO,IAAI;AAEtF,MAAI;AACF,cAAM,6BAAW,SAAS,gBAAgB,MAAM;AAChD,UAAM,WAAW,SAAS,KAAK,KAAK;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,MAAM,uBAAuB,EAAE,MAAO,MAAgB,OAAO,EAAE;AACvE,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY;AACf,YAAQ,MAAM,sBAAsB,eAAe,+CAA+C;AAAA,EACpG;AAEA,UAAQ,IAAI,gBAAgB,EAAE,MAAM,KAAK,QAAQ,MAAM,sBAAsB;AAC7E,SAAO;AACT;;;AC7FA,IAAAC,oBAAkC;AAClC,IAAAC,qBAAiB;AAwBjB,IAAM,iBAAyC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAkD;AAAA,EACtD,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,eAAe;AAAA,EACf,KAAK;AAAA,EACL,YAAY;AAAA,EACZ,SAAS;AAAA,EACT,YAAY;AACd;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,CAAC;AACxB;AAEA,SAAS,cAAc,OAAuB;AAC5C,SAAO,GAAG,MAAM,QAAQ,CAAC,CAAC;AAC5B;AAEA,SAAS,cAAc,aAAqD;AAC1E,QAAM,QAAQ,YAAY;AAC1B,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,aAAqD;AACjF,QAAM,QAAQ,YAAY;AAC1B,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,aAAqD;AAC7E,QAAM,QAAQ,YAAY;AAC1B,MAAI,iBAAiB,MAAM;AACzB,UAAMC,UAAS,MAAM,QAAQ;AAC7B,WAAO,OAAO,MAAMA,OAAM,IAAI,OAAOA;AAAA,EACvC;AAEA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,OAAO,MAAM,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAsC;AAC9D,QAAM,cAAc,SAAS;AAC7B,QAAM,gBAAgB,SAAS;AAC/B,QAAM,mBAAmB,SAAS;AAElC,MAAI,OAAO,gBAAgB,aAAa,OAAO,kBAAkB,YAAY,CAAC,OAAO,SAAS,aAAa,GAAG;AAC5G,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,cAAc,SAAS;AAC3C,MAAI,CAAC,oBAAoB,OAAO,qBAAqB,UAAU;AAC7D,WAAO,GAAG,WAAW,IAAI,aAAa;AAAA,EACxC;AAEA,QAAM,YAAY;AAClB,OACG,UAAU,SAAS,YAAY,UAAU,SAAS,eACnD,OAAO,UAAU,WAAW,YAC5B,OAAO,SAAS,UAAU,MAAM,MAC/B,UAAU,aAAa,QACtB,UAAU,aAAa,SACvB,UAAU,aAAa,QACvB,UAAU,aAAa,SACvB,UAAU,aAAa,OACzB;AACA,WAAO,GAAG,WAAW,IAAI,aAAa,IAAI,+BAA+B,UAAU,QAAQ,CAAC,IAAI,UAAU,MAAM;AAAA,EAClH;AAEA,SAAO,GAAG,WAAW,IAAI,aAAa;AACxC;AAEA,eAAe,yBAAyB,SAAiB,IAA6B;AACpF,QAAM,eAAe,mBAAAC,QAAK,KAAK,UAAU,GAAG,EAAE,QAAQ;AACtD,QAAM,eAAe,mBAAAA,QAAK,KAAK,SAAS,YAAY;AACpD,MAAI,CAAE,MAAMC,YAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,UAAM,4BAAS,cAAc,MAAM;AAC/C,MAAI,IAAI,KAAK,EAAE,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,QAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,MAAM,+BAA+B,YAAY,0BAA0B,QAAQ,CAAC,GAAG;AAAA,IACnG;AAEA,UAAM,WAAY,OAA0C;AAC5D,QAAI,OAAO,aAAa,YAAY,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC9E,YAAM,IAAI;AAAA,QACR,+BAA+B,YAAY,8CAA8C,QAAQ,CAAC;AAAA,MACpG;AAAA,IACF;AAEA,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,eAAe,oBAAoB,SAAiB,IAA6B;AAC/E,QAAM,eAAe,mBAAAD,QAAK,KAAK,cAAc,GAAG,EAAE,OAAO;AACzD,QAAM,eAAe,mBAAAA,QAAK,KAAK,SAAS,YAAY;AACpD,MAAI,CAAE,MAAMC,YAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,UAAM,4BAAS,cAAc,MAAM,CAAC;AAAA,EAC1D,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,oCAAoC,YAAY,KAAM,MAAgB,OAAO,EAAE;AAAA,EACjG;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,MAA4B;AACtD;AAEA,SAAS,kBAAkB,MAA2B;AACpD,QAAM,SAAS;AAAA,IACb,eAAe,IAAI,CAAC,WAAW,eAAe,MAAM,CAAC;AAAA,IACrD,GAAG,KAAK,IAAI,CAAC,QAAQ,eAAe,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC;AAAA,EAClE;AAEA,QAAM,SAAS,eAAe;AAAA,IAAI,CAAC,SAAS,gBAC1C,OAAO,OAAO,CAAC,KAAK,eAAe,KAAK,IAAI,KAAK,WAAW,WAAW,EAAE,MAAM,GAAG,CAAC;AAAA,EACrF;AAEA,QAAM,WAAW,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,UAAU,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;AACpG,SAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,eAAsB,YAA6B;AACjD,MAAI;AACJ,MAAI;AACF,UAAM,MAAM,QAAQ,IAAI;AACxB,KAAC,EAAE,QAAQ,IAAI,MAAM,sBAAsB,GAAG;AAAA,EAChD,SAAS,OAAO;AACd,YAAQ,MAAO,MAAgB,OAAO;AACtC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,mBAAAD,QAAK,KAAK,SAAS,QAAQ;AAE1C,MAAI;AACJ,MAAI;AACF,iBAAa,UAAM,2BAAQ,QAAQ,EAAE,eAAe,KAAK,CAAC;AAAA,EAC5D,SAAS,OAAO;AACd,YAAQ,MAAM,oCAAoC,QAAQ,KAAM,MAAgB,OAAO,EAAE;AACzF,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,WACd,OAAO,CAAC,UAAU,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,KAAK,KAAK,CAAC,MAAM,KAAK,WAAW,GAAG,CAAC,EAC7F,IAAI,CAAC,UAAU,MAAM,IAAI,EACzB,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEpC,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,gBAAgB;AAC5B,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,QAAQ,MAAM,UAAU,OAAO;AACrC,mBAAe,IAAI,IAAI,MAAM,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC;AAAA,EAClE,SAAS,OAAO;AACd,YAAQ,MAAM,kDAAmD,MAAgB,OAAO,EAAE;AAC1F,WAAO;AAAA,EACT;AAEA,QAAM,OAAoB,CAAC;AAC3B,QAAM,QAAQ,KAAK,IAAI;AACvB,aAAW,YAAY,UAAU;AAC/B,UAAM,KAAK,SAAS,MAAM,GAAG,CAAC,MAAM,MAAM;AAC1C,QAAI;AACJ,QAAI;AACF,aAAO,MAAM,YAAY,SAAS,QAAQ,GAAG;AAAA,IAC/C,SAAS,OAAO;AACd,cAAQ,MAAO,MAAgB,OAAO;AACtC,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,wBAAkB,MAAM,yBAAyB,SAAS,EAAE;AAAA,IAC9D,SAAS,OAAO;AACd,cAAQ,MAAO,MAAgB,OAAO;AACtC,aAAO;AAAA,IACT;AAEA,QAAI;AACJ,QAAI;AACF,wBAAkB,MAAM,oBAAoB,SAAS,EAAE;AAAA,IACzD,SAAS,OAAO;AACd,cAAQ,MAAO,MAAgB,OAAO;AACtC,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,IAAI;AACxB,UAAM,SAAS,0BAA0B,YAAY,MAAM;AAC3D,UAAM,WAAW,cAAc,WAAW;AAC1C,UAAM,kBAAkB,aAAa,OAAO,qBAAqB,WAAW,IAAI;AAChF,UAAM,cAAc,oBAAoB,OAAO,OAAO,iBAAiB,WAAW;AAClF,UAAM,gBAAgB,kBAAkB;AACxC,QAAI,MAAM;AACV,QAAI,aAA4B;AAEhC,QAAI,aAAa,MAAM;AACrB,YAAM,GAAG,YAAY,QAAQ,CAAC;AAC9B,mBAAc,gBAAgB,WAAY;AAAA,IAC5C,WAAW,oBAAoB,MAAM;AACnC,YAAM,GAAG,gBAAgB,QAAQ,CAAC,CAAC;AACnC,UAAI,gBAAgB,MAAM;AACxB,cAAM,sBAAsB,KAAK,IAAI,IAAI,QAAQ,gBAAgB,KAAK,KAAK,KAAK,IAAK;AACrF,qBAAc,sBAAsB,kBAAmB;AAAA,MACzD;AAAA,IACF;AAEA,UAAM,UAAU,eAAe,OAAO,MAAM,cAAc,MAAM,WAAW,cAAc,KAAK,gBAAgB;AAE9G,SAAK,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA,QAAQ,aAAa,IAAI,EAAE,IAAI,QAAQ;AAAA,MACvC,eAAe,YAAY,aAAa;AAAA,MACxC;AAAA,MACA,YAAY,eAAe,OAAO,MAAM,cAAc,UAAU;AAAA,MAChE;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,UAAQ,IAAI,kBAAkB,IAAI,CAAC;AACnC,SAAO;AACT;;;AC5SA,IAAAE,oBAA2B;AAC3B,IAAAC,qBAAiB;;;ACCjB,IAAM,mBAAmB;AAEzB,SAAS,SAAS,OAA+C;AAC/D,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO,MAAM,SAAS,mBAAmB,GAAG,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ;AACtF;AAEA,SAAS,WAAW,QAAiC,MAAoC;AACvF,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,OAAO,GAAG;AACxB,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAoC;AACzD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AAEA,MAAI;AACF,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,KAAa,OAA4C;AACtF,QAAM,UAAU,IAAI,KAAK;AACzB,MAAI,QAAQ,WAAW,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,OAAO;AAAA,EAC7B,QAAQ;AACN,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AAEf,QAAM,SACJ,UAAU,uBACN,WAAW,QAAQ,CAAC,UAAU,eAAe,SAAS,CAAC,KAAK,cAAc,OAAO,QAAQ,CAAC,IAC1F;AAEN,QAAM,WACJ,UAAU,mBAAmB,UAAU,0BACnC,WAAW,QAAQ,CAAC,aAAa,YAAY,MAAM,CAAC,KAAK,WAAW,QAAQ,CAAC,SAAS,CAAC,IACvF;AAEN,QAAM,YACJ,UAAU,mBAAmB,UAAU,0BACnC,cAAc,OAAO,YAAY,KAAK,OAAO,OAAO,KAAK,OAAO,WAAW,CAAC,IAC5E;AAEN,QAAM,aACJ,UAAU,mBAAmB,UAAU,0BACnC,cAAc,OAAO,aAAa,KAAK,OAAO,QAAQ,KAAK,OAAO,YAAY,KAAK,OAAO,OAAO,CAAC,IAClG;AAEN,SAAO;AAAA,IACL,WAAW,WAAW,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,IACzD,QAAQ,SAAS,MAAM;AAAA,IACvB,UAAU,SAAS,QAAQ;AAAA,IAC3B,WAAW,SAAS,SAAS;AAAA,IAC7B,YAAY,SAAS,UAAU;AAAA,IAC/B,gBAAgB,SAAS,WAAW,QAAQ,CAAC,mBAAmB,gBAAgB,CAAC,CAAC;AAAA,IAClF,KAAK,SAAS,WAAW,QAAQ,CAAC,OAAO,qBAAqB,kBAAkB,CAAC,CAAC;AAAA,IAClF,KAAK;AAAA,EACP;AACF;AAEA,eAAsB,gBAAiC;AACrD,MAAI,QAAQ,MAAM,OAAO;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,QAAI,OAAO;AACX,YAAQ,MAAM,YAAY,MAAM;AAChC,YAAQ,MAAM,GAAG,QAAQ,CAAC,UAAkB;AAC1C,cAAQ;AAAA,IACV,CAAC;AACD,YAAQ,MAAM,GAAG,OAAO,MAAM,QAAQ,IAAI,CAAC;AAC3C,YAAQ,MAAM,GAAG,SAAS,CAAC,UAAU,OAAO,KAAK,CAAC;AAAA,EACpD,CAAC;AACH;;;ACxGA,IAAAC,oBAAyB;AACzB,IAAAC,qBAAiB;AAOjB,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAE5B,SAAS,iBAAiB,SAAyB;AACjD,QAAM,UAAU,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAClD,MAAI,QAAQ,UAAU,uBAAuB;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,QAAQ,MAAM,GAAG,qBAAqB,CAAC;AACnD;AAEA,SAAS,eAAe,SAAiB,SAAqC;AAC5E,QAAM,UAAU,IAAI,OAAO,SAAS,OAAO,qCAAqC,GAAG;AACnF,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,MAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG;AACvB,WAAO;AAAA,EACT;AAEA,SAAO,iBAAiB,MAAM,CAAC,CAAC;AAClC;AAEA,eAAe,eAAe,SAA6C;AACzE,QAAM,QAAQ,MAAM,qBAAqB,OAAO;AAEhD,QAAM,SAA4B,CAAC;AACnC,aAAW,YAAY,OAAO;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,YAAY,SAAS,QAAQ;AAClD,YAAM,KAAK,OAAO,OAAO,IAAI,KAAK,MAAM,SAAS,QAAQ,SAAS,EAAE,CAAC;AACrE,YAAM,SAAS,0BAA0B,OAAO,IAAI,KAAK,MAAM;AAC/D,YAAM,UAAU,OAAO,IAAI,WAAW;AAEtC,aAAO,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA,YAAY,eAAe,SAAS,yBAAyB;AAAA,QAC7D,WAAW,eAAe,SAAS,gBAAgB;AAAA,QACnD,gBAAgB,eAAe,SAAS,sBAAsB;AAAA,QAC9D,OAAO,eAAe,SAAS,YAAY;AAAA,QAC3C,SAAS,iBAAiB,OAAO;AAAA,MACnC,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,sBAAsB,SAAqD;AACxF,QAAM,WAAW,mBAAAC,QAAK,KAAK,SAAS,UAAU,yBAAyB;AAEvE,MAAI;AACJ,MAAI;AACF,UAAM,UAAM,4BAAS,UAAU,MAAM;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,QAAQ,IACX,MAAM,OAAO,EACb,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EACzB,OAAO,CAAC,SAAS,KAAK,SAAS,CAAC;AAEnC,QAAM,SAAS,MAAM,MAAM,CAAC,mBAAmB;AAC/C,QAAM,SAAoC,CAAC;AAE3C,aAAW,QAAQ,QAAQ;AACzB,QAAI;AACF,YAAM,QAAQ,KAAK,MAAM,IAAI;AAC7B,aAAO,KAAK,KAAK;AAAA,IACnB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,yBACpB,SACA,OACA,SAC2B;AAC3B,QAAM,CAAC,OAAO,MAAM,iBAAiB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACzD,UAAU,OAAO;AAAA,IACjB,eAAe,OAAO;AAAA,IACtB,sBAAsB,OAAO;AAAA,EAC/B,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,cAAc,MAAM,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE;AAAA,IACtD;AAAA,IACA;AAAA,EACF;AACF;;;ACrGA,IAAM,+BAA+B;AAOrC,IAAM,cAA0B;AAAA,EAC9B,OAAO;AAAA,EACP,MAAM;AACR;AAEA,SAAS,KAAK,UAAoD;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,cAAc,CAAC;AAAA,IACf;AAAA,EACF;AACF;AAEA,SAAS,YAAY,UAA6B,aAA0B,KAAwC;AAClH,QAAM,KAAK,SAAS,GAAG;AACvB,MAAI,CAAC,IAAI;AACP,WAAO;AAAA,EACT;AAEA,SAAO,aAAa,EAAE,KAAK,YAAY,IAAI,EAAE;AAC/C;AAEA,eAAsB,uBACpB,SACA,aACA,OAAmB,aACa;AAChC,QAAM,aAAa,OAAO,SAAS,YAAY,UAAU,IAAI,YAAY,aAAa;AACtF,QAAM,WAA8B;AAAA,IAClC,GAAG;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAc,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAE7D,MAAI,SAAS,aAAa,8BAA8B;AACtD,WAAO,KAAK;AAAA,MACV,GAAG;AAAA,MACH,QAAQ;AAAA,MACR,QAAQ,GAAG,SAAS,MAAM;AAAA,IAC5B,CAAC;AAAA,EACH;AAEA,MAAI,SAAS,WAAW,UAAU,SAAS,WAAW,QAAQ;AAC5D,WAAO,KAAK,QAAQ;AAAA,EACtB;AAEA,MAAI,SAAS,WAAW,SAAS;AAC/B,QAAI,CAAC,YAAY,UAAU,aAAa,QAAQ,GAAG;AACjD,aAAO,KAAK,EAAE,GAAG,UAAU,QAAQ,QAAQ,QAAQ,GAAG,SAAS,MAAM,uBAAuB,CAAC;AAAA,IAC/F;AAEA,UAAM,OAAO,MAAM,KAAK,MAAM,SAAS,MAAgB;AACvD,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc,CAAC;AAAA,QACf;AAAA,QACA,OAAO,wBAAwB,SAAS,MAAM;AAAA,MAChD;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,SAAS,SAAS,MAAM,EAAE;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,QAAQ;AAC9B,QAAI,CAAC,YAAY,UAAU,aAAa,QAAQ,GAAG;AACjD,aAAO,KAAK,EAAE,GAAG,UAAU,QAAQ,QAAQ,QAAQ,GAAG,SAAS,MAAM,sBAAsB,CAAC;AAAA,IAC9F;AAEA,UAAM,OAAO,MAAM,KAAK,KAAK,SAAS,MAAgB;AACtD,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,cAAc,CAAC;AAAA,QACf;AAAA,QACA,OAAO,uBAAuB,SAAS,MAAM;AAAA,MAC/C;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,cAAc,CAAC,QAAQ,SAAS,MAAM,EAAE;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAEA,MAAI,SAAS,WAAW,UAAU;AAChC,UAAM,WAAW,YAAY,UAAU,aAAa,QAAQ;AAC5D,QAAI,CAAC,UAAU;AACb,aAAO,KAAK,EAAE,GAAG,UAAU,QAAQ,QAAQ,QAAQ,GAAG,SAAS,MAAM,2BAA2B,CAAC;AAAA,IACnG;AAEA,UAAM,SAAS,YAAY,UAAU,aAAa,aAAa,IAC1D,SAAS,cACV,QAAQ,aAAa,KAAK,CAAC,OAAO,OAAO,SAAS,MAAM;AAE5D,QAAI,UAAU,WAAW,SAAS,QAAQ;AACxC,aAAO,KAAK,EAAE,GAAG,UAAU,QAAQ,QAAQ,QAAQ,GAAG,SAAS,MAAM,kCAAkC,CAAC;AAAA,IAC1G;AAEA,UAAM,eAAyB,CAAC;AAEhC,QAAI,QAAQ;AACV,YAAM,WAAW,MAAM,KAAK,KAAK,MAAM;AACvC,UAAI,aAAa,GAAG;AAClB,eAAO;AAAA,UACL,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA,OAAO,uBAAuB,MAAM;AAAA,QACtC;AAAA,MACF;AACA,mBAAa,KAAK,QAAQ,MAAM,EAAE;AAAA,IACpC;AAEA,UAAM,YAAY,MAAM,KAAK,MAAM,SAAS,MAAgB;AAC5D,QAAI,cAAc,GAAG;AACnB,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,OAAO,wBAAwB,SAAS,MAAM;AAAA,MAChD;AAAA,IACF;AACA,iBAAa,KAAK,SAAS,SAAS,MAAM,EAAE;AAE5C,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,KAAK,EAAE,GAAG,UAAU,QAAQ,QAAQ,QAAQ,GAAG,SAAS,MAAM,wBAAwB,CAAC;AAChG;;;ACvJA,IAAAC,oBAAyB;AACzB,IAAAC,qBAAiB;AAuBjB,SAAS,oBAAoB,OAA+B;AAC1D,MAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAASC,kBAAiB,OAA+B;AACvD,MAAI,iBAAiB,MAAM;AACzB,UAAMC,UAAS,MAAM,QAAQ;AAC7B,WAAO,OAAO,MAAMA,OAAM,IAAI,OAAOA;AAAA,EACvC;AAEA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,GAAG;AAC1D,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,KAAK,MAAM,KAAK;AAC/B,MAAI,OAAO,MAAM,MAAM,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAeC,0BAAyB,SAAiB,OAAgC;AACvF,QAAM,eAAe,mBAAAC,QAAK,KAAK,UAAU,GAAG,KAAK,QAAQ;AACzD,QAAM,eAAe,mBAAAA,QAAK,KAAK,SAAS,YAAY;AACpD,MAAI,CAAE,MAAMC,YAAW,YAAY,GAAI;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,MAAM,UAAM,4BAAS,cAAc,MAAM;AAC/C,MAAI,IAAI,KAAK,EAAE,WAAW,GAAG;AAC3B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ;AACZ,QAAM,QAAQ,IAAI,MAAM,OAAO;AAC/B,aAAW,CAAC,OAAO,IAAI,KAAK,MAAM,QAAQ,GAAG;AAC3C,QAAI,KAAK,KAAK,EAAE,WAAW,GAAG;AAC5B;AAAA,IACF;AAEA,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,IAAI;AAAA,IAC1B,QAAQ;AACN,YAAM,IAAI,MAAM,qBAAqB,QAAQ,CAAC,EAAE;AAAA,IAClD;AAEA,UAAM,WAAY,OAA0C;AAC5D,QAAI,OAAO,aAAa,YAAY,CAAC,OAAO,SAAS,QAAQ,KAAK,WAAW,GAAG;AAC9E,YAAM,IAAI,MAAM,yBAAyB,QAAQ,CAAC,EAAE;AAAA,IACtD;AAEA,aAAS;AAAA,EACX;AAEA,SAAO;AACT;AAEA,eAAsB,wBAAwB,SAAiB,OAAe,WAAuC;AACnH,QAAM,UAAU,MAAMF,0BAAyB,SAAS,KAAK;AAC7D,QAAM,QAAQ,UAAU;AAExB,QAAM,cAAcF,kBAAiB,SAAS;AAC9C,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,MACL;AAAA,MACA,cAAc;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,eAAe,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,gBAAgB,KAAK,KAAK,KAAK,IAAK;AACnF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,SAA2B,UAA4C;AACzG,MAAI,SAAS,UAAU,aAAa,SAAS,MAAM,GAAG;AACpD,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,SAAS,WAAW,YAAY,SAAS,UAAU,aAAa,SAAS,MAAM,GAAG;AACpF,WAAO,SAAS;AAAA,EAClB;AAEA,MAAI,QAAQ,aAAa,WAAW,GAAG;AACrC,UAAM,SAAS,QAAQ,aAAa,CAAC;AACrC,WAAO,aAAa,MAAM,IAAI,SAAS;AAAA,EACzC;AAEA,SAAO;AACT;AAEA,eAAsB,gBACpB,SACA,SACA,UACwB;AACxB,QAAM,cAAc,oBAAoB,SAAS,QAAQ;AACzD,MAAI,CAAC,aAAa;AAChB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,eAAe,QAAQ,KAAK,KAAK,CAACK,SAAQA,KAAI,OAAO,WAAW;AACtE,MAAI,cAAc,WAAW,UAAU;AACrC,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,YAAY,SAAS,WAAW,GAAG;AAAA,EAClD,QAAQ;AACN,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,oBAAoB,IAAI,KAAK,SAAS;AACvD,QAAM,kBAAkB,aAAa,OAAO,oBAAoB,IAAI,KAAK,iBAAiB,IAAI;AAE9F,MAAI,aAAa,QAAQ,oBAAoB,MAAM;AACjD,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,wBAAwB,SAAS,aAAa,IAAI,KAAK,UAAU;AAAA,EACpF,SAAS,OAAO;AACd,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,QAAQ,mBAAoB,MAAgB,OAAO;AAAA,IACrD;AAAA,EACF;AAEA,MAAI,aAAa,MAAM;AACrB,UAAMC,aAAY,SAAS;AAC3B,UAAMC,eAAeD,aAAY,WAAY;AAC7C,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,UAAU;AAAA,MACV,WAAAA;AAAA,MACA,aAAAC;AAAA,MACA,SAASA,gBAAe;AAAA,MACxB,QAAQA,gBAAe,MAAM,mBAAmB;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,YAAY,SAAS;AAC3B,MAAI,cAAc,QAAQ,oBAAoB,MAAM;AAClD,WAAO;AAAA,MACL;AAAA,MACA,SAAS;AAAA,MACT,UAAU,mBAAmB;AAAA,MAC7B,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,cAAe,YAAY,kBAAmB;AACpD,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,SAAS,eAAe;AAAA,IACxB,QAAQ,eAAe,MAAM,mBAAmB;AAAA,EAClD;AACF;;;ACrNA,gCAAsB;AACtB,IAAAC,oBAA2B;AAC3B,qBAAe;AAIf,IAAM,QAAQ;AACd,IAAM,uBAAuB;AAC7B,IAAM,4BACJ;AA8CF,SAAS,gBAAgB,OAAyB;AAChD,MAAI,iBAAiB,OAAO;AAC1B,WAAO,EAAE,MAAM,MAAM,MAAM,SAAS,MAAM,SAAS,OAAO,MAAM,MAAM;AAAA,EACxE;AAEA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,KAAK;AAAA,EACrB;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,cAAkC,OAAkC;AAC5F,MAAI,CAAC,SAAS,CAAC,cAAc;AAC3B;AAAA,EACF;AAEA,MAAI;AACF,cAAM;AAAA,MACJ;AAAA,MACA,GAAG,KAAK,UAAU;AAAA,QAChB,GAAG;AAAA,QACH,MAAM,MAAM,OACR,OAAO,YAAY,OAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,gBAAgB,KAAK,CAAC,CAAC,CAAC,IAClG;AAAA,MACN,CAAC,CAAC;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,YAAY,KAA2C;AAC9D,QAAM,OAA0B,CAAC;AAEjC,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,IAAI,WAAW,MAAM,GAAG;AAC1B;AAAA,IACF;AACA,SAAK,GAAG,IAAI;AAAA,EACd;AAEA,SAAO;AACT;AAEA,eAAe,iBAAiB,EAAE,QAAQ,WAAW,QAAQ,GAAmC;AAC9F,SAAO,IAAI,QAAgB,CAAC,SAAS,WAAW;AAC9C,SAAK,UAAU,eAAe,wCAAwC;AAAA,MACpE,SAAS;AAAA,MACT,MAAM,CAAC,WAAW,mBAAmB,QAAQ,WAAW,UAAU,qBAAqB,EAAE;AAAA,MACzF,KAAK,eAAAC,QAAG,OAAO;AAAA,MACf;AAAA,IACF,CAAC;AAED,UAAM,YAAQ;AAAA,MACZ;AAAA,MACA,CAAC,WAAW,mBAAmB,QAAQ,WAAW,UAAU,qBAAqB,EAAE;AAAA,MACnF;AAAA,QACE,KAAK,eAAAA,QAAG,OAAO;AAAA,QACf,KAAK,YAAY,QAAQ,GAAG;AAAA,QAC5B,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,WAAW;AAEf,UAAM,QAAQ,WAAW,MAAM;AAC7B,iBAAW;AACX,YAAM,KAAK,SAAS;AAAA,IACtB,GAAG,SAAS;AAEZ,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,gBAAU;AACV,WAAK,UAAU,sBAAsB,+CAA+C,EAAE,MAAM,CAAC;AAAA,IAC/F,CAAC;AAED,UAAM,OAAO,YAAY,MAAM;AAC/B,UAAM,OAAO,GAAG,QAAQ,CAAC,UAAkB;AACzC,gBAAU;AACV,WAAK,UAAU,sBAAsB,+CAA+C,EAAE,MAAM,CAAC;AAAA,IAC/F,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,UAAU;AAC3B,mBAAa,KAAK;AAClB,aAAO,KAAK;AAAA,IACd,CAAC;AAED,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,mBAAa,KAAK;AAClB,WAAK,UAAU,eAAe,sCAAsC,EAAE,MAAM,UAAU,OAAO,CAAC;AAC9F,UAAI,UAAU;AACZ,eAAO,IAAI,MAAM,mCAAmC,SAAS,KAAK,CAAC;AACnE;AAAA,MACF;AAEA,UAAI,SAAS,GAAG;AACd,eAAO,IAAI,MAAM,yCAAyC,IAAI,KAAK,OAAO,KAAK,CAAC,EAAE,CAAC;AACnF;AAAA,MACF;AAEA,cAAQ,MAAM;AAAA,IAChB,CAAC;AAED,UAAM,MAAM,IAAI,MAAM;AAAA,EACxB,CAAC;AACH;AAEA,SAAS,6BAA6B,OAAuB;AAC3D,QAAM,UAAU,MAAM,KAAK;AAC3B,QAAM,QAAQ,QAAQ,MAAM,oCAAoC;AAChE,MAAI,SAAS,MAAM,CAAC,GAAG;AACrB,WAAO,MAAM,CAAC,EAAE,KAAK;AAAA,EACvB;AAEA,SAAO;AACT;AAEA,SAAS,iCAAiC,QAAmC;AAC3E,QAAM,QAAQ,OAAO,OAAO,CAAC,UAAU,SAAS,OAAO,UAAU,QAAQ;AAEzE,QAAM,cAAc,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,YAAY,OAAO,MAAM,WAAW,QAAQ;AACrG,MAAI,eAAe,OAAO,YAAY,WAAW,UAAU;AACzD,UAAM,OAAO,6BAA6B,YAAY,MAAM;AAC5D,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAEA,QAAM,iBAAiB,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,eAAe,MAAM,QAAQ,MAAM,SAAS,OAAO,CAAC;AAChH,MAAI,CAAC,kBAAkB,CAAC,MAAM,QAAQ,eAAe,SAAS,OAAO,GAAG;AACtE,WAAO;AAAA,EACT;AAEA,aAAW,SAAS,eAAe,QAAQ,SAAS;AAClD,QAAI,OAAO,SAAS,UAAU,OAAO,MAAM,SAAS,UAAU;AAC5D;AAAA,IACF;AAEA,UAAM,OAAO,6BAA6B,MAAM,IAAI;AACpD,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAc,UAAiD;AACjF,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,YAAY;AAClB,QAAM,SAAS,UAAU;AACzB,QAAM,aAAa,UAAU;AAC7B,QAAM,SAAS,UAAU;AAEzB,MACE,WAAW,WACX,WAAW,UACX,WAAW,YACX,WAAW,UACX,WAAW,QACX;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,eAAe,YAAY,CAAC,OAAO,SAAS,UAAU,GAAG;AAClE,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,YAAY,OAAO,KAAK,EAAE,WAAW,GAAG;AAC5D,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,UAAU,WAAW,WAAW,UAAU,SAAS;AACxE,QAAM,YAAY,OAAO,UAAU,gBAAgB,WAAW,UAAU,cAAc;AAEtF,MAAI,UAAU,CAAC,aAAa,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,IAAI;AAC3D,WAAO;AAAA,EACT;AAEA,MAAI,cAAc,CAAC,aAAa,SAAS,KAAK,CAAC,SAAS,IAAI,SAAS,IAAI;AACvE,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR,aAAa;AAAA,IACb;AAAA,IACA,QAAQ,OAAO,KAAK;AAAA,EACtB;AACF;AAEA,SAAS,YAAY,SAAmC;AACtD,QAAM,OAAO,QAAQ,KAClB,IAAI,CAAC,SAAS;AAAA,IACb,IAAI,IAAI;AAAA,IACR,QAAQ,IAAI;AAAA,IACZ,YAAY,IAAI;AAAA,IAChB,WAAW,IAAI;AAAA,IACf,iBAAiB,IAAI;AAAA,IACrB,OAAO,IAAI;AAAA,IACX,SAAS,IAAI;AAAA,EACf,EAAE,EACD,MAAM,GAAG,EAAE;AAEd,QAAM,UAAU,QAAQ,UACpB;AAAA,IACE,YAAY,QAAQ,QAAQ;AAAA,IAC5B,QAAQ,QAAQ,QAAQ;AAAA,IACxB,WAAW,QAAQ,QAAQ;AAAA,IAC3B,YAAY,QAAQ,QAAQ;AAAA,IAC5B,aAAa,QAAQ,QAAQ;AAAA,IAC7B,iBAAiB,QAAQ,QAAQ;AAAA,IACjC,KAAK,QAAQ,QAAQ;AAAA,EACvB,IACA;AAEJ,QAAM,SAAS,QAAQ,kBAAkB,IAAI,CAAC,WAAW;AAAA,IACvD,IAAI,MAAM;AAAA,IACV,OAAO,MAAM;AAAA,IACb,YAAY,MAAM;AAAA,IAClB,UAAU,MAAM;AAAA,EAClB,EAAE;AAEF,QAAM,sBACJ,QAAQ,UAAU,gBACd;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA,QAAQ,UAAU,uBAChB;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAER,SAAO;AAAA,IACL;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,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,MACH;AAAA,QACE,OAAO,QAAQ;AAAA,QACf,aAAa,QAAQ;AAAA,QACrB;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,eAAsB,oBACpB,SACA,qBAAqD,kBACrD,eAAiC,CAAC,GACR;AAC1B,QAAM,YAAY,OAAO,uBAAuB,aAAa,qBAAqB;AAClF,QAAM,UAAU,OAAO,uBAAuB,aAAa,eAAe;AAE1E,QAAM,WAAW,CAAC,OAAmB,SAAiB,SACpD,WAAW,QAAQ,cAAc;AAAA,IAC/B,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3B;AAAA,IACA,OAAO,QAAQ;AAAA,IACf,YAAY,QAAQ,SAAS;AAAA,IAC7B;AAAA,IACA;AAAA,EACF,CAAC;AAEH,MAAI,QAAQ,KAAK,WAAW,GAAG;AAC7B,UAAM,SAAS,aAAa,8CAA8C;AAC1E,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,UAAU;AAAA,QACR,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,MACV;AAAA,MACA,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,OAAO;AAClC,QAAM,SAAS,gBAAgB,iCAAiC;AAAA,IAC9D;AAAA,IACA,cAAc,QAAQ;AAAA,IACtB,QAAQ,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE;AAAA,EAC1C,CAAC;AAED,MAAI,UAAU;AACd,MAAI;AACF,cAAU,MAAM,UAAU;AAAA,MACxB;AAAA,MACA,WAAW;AAAA,MACX,SAAS,CAAC,OAAO,SAAS,SAAS;AACjC,aAAK,SAAS,OAAO,SAAS,IAAI;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,SAAS,gBAAgB,sCAAsC;AAAA,MACnE;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO,kCAAmC,MAAgB,OAAO;AAAA,IACnE;AAAA,EACF;AAEA,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,SAAS,gBAAgB,wCAAwC;AACvE,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,SAAS,oBAAoB,qCAAqC,EAAE,QAAQ,CAAC;AACnF,YAAQ,KAAK,MAAM,OAAO;AAAA,EAC5B,QAAQ;AACN,UAAM,SAAS,gBAAgB,gDAAgD,EAAE,QAAQ,CAAC;AAC1F,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,gBAAyB;AAC7B,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI;AACF,YAAM,SAAS,qBAAqB,kCAAkC,EAAE,YAAY,MAAM,OAAO,CAAC;AAClG,sBAAgB,iCAAiC,KAAK;AAAA,IACxD,QAAQ;AACN,YAAM,SAAS,gBAAgB,wDAAwD,EAAE,QAAQ,CAAC;AAClG,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,eAAe;AAClB,YAAM,SAAS,gBAAgB,mDAAmD,EAAE,QAAQ,CAAC;AAC7F,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF,WAAW,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAyB,WAAW,UAAU;AACrG,UAAM,OAAO,6BAA8B,MAAyB,UAAU,EAAE;AAChF,QAAI;AACF,YAAM,SAAS,qBAAqB,wCAAwC,EAAE,KAAK,CAAC;AACpF,sBAAgB,KAAK,MAAM,IAAI;AAAA,IACjC,QAAQ;AACN,YAAM,SAAS,gBAAgB,gDAAgD,EAAE,MAAM,QAAQ,CAAC;AAChG,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,OAAO;AAAA,QACP;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,IAAI,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC1D,QAAM,iBAAiB,WAAW,eAAe,QAAQ;AACzD,QAAM,SAAS,qBAAqB,wCAAwC;AAAA,IAC1E;AAAA,IACA,UAAU,MAAM,KAAK,QAAQ;AAAA,IAC7B,OAAO,mBAAmB;AAAA,EAC5B,CAAC;AACD,MAAI,CAAC,gBAAgB;AACnB,UAAM,SAAS,gBAAgB,+CAA+C,EAAE,eAAe,QAAQ,CAAC;AACxG,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,UAAU,iBAAiB,eAAe,WAAW,QAAQ;AACvE,UAAM,SAAS,qBAAqB,yEAAyE;AAAA,MAC3G,UAAU;AAAA,MACV,cAAc,QAAQ;AAAA,IACxB,CAAC;AAAA,EACH;AAEA,QAAM,SAAS,aAAa,0CAA0C;AAAA,IACpE,UAAU;AAAA,EACZ,CAAC;AACD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,UAAU;AAAA,IACV;AAAA,EACF;AACF;;;AL/aA,IAAMC,eAAgC;AAAA,EACpC,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa,CAAC,WAAmB,QAAQ,OAAO,MAAM,MAAM;AAC9D;AAEA,SAAS,YAAY,OAAmC;AACtD,SACE,UAAU,wBACV,UAAU,mBACV,UAAU,2BACV,UAAU;AAEd;AAEA,SAAS,kBAAkB,WAA4B,SAA0E;AAC/H,MAAI,SAAS;AACX,WAAO,QAAQ;AAAA,EACjB;AAEA,MAAI,UAAU,IAAI;AAChB,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,QAAQ,UAAU;AAAA,EACpB;AACF;AAEA,eAAsB,QAAQ,OAAe,OAAe,OAAyBA,cAA8B;AACjH,MAAI,CAAC,qBAAqB,KAAK,GAAG;AAChC,YAAQ,MAAM,2BAA2B,KAAK,qCAAqC;AACnF,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,YAAY,KAAK,GAAG;AACvB,YAAQ;AAAA,MACN,2BAA2B,KAAK;AAAA,IAClC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,oBAAoB,QAAQ,IAAI,CAAC;AACrD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,QAAM,cAAc,KAAK,eAAeA,aAAY;AACpD,QAAM,WAAW,MAAM,KAAK,UAAU,EAAE,MAAM,MAAM,EAAE;AACtD,QAAM,UAAU,eAAe,UAAU,KAAK;AAE9C,MAAI;AACJ,MAAI,UAAwC;AAC5C,MAAI,QAAuB;AAC3B,MAAI,eAAe;AACnB,MAAI,mBAAkC;AACtC,MAAI,YAAkC;AAEtC,MAAI;AACF,UAAM,UAAU,MAAM,yBAAyB,MAAM,SAAS,OAAO,OAAO;AAC5E,UAAM,eAAe,mBAAAC,QAAK,KAAK,MAAM,SAAS,UAAU,gBAAgB;AACxE,gBAAY,MAAM,KAAK,OAAO,SAAS,EAAE,aAAa,CAAC;AAEvD,QAAI,UAAU,IAAI;AAChB,YAAM,OAAO,MAAM,gBAAgB,MAAM,SAAS,SAAS,UAAU,QAAQ;AAC7E,UAAI,KAAK,SAAS;AAChB,oBAAY;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,YAAY,SAAS;AAAA,UACrB,QAAQ,KAAK;AAAA,UACb,UAAU,KAAK;AAAA,UACf,WAAW,KAAK;AAAA,UAChB,YAAY,KAAK;AAAA,UACjB,cAAc,KAAK;AAAA,UACnB,UAAU;AAAA,UACV,UAAU,UAAU;AAAA,UACpB,QAAQ,KAAK;AAAA,QACf;AAAA,MACF;AAEA,UAAI,UAAU,wBAAwB,KAAK,SAAS;AAClD,uBAAe;AACf,2BAAmB,QAAQ,KAAK,eAAe,SAAS,iBAAiB,KAAK,aAAa,GAAG,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,sBAAsB,SAAS,OAAO,OAAO,KAAK,YAAY,GAAG,QAAQ,CAAC,CAAC,IAAI,KAAK,YAAY,sBAAsB,SAAS,OAAO,MAAM,KAAK,eAAe,GAAG,QAAQ,CAAC,CAAC,mBAAmB,KAAK,WAAW;AAAA,MAC/U,OAAO;AACL,kBAAU,MAAM,KAAK,MAAM,SAAS,UAAU,QAAQ;AACtD,YAAI,QAAQ,OAAO;AACjB,kBAAQ,QAAQ;AAAA,QAClB;AAAA,MACF;AAAA,IACF,OAAO;AACL,cAAQ,UAAU;AAAA,IACpB;AAAA,EACF,SAAS,QAAQ;AACf,UAAM,UAAW,OAAiB;AAClC,gBAAY;AAAA,MACV,IAAI;AAAA,MACJ,OAAO,4BAA4B,OAAO;AAAA,IAC5C;AACA,YAAQ,UAAU;AAAA,EACpB;AAEA,QAAM,WAAW,kBAAkB,WAAW,OAAO;AAErD,QAAM,kBAAuC;AAAA,IAC3C;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,SAAS;AAAA,IACrB;AAAA,IACA,SAAS,SAAS,WAAW;AAAA,IAC7B,eAAe,SAAS,gBAAgB,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,cAA4B;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,SAAS;AAAA,IACrB,QAAQ,SAAS;AAAA,IACjB,YAAY,SAAS;AAAA,IACrB,SAAS,SAAS,WAAW;AAAA,EAC/B;AAEA,QAAM,kBAAkB,mBAAAA,QAAK,KAAK,MAAM,SAAS,UAAU,yBAAyB;AACpF,QAAM,cAAc,mBAAAA,QAAK,KAAK,MAAM,SAAS,UAAU,sBAAsB;AAC7E,QAAM,aAAa,mBAAAA,QAAK,KAAK,MAAM,SAAS,UAAU,oBAAoB;AAE1E,MAAI,WAAW;AACb,UAAM,KAAK,OAAO,YAAY,GAAG,KAAK,UAAU,SAAS,CAAC;AAAA,GAAM,MAAM;AAAA,EACxE;AAEA,QAAM,KAAK,OAAO,iBAAiB,GAAG,KAAK,UAAU,eAAe,CAAC;AAAA,GAAM,MAAM;AACjF,QAAM,KAAK,OAAO,aAAa,GAAG,KAAK,UAAU,WAAW,CAAC;AAAA,GAAM,MAAM;AAEzE,MAAI,UAAU,wBAAwB,cAAc;AAClD,kBAAc,KAAK,UAAU,EAAE,UAAU,OAAO,YAAY,oBAAoB,8BAA8B,CAAC,CAAC;AAChH,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,sBAAsB;AAClC,kBAAc,KAAK,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAChD,WAAO;AAAA,EACT;AAEA,gBAAc,KAAK,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAChD,SAAO;AACT;;;AzBxMA,eAAsB,KAAK,MAA+B;AACxD,QAAM,UAAU,IAAI,yBAAQ;AAE5B,UAAQ,KAAK,KAAK,EAAE,YAAY,oCAAoC;AAEpE,UACG,QAAQ,MAAM,EACd,YAAY,sDAAsD,EAClE,OAAO,mBAAmB,8BAA8B,EACxD,OAAO,sBAAsB,gCAAgC,EAC7D,OAAO,mBAAmB,sDAAsD,EAChF,OAAO,OAAO,YAAwD;AACrE,UAAM,WAAW,MAAM,QAAQ;AAAA,MAC7B,cAAc,QAAQ;AAAA,MACtB,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,aAAa,EACrB,YAAY,gCAAgC,EAC5C,OAAO,OAAO,YAAuB;AACpC,UAAM,KAAK,WAAW,QAAQ,SAAS,IAAI,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,IAAI;AAC3E,UAAM,WAAW,MAAM,OAAO,EAAE;AAChC,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,YAAY,EACpB,YAAY,+BAA+B,EAC3C,OAAO,OAAO,OAAe;AAC5B,UAAM,WAAW,MAAM,SAAS,EAAE;AAClC,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,WAAW,EACnB,YAAY,qDAAqD,EACjE,OAAO,OAAO,OAAe;AAC5B,UAAM,WAAW,MAAM,QAAQ,EAAE;AACjC,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,QAAQ,EAChB,YAAY,8BAA8B,EAC1C,OAAO,YAAY;AAClB,UAAM,WAAW,MAAM,UAAU;AACjC,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,YAAY,EACpB,YAAY,uCAAuC,EACnD,OAAO,eAAe,oDAAoD,EAC1E,OAAO,OAAO,IAAY,YAAiC;AAC1D,UAAM,WAAW,MAAM,SAAS,IAAI,EAAE,OAAO,QAAQ,MAAM,CAAC;AAC5D,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,UACG,QAAQ,sBAAsB,EAC9B,YAAY,kDAAkD,EAC9D,OAAO,OAAO,OAAe,UAAkB;AAC9C,UAAM,WAAW,MAAM,QAAQ,OAAO,KAAK;AAC3C,YAAQ,WAAW;AAAA,EACrB,CAAC;AAEH,QAAM,QAAQ,WAAW,IAAI;AAC/B;AAEA,IAAI,QAAQ,SAAS,QAAQ;AAC3B,OAAK,KAAK,QAAQ,IAAI;AACxB;","names":["import_promises","import_node_path","path","path","import_node_path","import_promises","import_node_path","path","import_promises","import_node_path","path","path","import_promises","import_node_path","import_prompts","import_promises","import_node_path","path","pathExists","matter","import_prompts","import_prompts","trimmed","result","import_prompts","BACK_VALUE","DIM","RESET","isManualComparisonOperator","trimmed","result","path","pathExists","isInteractiveTty","module","import_promises","import_node_path","import_gray_matter","matter","import_prompts","BACK_VALUE","DIM","RESET","module","trimmed","import_prompts","pathExists","isInteractiveTty","path","import_promises","import_node_path","path","pathExists","import_promises","import_node_path","pathExists","path","import_promises","import_node_path","millis","path","pathExists","import_promises","import_node_path","import_promises","import_node_path","path","import_promises","import_node_path","parseCreatedAtMs","millis","sumLoggedExposureSeconds","path","pathExists","bet","usedValue","percentUsed","import_promises","os","defaultDeps","path"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@samboyd/bep-cli",
3
+ "version": "0.1.0",
4
+ "description": "BEP: Budgeted Engineering Proposals (repo-native pre-commitment CLI)",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "publishConfig": {
8
+ "access": "public"
9
+ },
10
+ "bin": {
11
+ "bep-cli": "dist/cli.js",
12
+ "bep": "dist/cli.js"
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsup",
19
+ "prepack": "npm run build",
20
+ "pretest": "npm run build",
21
+ "test": "jest"
22
+ },
23
+ "dependencies": {
24
+ "@clack/prompts": "^0.11.0",
25
+ "commander": "^12.1.0",
26
+ "gray-matter": "^4.0.3"
27
+ },
28
+ "devDependencies": {
29
+ "@types/jest": "^29.5.14",
30
+ "@types/node": "^22.13.5",
31
+ "execa": "^9.5.2",
32
+ "jest": "^29.7.0",
33
+ "ts-jest": "^29.2.5",
34
+ "tsup": "^8.4.0",
35
+ "typescript": "^5.7.3"
36
+ }
37
+ }