{"version":3,"sources":["../src/pipeline/skill-driver.ts","../src/pipeline/runner.ts","../src/gate-engine/index.ts","../src/envelope/index.ts","../src/pipeline/skill-dispatch.ts","../src/pipeline/index.ts","../src/team/fs-utils.ts","../src/commands/init.ts","../src/skills-mirror/index.ts","../src/commands/update.ts","../src/gate-fix.ts","../src/commands/gate-cli.ts","../src/commands/envelope-cli.ts","../src/envelope/baseline.ts","../src/commands/code-scan-cli.ts","../src/commands/step-cli.ts","../src/pipeline/resolver.ts","../src/commands/reconcile-cli.ts","../src/reconcile/index.ts","../src/graphify/index.ts","../src/graphify/parse-exports.ts","../src/graphify/diff.ts","../src/reconcile/narrative.ts","../src/commands/baseline-cli.ts","../src/commands/req.ts","../src/pipeline/harness-start-driver.ts","../src/pipeline/decision-tree.ts","../src/commands/session.ts","../src/commands/dev-cli.ts","../src/env/port-allocator.ts","../src/env/session-store.ts","../src/env/provider-loader.ts","../src/env/provider-bridge.ts","../src/env/process-guardian.ts","../src/commands/env-cli.ts","../src/harness-border/cli.ts","../src/harness-border/env-loader.ts","../src/shared/mapping-resolver.ts","../src/shared/openapi-reader.ts","../src/harness-border/core/prompt-builder.ts","../src/harness-border/core/redaction-gate.ts","../src/harness-border/core/test-designer.ts","../src/harness-border/core/session-cache.ts","../src/harness-border/boundary-runner.ts","../src/smoke-test/golden-path.ts","../src/harness-border/contract-subcommand.ts","../src/harness-border/reporter.ts","../src/harness-border/gold-set.ts","../src/harness-border/plugins.ts","../src/harness-border/rule-engine.ts","../src/cli.ts","../src/telemetry/client.ts","../src/telemetry/config.ts","../src/telemetry/identifiers.ts","../src/telemetry/branch-sync.ts","../src/telemetry/index.ts","../src/version.ts","../src/client-state.ts","../src/commands/update-check.ts","../src/commands/skill-used.ts","../src/commands/loop-cli.ts","../src/loop/state.ts","../src/loop/types.ts","../src/loop/gitcode-issues.ts","../src/loop/naming.ts","../src/loop/router.ts","../src/loop/git-helpers.ts","../src/git-engine/strategy.ts","../src/git-engine/branch.ts","../src/loop/summarizer.ts","../src/loop/runner.ts","../src/loop/pr.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { dirname, join } from 'path'\r\nimport { loadPipelineConfig, initPipelineState, runStage } from '../pipeline/runner.js'\r\nimport { loadState, saveState, advanceToNextStage, pauseForReview, resumeFromReview } from '../pipeline/index.js'\r\nimport type { PipelineState } from '../pipeline/index.js'\r\nimport type { PipelineConfig } from '../pipeline/runner.js'\r\n\r\nexport interface PipelineRunResult {\r\n  state: PipelineState\r\n  pendingReviews: string[]\r\n  message: string\r\n}\r\n\r\nconst INPUT_TEMPLATES: Record<string, string> = {\r\n  prd: `# Product Requirements Document\r\n\r\n## User Stories\r\n\r\n- US-001: As a user, I want [describe goal], so that [describe benefit]\r\n  - acceptance_criteria: [define measurable criteria]\r\n`,\r\n  features: `# Features\r\n\r\n## Feature List\r\n\r\n### F-001: [Feature Name]\r\n\r\n- description: [What this feature does]\r\n- acceptance_criteria: [Measurable acceptance criteria]\r\n`,\r\n  nfr: `# Non-Functional Requirements\r\n\r\n## Performance\r\n\r\n- Response time: API p95 < 200 ms\r\n- Throughput: 100 req/s sustained\r\n\r\n## Reliability\r\n\r\n- Availability: 99.9% uptime\r\n\r\n## Security\r\n\r\n- Authentication required for all endpoints\r\n`,\r\n  arch_doc: `# Architecture Design\r\n\r\n## SPI (System Programming Interface)\r\n\r\n- [Define service interfaces]\r\n\r\n## DFX Budget\r\n\r\n- Performance budget: p95 < 200 ms\r\n- Memory budget: < 512 MB\r\n\r\n## ADR Status\r\n\r\n| ADR | Title | Status |\r\n|-----|-------|--------|\r\n| ADR-001 | [Decision] | Accepted |\r\n\r\n## Architecture Overview\r\n\r\n[Describe architecture decisions]\r\n`,\r\n  task_split: `# Task Split\r\n\r\nfeatures:\r\n  - F-001: [Feature Name]\r\n\r\ntasks:\r\n  - T-001: [Task description]\r\n    type: HITL\r\n    acceptance: [Acceptance criteria]\r\n    depends_on: []\r\n  - T-002: [Task description]\r\n    type: AFK\r\n    acceptance: [Acceptance criteria]\r\n    depends_on: [T-001]\r\n`,\r\n}\r\n\r\nexport function resolveContext(\r\n  pipelinePath: string,\r\n  requestId: string,\r\n  workDir: string,\r\n): Record<string, string> {\r\n  const config = loadPipelineConfig(pipelinePath)\r\n  const context: Record<string, string> = { req: requestId, project_root: workDir }\r\n\r\n  if (config.defaults) {\r\n    for (const [key, absPath] of Object.entries(config.defaults)) {\r\n      context[key] = absPath\r\n    }\r\n  }\r\n\r\n  return context\r\n}\r\n\r\nexport function prepareInputs(config: PipelineConfig, workDir: string): string[] {\r\n  if (!config.defaults) return []\r\n\r\n  const created: string[] = []\r\n\r\n  for (const [key, absPath] of Object.entries(config.defaults)) {\r\n    if (key === 'pipeline_state') continue // not a user-editable template\r\n    if (!INPUT_TEMPLATES[key]) continue\r\n\r\n    if (existsSync(absPath)) continue\r\n\r\n    const dir = dirname(absPath)\r\n    if (!existsSync(dir)) {\r\n      mkdirSync(dir, { recursive: true })\r\n    }\r\n\r\n    writeFileSync(absPath, INPUT_TEMPLATES[key], 'utf-8')\r\n    created.push(absPath)\r\n  }\r\n\r\n  return created\r\n}\r\n\r\nexport async function startPipeline(\r\n  requestId: string,\r\n  pipelinePath: string,\r\n  workDir: string,\r\n): Promise<PipelineRunResult> {\r\n  // Check for existing state (resume)\r\n  const existing = loadState(workDir)\r\n  if (existing && existing.requestId === requestId) {\r\n    const pendingReviews = scanPendingReviews(workDir)\r\n    if (pendingReviews.length > 0) {\r\n      return {\r\n        state: existing,\r\n        pendingReviews,\r\n        message: `Resumed pipeline for ${requestId}. Current stage: ${existing.currentStage} (${existing.stages[existing.currentStage].status}). ${pendingReviews.length} pending review(s).`,\r\n      }\r\n    }\r\n    return {\r\n      state: existing,\r\n      pendingReviews: [],\r\n      message: `Resumed pipeline for ${requestId}. Current stage: ${existing.currentStage} (${existing.stages[existing.currentStage].status}).`,\r\n    }\r\n  }\r\n\r\n  // Initialize new pipeline with defaults injected into context\r\n  const config = loadPipelineConfig(pipelinePath)\r\n  const context = resolveContext(pipelinePath, requestId, workDir)\r\n  const state = initPipelineState(config, requestId, context)\r\n  saveState(state, workDir)\r\n\r\n  return {\r\n    state,\r\n    pendingReviews: [],\r\n    message: `Started pipeline \"${config.name}\" for ${requestId}. First stage: ${state.currentStage}.`,\r\n  }\r\n}\r\n\r\nexport function scanPendingReviews(workDir: string): string[] {\r\n  const pendingDir = join(workDir, '.harness/.pipeline', 'pending-reviews')\r\n  if (!existsSync(pendingDir)) return []\r\n\r\n  try {\r\n    return readdirSync(pendingDir)\r\n      .filter(f => f.endsWith('.json'))\r\n      .map(f => {\r\n        try {\r\n          const content = readFileSync(join(pendingDir, f), 'utf-8')\r\n          const parsed = JSON.parse(content)\r\n          return `${parsed.stage}: ${parsed.pipelineName} (${parsed.requestId})`\r\n        } catch {\r\n          return f\r\n        }\r\n      })\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n\r\nexport function getStatus(workDir: string): string {\r\n  const state = loadState(workDir)\r\n  if (!state) {\r\n    return 'No pipeline running in this directory.'\r\n  }\r\n\r\n  const lines: string[] = [\r\n    `Pipeline: ${state.pipelineName}`,\r\n    `Request: ${state.requestId}`,\r\n    `Current: ${state.currentStage} (${state.stages[state.currentStage].status})`,\r\n    '',\r\n    'Stages:',\r\n  ]\r\n\r\n  for (const [name, stage] of Object.entries(state.stages)) {\r\n    const marker = stage.status === 'completed' ? '[x]' :\r\n                   stage.status === 'in_progress' ? '[>]' :\r\n                   stage.status === 'awaiting_review' ? '[!]' :\r\n                   stage.status === 'rejected' ? '[!]' :\r\n                   '[ ]'\r\n    lines.push(`  ${marker} ${name} (${stage.status})`)\r\n  }\r\n\r\n  const pending = scanPendingReviews(workDir)\r\n  if (pending.length > 0) {\r\n    lines.push('')\r\n    lines.push('Pending Reviews:')\r\n    for (const review of pending) {\r\n      lines.push(`  - ${review}`)\r\n    }\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { dirname, join } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport { runGate } from '../gate-engine/index.js'\r\nimport type { GateReport, GateCheckRequest } from '../gate-engine/types.js'\r\nimport type { PipelineState, StageStatus } from './index.js'\r\nimport { resolveSkillForStage, buildSkillPrompt } from './skill-dispatch.js'\r\nimport { advanceToNextStage, pauseForReview, saveState } from './index.js'\r\n\r\nexport interface StageConfig {\r\n  name: string\r\n  mode: 'auto' | 'team' | 'direct'\r\n  skill: string\r\n  team?: string\r\n  entry_gate?: string\r\n  exit_gate?: string\r\n  review_gate?: {\r\n    reviewer: string\r\n    description: string\r\n  }\r\n  params?: Record<string, unknown>\r\n  outputs?: string[]\r\n  checkpoint?: {\r\n    type: string\r\n    id: string\r\n    description: string\r\n  }\r\n  optional?: boolean\r\n}\r\n\r\nexport interface PipelineConfig {\r\n  name: string\r\n  description?: string\r\n  context?: string\r\n  defaults?: Record<string, string>\r\n  stages: StageConfig[]\r\n  dependencies?: Record<string, string[]>\r\n  governance_root?: string\r\n  platform?: {\r\n    supports_edit_hooks?: boolean\r\n  }\r\n}\r\n\r\nexport function loadPipelineConfig(path: string): PipelineConfig {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Pipeline config not found: ${path}`)\r\n  }\r\n  const raw = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(raw)\r\n  const pipeline = parsed.pipeline ?? parsed\r\n  const pipelineDir = dirname(path)\r\n\r\n  let defaults: Record<string, string> | undefined\r\n  if (pipeline.defaults && typeof pipeline.defaults === 'object') {\r\n    defaults = {}\r\n    for (const [key, relPath] of Object.entries(pipeline.defaults as Record<string, string>)) {\r\n      defaults[key] = join(pipelineDir, relPath)\r\n    }\r\n  }\r\n\r\n  return {\r\n    name: pipeline.name ?? 'default',\r\n    description: pipeline.description,\r\n    context: pipeline.context,\r\n    defaults,\r\n    stages: (pipeline.stages ?? []).map((s: any) => ({\r\n      name: s.name,\r\n      mode: s.mode ?? 'auto',\r\n      skill: s.skill ?? s.name,\r\n      team: s.team,\r\n      entry_gate: s.entry_gate,\r\n      exit_gate: s.exit_gate,\r\n      review_gate: s.review_gate,\r\n      params: s.params,\r\n      outputs: s.outputs,\r\n      checkpoint: s.checkpoint,\r\n      optional: s.optional ?? false,\r\n    })),\r\n    dependencies: pipeline.dependencies,\r\n    governance_root: pipeline.governance_root,\r\n    platform: pipeline.platform ? {\r\n      supports_edit_hooks: pipeline.platform.supports_edit_hooks ?? true,\r\n    } : undefined,\r\n  }\r\n}\r\n\r\nexport function initPipelineState(\r\n  config: PipelineConfig,\r\n  requestId: string,\r\n  context: Record<string, string> = {},\r\n): PipelineState {\r\n  const stages: PipelineState['stages'] = {}\r\n  for (const stage of config.stages) {\r\n    stages[stage.name] = {\r\n      status: 'pending',\r\n      mode: stage.mode,\r\n    }\r\n  }\r\n\r\n  return {\r\n    pipelineName: config.name,\r\n    requestId,\r\n    currentStage: config.stages[0]?.name ?? '',\r\n    stages,\r\n    context,\r\n  }\r\n}\r\n\r\nexport interface StageRunResult {\r\n  stageStatus: StageStatus\r\n  gateReport?: GateReport\r\n  skillPrompt?: string\r\n  state: PipelineState\r\n}\r\n\r\nexport async function runStage(\r\n  state: PipelineState,\r\n  stageName: string,\r\n  config: PipelineConfig,\r\n  pipelineDir: string,\r\n): Promise<StageRunResult> {\r\n  const stageConfig = config.stages.find(s => s.name === stageName)\r\n  if (!stageConfig) {\r\n    throw new Error(`Stage not found in config: ${stageName}`)\r\n  }\r\n\r\n  // Start the stage\r\n  state = advanceToNextStage(state)\r\n\r\n  // Run entry gate if configured\r\n  if (stageConfig.entry_gate) {\r\n    const gatePath = resolveGatePath(stageConfig.entry_gate, pipelineDir)\r\n    if (existsSync(gatePath)) {\r\n      const request = buildGateRequest(gatePath, pipelineDir, 'pre-stage', stageName, state.context)\r\n      const entryReport = await runGate(request)\r\n\r\n      if (entryReport.blocked) {\r\n        state.stages[stageName].status = 'rejected'\r\n        state.stages[stageName].gateReport = entryReport\r\n        saveState(state, pipelineDir)\r\n        return { stageStatus: 'rejected', gateReport: entryReport, state }\r\n      }\r\n    } else {\r\n      console.warn(`[harness] Entry gate file not found: ${stageConfig.entry_gate} (resolved to ${gatePath})`)\r\n    }\r\n  }\r\n\r\n  // Build skill prompt for the stage\r\n  const resolved = resolveSkillForStage(stageConfig)\r\n  const skillPrompt = buildSkillPrompt(resolved, state.context)\r\n\r\n  saveState(state, pipelineDir)\r\n  return { stageStatus: 'in_progress', skillPrompt, state }\r\n}\r\n\r\nexport async function runExitGate(\r\n  state: PipelineState,\r\n  stageName: string,\r\n  config: PipelineConfig,\r\n  pipelineDir: string,\r\n): Promise<StageRunResult> {\r\n  const stageConfig = config.stages.find(s => s.name === stageName)\r\n  if (!stageConfig) {\r\n    throw new Error(`Stage not found in config: ${stageName}`)\r\n  }\r\n\r\n  if (!stageConfig.exit_gate) {\r\n    return { stageStatus: state.stages[stageName].status, state }\r\n  }\r\n\r\n  const gatePath = resolveGatePath(stageConfig.exit_gate, pipelineDir)\r\n  if (!existsSync(gatePath)) {\r\n    console.warn(`[harness] Exit gate file not found: ${stageConfig.exit_gate} (resolved to ${gatePath})`)\r\n    return { stageStatus: state.stages[stageName].status, state }\r\n  }\r\n\r\n  const request = buildGateRequest(gatePath, pipelineDir, 'post-stage', stageName, state.context)\r\n  const exitReport = await runGate(request)\r\n\r\n  if (exitReport.blocked) {\r\n    state.stages[stageName].status = 'rejected'\r\n    state.stages[stageName].gateReport = exitReport\r\n    saveState(state, pipelineDir)\r\n    return { stageStatus: 'rejected', gateReport: exitReport, state }\r\n  }\r\n\r\n  return { stageStatus: state.stages[stageName].status, gateReport: exitReport, state }\r\n}\r\n\r\nfunction resolveGatePath(gateRef: string, pipelineDir: string): string {\r\n  if (existsSync(gateRef)) return gateRef\r\n  // Try relative to pipelineDir\r\n  const pipelinePath = join(pipelineDir, gateRef)\r\n  if (existsSync(pipelinePath)) return pipelinePath\r\n  // Try relative to CWD\r\n  const cwdPath = join(process.cwd(), gateRef)\r\n  if (existsSync(cwdPath)) return cwdPath\r\n  return gateRef\r\n}\r\n\r\nfunction isBindingFile(filePath: string): boolean {\r\n  // Binding files live under gates/bindings/ — they have a `rules_files` key\r\n  // instead of inline `rules`. Detect by path convention.\r\n  const normalized = filePath.replace(/\\\\/g, '/')\r\n  return normalized.includes('/bindings/') || normalized.includes('\\\\bindings\\\\')\r\n}\r\n\r\nfunction buildGateRequest(\r\n  gatePath: string,\r\n  pipelineDir: string,\r\n  binding: GateCheckRequest['binding'],\r\n  stage: string,\r\n  context: Record<string, string>,\r\n): GateCheckRequest {\r\n  // Derive gatesRoot: the directory containing the gates/ folder\r\n  // gatePath is like: /proj/gates/bindings/pre-edit.yaml or /proj/gates/entry.yaml\r\n  // gatesRoot should be /proj/gates\r\n  const gatesRoot = deriveGatesRoot(gatePath)\r\n\r\n  if (isBindingFile(gatePath)) {\r\n    return {\r\n      binding,\r\n      bindingFile: gatePath,\r\n      gatesRoot,\r\n      projectRoot: pipelineDir,\r\n      context,\r\n      stage,\r\n    }\r\n  }\r\n\r\n  return {\r\n    binding,\r\n    rulesFile: gatePath,\r\n    projectRoot: pipelineDir,\r\n    context,\r\n    stage,\r\n  }\r\n}\r\n\r\nfunction deriveGatesRoot(gatePath: string): string {\r\n  // Walk up from gatePath to find the \"gates\" directory\r\n  let dir = dirname(gatePath) // e.g., .../gates/bindings\r\n  let parent = dirname(dir)    // e.g., .../gates\r\n  const base = dir.split(/[/\\\\]/).pop() ?? ''\r\n  if (base === 'gates') return dir\r\n  const parentBase = parent.split(/[/\\\\]/).pop() ?? ''\r\n  if (parentBase === 'gates') return parent\r\n  // Fallback: use two levels up\r\n  return parent\r\n}\r\n","import { readFileSync, existsSync, readdirSync } from 'fs'\r\nimport { execSync } from 'child_process'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport { relative, sep, join, dirname } from 'path'\r\nimport { loadEnvelope, checkDrift } from '../envelope/index.js'\r\nimport type { GateRule, GateResult, GateReport, GateCheckRequest, GateCheckResponse, GateBinding } from './types.js'\r\n\r\nexport type { GateRule, GateResult, GateReport, GateCheckRequest, GateCheckResponse, GateBinding } from './types.js'\r\n\r\nfunction enrichContext(request: GateCheckRequest, ctx: Record<string, string>): Record<string, string> {\r\n  const enriched = { ...ctx }\r\n\r\n  if (!enriched.project_root) {\r\n    enriched.project_root = request.projectRoot ?? process.cwd()\r\n  }\r\n\r\n  // Caller-supplied test_command wins; otherwise fall through to evidence lookup.\r\n  if (enriched.test_command) {\r\n    return enriched\r\n  }\r\n\r\n  const requestId = enriched.request_id ?? enriched.req_id ?? enriched['REQ-ID'] ?? enriched.req\r\n  if (requestId) {\r\n    const root = request.projectRoot ?? process.cwd()\r\n    const evidencePaths = [\r\n      join(root, '.harness', 'architecture-envelopes', requestId, 'step-2-code-scan-evidence.yaml'),\r\n      join(root, '.harness', 'architecture-envelopes', requestId, 'code-scan-evidence.yaml'),\r\n      join(root, 'docs', 'governance', 'architecture-envelopes', requestId, 'code-scan-evidence.yaml'),\r\n    ]\r\n\r\n    for (const evidencePath of evidencePaths) {\r\n      if (!existsSync(evidencePath)) continue\r\n      try {\r\n        const yaml = parseSimpleYaml(readFileSync(evidencePath, 'utf-8'))\r\n        const testCommand = getYamlField(yaml, 'stack.test_command')\r\n        if (typeof testCommand === 'string' && testCommand.trim().length > 0) {\r\n          enriched.test_command = testCommand.trim()\r\n          break\r\n        }\r\n      } catch {\r\n        // try next candidate path\r\n      }\r\n    }\r\n  }\r\n\r\n  // Fallback when caller did not supply test_command and no step-2 evidence was found.\r\n  // Keeps existing behavior for projects that have not yet run step-2 code-scan.\r\n  if (!enriched.test_command) {\r\n    enriched.test_command = 'npm test'\r\n  }\r\n\r\n  return enriched\r\n}\r\n\r\nfunction interpolate(template: string, context: Record<string, string>): string {\r\n  return template.replace(/\\{(\\w+)\\}/g, (_, key) => context[key] ?? `{${key}}`)\r\n}\r\n\r\nfunction matchGlob(filePath: string, patterns: string[] | undefined, projectRoot: string): boolean {\r\n  if (!patterns || patterns.length === 0) return true\r\n  // Normalize to forward slashes for glob matching\r\n  const rel = relative(projectRoot, filePath).split(sep).join('/')\r\n  const normalizedRoot = projectRoot.split(sep).join('/')\r\n  const absNorm = filePath.split(sep).join('/')\r\n  for (const pattern of patterns) {\r\n    if (globMatch(rel, pattern)) return true\r\n    // Also try absolute path match\r\n    if (globMatch(absNorm, pattern)) return true\r\n  }\r\n  return false\r\n}\r\n\r\nfunction globToRegex(pattern: string): string {\r\n  return pattern\r\n    .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\r\n    .replace(/\\*\\*/g, '{{DOUBLESTAR}}')\r\n    .replace(/\\*/g, '[^/]*')\r\n    .replace(/{{DOUBLESTAR}}/g, '.*')\r\n    .replace(/\\?/g, '[^/]')\r\n}\r\n\r\nfunction globMatch(str: string, pattern: string): boolean {\r\n  // '**/' at start matches zero or more path segments\r\n  if (pattern.startsWith('**/')) {\r\n    const rest = globToRegex(pattern.slice(3))\r\n    return new RegExp(`^(?:.+/)?${rest}$`).test(str)\r\n  }\r\n  return new RegExp(`^${globToRegex(pattern)}$`).test(str)\r\n}\r\n\r\nfunction checkYamlField(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const filePath = rule.file ? interpolate(rule.file, context) : ''\r\n  if (!filePath || !existsSync(filePath)) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `File not found: ${filePath}` }\r\n  }\r\n\r\n  try {\r\n    const content = readFileSync(filePath, 'utf-8')\r\n    const yaml = parseSimpleYaml(content)\r\n\r\n    for (const field of (rule.required_fields ?? [])) {\r\n      if (!getYamlField(yaml, field)) {\r\n        return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Missing field: ${field}` }\r\n      }\r\n    }\r\n\r\n    if (rule.field && rule.value) {\r\n      const actual = getYamlField(yaml, rule.field)\r\n      if (actual !== rule.value) {\r\n        return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Field ${rule.field}: expected \"${rule.value}\", got \"${actual}\"` }\r\n      }\r\n    }\r\n\r\n    return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.message }\r\n  }\r\n}\r\n\r\nfunction checkSection(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const filePath = rule.file ? interpolate(rule.file, context) : ''\r\n  if (!filePath || !existsSync(filePath)) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `File not found: ${filePath}` }\r\n  }\r\n\r\n  try {\r\n    const content = readFileSync(filePath, 'utf-8')\r\n    const headingCount = (content.match(/^#{1,3}\\s+/gm) ?? []).length\r\n\r\n    if (headingCount >= (rule.required_sections ?? 0)) {\r\n      return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n    }\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Found ${headingCount} sections, required ${rule.required_sections}` }\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.message }\r\n  }\r\n}\r\n\r\nexport function checkRegexOnContent(rule: GateRule, content: string, defaultMatchMode?: 'absent' | 'present'): GateResult {\r\n  // If the rule has a file field and no explicit match_mode, default to 'present' (legacy behavior)\r\n  // Otherwise default to 'absent' (new behavior: forbid pattern)\r\n  const matchMode = rule.match_mode ?? defaultMatchMode ?? (rule.file ? 'present' : 'absent')\r\n  const pattern = rule.pattern ? new RegExp(rule.pattern, 'm') : /./\r\n  const found = pattern.test(content)\r\n\r\n  if (matchMode === 'absent') {\r\n    return { ruleId: rule.id, passed: !found, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: found ? `Forbidden pattern \"${rule.pattern}\" found` : undefined }\r\n  } else {\r\n    return { ruleId: rule.id, passed: found, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: !found ? `Required pattern \"${rule.pattern}\" not found` : undefined }\r\n  }\r\n}\r\n\r\n/**\r\n * Verify a rule's liveness guard: when negative_case_required is set, the rule must declare a negative_case,\r\n * and (for regex-check) the negative_case must actually trigger the rule's pattern — otherwise the guard\r\n * is empty (catches nothing) and the rule is unsafe to enforce.\r\n */\r\nfunction verifyLiveness(rule: GateRule): GateResult | null {\r\n  if (!rule.negative_case_required) return null\r\n  if (!rule.negative_case || rule.negative_case.trim() === '') {\r\n    return {\r\n      ruleId: rule.id,\r\n      passed: false,\r\n      blocking: true,\r\n      severity: 'error',\r\n      message: rule.message,\r\n      source: rule.source,\r\n      details: `Rule \"${rule.id}\" declares negative_case_required but missing negative_case — liveness guard cannot be verified`,\r\n    }\r\n  }\r\n  if (rule.type === 'regex-check' && rule.pattern) {\r\n    const pattern = new RegExp(rule.pattern)\r\n    const matchMode = rule.match_mode ?? (rule.file ? 'present' : 'absent')\r\n    // For 'absent' mode, the negative_case must match the pattern (it proves the regex actually catches violations)\r\n    // For 'present' mode, the negative_case must also match (proves the regex actually finds required marker)\r\n    const negativeMatches = pattern.test(rule.negative_case)\r\n    if (!negativeMatches) {\r\n      return {\r\n        ruleId: rule.id,\r\n        passed: false,\r\n        blocking: true,\r\n        severity: 'error',\r\n        message: rule.message,\r\n        source: rule.source,\r\n        details: `Rule \"${rule.id}\" liveness guard degraded — negative_case \"${rule.negative_case}\" does not match pattern \"${rule.pattern}\" (match_mode: ${matchMode}); the guard would never trigger on real violations`,\r\n      }\r\n    }\r\n  }\r\n  return null\r\n}\r\n\r\nfunction checkRegex(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const filePath = rule.file ? interpolate(rule.file, context) : ''\r\n  if (!filePath || !existsSync(filePath)) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `File not found: ${filePath}` }\r\n  }\r\n\r\n  try {\r\n    const content = readFileSync(filePath, 'utf-8')\r\n    return checkRegexOnContent(rule, content)\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.message }\r\n  }\r\n}\r\n\r\nfunction checkExec(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const command = rule.command ? interpolate(rule.command, context) : ''\r\n  if (!command) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: 'No command specified' }\r\n  }\r\n\r\n  try {\r\n    execSync(command, { timeout: 30000, stdio: 'pipe' })\r\n    return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.stderr?.toString() ?? err.message }\r\n  }\r\n}\r\n\r\nfunction applyDefaults(rule: Partial<GateRule>): GateRule {\r\n  return {\r\n    id: rule.id ?? '',\r\n    type: rule.type ?? 'exec',\r\n    blocking: rule.blocking ?? true,\r\n    severity: rule.severity ?? 'error',\r\n    scope: rule.scope ?? 'incremental',\r\n    source: rule.source ?? '',\r\n    message: rule.message ?? '',\r\n    ...rule,\r\n  } as GateRule\r\n}\r\n\r\nconst GATE_TYPE_MAP: Record<string, 'pre-stage' | 'pre-edit' | 'post-edit' | 'post-stage'> = {\r\n  entry: 'pre-stage',\r\n  exit: 'post-stage',\r\n}\r\n\r\nexport async function loadBinding(bindingFilePath: string): Promise<GateBinding> {\r\n  if (!existsSync(bindingFilePath)) {\r\n    throw new Error(`Gate binding file not found: ${bindingFilePath}`)\r\n  }\r\n\r\n  const raw = readFileSync(bindingFilePath, 'utf-8')\r\n  // Binding files are YAML — try YAML first, then JSON as fallback\r\n  try {\r\n    const parsed = parseYaml(raw)\r\n    return {\r\n      binding: parsed.binding,\r\n      stage: parsed.stage,\r\n      context: parsed.context,\r\n      rules_files: parsed.rules_files ?? [],\r\n    }\r\n  } catch {\r\n    try {\r\n      const parsed = JSON.parse(raw)\r\n      return {\r\n        binding: parsed.binding,\r\n        stage: parsed.stage,\r\n        context: parsed.context,\r\n        rules_files: parsed.rules_files ?? [],\r\n      }\r\n    } catch {\r\n      throw new Error(`Failed to parse gate binding file: ${bindingFilePath}`)\r\n    }\r\n  }\r\n}\r\n\r\nexport async function resolveRulesFromBinding(\r\n  bindingFilePath: string,\r\n  gatesRoot: string,\r\n): Promise<GateRule[]> {\r\n  const binding = await loadBinding(bindingFilePath)\r\n  const allRules: GateRule[] = []\r\n\r\n  for (const relPath of binding.rules_files) {\r\n    const absPath = join(gatesRoot, relPath)\r\n    if (!existsSync(absPath)) {\r\n      throw new Error(`Gate rules file not found: ${absPath} (referenced from binding ${bindingFilePath})`)\r\n    }\r\n\r\n    const raw = readFileSync(absPath, 'utf-8')\r\n    let rules: GateRule[]\r\n    // Rules files are YAML — try YAML first, then JSON as fallback\r\n    try {\r\n      const parsed = parseYaml(raw)\r\n      rules = Array.isArray(parsed) ? parsed : parsed?.rules ?? []\r\n    } catch {\r\n      try {\r\n        const parsed = JSON.parse(raw)\r\n        rules = Array.isArray(parsed) ? parsed : parsed?.rules ?? []\r\n      } catch {\r\n        throw new Error(`Failed to parse gate rules file: ${absPath}`)\r\n      }\r\n    }\r\n    allRules.push(...rules)\r\n  }\r\n\r\n  return allRules\r\n}\r\n\r\nfunction checkDriftRule(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const envelopePath = rule.envelope_path ? interpolate(rule.envelope_path, context) : context.envelope ?? ''\r\n  if (!envelopePath || !existsSync(envelopePath)) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Envelope file not found: ${envelopePath}` }\r\n  }\r\n\r\n  try {\r\n    const envelope = loadEnvelope(envelopePath)\r\n    const changedFiles = getGitChangedFiles(process.cwd())\r\n    const drift = checkDrift(envelope, changedFiles)\r\n\r\n    if (drift.passed) {\r\n      return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n    }\r\n    const unexpectedFiles = drift.unexpected.map(u => u.file).join(', ')\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Drift detected — unexpected files: ${unexpectedFiles}` }\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.message }\r\n  }\r\n}\r\n\r\nfunction checkContractRule(rule: GateRule, context: Record<string, string>): GateResult {\r\n  const contractDir = rule.contract_dir ? interpolate(rule.contract_dir, context) : context.contract_dir ?? ''\r\n  if (!contractDir || !existsSync(contractDir)) {\r\n    return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: 'No contract directory found — passing by default' }\r\n  }\r\n\r\n  try {\r\n    const breakingChanges: string[] = []\r\n    for (const entry of readdirSync(contractDir)) {\r\n      if (!entry.endsWith('.json')) continue\r\n      const content = readFileSync(join(contractDir, entry), 'utf-8')\r\n      const contract = JSON.parse(content)\r\n      if (contract.breakingChanges && Array.isArray(contract.breakingChanges)) {\r\n        for (const bc of contract.breakingChanges) {\r\n          breakingChanges.push(`${contract.module ?? entry}: ${bc.type} ${bc.name ?? ''}`.trim())\r\n        }\r\n      }\r\n    }\r\n\r\n    if (breakingChanges.length === 0) {\r\n      return { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n    }\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Breaking changes detected: ${breakingChanges.join('; ')}` }\r\n  } catch (err: any) {\r\n    return { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: err.message }\r\n  }\r\n}\r\n\r\nfunction getGitChangedFiles(projectRoot: string): string[] {\r\n  try {\r\n    const output = execSync('git diff --name-only HEAD', {\r\n      timeout: 10000,\r\n      stdio: 'pipe',\r\n      cwd: projectRoot,\r\n    }).toString().trim()\r\n    return output ? output.split('\\n').filter(Boolean) : []\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n\r\nasync function executeRules(\r\n  rules: GateRule[],\r\n  context: Record<string, string>,\r\n  request: GateCheckRequest,\r\n): Promise<{ results: GateResult[]; blocked: boolean; warnings: number }> {\r\n  const results: GateResult[] = []\r\n  let blocked = false\r\n  let warnings = 0\r\n  const isIncremental = request.binding === 'pre-edit' && request.edit?.content !== undefined\r\n\r\n  for (const rawRule of rules) {\r\n    const rule = applyDefaults(rawRule)\r\n\r\n    // Liveness guard — fail fast if a rule marked negative_case_required cannot verify its guard\r\n    const livenessFailure = verifyLiveness(rule)\r\n    if (livenessFailure) {\r\n      results.push(livenessFailure)\r\n      blocked = true\r\n      continue\r\n    }\r\n\r\n    // drift-check and contract-check only run at post-stage / pre-stage\r\n    if ((rule.type === 'drift-check' || rule.type === 'contract-check') &&\r\n        (request.binding === 'pre-edit' || request.binding === 'post-edit')) {\r\n      results.push({ ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Skipped: ${rule.type} is post-stage only` })\r\n      continue\r\n    }\r\n\r\n    // Skip full-only rules in incremental mode\r\n    if (isIncremental && rule.scope === 'full-only') {\r\n      results.push({ ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: 'Skipped: full-only rule in incremental mode' })\r\n      continue\r\n    }\r\n\r\n    // Pre-edit: early return on empty content\r\n    if (request.binding === 'pre-edit' && request.edit?.content === '') {\r\n      results.push({ ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source })\r\n      continue\r\n    }\r\n\r\n    // File filtering in pre-edit\r\n    if ((request.binding === 'pre-edit' || request.binding === 'post-edit') && request.edit?.filePath) {\r\n      if (!matchGlob(request.edit.filePath, rule.includes, request.projectRoot)) {\r\n        results.push({ ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: 'Skipped: file not matching includes' })\r\n        continue\r\n      }\r\n      if (rule.excludes && rule.excludes.length > 0 && matchGlob(request.edit.filePath, rule.excludes, request.projectRoot)) {\r\n        results.push({ ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: 'Skipped: file matches excludes' })\r\n        continue\r\n      }\r\n    }\r\n\r\n    let result: GateResult\r\n\r\n    // Incremental mode: regex-check on content snippet\r\n    if (isIncremental && rule.type === 'regex-check') {\r\n      result = checkRegexOnContent(rule, request.edit!.content!)\r\n    } else if (request.binding === 'post-edit' && request.edit?.filePath && !request.edit.content && rule.type === 'regex-check') {\r\n      // Post-edit full-file: read file from disk\r\n      const filePath = request.edit.filePath\r\n      if (existsSync(filePath)) {\r\n        const content = readFileSync(filePath, 'utf-8')\r\n        // Also check includes/excludes for post-edit\r\n        if (rule.includes && !matchGlob(filePath, rule.includes, request.projectRoot)) {\r\n          result = { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n        } else if (rule.excludes && rule.excludes.length > 0 && matchGlob(filePath, rule.excludes, request.projectRoot)) {\r\n          result = { ruleId: rule.id, passed: true, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source }\r\n        } else {\r\n          result = checkRegexOnContent(rule, content)\r\n        }\r\n      } else {\r\n        result = { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `File not found: ${filePath}` }\r\n      }\r\n    } else if (rule.type === 'drift-check') {\r\n      result = checkDriftRule(rule, context)\r\n    } else if (rule.type === 'contract-check') {\r\n      result = checkContractRule(rule, context)\r\n    } else {\r\n      // Full-file mode: use original logic\r\n      switch (rule.type) {\r\n        case 'yaml-field-check':\r\n          result = checkYamlField(rule, context)\r\n          break\r\n        case 'section-check':\r\n          result = checkSection(rule, context)\r\n          break\r\n        case 'regex-check':\r\n          result = checkRegex(rule, context)\r\n          break\r\n        case 'exec':\r\n        case 'custom':\r\n          result = checkExec(rule, context)\r\n          break\r\n        default:\r\n          result = { ruleId: rule.id, passed: false, blocking: rule.blocking, severity: rule.severity, message: rule.message, source: rule.source, details: `Unknown rule type: ${rule.type}` }\r\n      }\r\n    }\r\n\r\n    results.push(result)\r\n\r\n    if (!result.passed) {\r\n      if (result.blocking) {\r\n        blocked = true\r\n      } else {\r\n        warnings++\r\n      }\r\n    }\r\n  }\r\n\r\n  return { results, blocked, warnings }\r\n}\r\n\r\n/** A8: Resolve well-known placeholders from convention-based paths under projectRoot. */\r\nfunction buildDefaultContext(\r\n  projectRoot: string,\r\n  requestId?: string,\r\n): Record<string, string> {\r\n  const ctx: Record<string, string> = {\r\n    project_root: projectRoot,\r\n  }\r\n\r\n  // {req} → request_id\r\n  if (requestId) ctx.req = requestId\r\n\r\n  // {task_split} → .harness/task_split/ (directory) or .harness/task-decomposition.yaml\r\n  const taskSplitDir = join(projectRoot, '.harness', 'task_split')\r\n  if (existsSync(taskSplitDir)) ctx.task_split = taskSplitDir\r\n  else {\r\n    const taskDecomp = join(projectRoot, '.harness', 'task-decomposition.yaml')\r\n    if (existsSync(taskDecomp)) ctx.task_split = taskDecomp\r\n  }\r\n\r\n  // {arch_doc} → .harness/4plus1/architecture-baseline.yaml or docs/4plus1/harness-toolkit-baseline.yaml\r\n  const archDocHarness = join(projectRoot, '.harness', '4plus1', 'architecture-baseline.yaml')\r\n  if (existsSync(archDocHarness)) ctx.arch_doc = archDocHarness\r\n  else {\r\n    const archDocDocs = join(projectRoot, 'docs', '4plus1', 'harness-toolkit-baseline.yaml')\r\n    if (existsSync(archDocDocs)) ctx.arch_doc = archDocDocs\r\n  }\r\n\r\n  // {changelog} → CHANGELOG.md or docs/changelog.md\r\n  const changelogRoot = join(projectRoot, 'CHANGELOG.md')\r\n  if (existsSync(changelogRoot)) ctx.changelog = changelogRoot\r\n  else {\r\n    const changelogDocs = join(projectRoot, 'docs', 'changelog.md')\r\n    if (existsSync(changelogDocs)) ctx.changelog = changelogDocs\r\n  }\r\n\r\n  // {release_notes} → docs/release-notes.md or docs/governance/release-notes/{req}.md\r\n  const releaseNotes = join(projectRoot, 'docs', 'release-notes.md')\r\n  if (existsSync(releaseNotes)) ctx.release_notes = releaseNotes\r\n  else if (requestId) {\r\n    const releaseNotesReq = join(projectRoot, 'docs', 'governance', 'release-notes', `${requestId}.md`)\r\n    if (existsSync(releaseNotesReq)) ctx.release_notes = releaseNotesReq\r\n  }\r\n\r\n  // {contract_dir} → docs/governance/contracts/ or .harness/contracts/\r\n  const contractDirDocs = join(projectRoot, 'docs', 'governance', 'contracts')\r\n  if (existsSync(contractDirDocs)) ctx.contract_dir = contractDirDocs\r\n  else {\r\n    const contractDirHarness = join(projectRoot, '.harness', 'contracts')\r\n    if (existsSync(contractDirHarness)) ctx.contract_dir = contractDirHarness\r\n  }\r\n\r\n  return ctx\r\n}\r\n\r\nexport async function runGate(\r\n  rulesFileOrRequest: string | GateCheckRequest,\r\n  context?: Record<string, string>,\r\n  options?: { gateType?: 'entry' | 'exit'; stage?: string },\r\n): Promise<GateReport> {\r\n  let request: GateCheckRequest\r\n  let legacyGateType: 'entry' | 'exit' | undefined\r\n\r\n  if (typeof rulesFileOrRequest === 'string') {\r\n    // Old API: runGate(rulesFile, context, options)\r\n    const binding = options?.gateType ? GATE_TYPE_MAP[options.gateType] : 'pre-stage'\r\n    request = {\r\n      binding,\r\n      rulesFile: rulesFileOrRequest,\r\n      projectRoot: process.cwd(),\r\n      context: context ?? {},\r\n      stage: options?.stage,\r\n    }\r\n    legacyGateType = options?.gateType\r\n  } else {\r\n    request = rulesFileOrRequest\r\n  }\r\n\r\n  // A8: Build default context from well-known paths, then enrich with test_command discovery\r\n  const defaultCtx = buildDefaultContext(request.projectRoot, request.requestId)\r\n  const ctx = enrichContext(request, { ...defaultCtx, ...(request.context ?? {}), ...(context ?? {}) })\r\n\r\n  let rules: GateRule[]\r\n\r\n  // Support binding-file-based resolution\r\n  if (request.bindingFile && request.gatesRoot) {\r\n    rules = await resolveRulesFromBinding(request.bindingFile, request.gatesRoot)\r\n  } else if (request.rulesFile) {\r\n    if (!existsSync(request.rulesFile)) {\r\n      throw new Error(`Gate rules file not found: ${request.rulesFile}`)\r\n    }\r\n\r\n    const raw = readFileSync(request.rulesFile, 'utf-8')\r\n    // Rules files are YAML — try YAML first, then JSON as fallback\r\n    try {\r\n      const parsed = parseYaml(raw)\r\n      rules = Array.isArray(parsed) ? parsed : parsed?.rules ?? []\r\n    } catch {\r\n      try {\r\n        const parsed = JSON.parse(raw)\r\n        rules = Array.isArray(parsed) ? parsed : parsed?.rules ?? []\r\n      } catch {\r\n        throw new Error(`Failed to parse gate rules file: ${request.rulesFile}`)\r\n      }\r\n    }\r\n  } else {\r\n    throw new Error('GateCheckRequest must specify either rulesFile or bindingFile + gatesRoot')\r\n  }\r\n\r\n  const { results, blocked, warnings } = await executeRules(rules, ctx, request)\r\n\r\n  const report: GateReport = {\r\n    binding: request.binding,\r\n    stage: request.stage,\r\n    results,\r\n    blocked,\r\n    warnings,\r\n  }\r\n\r\n  if (legacyGateType) {\r\n    report.gateType = legacyGateType\r\n  }\r\n\r\n  return report\r\n}\r\n// --- Simple YAML field accessor ---\r\n\r\nfunction parseSimpleYaml(content: string): Record<string, any> {\r\n  const result: Record<string, any> = {}\r\n  const lines = content.split('\\n')\r\n  const stack: Array<{ indent: number; obj: Record<string, any> }> = [{ indent: -1, obj: result }]\r\n  let currentKey = ''\r\n\r\n  for (const line of lines) {\r\n    if (!line.trim() || line.trim().startsWith('#')) continue\r\n\r\n    const indent = line.search(/\\S/)\r\n    const trimmed = line.trim()\r\n\r\n    while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\r\n      stack.pop()\r\n    }\r\n\r\n    const parent = stack[stack.length - 1].obj\r\n\r\n    if (trimmed.endsWith(':')) {\r\n      const key = trimmed.slice(0, -1).trim()\r\n      if (key) {\r\n        parent[key] = {}\r\n        stack.push({ indent, obj: parent[key] })\r\n        currentKey = key\r\n      }\r\n    } else if (trimmed.includes(':')) {\r\n      const colonIdx = trimmed.indexOf(':')\r\n      const key = trimmed.substring(0, colonIdx).trim()\r\n      let value: any = trimmed.substring(colonIdx + 1).trim()\r\n      if ((value.startsWith('\"') && value.endsWith('\"')) || (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\r\n        value = value.slice(1, -1)\r\n      }\r\n      if (value === '') value = {}\r\n      parent[key] = value\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n\r\nfunction getYamlField(obj: Record<string, any>, path: string): any {\r\n  const parts = path.split('.')\r\n  let current: any = obj\r\n  for (const part of parts) {\r\n    if (current == null || typeof current !== 'object') return undefined\r\n    current = current[part]\r\n  }\r\n  return current\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { parse as parseYaml } from 'yaml'\r\n\r\nexport interface ModuleBoundary {\r\n  module: string\r\n  paths: string[]\r\n  change_level?: ChangeLevel\r\n}\r\n\r\nexport interface ContractPolicy {\r\n  allowed: string[]\r\n  forbidden: string[]\r\n  migration_required_when: string[]\r\n}\r\n\r\nexport interface StateOwnershipPolicy {\r\n  unchanged: string[]\r\n  allowed_new_state: string[]\r\n  forbidden: string[]\r\n}\r\n\r\nexport interface AutomationProjectionPolicy {\r\n  graphify?: string[]\r\n  openapi_swagger?: string[]\r\n  codegen?: string[]\r\n}\r\n\r\nexport type ProjectionToolName = 'graphify' | 'openapi_swagger' | 'codegen'\r\n\r\nexport interface ArchitectureEnvelope {\r\n  version: string\r\n  request_id: string\r\n  legal_layer?: {\r\n    architectural?: Array<{ scope: string; enforcement: string }>\r\n    code?: Array<{ scope: string; enforcement: string }>\r\n  }\r\n  module_boundaries: {\r\n    writable: ModuleBoundary[]\r\n    read_only: ModuleBoundary[]\r\n    forbidden: ModuleBoundary[]\r\n  }\r\n  absorption_budget: {\r\n    max_parallel_slices: number\r\n  }\r\n  /** Conditions under which AI must stop and request human adjudication. */\r\n  escalation_conditions?: string[]\r\n  /** What kinds of contract changes are allowed / forbidden / require migration. */\r\n  contract_policy?: ContractPolicy\r\n  /** State ownership boundaries AI must not cross. */\r\n  state_ownership?: StateOwnershipPolicy\r\n  /** Declared usage scope for automated projection tools (graphify / openapi / codegen). Use is denied by default if not declared. */\r\n  automation_projection_policy?: AutomationProjectionPolicy\r\n}\r\n\r\nexport type ChangeLevel = 'L0' | 'L1' | 'L2' | 'L3'\r\n\r\nexport interface DriftResult {\r\n  allowed: string[]\r\n  unexpected: Array<{ file: string; change_level?: ChangeLevel }>\r\n  passed: boolean\r\n}\r\n\r\nexport interface EnvelopeValidation {\r\n  valid: boolean\r\n  errors: string[]\r\n}\r\n\r\nexport function loadEnvelope(path: string): ArchitectureEnvelope {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Envelope file not found: ${path}`)\r\n  }\r\n  const raw = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(raw)\r\n\r\n  if (!parsed.module_boundaries) {\r\n    throw new Error('Envelope missing required field: module_boundaries')\r\n  }\r\n\r\n  return {\r\n    version: parsed.version ?? '1.0',\r\n    request_id: parsed.request_id ?? '',\r\n    legal_layer: parsed.legal_layer,\r\n    module_boundaries: {\r\n      writable: (parsed.module_boundaries.writable ?? []).map((w: any) => ({\r\n        module: w.module,\r\n        paths: w.paths ?? [],\r\n        change_level: w.change_level ?? 'L0',\r\n      })),\r\n      read_only: (parsed.module_boundaries.read_only ?? []).map((r: any) => ({\r\n        module: r.module,\r\n        paths: r.paths ?? [],\r\n      })),\r\n      forbidden: (parsed.module_boundaries.forbidden ?? []).map((f: any) => ({\r\n        module: f.module,\r\n        paths: f.paths ?? [],\r\n      })),\r\n    },\r\n    absorption_budget: {\r\n      max_parallel_slices: parsed.absorption_budget?.max_parallel_slices ?? 1,\r\n    },\r\n    escalation_conditions: parsed.escalation_conditions,\r\n    contract_policy: parsed.contract_policy,\r\n    state_ownership: parsed.state_ownership,\r\n    automation_projection_policy: parsed.automation_projection_policy,\r\n  }\r\n}\r\n\r\nexport function validateEnvelope(envelope: ArchitectureEnvelope): EnvelopeValidation {\r\n  const errors: string[] = []\r\n  const { writable, read_only, forbidden } = envelope.module_boundaries\r\n\r\n  if (writable.length === 0 && read_only.length === 0 && forbidden.length === 0) {\r\n    errors.push('module_boundaries has no entries — at least one writable path is required')\r\n  }\r\n\r\n  if (writable.length === 0) {\r\n    errors.push('module_boundaries.writable is empty — deny-by-default requires at least one allowed path')\r\n  }\r\n\r\n  const allAllowedPatterns = [...writable, ...read_only].flatMap(b => b.paths)\r\n  const forbiddenPatterns = forbidden.flatMap(b => b.paths)\r\n  for (const fp of forbiddenPatterns) {\r\n    if (allAllowedPatterns.includes(fp)) {\r\n      errors.push(`conflict: path \"${fp}\" appears in both allowed and forbidden boundaries`)\r\n    }\r\n  }\r\n\r\n  // surface declared-but-empty projection tools — non-fatal, but signals intent without scope\r\n  const projPolicy = envelope.automation_projection_policy\r\n  if (projPolicy) {\r\n    for (const tool of ['graphify', 'openapi_swagger', 'codegen'] as const) {\r\n      const declared = projPolicy[tool as keyof AutomationProjectionPolicy]\r\n      if (declared !== undefined && Array.isArray(declared) && declared.length === 0) {\r\n        // These are warnings, not errors. Caller can choose to log them or ignore.\r\n        // We surface them in `errors` so existing callers still see them; severity is encoded in the message.\r\n        errors.push(`warning: automation_projection_policy.${tool} is declared but empty — tool will be denied by default`)\r\n      }\r\n    }\r\n  }\r\n\r\n  return { valid: errors.length === 0, errors }\r\n}\r\n\r\nexport function pathMatchesGlob(filePath: string, pattern: string): boolean {\r\n  const normalized = filePath.replace(/\\\\/g, '/')\r\n  if (pattern.endsWith('/**')) {\r\n    const prefix = pattern.slice(0, -3)\r\n    return normalized === prefix || normalized.startsWith(prefix + '/')\r\n  }\r\n  if (pattern.includes('*')) {\r\n    const regexStr = pattern\r\n      .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&')\r\n      .replace(/\\*\\*/g, '.*')\r\n      .replace(/\\*/g, '[^/]*')\r\n      .replace(/\\?/g, '[^/]')\r\n    return new RegExp(`^${regexStr}$`).test(normalized)\r\n  }\r\n  return normalized === pattern || normalized.startsWith(pattern + '/')\r\n}\r\n\r\nexport function checkDrift(envelope: ArchitectureEnvelope, changedFiles: string[]): DriftResult {\r\n  const allowed: string[] = []\r\n  const unexpected: Array<{ file: string; change_level?: ChangeLevel }> = []\r\n\r\n  const writablePatterns = envelope.module_boundaries.writable.flatMap(w => w.paths.map(p => ({ pattern: p, change_level: w.change_level ?? 'L0' as ChangeLevel })))\r\n  const readOnlyPatterns = envelope.module_boundaries.read_only.flatMap(r => r.paths)\r\n  const allAllowedPatterns = [...writablePatterns.map(w => w.pattern), ...readOnlyPatterns]\r\n\r\n  for (const file of changedFiles) {\r\n    const matchedWritable = writablePatterns.find(w => pathMatchesGlob(file, w.pattern))\r\n    if (matchedWritable) {\r\n      if (matchedWritable.change_level === 'L2' || matchedWritable.change_level === 'L3') {\r\n        unexpected.push({ file, change_level: matchedWritable.change_level })\r\n      } else {\r\n        allowed.push(file)\r\n      }\r\n    } else if (readOnlyPatterns.some(p => pathMatchesGlob(file, p))) {\r\n      unexpected.push({ file })\r\n    } else if (allAllowedPatterns.length === 0 || !allAllowedPatterns.some(p => pathMatchesGlob(file, p))) {\r\n      unexpected.push({ file })\r\n    } else {\r\n      allowed.push(file)\r\n    }\r\n  }\r\n\r\n  return { allowed, unexpected, passed: unexpected.length === 0 }\r\n}\r\n\r\nexport function getAllowedPaths(envelope: ArchitectureEnvelope, moduleName?: string): string[] {\r\n  const boundaries = [...envelope.module_boundaries.writable, ...envelope.module_boundaries.read_only]\r\n  if (moduleName) {\r\n    return boundaries.filter(b => b.module === moduleName).flatMap(b => b.paths)\r\n  }\r\n  return boundaries.flatMap(b => b.paths)\r\n}\r\n\r\nexport function getChangeLevel(envelope: ArchitectureEnvelope, path: string): ChangeLevel {\r\n  for (const w of envelope.module_boundaries.writable) {\r\n    if (w.paths.some(p => pathMatchesGlob(path, p))) {\r\n      return w.change_level ?? 'L0'\r\n    }\r\n  }\r\n  for (const r of envelope.module_boundaries.read_only) {\r\n    if (r.paths.some(p => pathMatchesGlob(path, p))) {\r\n      return 'L1'\r\n    }\r\n  }\r\n  for (const f of envelope.module_boundaries.forbidden) {\r\n    if (f.paths.some(p => pathMatchesGlob(path, p))) {\r\n      return 'L3'\r\n    }\r\n  }\r\n  return 'L3'\r\n}\r\n\r\nexport interface ProjectionUsageResult {\r\n  allowed: boolean\r\n  /** Declared usages that matched the requested usage; empty if the tool is not declared or the usage falls outside declared scope. */\r\n  matchedDeclarations: string[]\r\n  reason: string\r\n}\r\n\r\n/**\r\n * Verify that an automated projection tool usage (graphify / openapi_swagger / codegen) is declared in the envelope's\r\n * automation_projection_policy. Implements deny-by-default: undeclared tools are not allowed.\r\n *\r\n * The matching is intentionally permissive: a request matches if any declared entry contains the request string\r\n * (substring match), because declared entries are human-readable scopes (e.g. \"reverse-extract dependency graph for drift check\").\r\n */\r\nexport function checkProjectionToolUsage(\r\n  envelope: ArchitectureEnvelope,\r\n  tool: ProjectionToolName,\r\n  requestedUsage: string,\r\n): ProjectionUsageResult {\r\n  const policy = envelope.automation_projection_policy\r\n  if (!policy) {\r\n    return {\r\n      allowed: false,\r\n      matchedDeclarations: [],\r\n      reason: `automation_projection_policy not declared — tool \"${tool}\" denied by default`,\r\n    }\r\n  }\r\n  const declared = policy[tool]\r\n  if (!declared || declared.length === 0) {\r\n    return {\r\n      allowed: false,\r\n      matchedDeclarations: [],\r\n      reason: `tool \"${tool}\" has no declared allowed usages — denied by default`,\r\n    }\r\n  }\r\n  const matched = declared.filter(decl => decl.includes(requestedUsage) || requestedUsage.includes(decl))\r\n  if (matched.length === 0) {\r\n    return {\r\n      allowed: false,\r\n      matchedDeclarations: [],\r\n      reason: `requested usage \"${requestedUsage}\" not within declared scope for tool \"${tool}\": ${declared.join('; ')}`,\r\n    }\r\n  }\r\n  return {\r\n    allowed: true,\r\n    matchedDeclarations: matched,\r\n    reason: `matched ${matched.length} declaration(s)`,\r\n  }\r\n}\r\n\r\n/**\r\n * Check whether an escalation condition has been declared in the envelope.\r\n * AI agents consult this before deciding whether to stop and ask for human adjudication.\r\n */\r\nexport function isEscalationDeclared(envelope: ArchitectureEnvelope, condition: string): boolean {\r\n  if (!envelope.escalation_conditions) return false\r\n  return envelope.escalation_conditions.some(c => c.includes(condition) || condition.includes(c))\r\n}\r\n\r\n/**\r\n * Check whether a proposed state-ownership change is forbidden by the envelope.\r\n * Used to gate Level 3 changes that would alter state owners.\r\n */\r\nexport function isStateChangeForbidden(envelope: ArchitectureEnvelope, stateName: string): boolean {\r\n  if (!envelope.state_ownership) return false\r\n  return envelope.state_ownership.forbidden.some(s => s.includes(stateName) || stateName.includes(s))\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { StageConfig } from './runner.js'\r\n\r\nconst DEFAULT_SKILLS_DIR = join(process.cwd(), '.claude', 'skills')\r\n\r\nexport interface SkillDescriptor {\r\n  name: string\r\n  description: string\r\n  triggers: string[]\r\n  workflow: string\r\n}\r\n\r\nexport interface ResolvedSkill {\r\n  stageName: string\r\n  skill: SkillDescriptor\r\n  team?: string\r\n  entryGate?: string\r\n  exitGate?: string\r\n  reviewGate?: { reviewer: string; description: string }\r\n  params?: Record<string, unknown>\r\n}\r\n\r\nexport function loadSkillDescriptor(skillName: string, skillsDir: string): SkillDescriptor {\r\n  const skillPath = join(skillsDir, skillName, 'SKILL.md')\r\n  if (!existsSync(skillPath)) {\r\n    throw new Error(`Skill \"${skillName}\" not found at ${skillPath}`)\r\n  }\r\n\r\n  const raw = readFileSync(skillPath, 'utf-8')\r\n\r\n  // Parse YAML frontmatter\r\n  const frontmatterMatch = raw.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---/)\r\n  if (!frontmatterMatch) {\r\n    throw new Error(`Skill \"${skillName}\" has no frontmatter`)\r\n  }\r\n\r\n  const frontmatter = frontmatterMatch[1]\r\n  const body = raw.slice(frontmatterMatch[0].length).trim()\r\n\r\n  // Simple YAML parsing for frontmatter fields\r\n  const nameMatch = frontmatter.match(/^name:\\s*(.+)$/m)\r\n  const descMatch = frontmatter.match(/^description:\\s*\"?(.+?)\"?\\s*$/m)\r\n  const triggersMatch = frontmatter.match(/^triggers:\\s*\\n((?:\\s+- .+\\n?)+)/m)\r\n\r\n  const name = nameMatch?.[1]?.trim() ?? skillName\r\n  const description = descMatch?.[1]?.trim() ?? ''\r\n  const triggers = triggersMatch?.[1]\r\n    ?.split('\\n')\r\n    .map(l => l.trim())\r\n    .filter(l => l.startsWith('- '))\r\n    .map(l => l.replace(/^-\\s+/, '')) ?? []\r\n\r\n  return { name, description, triggers, workflow: body }\r\n}\r\n\r\nexport function resolveSkillForStage(stage: StageConfig, skillsDir: string = DEFAULT_SKILLS_DIR): ResolvedSkill {\r\n  const skill = loadSkillDescriptor(stage.skill, skillsDir)\r\n  return {\r\n    stageName: stage.name,\r\n    skill,\r\n    team: stage.team,\r\n    entryGate: stage.entry_gate,\r\n    exitGate: stage.exit_gate,\r\n    reviewGate: stage.review_gate,\r\n    params: stage.params,\r\n  }\r\n}\r\n\r\nexport function buildSkillPrompt(resolved: ResolvedSkill, context: Record<string, string>): string {\r\n  const lines: string[] = []\r\n\r\n  lines.push(`# Stage: ${resolved.stageName}`)\r\n  lines.push(`# Skill: ${resolved.skill.name}`)\r\n  lines.push('')\r\n\r\n  if (resolved.team) {\r\n    lines.push(`Team config: ${resolved.team}`)\r\n  }\r\n  if (resolved.params && Object.keys(resolved.params).length > 0) {\r\n    lines.push(`Params: ${JSON.stringify(resolved.params)}`)\r\n  }\r\n\r\n  lines.push('')\r\n  lines.push('## Workflow')\r\n  lines.push('')\r\n\r\n  // Interpolate context variables into the workflow\r\n  let workflow = resolved.skill.workflow\r\n  for (const [key, value] of Object.entries(context)) {\r\n    workflow = workflow.replaceAll(`{${key}}`, value)\r\n  }\r\n  lines.push(workflow)\r\n\r\n  if (resolved.reviewGate) {\r\n    lines.push('')\r\n    lines.push('## Review Gate')\r\n    lines.push(`Reviewer: ${resolved.reviewGate.reviewer}`)\r\n    lines.push(`Description: ${resolved.reviewGate.description}`)\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n","import { existsSync, readFileSync, readdirSync, mkdirSync, rmSync, writeFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { atomicWriteJson, ensureDir } from '../team/fs-utils.js'\r\nimport type { GateReport } from '../gate-engine/types.js'\r\n\r\nexport type StageMode = 'auto' | 'team' | 'direct'\r\nexport type StageStatus = 'pending' | 'in_progress' | 'awaiting_review' | 'completed' | 'rejected'\r\nexport type ArtifactStatus = 'draft' | 'reviewed' | 'accepted' | 'superseded'\r\n\r\nexport interface ArtifactRecord {\r\n  path: string\r\n  status: ArtifactStatus\r\n  updatedAt: string\r\n  updatedBy?: string\r\n  /** Stage that produced this artifact. */\r\n  producedBy?: string\r\n}\r\n\r\nexport interface PipelineState {\r\n  pipelineName: string\r\n  requestId: string\r\n  currentStage: string\r\n  stages: Record<string, {\r\n    status: StageStatus\r\n    mode: StageMode\r\n    startedAt?: string\r\n    completedAt?: string\r\n    gateReport?: GateReport\r\n    reviewDecision?: 'approved' | 'rejected'\r\n    reviewComment?: string\r\n  }>\r\n  context: Record<string, string>\r\n  /** Artifact lifecycle — tracks each produced artifact from draft → reviewed → accepted → superseded. Optional for backward compat with old state.json files. */\r\n  artifacts?: Record<string, ArtifactRecord>\r\n}\r\n\r\nfunction stateFilePath(pipelineDir: string): string {\r\n  return join(pipelineDir, '.harness', '.pipeline', 'state.json')\r\n}\r\n\r\nexport function loadState(pipelineDir: string): PipelineState | null {\r\n  const path = stateFilePath(pipelineDir)\r\n  if (!existsSync(path)) return null\r\n\r\n  try {\r\n    return JSON.parse(readFileSync(path, 'utf-8')) as PipelineState\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nexport function saveState(state: PipelineState, pipelineDir: string): void {\r\n  const dir = join(pipelineDir, '.harness', '.pipeline')\r\n  ensureDir(dir)\r\n  atomicWriteJson(stateFilePath(pipelineDir), state)\r\n}\r\n\r\nexport function advanceToNextStage(state: PipelineState, pipelineDir: string = getContextPipelineDir()): PipelineState {\r\n  const stageNames = Object.keys(state.stages)\r\n  const currentIdx = stageNames.indexOf(state.currentStage)\r\n\r\n  // If current stage is completed, find next pending stage\r\n  if (state.stages[state.currentStage].status === 'completed') {\r\n    for (let i = currentIdx + 1; i < stageNames.length; i++) {\r\n      const name = stageNames[i]\r\n      if (state.stages[name].status === 'pending') {\r\n        setAutoContinue(pipelineDir)\r\n        resetStopFailureCount(pipelineDir)\r\n        return {\r\n          ...state,\r\n          currentStage: name,\r\n          stages: {\r\n            ...state.stages,\r\n            [name]: {\r\n              ...state.stages[name],\r\n              status: 'in_progress',\r\n              startedAt: new Date().toISOString(),\r\n            },\r\n          },\r\n        }\r\n      }\r\n    }\r\n    return state // all done\r\n  }\r\n\r\n  // Current stage is pending or rejected — start/restart it\r\n  const name = state.currentStage\r\n  setAutoContinue(pipelineDir)\r\n  resetStopFailureCount(pipelineDir)\r\n  return {\r\n    ...state,\r\n    stages: {\r\n      ...state.stages,\r\n      [name]: {\r\n        ...state.stages[name],\r\n        status: 'in_progress',\r\n        startedAt: new Date().toISOString(),\r\n        reviewDecision: undefined,\r\n        reviewComment: undefined,\r\n      },\r\n    },\r\n  }\r\n}\r\n\r\nexport function pauseForReview(\r\n  state: PipelineState,\r\n  stage: string,\r\n  gateReport?: GateReport,\r\n  pipelineDir: string = getContextPipelineDir(),\r\n): PipelineState {\r\n  const updated: PipelineState = {\r\n    ...state,\r\n    stages: {\r\n      ...state.stages,\r\n      [stage]: {\r\n        ...state.stages[stage],\r\n        status: 'awaiting_review',\r\n        ...(gateReport ? { gateReport } : {}),\r\n      },\r\n    },\r\n  }\r\n\r\n  // Clear auto-continue on review pause\r\n  clearAutoContinue(pipelineDir)\r\n\r\n  // Write pending-reviews notification\r\n  const pendingDir = join(pipelineDir, '.harness', '.pipeline', 'pending-reviews')\r\n  ensureDir(pendingDir)\r\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\r\n  const fileName = `${stage}-${timestamp}.json`\r\n  atomicWriteJson(join(pendingDir, fileName), {\r\n    stage,\r\n    pipelineName: state.pipelineName,\r\n    requestId: state.requestId,\r\n    gateReport,\r\n    createdAt: new Date().toISOString(),\r\n  })\r\n\r\n  return updated\r\n}\r\n\r\nexport function resumeFromReview(\r\n  state: PipelineState,\r\n  stage: string,\r\n  decision: 'approved' | 'rejected',\r\n  comment?: string,\r\n  pipelineDir: string = getContextPipelineDir(),\r\n): PipelineState {\r\n  const stageUpdate = decision === 'approved'\r\n    ? {\r\n        status: 'completed' as StageStatus,\r\n        reviewDecision: decision,\r\n        reviewComment: comment,\r\n        completedAt: new Date().toISOString(),\r\n      }\r\n    : {\r\n        status: 'rejected' as StageStatus,\r\n        reviewDecision: decision,\r\n        reviewComment: comment,\r\n      }\r\n\r\n  // Clear auto-continue on stage completion\r\n  if (decision === 'approved') {\r\n    clearAutoContinue(pipelineDir)\r\n  }\r\n\r\n  // Clear pending-reviews file for this stage\r\n  const pendingDir = join(pipelineDir, '.harness', '.pipeline', 'pending-reviews')\r\n  if (existsSync(pendingDir)) {\r\n    const files = readdirSync(pendingDir).filter(f => f.startsWith(stage))\r\n    for (const f of files) {\r\n      rmSync(join(pendingDir, f))\r\n    }\r\n  }\r\n\r\n  return {\r\n    ...state,\r\n    stages: {\r\n      ...state.stages,\r\n      [stage]: {\r\n        ...state.stages[stage],\r\n        ...stageUpdate,\r\n      },\r\n    },\r\n  }\r\n}\r\n\r\n// Default pipeline dir — can be overridden by setting PIPELINE_DIR env var\r\nfunction getContextPipelineDir(): string {\r\n  return process.env.PIPELINE_DIR ?? process.cwd()\r\n}\r\n\r\n// --- Artifact lifecycle ---\r\n\r\n/**\r\n * Record or update the status of a produced artifact (draft → reviewed → accepted → superseded).\r\n * Persists to .pipeline/state.json immediately so the lifecycle survives session restarts.\r\n */\r\nexport function setArtifactStatus(\r\n  state: PipelineState,\r\n  artifactId: string,\r\n  path: string,\r\n  status: ArtifactStatus,\r\n  pipelineDir: string = getContextPipelineDir(),\r\n  options?: { updatedBy?: string; producedBy?: string },\r\n): PipelineState {\r\n  const artifacts = { ...(state.artifacts ?? {}) }\r\n  const existing = artifacts[artifactId]\r\n  artifacts[artifactId] = {\r\n    path,\r\n    status,\r\n    updatedAt: new Date().toISOString(),\r\n    updatedBy: options?.updatedBy,\r\n    producedBy: options?.producedBy ?? existing?.producedBy,\r\n  }\r\n  const updated: PipelineState = { ...state, artifacts }\r\n  saveState(updated, pipelineDir)\r\n  return updated\r\n}\r\n\r\nexport function getArtifactStatus(state: PipelineState, artifactId: string): ArtifactStatus | undefined {\r\n  return state.artifacts?.[artifactId]?.status\r\n}\r\n\r\nexport function getArtifactRecord(state: PipelineState, artifactId: string): ArtifactRecord | undefined {\r\n  return state.artifacts?.[artifactId]\r\n}\r\n\r\n/**\r\n * Mark all outputs of a stage as `draft`. Called by advanceToNextStage when a stage transitions to in_progress\r\n * or completes work. The reviewer/accepted promotions are deferred to step-7/step-8 logic, leaving a hook.\r\n */\r\nexport function markStageOutputsAsDraft(\r\n  state: PipelineState,\r\n  stageName: string,\r\n  outputs: string[],\r\n  pipelineDir: string = getContextPipelineDir(),\r\n): PipelineState {\r\n  let updated = state\r\n  for (const output of outputs) {\r\n    // Use output basename (without extension) as the artifactId — keeps IDs stable across pipeline dirs.\r\n    const artifactId = output.replace(/\\.[^.]+$/, '')\r\n    updated = setArtifactStatus(updated, artifactId, output, 'draft', pipelineDir, { producedBy: stageName })\r\n  }\r\n  return updated\r\n}\r\n\r\n\r\n// --- Auto-continue lifecycle (ADR-0007) ---\r\n\r\nexport function setAutoContinue(pipelineDir: string): void {\r\n  const dir = join(pipelineDir, '.harness', '.pipeline')\r\n  ensureDir(dir)\r\n  writeFileSync(join(dir, 'auto-continue'), '', 'utf-8')\r\n}\r\n\r\nexport function clearAutoContinue(pipelineDir: string): void {\r\n  const path = join(pipelineDir, '.harness', '.pipeline', 'auto-continue')\r\n  if (existsSync(path)) {\r\n    rmSync(path)\r\n  }\r\n}\r\n\r\nexport function getStopFailureCount(pipelineDir: string): number {\r\n  const path = join(pipelineDir, '.harness', '.pipeline', 'stop-failure-count')\r\n  if (!existsSync(path)) {\r\n    return 0\r\n  }\r\n  try {\r\n    return parseInt(readFileSync(path, 'utf-8').trim()) || 0\r\n  } catch {\r\n    return 0\r\n  }\r\n}\r\n\r\nexport function incrementStopFailureCount(pipelineDir: string): void {\r\n  const count = getStopFailureCount(pipelineDir) + 1\r\n  const dir = join(pipelineDir, '.harness', '.pipeline')\r\n  ensureDir(dir)\r\n  writeFileSync(join(dir, 'stop-failure-count'), String(count), 'utf-8')\r\n}\r\n\r\nexport function resetStopFailureCount(pipelineDir: string): void {\r\n  const path = join(pipelineDir, '.harness', '.pipeline', 'stop-failure-count')\r\n  if (existsSync(path)) {\r\n    rmSync(path)\r\n  }\r\n}\r\n","import { writeFileSync, existsSync, mkdirSync, renameSync, openSync, writeSync, closeSync, constants } from 'fs'\r\nimport { dirname } from 'path'\r\n\r\nexport function atomicWriteJson(filePath: string, data: unknown): void {\r\n  const dir = dirname(filePath)\r\n  if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\r\n  const tmpPath = `${filePath}.tmp.${process.pid}.${Date.now()}`\r\n  writeFileSync(tmpPath, JSON.stringify(data, null, 2) + '\\n', 'utf-8')\r\n  renameSync(tmpPath, filePath)\r\n}\r\n\r\nexport function ensureDir(dirPath: string): void {\r\n  if (!existsSync(dirPath)) mkdirSync(dirPath, { recursive: true })\r\n}\r\n\r\nexport function appendLine(filePath: string, line: string): void {\r\n  const dir = dirname(filePath)\r\n  if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\r\n  const fd = openSync(filePath, constants.O_WRONLY | constants.O_APPEND | constants.O_CREAT, 0o644)\r\n  try {\r\n    writeSync(fd, line + '\\n', null, 'utf-8')\r\n  } finally {\r\n    closeSync(fd)\r\n  }\r\n}\r\n","import { existsSync, copyFileSync, mkdirSync, writeFileSync, readFileSync, readdirSync, statSync, symlinkSync, lstatSync } from 'fs'\r\nimport { join, dirname, resolve, basename } from 'path'\r\nimport { homedir } from 'os'\r\nimport { mirrorSkills, MIRROR_TARGETS, formatPlainDirWarn } from '../skills-mirror/index.js'\r\n\r\ntype FileResult = 'created' | 'skipped' | 'overwritten' | 'appended'\r\n\r\nconst CLAUDE_MD_SENTINEL = '<!-- harness-router-begin -->'\r\n\r\nexport interface StandaloneSkillResult {\r\n  skill: string\r\n  method: 'symlink' | 'copy'\r\n  source: string\r\n  symlinkFallback?: boolean\r\n}\r\n\r\nexport interface SkillsMirrorResult {\r\n  created: number\r\n  skipped: number\r\n  warned: number\r\n  rejected: Array<{ skill: string; reason: string; offender?: string }>\r\n  targetDirs: string[]\r\n  warnings: string[]\r\n}\r\n\r\nexport interface InitResult {\r\n  files: Array<{ path: string; result: FileResult }>\r\n  dirs: string[]\r\n  hooksInstalled?: boolean\r\n  permissionsInstalled?: boolean\r\n  standaloneSkills?: StandaloneSkillResult[]\r\n  skillsMirror?: SkillsMirrorResult\r\n  backupDir?: string\r\n}\r\n\r\nexport const STANDALONE_SKILLS = [\r\n  'caveman', 'diagnose', 'find-skills', 'grill-with-docs', 'handoff',\r\n  'harness-ut', 'improve-codebase-architecture', 'prototype', 'tdd',\r\n  'to-issues', 'to-prd', 'triage', 'write-a-skill', 'zoom-out',\r\n  'architecture-models-4plus1',\r\n  'arch-driven',\r\n  'step-2-code-scan',\r\n  'gen-ui-testcases',\r\n  'harness-ui-design',\r\n  'harness-permissions',\r\n  'step-5-slice',\r\n  'step-6-implement',\r\n]\r\n\r\nexport const CONTEXT_TEMPLATE = `# Project Context\r\n\r\n## Terminology\r\n<!-- Define project-specific terms here -->\r\n\r\n## Architecture Decisions\r\n<!-- Link ADRs here -->\r\n`\r\n\r\nconst SCAFFOLD_FILES = [\r\n  'pipeline.yaml',\r\n  'CLAUDE.md',\r\n  '.harness/gates/rules/security-design.yaml',\r\n  '.harness/gates/rules/security-design-extended.yaml',\r\n  '.harness/gates/rules/naming-convention.yaml',\r\n  '.harness/gates/rules/code-format.yaml',\r\n  '.harness/gates/rules/code-practice.yaml',\r\n  '.harness/gates/rules/license-copyright.yaml',\r\n  '.harness/gates/rules/contributing-compliance.yaml',\r\n  '.harness/gates/rules/code-review.yaml',\r\n  '.harness/gates/rules/python-coding-style.yaml',\r\n  '.harness/gates/rules/java-coding-style.yaml',\r\n  '.harness/gates/rules/security-redline.yaml',\r\n  '.harness/gates/rules/security-checklist.yaml',\r\n  '.harness/gates/rules/container-security.yaml',\r\n  '.harness/gates/rules/api-security.yaml',\r\n  '.harness/gates/rules/doc-structure.yaml',\r\n  '.harness/gates/rules/language-style.yaml',\r\n  '.harness/gates/rules/content-elements.yaml',\r\n  '.harness/gates/rules/advanced-analysis.yaml',\r\n  '.harness/gates/rules/arch-driven-overview.yaml',\r\n  '.harness/gates/rules/telemetry-drift.yaml',\r\n  '.harness/gates/rules/telemetry-contract.yaml',\r\n  '.harness/gates/rules/telemetry-schema-sync.yaml',\r\n  '.harness/gates/bindings/pre-edit.yaml',\r\n  '.harness/gates/bindings/post-edit.yaml',\r\n  '.claude/skills/harness-design/SKILL.md',\r\n  '.claude/skills/harness-start/SKILL.md',\r\n  '.claude/skills/harness-status/SKILL.md',\r\n  '.claude/skills/harness-router/SKILL.md',\r\n  '.claude/skills/compile-spec/SKILL.md',\r\n  '.claude/skills/dev-start/SKILL.md',\r\n  '.claude/skills/harness-ut/SKILL.md',\r\n  '.claude/skills/harness-start/ADR-FORMAT.md',\r\n  '.claude/skills/harness-start/CONTEXT-FORMAT.md',\r\n  '.claude/skills/run-stack/SKILL.md',\r\n  '.claude/skills/run-stack/PROJECT_NOTES.md',\r\n  '.claude/skills/run-stack/examples/agent-studio.md',\r\n  '.claude/skills/step-1-req-clarify/SKILL.md',\r\n  '.claude/skills/step-3-envelope/SKILL.md',\r\n  '.claude/skills/step-4-gate-derive/SKILL.md',\r\n  '.claude/skills/step-5-slice/SKILL.md',\r\n  '.claude/skills/step-6-implement/SKILL.md',\r\n  '.claude/skills/step-7-reconcile/SKILL.md',\r\n  '.claude/skills/step-8-baseline/SKILL.md',\r\n  '.claude/skills/step-9-release/SKILL.md',\r\n  '.harness/version-intents/.gitkeep',\r\n  '.harness/architecture-envelopes/.gitkeep',\r\n  '.harness/review-packets/.gitkeep',\r\n  '.harness/delivery-projections/.gitkeep',\r\n  '.harness/baselines/.gitkeep',\r\n  'pipeline-full.yaml',\r\n  'pipeline-incremental.yaml',\r\n  'pipeline-lightweight.yaml',\r\n  'git-strategy.yaml',\r\n  '.harness/gates/architecture-entry.yaml',\r\n  '.harness/gates/architecture-exit.yaml',\r\n  '.harness/gates/development-entry.yaml',\r\n  '.harness/gates/development-exit.yaml',\r\n  '.harness/gates/integration-entry.yaml',\r\n  '.harness/gates/integration-exit.yaml',\r\n  '.harness/gates/release-entry.yaml',\r\n  '.harness/gates/release-exit.yaml',\r\n  '.harness/gates/requirements-exit.yaml',\r\n  '.harness/gates/task-decomposition-exit.yaml',\r\n  'teams/arch-roundtable.yaml',\r\n  'teams/tdd-team.yaml',\r\n]\r\n\r\nexport function scaffoldDir(): string {\r\n  const candidates = [\r\n    join(__dirname, 'scaffold'),\r\n    resolve(__dirname, '..'),\r\n    resolve(__dirname, '..', '..'),\r\n  ]\r\n  for (const candidate of candidates) {\r\n    if (existsSync(join(candidate, 'pipeline.yaml'))) return candidate\r\n  }\r\n  return candidates[0]\r\n}\r\n\r\n/** Resolve bundled or repo-root hook scripts directory (also checks scaffold sibling dist/scripts/hooks). */\r\nexport function resolveHookScriptsSourceDir(scaffoldDir?: string): string | null {\r\n  if (scaffoldDir) {\r\n    const fromScaffold = join(scaffoldDir, '..', 'scripts', 'hooks')\r\n    if (existsSync(fromScaffold)) return fromScaffold\r\n  }\r\n  const distHooks = join(__dirname, '..', 'scripts', 'hooks')\r\n  if (existsSync(distHooks)) return distHooks\r\n  const rootHooks = join(__dirname, '..', '..', 'scripts', 'hooks')\r\n  if (existsSync(rootHooks)) return rootHooks\r\n  return null\r\n}\r\n\r\n/** Copy scripts/hooks/*.mjs into target repo (unconditional — settings may reference them). */\r\nexport function shipHookScripts(targetDir: string, scaffoldDir?: string): string[] {\r\n  const hookScriptsDir = resolveHookScriptsSourceDir(scaffoldDir)\r\n  if (!hookScriptsDir) return []\r\n  return copyDirRecursive(hookScriptsDir, join(targetDir, 'scripts', 'hooks'))\r\n}\r\n\r\nexport function copyDirRecursive(src: string, dest: string): string[] {\r\n  const copiedFiles: string[] = []\r\n  mkdirSync(dest, { recursive: true })\r\n\r\n  for (const entry of readdirSync(src)) {\r\n    const srcPath = join(src, entry)\r\n    const destPath = join(dest, entry)\r\n\r\n    if (statSync(srcPath).isDirectory()) {\r\n      copiedFiles.push(...copyDirRecursive(srcPath, destPath))\r\n    } else {\r\n      copyFileSync(srcPath, destPath)\r\n      copiedFiles.push(destPath)\r\n    }\r\n  }\r\n\r\n  return copiedFiles\r\n}\r\n\r\nexport function installStandaloneSkill(\r\n  skillName: string,\r\n  targetDir: string,\r\n  sourceDir: string,\r\n): StandaloneSkillResult {\r\n  const globalSkillDir = join(homedir(), '.agents', 'skills', skillName)\r\n  const destDir = join(targetDir, '.claude', 'skills', skillName)\r\n  const scaffoldSkillDir = join(sourceDir, '.claude', 'skills', skillName)\r\n\r\n  if (existsSync(globalSkillDir)) {\r\n    try {\r\n      symlinkSync(globalSkillDir, destDir, 'junction')\r\n      return { skill: skillName, method: 'symlink', source: globalSkillDir }\r\n    } catch {\r\n      // Symlink failed (e.g. Windows without developer mode) — fall back to copy\r\n    }\r\n\r\n    try {\r\n      copyDirRecursive(globalSkillDir, destDir)\r\n      return { skill: skillName, method: 'copy', source: globalSkillDir, symlinkFallback: true }\r\n    } catch {\r\n      // Global dir exists but copy failed — fall through to scaffold\r\n    }\r\n  }\r\n\r\n  // No global dir or global copy failed — copy from scaffold\r\n  if (existsSync(scaffoldSkillDir)) {\r\n    copyDirRecursive(scaffoldSkillDir, destDir)\r\n    return { skill: skillName, method: 'copy', source: 'scaffold' }\r\n  }\r\n\r\n  // Neither source available — skip\r\n  return { skill: skillName, method: 'copy', source: 'scaffold' }\r\n}\r\n\r\nconst HARNESS_GITIGNORE_ENTRIES = [\r\n  '.harness/.pipeline/',\r\n  '.claude/skills/harness-*/',\r\n  '.claude/skills/compile-spec/',\r\n  '.claude/skills/dev-start/',\r\n  '.claude/skills/run-stack/',\r\n  '.claude/skills/caveman/',\r\n  '.claude/skills/diagnose/',\r\n  '.claude/skills/find-skills/',\r\n  '.claude/skills/grill-with-docs/',\r\n  '.claude/skills/handoff/',\r\n  '.claude/skills/improve-codebase-architecture/',\r\n  '.claude/skills/prototype/',\r\n  '.claude/skills/tdd/',\r\n  '.claude/skills/to-issues/',\r\n  '.claude/skills/to-prd/',\r\n  '.claude/skills/triage/',\r\n  '.claude/skills/write-a-skill/',\r\n  '.claude/skills/zoom-out/',\r\n  '.trae/skills/harness-*/',\r\n  '.trae/skills/arch-roundtable/',\r\n  '.trae/skills/task-decomposition/',\r\n  '.trae/skills/tdd-cycle/',\r\n  '.trae/skills/integration-verify/',\r\n  '.trae/skills/release-pack/',\r\n  '.trae/skills/compile-spec/',\r\n  '.trae/skills/dev-start/',\r\n  '.trae/skills/run-stack/',\r\n  '.trae/skills/caveman/',\r\n  '.trae/skills/diagnose/',\r\n  '.trae/skills/find-skills/',\r\n  '.trae/skills/grill-with-docs/',\r\n  '.trae/skills/handoff/',\r\n  '.trae/skills/improve-codebase-architecture/',\r\n  '.trae/skills/prototype/',\r\n  '.trae/skills/tdd/',\r\n  '.trae/skills/to-issues/',\r\n  '.trae/skills/to-prd/',\r\n  '.trae/skills/triage/',\r\n  '.trae/skills/write-a-skill/',\r\n  '.trae/skills/zoom-out/',\r\n  '.opencode/skills/harness-*/',\r\n  '.opencode/skills/arch-roundtable/',\r\n  '.opencode/skills/task-decomposition/',\r\n  '.opencode/skills/tdd-cycle/',\r\n  '.opencode/skills/integration-verify/',\r\n  '.opencode/skills/release-pack/',\r\n  '.opencode/skills/compile-spec/',\r\n  '.opencode/skills/dev-start/',\r\n  '.opencode/skills/run-stack/',\r\n  '.opencode/skills/caveman/',\r\n  '.opencode/skills/diagnose/',\r\n  '.opencode/skills/find-skills/',\r\n  '.opencode/skills/grill-with-docs/',\r\n  '.opencode/skills/handoff/',\r\n  '.opencode/skills/improve-codebase-architecture/',\r\n  '.opencode/skills/prototype/',\r\n  '.opencode/skills/tdd/',\r\n  '.opencode/skills/to-issues/',\r\n  '.opencode/skills/to-prd/',\r\n  '.opencode/skills/triage/',\r\n  '.opencode/skills/write-a-skill/',\r\n  '.opencode/skills/zoom-out/',\r\n  '.claude/skills/architecture-models-4plus1/',\r\n  '.claude/skills/gen-ui-testcases/',\r\n  'node_modules/',\r\n  'harness-rd-toolkit-*.tgz',\r\n  'wefq1981-harness-toolkit-*.tgz',\r\n  'CONTEXT.md',\r\n  '.harness-init-backup/',\r\n]\r\n\r\nexport function updateGitignore(targetDir: string): void {\r\n  const gitignorePath = join(targetDir, '.gitignore')\r\n  let existingContent = ''\r\n  if (existsSync(gitignorePath)) {\r\n    existingContent = readFileSync(gitignorePath, 'utf-8')\r\n  }\r\n\r\n  const lines = existingContent.split('\\n')\r\n  const entriesToAdd: string[] = []\r\n\r\n  for (const entry of HARNESS_GITIGNORE_ENTRIES) {\r\n    const trimmed = entry.trim()\r\n    if (trimmed && !lines.some((l) => l.trim() === trimmed)) {\r\n      entriesToAdd.push(trimmed)\r\n    }\r\n  }\r\n\r\n  if (entriesToAdd.length > 0) {\r\n    const newContent = existingContent\r\n      ? existingContent.replace(/\\n?$/, '\\n') + entriesToAdd.join('\\n') + '\\n'\r\n      : entriesToAdd.join('\\n') + '\\n'\r\n    writeFileSync(gitignorePath, newContent, 'utf-8')\r\n  }\r\n}\r\n\r\nfunction backupExistingFiles(targetDir: string): string | null {\r\n  const timestamp = new Date().toISOString().replace(/[:.]/g, '-')\r\n  const backupDir = join(targetDir, '.claude', `.harness-init-backup-${timestamp}`)\r\n\r\n  const candidates: string[] = []\r\n  if (existsSync(join(targetDir, '.claude', 'settings.local.json'))) {\r\n    candidates.push('.claude/settings.local.json')\r\n  }\r\n\r\n  if (candidates.length === 0) return null\r\n\r\n  try {\r\n    mkdirSync(backupDir, { recursive: true })\r\n    for (const relPath of candidates) {\r\n      const src = join(targetDir, relPath)\r\n      const dst = join(backupDir, relPath)\r\n      mkdirSync(dirname(dst), { recursive: true })\r\n      copyFileSync(src, dst)\r\n    }\r\n  } catch (err) {\r\n    throw new Error(`Backup failed for ${relPath}: ${(err as Error).message}`)\r\n  }\r\n\r\n  return backupDir\r\n}\r\n\r\nexport function runInit(\r\n  targetDir: string,\r\n  force: boolean = false,\r\n  installHooks: boolean = true,\r\n  skipStandaloneSkills: boolean = false,\r\n): InitResult {\r\n  const sourceDir = scaffoldDir()\r\n  const results: InitResult = { files: [], dirs: [] }\r\n\r\n  if (!existsSync(targetDir)) {\r\n    mkdirSync(targetDir, { recursive: true })\r\n  }\r\n\r\n  if (force) {\r\n    try {\r\n      results.backupDir = backupExistingFiles(targetDir)\r\n    } catch (err) {\r\n      throw new Error(`Refusing to proceed with --force: ${(err as Error).message}`)\r\n    }\r\n  }\r\n\r\n  for (const relPath of SCAFFOLD_FILES) {\r\n    const src = join(sourceDir, relPath)\r\n    const dest = join(targetDir, relPath)\r\n\r\n    if (!existsSync(src)) {\r\n      results.files.push({ path: relPath, result: 'skipped' })\r\n      continue\r\n    }\r\n\r\n    const destDir = dirname(dest)\r\n    if (!existsSync(destDir)) {\r\n      mkdirSync(destDir, { recursive: true })\r\n      results.dirs.push(dirname(relPath))\r\n    }\r\n\r\n    const destExisted = existsSync(dest)\r\n\r\n    // CLAUDE.md is special-cased: never overwrite an existing customer file.\r\n    // - does not exist → write the template\r\n    // - exists, no sentinel → append the template block to the end\r\n    // - exists, sentinel present → skip (idempotent)\r\n    if (relPath === 'CLAUDE.md') {\r\n      if (!destExisted) {\r\n        copyFileSync(src, dest)\r\n        results.files.push({ path: relPath, result: 'created' })\r\n        continue\r\n      }\r\n      const existing = readFileSync(dest, 'utf-8')\r\n      if (existing.includes(CLAUDE_MD_SENTINEL)) {\r\n        results.files.push({ path: relPath, result: 'skipped' })\r\n        continue\r\n      }\r\n      const template = readFileSync(src, 'utf-8')\r\n      const separator = existing.endsWith('\\n') ? '\\n' : '\\n\\n'\r\n      writeFileSync(dest, existing + separator + template, 'utf-8')\r\n      results.files.push({ path: relPath, result: 'appended' })\r\n      continue\r\n    }\r\n\r\n    if (destExisted && !force) {\r\n      results.files.push({ path: relPath, result: 'skipped' })\r\n      continue\r\n    }\r\n\r\n    copyFileSync(src, dest)\r\n    results.files.push({ path: relPath, result: destExisted ? 'overwritten' : 'created' })\r\n  }\r\n\r\n  const contextPath = join(targetDir, 'CONTEXT.md')\r\n  const contextExisted = existsSync(contextPath)\r\n  if (!contextExisted || force) {\r\n    writeFileSync(contextPath, CONTEXT_TEMPLATE, 'utf-8')\r\n    results.files.push({\r\n      path: 'CONTEXT.md',\r\n      result: contextExisted ? 'overwritten' : 'created',\r\n    })\r\n  } else {\r\n    results.files.push({ path: 'CONTEXT.md', result: 'skipped' })\r\n  }\r\n\r\n  const pipelineDir = join(targetDir, '.harness', '.pipeline')\r\n  if (!existsSync(pipelineDir)) {\r\n    mkdirSync(pipelineDir, { recursive: true })\r\n    results.dirs.push('.harness/.pipeline')\r\n  }\r\n  const gitkeep = join(pipelineDir, '.gitkeep')\r\n  if (!existsSync(gitkeep)) {\r\n    writeFileSync(gitkeep, '', 'utf-8')\r\n  }\r\n\r\n  const governanceTierDirs = [\r\n    '.harness/version-intents',\r\n    '.harness/architecture-envelopes',\r\n    '.harness/review-packets',\r\n    '.harness/delivery-projections',\r\n    '.harness/baselines',\r\n  ]\r\n  for (const tier of governanceTierDirs) {\r\n    const tierDir = join(targetDir, ...tier.split('/'))\r\n    if (!existsSync(tierDir)) {\r\n      mkdirSync(tierDir, { recursive: true })\r\n      results.dirs.push(tier)\r\n    }\r\n    const tierGitkeep = join(tierDir, '.gitkeep')\r\n    if (!existsSync(tierGitkeep)) {\r\n      writeFileSync(tierGitkeep, '', 'utf-8')\r\n    }\r\n  }\r\n\r\n  shipHookScripts(targetDir, sourceDir)\r\n\r\n  if (installHooks) {\r\n    results.hooksInstalled = installHooksToSettings(targetDir, force)\r\n  }\r\n\r\n  // Always install permissions so gate-check CLI commands work\r\n  results.permissionsInstalled = installPermissionsToSettings(targetDir)\r\n\r\n  // Install Standalone Skills\r\n  if (!skipStandaloneSkills) {\r\n    results.standaloneSkills = STANDALONE_SKILLS.map(name =>\r\n      installStandaloneSkill(name, targetDir, sourceDir),\r\n    )\r\n  } else {\r\n    results.standaloneSkills = []\r\n  }\r\n\r\n  // Skills Mirror: copy .claude/skills/ -> .trae/skills/ + .opencode/skills/\r\n  try {\r\n    const mirror = mirrorSkills(targetDir)\r\n    const warnings: string[] = []\r\n    for (const t of MIRROR_TARGETS) {\r\n      const relTarget = join(targetDir, t.dir)\r\n      const skillSrc = join(targetDir, '.claude', 'skills')\r\n      if (existsSync(skillSrc) && existsSync(relTarget)) {\r\n        const entries = readdirSync(skillSrc, { withFileTypes: true })\r\n        for (const e of entries) {\r\n          if (!e.isDirectory()) continue\r\n          const targetSkill = join(relTarget, e.name)\r\n          if (existsSync(targetSkill) && !lstatSync(targetSkill).isSymbolicLink() && lstatSync(targetSkill).isDirectory()) {\r\n            warnings.push(formatPlainDirWarn(targetSkill, targetDir))\r\n          }\r\n        }\r\n      }\r\n    }\r\n    results.skillsMirror = {\r\n      created: mirror.created,\r\n      skipped: mirror.skipped,\r\n      warned: mirror.warned,\r\n      rejected: mirror.rejected,\r\n      targetDirs: MIRROR_TARGETS.map(t => t.dir),\r\n      warnings,\r\n    }\r\n  } catch (err) {\r\n    results.skillsMirror = {\r\n      created: 0,\r\n      skipped: 0,\r\n      warned: 0,\r\n      rejected: [],\r\n      targetDirs: MIRROR_TARGETS.map(t => t.dir),\r\n      warnings: ['Skills mirror failed: ' + (err as Error).message],\r\n    }\r\n  }\r\n\r\n  updateGitignore(targetDir)\r\n\r\n  return results\r\n}\r\n\r\nexport function installHooksToSettings(targetDir: string, force: boolean = false): boolean {\r\n  const settingsDir = join(targetDir, '.claude')\r\n  // Hooks go to settings.json (shared, checked in) so the whole team gets them.\r\n  // Permissions stay in settings.local.json (personal, gitignored).\r\n  const settingsPath = join(settingsDir, 'settings.json')\r\n\r\n  // Use .mjs hooks via node — cross-platform compatible (works on Windows, WSL, Linux, macOS)\r\n  // .cmd/.sh wrappers are not used since Claude Code may run in bash/WSL environment\r\n  const distScriptsDir = join(__dirname, '..', 'scripts', 'hooks')\r\n  const rootScriptsDir = join(__dirname, '..', '..', 'scripts', 'hooks')\r\n  const scriptsDir = existsSync(distScriptsDir) ? distScriptsDir : rootScriptsDir\r\n\r\n  const preEditMjs = join(scriptsDir, 'claude-code-pre-edit.mjs')\r\n  const postEditMjs = join(scriptsDir, 'claude-code-post-edit.mjs')\r\n  const resilienceMjs = join(scriptsDir, 'harness-hook-handler.mjs')\r\n  const updateNotifyMjs = join(scriptsDir, 'harness-update-notify.mjs')\r\n\r\n  if (!existsSync(preEditMjs) || !existsSync(postEditMjs)) {\r\n    return false\r\n  }\r\n\r\n  // Hook commands use POSIX relative paths (scripts/hooks/<file>.mjs) so the\r\n  // shared, checked-in settings.json works for every clone path / teammate.\r\n  // Claude Code resolves the command from CWD (project root), which matches\r\n  // the layout this file is meant to live in. Absolute paths would break for\r\n  // anyone with a different checkout location.\r\n  const preEditScript = `node scripts/hooks/claude-code-pre-edit.mjs`\r\n  const postEditScript = `node scripts/hooks/claude-code-post-edit.mjs`\r\n  const resilienceCmd = `node scripts/hooks/harness-hook-handler.mjs`\r\n  const updateNotifyCmd = `node scripts/hooks/harness-update-notify.mjs`\r\n  // Used only for the file-existence gate below — absolute path is safe to use\r\n  // on the local filesystem (never written to settings.json).\r\n  const resilienceMjsAbs = resolve(scriptsDir, 'harness-hook-handler.mjs').replace(/\\\\/g, '/')\r\n\r\n  // Read or create settings.json\r\n  let settings: Record<string, any> = {}\r\n  if (existsSync(settingsPath)) {\r\n    try {\r\n      settings = JSON.parse(readFileSync(settingsPath, 'utf-8'))\r\n    } catch {\r\n      settings = {}\r\n    }\r\n  }\r\n\r\n  if (!settings.hooks) settings.hooks = {}\r\n  if (!settings.hooks.PreToolUse) settings.hooks.PreToolUse = []\r\n  if (!settings.hooks.PostToolUse) settings.hooks.PostToolUse = []\r\n\r\n  // Check if already installed (and if force is used, treat as not installed to replace)\r\n  const preExists = settings.hooks.PreToolUse.some(\r\n    (h: any) =>\r\n      Array.isArray(h.hooks) && h.hooks.some((hk: any) => hk.command?.includes('claude-code-pre-edit')),\r\n  )\r\n  const postExists = settings.hooks.PostToolUse.some(\r\n    (h: any) =>\r\n      Array.isArray(h.hooks) && h.hooks.some((hk: any) => hk.command?.includes('claude-code-post-edit')),\r\n  )\r\n\r\n  // When force=true, remove old .cmd hooks so they get replaced with .mjs\r\n  if (force) {\r\n    settings.hooks.PreToolUse = settings.hooks.PreToolUse.filter(\r\n      (h: any) => !h.hooks?.some((hk: any) => hk.command?.endsWith('.cmd'))\r\n    )\r\n    settings.hooks.PostToolUse = settings.hooks.PostToolUse.filter(\r\n      (h: any) => !h.hooks?.some((hk: any) => hk.command?.endsWith('.cmd'))\r\n    )\r\n  }\r\n\r\n  // Re-check after removing old hooks\r\n  const preExistsAfterForce = settings.hooks.PreToolUse.some(\r\n    (h: any) =>\r\n      Array.isArray(h.hooks) && h.hooks.some((hk: any) => hk.command?.includes('claude-code-pre-edit')),\r\n  )\r\n  const postExistsAfterForce = settings.hooks.PostToolUse.some(\r\n    (h: any) =>\r\n      Array.isArray(h.hooks) && h.hooks.some((hk: any) => hk.command?.includes('claude-code-post-edit')),\r\n  )\r\n\r\n  if (!preExistsAfterForce) {\r\n    settings.hooks.PreToolUse.push({\r\n      matcher: 'Edit|Write',\r\n      hooks: [\r\n        { type: 'command', command: preEditScript },\r\n      ],\r\n    })\r\n  }\r\n  if (!postExistsAfterForce) {\r\n    settings.hooks.PostToolUse.push({\r\n      matcher: 'Edit|Write',\r\n      hooks: [\r\n        { type: 'command', command: postEditScript },\r\n      ],\r\n    })\r\n  }\r\n\r\n  // Install resilience hooks (ADR-0007)\r\n  if (existsSync(resilienceMjsAbs)) {\r\n    if (!settings.hooks.PermissionRequest) {\r\n      settings.hooks.PermissionRequest = []\r\n    }\r\n    if (!settings.hooks.Stop) {\r\n      settings.hooks.Stop = []\r\n    }\r\n    if (!settings.hooks.StopFailure) {\r\n      settings.hooks.StopFailure = []\r\n    }\r\n\r\n    const permReqExists = settings.hooks.PermissionRequest.some(\r\n      (h: any) =>\r\n        Array.isArray(h.hooks) &&\r\n        h.hooks.some(\r\n          (hk: any) => hk.command?.includes('harness-hook-handler'),\r\n        ),\r\n    )\r\n    const stopExists = settings.hooks.Stop.some(\r\n      (h: any) =>\r\n        Array.isArray(h.hooks) &&\r\n        h.hooks.some(\r\n          (hk: any) => hk.command?.includes('harness-hook-handler'),\r\n        ),\r\n    )\r\n    const stopFailExists = settings.hooks.StopFailure.some(\r\n      (h: any) =>\r\n        Array.isArray(h.hooks) &&\r\n        h.hooks.some(\r\n          (hk: any) => hk.command?.includes('harness-hook-handler'),\r\n        ),\r\n    )\r\n\r\n    if (!permReqExists) {\r\n      settings.hooks.PermissionRequest.push({\r\n        matcher: 'Bash',\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n      settings.hooks.PermissionRequest.push({\r\n        matcher:\r\n          'Edit|Write|Glob|Grep|WebSearch|WebFetch|NotebookEdit',\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n    }\r\n\r\n    const postBashExists = settings.hooks.PostToolUse.some(\r\n      (h: any) =>\r\n        h.matcher === 'Bash' &&\r\n        Array.isArray(h.hooks) &&\r\n        h.hooks.some(\r\n          (hk: any) => hk.command?.includes('harness-hook-handler'),\r\n        ),\r\n    )\r\n    if (!postBashExists) {\r\n      settings.hooks.PostToolUse.push({\r\n        matcher: 'Bash',\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n    }\r\n\r\n    // Auto-handoff (Q3-E): register PostToolUse[Skill] matcher so the handler\r\n    // can fire on skill completion when HARNESS_HANDOFF_SKILL_TRIGGER != 'none'.\r\n    // The matcher is always registered (cheap); the handler's env gate decides\r\n    // whether to actually fire. Idempotent.\r\n    const postSkillExists = settings.hooks.PostToolUse.some(\r\n      (h: any) =>\r\n        h.matcher === 'Skill' &&\r\n        Array.isArray(h.hooks) &&\r\n        h.hooks.some(\r\n          (hk: any) => hk.command?.includes('harness-hook-handler'),\r\n        ),\r\n    )\r\n    if (!postSkillExists) {\r\n      settings.hooks.PostToolUse.push({\r\n        matcher: 'Skill',\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n    }\r\n\r\n    if (!stopExists) {\r\n      settings.hooks.Stop.push({\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n    }\r\n\r\n    if (!stopFailExists) {\r\n      settings.hooks.StopFailure.push({\r\n        hooks: [\r\n          { type: 'command', command: resilienceCmd },\r\n        ],\r\n      })\r\n    }\r\n  }\r\n\r\n  mkdirSync(settingsDir, { recursive: true })\r\n  writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8')\r\n  return true\r\n}\r\n\r\nconst HARNESS_PERMISSIONS_ALLOW = [\r\n  'Read',\r\n  'Write',\r\n  'Edit',\r\n  'Glob',\r\n  'Grep',\r\n  'WebSearch',\r\n  'WebFetch',\r\n  'NotebookEdit',\r\n  'Bash(node *)',\r\n  'Bash(npm *)',\r\n  'Bash(npx *)',\r\n  'Bash(git *)',\r\n  'Bash(mkdir *)',\r\n  'Bash(ls *)',\r\n  'Bash(cat *)',\r\n  'Bash(head *)',\r\n  'Bash(tail *)',\r\n  'Bash(cp *)',\r\n  'Bash(mv *)',\r\n  'Bash(echo *)',\r\n  'Bash(which *)',\r\n  'Bash(pwd)',\r\n  'Bash(cd *)',\r\n  'Bash(tsc *)',\r\n  'Bash(vitest *)',\r\n  'Bash(eslint *)',\r\n  'Bash(prettier *)',\r\n  'Bash(harness-toolkit *)',\r\n  'Bash(harness-rd-toolkit *)',\r\n  'Bash(grep *)',\r\n  'Bash(find *)',\r\n  'Bash(sort *)',\r\n  'Bash(wc *)',\r\n  'Bash(diff *)',\r\n  'Bash(gh *)',\r\n  'Bash(curl *)',\r\n  'Bash(chmod *)',\r\n  'Bash(cmd *)',\r\n  'Bash(command_substitution)',\r\n  'Bash(pipeline)',\r\n  // 含 shell 变量插值（simple_expansion）的常见自检命令 — Claude Code 对 $VAR 仍弹窗，\r\n  // 这里加显式模式覆盖 harness 开发高频场景。详见 .claude/skills/harness-permissions/SKILL.md。\r\n  'Bash(node -e *)',\r\n  'Bash(node --check *)',\r\n  'Bash(CLAUDE_PROJECT_DIR=* *)',\r\n  'Bash(PORT=* node *)',\r\n  'Bash(NODE_OPTIONS=* *)',\r\n  'Bash(PATH=* *)',\r\n  'Bash(python3 -c *)',\r\n  'Bash(python -c *)',\r\n  'Bash(*)',\r\n]\r\n\r\nconst HARNESS_PERMISSIONS_ASK = [\r\n  // 文件删除（含大小写变体）— rm 已移到 deny，这里保留 rmdir/del 的大小写变体\r\n  'Bash(RM *)',\r\n  'Bash(Rm *)',\r\n  'Bash(rmdir *)',\r\n  'Bash(Rmdir *)',\r\n  'Bash(del *)',\r\n  // 磁盘擦除\r\n  'Bash(dd *)',\r\n  'Bash(shred *)',\r\n  // Git 改写/删除历史\r\n  'Bash(git reset --hard *)',\r\n  'Bash(git push --force *)',\r\n  'Bash(git push --force-with-lease *)',\r\n  'Bash(git push --delete *)',\r\n  'Bash(git rebase -i *)',\r\n  'Bash(git clean *)',\r\n  'Bash(git branch -D *)',\r\n  'Bash(git checkout -- *)',\r\n  'Bash(git restore *)',\r\n  // 权限放宽\r\n  'Bash(chmod 777 *)',\r\n  // 进程强制终止\r\n  'Bash(kill -9 *)',\r\n  'Bash(pkill *)',\r\n  'Bash(killall *)',\r\n  'Bash(taskkill /F *)',\r\n]\r\n\r\nconst HARNESS_PERMISSIONS_DENY = [\r\n  // 文件删除（rm 主路径 — 直接拒绝，强制用户显式 approve 或改用 rmdir）\r\n  'Bash(rm *)',\r\n  'Bash(rm -rf *)',\r\n  // 系统控制 / 关机\r\n  'Bash(shutdown *)',\r\n  'Bash(reboot *)',\r\n  'Bash(halt *)',\r\n  'Bash(poweroff *)',\r\n  'Bash(init 0)',\r\n  'Bash(init 6)',\r\n  // 防火墙 / 网络\r\n  'Bash(iptables -F *)',\r\n  'Bash(ufw *)',\r\n  // 磁盘管理\r\n  'Bash(fdisk *)',\r\n  'Bash(mkfs *)',\r\n  // Windows cmd（单斜杠 + 双斜杠，覆盖 Git Bash 与原生 cmd）\r\n  'Bash(cmd /c format *)',\r\n  'Bash(cmd //c format *)',\r\n  'Bash(cmd /c diskpart *)',\r\n  'Bash(cmd //c diskpart *)',\r\n  'Bash(cmd /c net user *)',\r\n  'Bash(cmd //c net user *)',\r\n  'Bash(cmd /c net stop *)',\r\n  'Bash(cmd //c net stop *)',\r\n  'Bash(cmd /c sc delete *)',\r\n  'Bash(cmd //c sc delete *)',\r\n  'Bash(cmd /c bcdedit *)',\r\n  'Bash(cmd //c bcdedit *)',\r\n  'Bash(cmd /c cipher /w *)',\r\n  'Bash(cmd //c cipher /w *)',\r\n  'Bash(cmd /c reg delete *)',\r\n  'Bash(cmd //c reg delete *)',\r\n  'Bash(cmd /c del /f *)',\r\n  'Bash(cmd //c del /f *)',\r\n  'Bash(cmd /c rd /s *)',\r\n  'Bash(cmd //c rd /s *)',\r\n  // PowerShell（Remove-Item -Force -Recurse / Format-Volume / Stop-Computer 等）\r\n  'Bash(powershell *)',\r\n  'Bash(pwsh *)',\r\n  // GitHub 破坏性 / 凭证\r\n  'Bash(gh repo delete *)',\r\n  'Bash(gh auth login *)',\r\n  'Bash(gh auth refresh *)',\r\n  'Bash(gh auth logout *)',\r\n  'Bash(gh secret *)',\r\n  'Bash(gh ssh-key add *)',\r\n  'Bash(gh gpg-key add *)',\r\n  'Bash(gh extension install *)',\r\n  'Bash(gh codespace *)',\r\n  'Bash(gh api *)',\r\n  // 远程代码执行\r\n  'Bash(curl * | bash)',\r\n  'Bash(curl * | sh)',\r\n  'Bash(curl * | bash -)',\r\n  'Bash(curl * | sh -)',\r\n  'Bash(wget * | bash)',\r\n  'Bash(wget * | sh)',\r\n  'Bash(npm exec *)',\r\n  'Bash(npx --package=* *)',\r\n]\r\n\r\nexport function installPermissionsToSettings(targetDir: string): boolean {\r\n  const settingsDir = join(targetDir, '.claude')\r\n  const settingsPath = join(settingsDir, 'settings.local.json')\r\n\r\n  let settings: Record<string, any> = {}\r\n  if (existsSync(settingsPath)) {\r\n    try {\r\n      settings = JSON.parse(readFileSync(settingsPath, 'utf-8'))\r\n    } catch {\r\n      settings = {}\r\n    }\r\n  }\r\n\r\n  if (!settings.permissions) settings.permissions = {}\r\n  if (!settings.permissions.allow) settings.permissions.allow = []\r\n  if (!settings.permissions.ask) settings.permissions.ask = []\r\n  if (!settings.permissions.deny) settings.permissions.deny = []\r\n\r\n  const allowSet = new Set(settings.permissions.allow)\r\n  for (const p of HARNESS_PERMISSIONS_ALLOW) {\r\n    if (!allowSet.has(p)) {\r\n      settings.permissions.allow.push(p)\r\n    }\r\n  }\r\n\r\n  const askSet = new Set(settings.permissions.ask)\r\n  for (const p of HARNESS_PERMISSIONS_ASK) {\r\n    if (!askSet.has(p)) {\r\n      settings.permissions.ask.push(p)\r\n    }\r\n  }\r\n\r\n  const denySet = new Set(settings.permissions.deny)\r\n  for (const p of HARNESS_PERMISSIONS_DENY) {\r\n    if (!denySet.has(p)) {\r\n      settings.permissions.deny.push(p)\r\n    }\r\n  }\r\n\r\n  mkdirSync(settingsDir, { recursive: true })\r\n  writeFileSync(settingsPath, JSON.stringify(settings, null, 2), 'utf-8')\r\n  return true\r\n}\r\n\r\nexport function formatReport(result: InitResult): string {\r\n  const created = result.files.filter(f => f.result === 'created')\r\n  const skipped = result.files.filter(f => f.result === 'skipped')\r\n  const overwritten = result.files.filter(f => f.result === 'overwritten')\r\n  const appended = result.files.filter(f => f.result === 'appended')\r\n\r\n  const lines: string[] = ['harness-rd-toolkit init complete.', '']\r\n\r\n  if (created.length > 0) {\r\n    lines.push(`Created (${created.length}):`)\r\n    for (const f of created) lines.push(`  + ${f.path}`)\r\n  }\r\n  if (appended.length > 0) {\r\n    lines.push(`Appended — existing file preserved, template block appended (${appended.length}):`)\r\n    for (const f of appended) lines.push(`  ↧ ${f.path}`)\r\n  }\r\n  if (skipped.length > 0) {\r\n    lines.push(`Skipped — already exists (${skipped.length}):`)\r\n    for (const f of skipped) lines.push(`  ~ ${f.path}`)\r\n  }\r\n  if (overwritten.length > 0) {\r\n    lines.push(`Overwritten (${overwritten.length}):`)\r\n    for (const f of overwritten) lines.push(`  ! ${f.path}`)\r\n  }\r\n  if (result.dirs.length > 0) {\r\n    lines.push('')\r\n    lines.push(`Directories created: ${result.dirs.join(', ')}`)\r\n  }\r\n\r\n  if (result.backupDir) {\r\n    lines.push('')\r\n    lines.push(`Backup created: ${result.backupDir}`)\r\n  }\r\n\r\n  if (result.hooksInstalled) {\r\n    lines.push('')\r\n    lines.push('Claude Code hooks installed in .claude/settings.local.json')\r\n  }\r\n\r\n  if (result.permissionsInstalled) {\r\n    lines.push('')\r\n    lines.push('Claude Code permissions installed in .claude/settings.local.json')\r\n  }\r\n\r\n  // Standalone Skills section\r\n  if (result.skillsMirror) {\r\n    lines.push('')\r\n    const m = result.skillsMirror\r\n    const totalTargets = m.targetDirs.length\r\n    const status = m.rejected.length > 0 ? 'rejected' : (m.warnings.length > 0 ? 'warned' : 'ok')\r\n    lines.push(`Skills Mirror (${status}): targets=${totalTargets} created=${m.created} skipped=${m.skipped} warned=${m.warned} rejected=${m.rejected.length}`)\r\n    for (const dir of m.targetDirs) {\r\n      lines.push(`  ${dir}`)\r\n    }\r\n    for (const r of m.rejected) {\r\n      lines.push(`  REJECTED ${r.skill}: ${r.reason}${r.offender ? ' (' + r.offender + ')' : ''}`)\r\n    }\r\n    for (const w of m.warnings) {\r\n      lines.push('  ' + w.split(String.fromCharCode(10)).join(String.fromCharCode(10) + '  '))\r\n    }\r\n  }\r\n\r\n  if (result.standaloneSkills && result.standaloneSkills.length > 0) {\r\n    lines.push('')\r\n    lines.push(`Standalone Skills (${result.standaloneSkills.length}):`)\r\n    for (const s of result.standaloneSkills) {\r\n      if (s.method === 'symlink') {\r\n        lines.push(`  ${s.skill.padEnd(28)} symlink → ${s.source}`)\r\n      } else {\r\n        const suffix = s.symlinkFallback ? ' (symlink failed, fallback)' : ''\r\n        lines.push(`  ${s.skill.padEnd(28)} copy (${s.source})${suffix}`)\r\n      }\r\n    }\r\n  }\r\n\r\n  lines.push('')\r\n  if (skipped.length > 0) {\r\n    lines.push('Skipped files were not overwritten. Use --force to overwrite.')\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n","import fs from 'node:fs'\r\nimport path from 'node:path'\r\n\r\nexport const MIRROR_TARGETS = [\r\n  { id: 'trae', dir: '.trae/skills' },\r\n  { id: 'opencode', dir: '.opencode/skills' },\r\n] as const\r\n\r\nexport type MirrorTargetId = (typeof MIRROR_TARGETS)[number]['id']\r\n\r\nexport interface MirrorOpts {\r\n  dryRun?: boolean\r\n  force?: boolean\r\n}\r\n\r\nexport interface MirrorResult {\r\n  created: number\r\n  skipped: number\r\n  warned: number\r\n  rejected: Array<{ skill: string; reason: string; offender?: string }>\r\n}\r\n\r\nexport type TargetState =\r\n  | 'missing'\r\n  | 'correct-symlink'\r\n  | 'wrong-symlink'\r\n  | 'plain-dir'\r\n  | 'dangling'\r\n\r\nexport interface LinkCheckResult {\r\n  ok: boolean\r\n  reason?: 'out-of-tree-symlink'\r\n  offender?: string\r\n}\r\n\r\nfunction readSourceSkills(projectRoot: string): string[] {\r\n  const srcDir = path.join(projectRoot, '.claude', 'skills')\r\n  if (!fs.existsSync(srcDir)) {\r\n    return []\r\n  }\r\n  return fs\r\n    .readdirSync(srcDir, { withFileTypes: true })\r\n    .filter((d) => {\r\n      return d.isDirectory()\r\n    })\r\n    .map((d) => {\r\n      return d.name\r\n    })\r\n}\r\n\r\nfunction isLinkPointingToSource(targetPath: string, sourceRel: string): 'correct' | 'wrong' | 'dangling' {\r\n  let target: string\r\n  try {\r\n    target = fs.readlinkSync(targetPath)\r\n  } catch {\r\n    return 'wrong'\r\n  }\r\n  const absTarget = path.resolve(path.dirname(targetPath), target)\r\n  const skillAbs = path.resolve(sourceRel)\r\n  if (absTarget !== skillAbs && !absTarget.startsWith(skillAbs + path.sep)) {\r\n    return 'wrong'\r\n  }\r\n  try {\r\n    fs.statSync(absTarget)\r\n    return 'correct'\r\n  } catch {\r\n    return 'dangling'\r\n  }\r\n}\r\n\r\nexport function classifyTarget(targetPath: string, sourceRel: string): TargetState {\r\n  if (!fs.existsSync(targetPath)) {\r\n    return 'missing'\r\n  }\r\n  const lstat = fs.lstatSync(targetPath)\r\n  if (lstat.isSymbolicLink()) {\r\n    const verdict = isLinkPointingToSource(targetPath, sourceRel)\r\n    if (verdict === 'correct') return 'correct-symlink'\r\n    if (verdict === 'dangling') return 'dangling'\r\n    return 'wrong-symlink'\r\n  }\r\n  if (lstat.isDirectory()) {\r\n    let readlinkOk = false\r\n    try {\r\n      fs.readlinkSync(targetPath)\r\n      readlinkOk = true\r\n    } catch {\r\n      readlinkOk = false\r\n    }\r\n    if (readlinkOk) {\r\n      const verdict = isLinkPointingToSource(targetPath, sourceRel)\r\n      if (verdict === 'correct') return 'correct-symlink'\r\n      if (verdict === 'dangling') return 'dangling'\r\n      return 'wrong-symlink'\r\n    }\r\n    return 'plain-dir'\r\n  }\r\n  return 'plain-dir'\r\n}\r\n\r\nexport function checkSourceLinks(skillDir: string): LinkCheckResult {\r\n  const skillAbs = path.resolve(skillDir)\r\n  const visited = new Set<string>()\r\n  const stack: string[] = [skillAbs]\r\n  let depth = 0\r\n  const MAX_DEPTH = 8\r\n\r\n  while (stack.length > 0) {\r\n    if (depth++ > MAX_DEPTH * 100) {\r\n      return {\r\n        ok: false,\r\n        reason: 'out-of-tree-symlink',\r\n        offender: stack[stack.length - 1],\r\n      }\r\n    }\r\n    const current = stack.pop()!\r\n    if (visited.has(current)) {\r\n      continue\r\n    }\r\n    visited.add(current)\r\n\r\n    let entries: fs.Dirent[]\r\n    try {\r\n      entries = fs.readdirSync(current, { withFileTypes: true })\r\n    } catch {\r\n      continue\r\n    }\r\n    for (const entry of entries) {\r\n      const entryPath = path.join(current, entry.name)\r\n      let lstat: fs.Stats\r\n      try {\r\n        lstat = fs.lstatSync(entryPath)\r\n      } catch {\r\n        continue\r\n      }\r\n      if (lstat.isSymbolicLink()) {\r\n        let target: string\r\n        try {\r\n          target = fs.readlinkSync(entryPath)\r\n        } catch {\r\n          return { ok: false, reason: 'out-of-tree-symlink', offender: entryPath }\r\n        }\r\n        const absTarget = path.resolve(path.dirname(entryPath), target)\r\n        if (absTarget !== skillAbs && !absTarget.startsWith(skillAbs + path.sep)) {\r\n          return { ok: false, reason: 'out-of-tree-symlink', offender: entryPath }\r\n        }\r\n      } else if (lstat.isDirectory()) {\r\n        stack.push(entryPath)\r\n      }\r\n    }\r\n  }\r\n\r\n  return { ok: true }\r\n}\r\n\r\nexport function formatPlainDirWarn(targetPath: string, projectRoot: string): string {\r\n  const rel = path.relative(projectRoot, targetPath)\r\n  return [\r\n    `\\`${rel}\\` is a plain directory, not a symlink`,\r\n    `init will skip, your skill won't be mirrored here`,\r\n    `Fix:  rm -rf ${rel}`,\r\n    `Rerun:  harness-toolkit init`,\r\n    `Reason: init won't delete your manual content to prevent overwrite`,\r\n  ].join('\\n       ')\r\n}\r\n\r\nfunction mirrorOne(\r\n  projectRoot: string,\r\n  skill: string,\r\n  target: typeof MIRROR_TARGETS[number],\r\n  force: boolean\r\n): Promise<{ action: 'created' | 'skipped' | 'warned'; warning?: string }> {\r\n  const sourceRel = path.join(projectRoot, '.claude', 'skills', skill)\r\n  const targetPath = path.join(projectRoot, target.dir, skill)\r\n  const targetDir = path.dirname(targetPath)\r\n\r\n  fs.mkdirSync(targetDir, { recursive: true })\r\n\r\n  const rel = path.relative(targetDir, sourceRel)\r\n  const state = classifyTarget(targetPath, sourceRel)\r\n\r\n  if (state === 'correct-symlink') {\r\n    return { action: 'skipped' }\r\n  }\r\n  if (state === 'missing' || state === 'dangling') {\r\n    try {\r\n      fs.unlinkSync(targetPath)\r\n    } catch {\r\n      /* ignore: not present */\r\n    }\r\n    if (process.platform === 'win32') {\r\n      fs.symlinkSync(rel, targetPath, 'junction')\r\n    } else {\r\n      fs.symlinkSync(rel, targetPath)\r\n    }\r\n    return { action: 'created' }\r\n  }\r\n  if (state === 'wrong-symlink') {\r\n    if (!force) {\r\n      return {\r\n        action: 'warned',\r\n        warning: `\\`${targetPath}\\` is a symlink pointing elsewhere; use --force to recreate`,\r\n      }\r\n    }\r\n    fs.unlinkSync(targetPath)\r\n    if (process.platform === 'win32') {\r\n      fs.symlinkSync(rel, targetPath, 'junction')\r\n    } else {\r\n      fs.symlinkSync(rel, targetPath)\r\n    }\r\n    return { action: 'created' }\r\n  }\r\n  return {\r\n    action: 'warned',\r\n    warning: formatPlainDirWarn(targetPath, projectRoot),\r\n  }\r\n}\r\n\r\nexport function mirrorSkills(\r\n  projectRoot: string,\r\n  opts: MirrorOpts = {}\r\n): Promise<MirrorResult> {\r\n  const skills = readSourceSkills(projectRoot)\r\n  const result: MirrorResult = {\r\n    created: 0,\r\n    skipped: 0,\r\n    warned: 0,\r\n    rejected: [],\r\n  }\r\n\r\n  for (const skill of skills) {\r\n    const skillDir = path.join(projectRoot, '.claude', 'skills', skill)\r\n    const check = checkSourceLinks(skillDir)\r\n    if (!check.ok) {\r\n      result.rejected.push({\r\n        skill,\r\n        reason: check.reason ?? 'unknown',\r\n        offender: check.offender,\r\n      })\r\n      continue\r\n    }\r\n\r\n    for (const target of MIRROR_TARGETS) {\r\n      const r = mirrorOne(projectRoot, skill, target, opts.force ?? false)\r\n      if (r.action === 'created') {\r\n        result.created++\r\n      } else if (r.action === 'skipped') {\r\n        result.skipped++\r\n      } else if (r.action === 'warned') {\r\n        result.warned++\r\n      }\r\n    }\r\n  }\r\n\r\n  return result\r\n}\r\n","import { createHash } from 'crypto'\r\nimport { createInterface } from 'readline'\r\nimport {\r\n  existsSync,\r\n  readFileSync,\r\n  writeFileSync,\r\n  mkdirSync,\r\n  copyFileSync,\r\n  readdirSync,\r\n  statSync,\r\n  lstatSync,\r\n  readlinkSync,\r\n} from 'fs'\r\nimport { join, dirname, relative } from 'path'\r\nimport { homedir } from 'os'\r\nimport {\r\n  scaffoldDir,\r\n  installHooksToSettings,\r\n  installPermissionsToSettings,\r\n  updateGitignore,\r\n  resolveHookScriptsSourceDir,\r\n  STANDALONE_SKILLS,\r\n  CONTEXT_TEMPLATE,\r\n  type StandaloneSkillResult,\r\n} from './init.js'\r\n\r\nexport type FileAction =\r\n  | 'created'\r\n  | 'updated'\r\n  | 'skipped-up-to-date'\r\n  | 'skipped-conflict'\r\n  | 'skipped-symlink'\r\n  | 'skipped-missing-source'\r\n\r\nexport interface UpdateFileResult {\r\n  path: string\r\n  action: FileAction\r\n}\r\n\r\nexport interface UpdateOptions {\r\n  force?: boolean\r\n  interactive?: boolean\r\n  dryRun?: boolean\r\n  hooks?: boolean\r\n  permissions?: boolean\r\n  skipStandaloneSkills?: boolean\r\n}\r\n\r\nexport interface UpdateResult {\r\n  targetDir: string\r\n  sourceDir: string\r\n  files: UpdateFileResult[]\r\n  standaloneSkills: StandaloneSkillResult[]\r\n  hooksUpdated?: boolean\r\n  permissionsUpdated?: boolean\r\n  gitignoreUpdated: boolean\r\n  context: UpdateFileResult\r\n  conflicts: string[]\r\n}\r\n\r\nconst ROOT_FILES = [\r\n  'pipeline.yaml',\r\n  'pipeline-full.yaml',\r\n  'pipeline-incremental.yaml',\r\n  'pipeline-lightweight.yaml',\r\n  'git-strategy.yaml',\r\n]\r\n\r\nconst SYNC_DIRS = [\r\n  '.claude/skills',\r\n  'gates',\r\n  'teams',\r\n]\r\n\r\nconst STANDALONE_SET = new Set(STANDALONE_SKILLS)\r\n\r\nconst SKIP_REL_PREFIXES = [\r\n  'gates/rules-src',\r\n]\r\n\r\nfunction normalizeEol(input: string): string {\r\n  return input.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n')\r\n}\r\n\r\nfunction hashContent(input: string): string {\r\n  return createHash('sha256').update(normalizeEol(input)).digest('hex')\r\n}\r\n\r\nfunction hashFile(absPath: string): string | null {\r\n  if (!existsSync(absPath)) return null\r\n  let content: string\r\n  try {\r\n    content = readFileSync(absPath, 'utf-8')\r\n  } catch {\r\n    return null\r\n  }\r\n  return hashContent(content)\r\n}\r\n\r\nfunction isSymlink(absPath: string): boolean {\r\n  try {\r\n    return lstatSync(absPath).isSymbolicLink()\r\n  } catch {\r\n    return false\r\n  }\r\n}\r\n\r\nfunction readlinkSafe(p: string): string | null {\r\n  try {\r\n    return readlinkSync(p)\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction listFilesRecursive(rootAbs: string): string[] {\r\n  const out: string[] = []\r\n  if (!existsSync(rootAbs)) return out\r\n  for (const entry of readdirSync(rootAbs)) {\r\n    const abs = join(rootAbs, entry)\r\n    const st = lstatSync(abs)\r\n    if (st.isDirectory()) {\r\n      out.push(...listFilesRecursive(abs))\r\n    } else if (st.isFile()) {\r\n      out.push(abs)\r\n    }\r\n  }\r\n  return out\r\n}\r\n\r\nfunction toForward(p: string): string {\r\n  return p.split('\\\\').join('/')\r\n}\r\n\r\nfunction promptYesNo(question: string): Promise<boolean> {\r\n  return new Promise((resolvePromise) => {\r\n    const rl = createInterface({ input: process.stdin, output: process.stdout })\r\n    rl.question(question, (answer) => {\r\n      rl.close()\r\n      resolvePromise(/^y(es)?$/i.test(answer.trim()))\r\n    })\r\n  })\r\n}\r\n\r\nconst PROTECTED_FILES = new Set([\r\n  'CLAUDE.md',\r\n  'CONTEXT.md',\r\n  '.claude/settings.json',\r\n  '.claude/settings.local.json',\r\n])\r\n\r\nexport type ConflictChoice = 'keep-dest' | 'take-toolkit' | 'manual-merge'\r\n\r\nexport interface ConflictOption {\r\n  id: ConflictChoice\r\n  label: string\r\n  effect: string\r\n}\r\n\r\nexport const CONFLICT_OPTIONS: ConflictOption[] = [\r\n  {\r\n    id: 'keep-dest',\r\n    label: 'Keep my version',\r\n    effect: 'Leaves the file in the target untouched; the toolkit version is not applied.',\r\n  },\r\n  {\r\n    id: 'take-toolkit',\r\n    label: 'Take toolkit version',\r\n    effect: 'Overwrites the target file with the toolkit scaffold version.',\r\n  },\r\n  {\r\n    id: 'manual-merge',\r\n    label: 'Manual merge',\r\n    effect: 'Pauses so you can resolve the diff by hand; the file is left as-is until you re-run update.',\r\n  },\r\n]\r\n\r\nexport interface PendingConflict {\r\n  relPath: string\r\n  srcAbs: string\r\n  destAbs: string\r\n}\r\n\r\nexport class RejectForce extends Error {\r\n  readonly protectedPaths: string[]\r\n  constructor(protectedPaths: string[]) {\r\n    super(`--force refused for protected file(s): ${protectedPaths.join(', ')}`)\r\n    this.name = 'RejectForce'\r\n    this.protectedPaths = protectedPaths\r\n  }\r\n}\r\n\r\nexport function isProtected(relPath: string): boolean {\r\n  const norm = toForward(relPath)\r\n  return PROTECTED_FILES.has(norm)\r\n}\r\n\r\nexport interface ConflictDecision {\r\n  relPath: string\r\n  choice: ConflictChoice\r\n}\r\n\r\nexport async function smartConflictPanel(\r\n  conflicts: PendingConflict[],\r\n  choose: (relPath: string) => Promise<ConflictChoice>,\r\n): Promise<ConflictDecision[]> {\r\n  const decisions: ConflictDecision[] = []\r\n  for (const c of conflicts) {\r\n    if (!isProtected(c.relPath)) continue\r\n    const choice = await choose(c.relPath)\r\n    decisions.push({ relPath: c.relPath, choice })\r\n  }\r\n  return decisions\r\n}\r\n\r\nfunction syncOneFile(\r\n  sourceDir: string,\r\n  targetDir: string,\r\n  relPath: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n): UpdateFileResult {\r\n  const srcAbs = join(sourceDir, relPath)\r\n  const destAbs = join(targetDir, relPath)\r\n\r\n  if (!existsSync(srcAbs)) {\r\n    return { path: relPath, action: 'skipped-missing-source' }\r\n  }\r\n\r\n  if (isSymlink(destAbs)) {\r\n    return { path: relPath, action: 'skipped-symlink' }\r\n  }\r\n\r\n  const srcHash = hashFile(srcAbs)\r\n  const destHash = hashFile(destAbs)\r\n\r\n  if (destHash === null) {\r\n    if (!dryRun) {\r\n      mkdirSync(dirname(destAbs), { recursive: true })\r\n      copyFileSync(srcAbs, destAbs)\r\n    }\r\n    return { path: relPath, action: 'created' }\r\n  }\r\n\r\n  if (srcHash === destHash) {\r\n    return { path: relPath, action: 'skipped-up-to-date' }\r\n  }\r\n\r\n  pendingConflicts.push({ relPath, srcAbs, destAbs })\r\n  return { path: relPath, action: 'skipped-conflict' }\r\n}\r\n\r\nfunction resolveStandaloneSource(name: string, sourceDir: string): string | null {\r\n  const globalSkillDir = join(homedir(), '.agents', 'skills', name)\r\n  if (existsSync(globalSkillDir)) return globalSkillDir\r\n  const scaffoldSkillDir = join(sourceDir, '.claude', 'skills', name)\r\n  if (existsSync(scaffoldSkillDir)) return scaffoldSkillDir\r\n  return null\r\n}\r\n\r\nfunction syncStandaloneSkillFiles(\r\n  sourceDir: string,\r\n  targetDir: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n  skipStandaloneSkills: boolean,\r\n): { results: UpdateFileResult[]; standaloneResults: StandaloneSkillResult[] } {\r\n  const out: UpdateFileResult[] = []\r\n  const standaloneResults: StandaloneSkillResult[] = []\r\n\r\n  if (skipStandaloneSkills) return { results: out, standaloneResults }\r\n\r\n  for (const name of STANDALONE_SKILLS) {\r\n    const destDir = join(targetDir, '.claude', 'skills', name)\r\n    if (existsSync(destDir) && isSymlink(destDir)) {\r\n      out.push({ path: `.claude/skills/${name}`, action: 'skipped-symlink' })\r\n      standaloneResults.push({ skill: name, method: 'symlink', source: readlinkSafe(destDir) ?? '' })\r\n      continue\r\n    }\r\n    const srcSkillDir = resolveStandaloneSource(name, sourceDir)\r\n    if (!srcSkillDir) {\r\n      out.push({ path: `.claude/skills/${name}`, action: 'skipped-missing-source' })\r\n      continue\r\n    }\r\n    const isGlobal = srcSkillDir === join(homedir(), '.agents', 'skills', name)\r\n    standaloneResults.push({\r\n      skill: name,\r\n      method: isGlobal ? 'symlink' : 'copy',\r\n      source: isGlobal ? srcSkillDir : 'scaffold',\r\n    })\r\n    const files = listFilesRecursive(srcSkillDir)\r\n    for (const abs of files) {\r\n      const rel = relative(srcSkillDir, abs)\r\n      const relPath = `.claude/skills/${name}/${toForward(rel)}`\r\n      out.push(syncOneFileFromAbs(srcSkillDir, targetDir, relPath, abs, pendingConflicts, dryRun))\r\n    }\r\n  }\r\n  return { results: out, standaloneResults }\r\n}\r\n\r\nfunction syncHookScriptFiles(\r\n  sourceDir: string,\r\n  targetDir: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n): UpdateFileResult[] {\r\n  const hookSrc = resolveHookScriptsSourceDir(sourceDir)\r\n  if (!hookSrc) return []\r\n  const out: UpdateFileResult[] = []\r\n  for (const abs of listFilesRecursive(hookSrc)) {\r\n    const rel = relative(hookSrc, abs)\r\n    const relPath = `scripts/hooks/${toForward(rel)}`\r\n    out.push(syncOneFileFromAbs(hookSrc, targetDir, relPath, abs, pendingConflicts, dryRun))\r\n  }\r\n  return out\r\n}\r\n\r\nfunction syncOneFileFromAbs(\r\n  _sourceRoot: string,\r\n  targetDir: string,\r\n  relPath: string,\r\n  srcAbs: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n): UpdateFileResult {\r\n  const destAbs = join(targetDir, relPath)\r\n  if (!existsSync(srcAbs)) {\r\n    return { path: relPath, action: 'skipped-missing-source' }\r\n  }\r\n  if (isSymlink(destAbs)) {\r\n    return { path: relPath, action: 'skipped-symlink' }\r\n  }\r\n  const srcHash = hashFile(srcAbs)\r\n  const destHash = hashFile(destAbs)\r\n  if (destHash === null) {\r\n    if (!dryRun) {\r\n      mkdirSync(dirname(destAbs), { recursive: true })\r\n      copyFileSync(srcAbs, destAbs)\r\n    }\r\n    return { path: relPath, action: 'created' }\r\n  }\r\n  if (srcHash === destHash) {\r\n    return { path: relPath, action: 'skipped-up-to-date' }\r\n  }\r\n  pendingConflicts.push({ relPath, srcAbs, destAbs })\r\n  return { path: relPath, action: 'skipped-conflict' }\r\n}\r\n\r\nfunction syncHarnessSkillFiles(\r\n  sourceDir: string,\r\n  targetDir: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n): UpdateFileResult[] {\r\n  const out: UpdateFileResult[] = []\r\n  const skillsRoot = join(sourceDir, '.claude', 'skills')\r\n  if (!existsSync(skillsRoot)) return out\r\n\r\n  for (const skill of readdirSync(skillsRoot)) {\r\n    if (STANDALONE_SET.has(skill)) continue\r\n    const skillAbs = join(skillsRoot, skill)\r\n    if (!statSync(skillAbs).isDirectory()) continue\r\n\r\n    const files = listFilesRecursive(skillAbs)\r\n    for (const abs of files) {\r\n      const rel = relative(skillsRoot, abs)\r\n      const relPath = `.claude/skills/${toForward(rel)}`\r\n      out.push(syncOneFile(sourceDir, targetDir, relPath, pendingConflicts, dryRun))\r\n    }\r\n  }\r\n  return out\r\n}\r\n\r\nfunction syncDirTree(\r\n  sourceDir: string,\r\n  targetDir: string,\r\n  dirRel: string,\r\n  pendingConflicts: PendingConflict[],\r\n  dryRun: boolean,\r\n): UpdateFileResult[] {\r\n  const out: UpdateFileResult[] = []\r\n  const srcRoot = join(sourceDir, dirRel)\r\n  if (!existsSync(srcRoot)) return out\r\n  const files = listFilesRecursive(srcRoot)\r\n  for (const abs of files) {\r\n    const rel = relative(srcRoot, abs)\r\n    const relPath = `${dirRel}/${toForward(rel)}`\r\n    if (SKIP_REL_PREFIXES.some((p) => relPath === p || relPath.startsWith(p + '/'))) continue\r\n    out.push(syncOneFile(sourceDir, targetDir, relPath, pendingConflicts, dryRun))\r\n  }\r\n  return out\r\n}\r\n\r\nfunction syncContext(targetDir: string, dryRun: boolean): UpdateFileResult {\r\n  const ctxPath = join(targetDir, 'CONTEXT.md')\r\n  if (!existsSync(ctxPath)) {\r\n    if (!dryRun) writeFileSync(ctxPath, CONTEXT_TEMPLATE, 'utf-8')\r\n    return { path: 'CONTEXT.md', action: 'created' }\r\n  }\r\n  const existingHash = hashFile(ctxPath)\r\n  const templateHash = hashContent(CONTEXT_TEMPLATE)\r\n  if (existingHash === templateHash) {\r\n    return { path: 'CONTEXT.md', action: 'skipped-up-to-date' }\r\n  }\r\n  return { path: 'CONTEXT.md', action: 'skipped-conflict' }\r\n}\r\n\r\nasync function resolveConflictsInteractively(\r\n  conflicts: PendingConflict[],\r\n  files: UpdateFileResult[],\r\n): Promise<void> {\r\n  if (conflicts.length === 0) return\r\n  process.stdout.write(`\\n${conflicts.length} conflict(s) need a decision.\\n`)\r\n  for (const c of conflicts) {\r\n    const yes = await promptYesNo(`[conflict] ${c.relPath} differs. Overwrite with toolkit version? [y/N] `)\r\n    const idx = files.findIndex((f) => f.path === c.relPath && f.action === 'skipped-conflict')\r\n    if (yes) {\r\n      mkdirSync(dirname(c.destAbs), { recursive: true })\r\n      copyFileSync(c.srcAbs, c.destAbs)\r\n      if (idx >= 0) files[idx] = { path: c.relPath, action: 'updated' }\r\n    } else {\r\n      if (idx >= 0) files[idx] = { path: c.relPath, action: 'skipped-conflict' }\r\n    }\r\n  }\r\n}\r\n\r\nfunction resolveConflictsWithForce(\r\n  conflicts: PendingConflict[],\r\n  files: UpdateFileResult[],\r\n): void {\r\n  for (const c of conflicts) {\r\n    mkdirSync(dirname(c.destAbs), { recursive: true })\r\n    copyFileSync(c.srcAbs, c.destAbs)\r\n    const idx = files.findIndex((f) => f.path === c.relPath && f.action === 'skipped-conflict')\r\n    if (idx >= 0) files[idx] = { path: c.relPath, action: 'updated' }\r\n  }\r\n}\r\n\r\nexport async function runUpdate(\r\n  targetDir: string,\r\n  options: UpdateOptions = {},\r\n): Promise<UpdateResult> {\r\n  const opts: Required<UpdateOptions> = {\r\n    force: options.force ?? false,\r\n    interactive: options.interactive ?? false,\r\n    dryRun: options.dryRun ?? false,\r\n    hooks: options.hooks ?? true,\r\n    permissions: options.permissions ?? true,\r\n    skipStandaloneSkills: options.skipStandaloneSkills ?? false,\r\n  }\r\n\r\n  const sourceDir = scaffoldDir()\r\n  if (!existsSync(targetDir)) {\r\n    mkdirSync(targetDir, { recursive: true })\r\n  }\r\n\r\n  const files: UpdateFileResult[] = []\r\n  const pendingConflicts: PendingConflict[] = []\r\n\r\n  for (const rootFile of ROOT_FILES) {\r\n    files.push(syncOneFile(sourceDir, targetDir, rootFile, pendingConflicts, opts.dryRun))\r\n  }\r\n\r\n  files.push(...syncHarnessSkillFiles(sourceDir, targetDir, pendingConflicts, opts.dryRun))\r\n\r\n  const { results: standaloneFiles, standaloneResults } = syncStandaloneSkillFiles(\r\n    sourceDir,\r\n    targetDir,\r\n    pendingConflicts,\r\n    opts.dryRun,\r\n    opts.skipStandaloneSkills,\r\n  )\r\n  files.push(...standaloneFiles)\r\n  files.push(...syncHookScriptFiles(sourceDir, targetDir, pendingConflicts, opts.dryRun))\r\n\r\n  for (const dirRel of SYNC_DIRS) {\r\n    if (dirRel === '.claude/skills') continue\r\n    files.push(...syncDirTree(sourceDir, targetDir, dirRel, pendingConflicts, opts.dryRun))\r\n  }\r\n\r\n  const context = syncContext(targetDir, opts.dryRun)\r\n  if (context.action === 'skipped-conflict') {\r\n    pendingConflicts.push({\r\n      relPath: 'CONTEXT.md',\r\n      srcAbs: '',\r\n      destAbs: join(targetDir, 'CONTEXT.md'),\r\n    })\r\n  }\r\n\r\n  if (!opts.dryRun && pendingConflicts.length > 0) {\r\n    if (opts.interactive && process.stdin.isTTY) {\r\n      await resolveConflictsInteractively(pendingConflicts, files)\r\n    } else if (opts.force) {\r\n      resolveConflictsWithForce(pendingConflicts, files)\r\n    }\r\n  }\r\n\r\n  let hooksUpdated: boolean | undefined\r\n  if (opts.hooks && !opts.dryRun) {\r\n    hooksUpdated = installHooksToSettings(targetDir, opts.force)\r\n  }\r\n\r\n  let permissionsUpdated: boolean | undefined\r\n  if (opts.permissions && !opts.dryRun) {\r\n    permissionsUpdated = installPermissionsToSettings(targetDir)\r\n  }\r\n\r\n  let gitignoreUpdated = false\r\n  if (!opts.dryRun) {\r\n    const before = existsSync(join(targetDir, '.gitignore'))\r\n      ? readFileSync(join(targetDir, '.gitignore'), 'utf-8')\r\n      : ''\r\n    updateGitignore(targetDir)\r\n    const after = existsSync(join(targetDir, '.gitignore'))\r\n      ? readFileSync(join(targetDir, '.gitignore'), 'utf-8')\r\n      : ''\r\n    gitignoreUpdated = before !== after\r\n  }\r\n\r\n  const remainingConflicts = files\r\n    .filter((f) => f.action === 'skipped-conflict')\r\n    .map((f) => f.path)\r\n\r\n  return {\r\n    targetDir,\r\n    sourceDir,\r\n    files,\r\n    standaloneSkills: standaloneResults,\r\n    hooksUpdated,\r\n    permissionsUpdated,\r\n    gitignoreUpdated,\r\n    context,\r\n    conflicts: remainingConflicts,\r\n  }\r\n}\r\n\r\nexport function formatUpdateReport(result: UpdateResult): string {\r\n  const lines: string[] = [\r\n    `harness-rd-toolkit update — target: ${result.targetDir}`,\r\n    `source: ${result.sourceDir}`,\r\n    '',\r\n  ]\r\n\r\n  const created = result.files.filter((f) => f.action === 'created')\r\n  const updated = result.files.filter((f) => f.action === 'updated')\r\n  const upToDate = result.files.filter((f) => f.action === 'skipped-up-to-date')\r\n  const conflicts = result.files.filter((f) => f.action === 'skipped-conflict')\r\n  const missing = result.files.filter((f) => f.action === 'skipped-missing-source')\r\n  const symlinks = result.files.filter((f) => f.action === 'skipped-symlink')\r\n\r\n  if (created.length > 0) {\r\n    lines.push(`Created (${created.length}):`)\r\n    for (const f of created) lines.push(`  + ${f.path}`)\r\n  }\r\n  if (updated.length > 0) {\r\n    lines.push(`Updated (${updated.length}):`)\r\n    for (const f of updated) lines.push(`  ! ${f.path}`)\r\n  }\r\n  if (conflicts.length > 0) {\r\n    lines.push(`Conflicts — local changes preserved (${conflicts.length}):`)\r\n    for (const f of conflicts) lines.push(`  ~ ${f.path}`)\r\n    lines.push('')\r\n    lines.push('  Re-run with --force to overwrite, or --interactive to decide per-file.')\r\n  }\r\n  if (missing.length > 0) {\r\n    lines.push(`Missing in source (${missing.length}):`)\r\n    for (const f of missing) lines.push(`  ? ${f.path}`)\r\n  }\r\n  if (symlinks.length > 0) {\r\n    lines.push(`Symlinks left untouched (${symlinks.length}):`)\r\n    for (const f of symlinks) lines.push(`  @ ${f.path}`)\r\n  }\r\n\r\n  lines.push('')\r\n  lines.push(`Up-to-date: ${upToDate.length} file(s).`)\r\n\r\n  if (result.context.action === 'created') {\r\n    lines.push('CONTEXT.md: created from template.')\r\n  } else if (result.context.action === 'skipped-conflict') {\r\n    lines.push('CONTEXT.md: user-modified, left untouched.')\r\n  } else {\r\n    lines.push('CONTEXT.md: up-to-date template.')\r\n  }\r\n\r\n  if (result.hooksUpdated) {\r\n    lines.push('Claude Code hooks: merged into .claude/settings.local.json.')\r\n  } else if (result.hooksUpdated === false) {\r\n    lines.push('Claude Code hooks: not installed (script files not found).')\r\n  }\r\n\r\n  if (result.permissionsUpdated) {\r\n    lines.push('Claude Code permissions: merged into .claude/settings.local.json.')\r\n  }\r\n\r\n  if (result.gitignoreUpdated) {\r\n    lines.push('.gitignore: harness entries added.')\r\n  }\r\n\r\n  if (result.standaloneSkills.length > 0) {\r\n    lines.push('')\r\n    lines.push(`Standalone skills (${result.standaloneSkills.length}):`)\r\n    for (const s of result.standaloneSkills) {\r\n      if (s.method === 'symlink') {\r\n        lines.push(`  ${s.skill.padEnd(28)} symlink → ${s.source}`)\r\n      } else {\r\n        const suffix = s.symlinkFallback ? ' (symlink failed, fallback)' : ''\r\n        lines.push(`  ${s.skill.padEnd(28)} ${s.method} (${s.source})${suffix}`)\r\n      }\r\n    }\r\n  }\r\n\r\n  if (result.conflicts.length > 0) {\r\n    lines.push('')\r\n    lines.push(`${result.conflicts.length} conflict(s) still need your decision.`)\r\n  }\r\n\r\n  return lines.join('\\n')\r\n}\r\n","import { runGate } from './gate-engine/index.js'\r\nimport { resolve } from 'path'\r\nimport { readFileSync, writeFileSync, existsSync } from 'fs'\r\n\r\ninterface FixAction {\r\n  ruleId: string\r\n  description: string\r\n  fix: (content: string) => string\r\n}\r\n\r\nconst VAR_RE = new RegExp([String.fromCharCode(92), \"bvar\", String.fromCharCode(92), \"s+\"].join(\"\"), \"g\")\r\nconst NL_CH = String.fromCharCode(10)\r\nconst CONSOLE_DEBUG_RE = new RegExp(\"console\" + String.fromCharCode(92) + \".debug\" + String.fromCharCode(92) + \"s*\" + String.fromCharCode(92) + \"(\")\r\n\r\nconst FIXABLE_RULES: FixAction[] = [\r\n  {\r\n    ruleId: 'practice-no-var',\r\n    description: 'Replace var with const',\r\n    fix: (c: string) => c.replace(VAR_RE, \"const \"),\r\n  },\r\n  {\r\n    ruleId: 'format-no-tabs',\r\n    description: 'Replace tabs with 2 spaces',\r\n    fix: (c: string) => c.replace(/\\t/g, \"  \"),\r\n  },\r\n  {\r\n    ruleId: 'review-no-console-debug-leftovers',\r\n    description: 'Remove console.debug statements',\r\n    fix: (c: string) => c\r\n.split(NL_CH)\r\n.filter((line: string) => !CONSOLE_DEBUG_RE.test(line))\r\n.join(NL_CH),\r\n  },\r\n]\r\n\r\nexport async function handleGateFix(args: string[]): Promise<void> {\r\n  const filePath = args[2]\r\n  if (!filePath || !existsSync(filePath)) {\r\n    console.error('Usage: harness-rd-toolkit gate fix <file>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const projectRoot = process.cwd()\r\n  const bindingFile = resolve(projectRoot, '.harness', 'gates', 'bindings', 'pre-edit.yaml')\r\n  const gatesRoot = resolve(projectRoot, '.harness', 'gates')\r\n\r\n  if (!existsSync(bindingFile)) {\r\n    console.error('No gate bindings found. Run from project root.')\r\n    process.exit(1)\r\n  }\r\n\r\n  let content = readFileSync(filePath, 'utf-8')\r\n  const request = {\r\n    binding: 'pre-edit' as const,\r\n    bindingFile,\r\n    gatesRoot,\r\n    projectRoot,\r\n    edit: { filePath, content },\r\n    context: {},\r\n  }\r\n\r\n  const report = await runGate(request)\r\n  const failures = report.results.filter((r: any) => !r.passed)\r\n\r\n  if (failures.length === 0) {\r\n    console.log('No violations found. File is clean.')\r\n    process.exit(0)\r\n  }\r\n\r\n  console.log(\"Found \" + failures.length + \" violation(s):\")\r\n  for (const f of failures) {\r\n    const fixable = FIXABLE_RULES.find((fr: FixAction) => fr.ruleId === f.ruleId)\r\n    const marker = fixable ? '[AUTO-FIX]' : '[MANUAL]'\r\n    console.log(\"  \" + marker + \" \" + f.severity + \" \" + f.ruleId + \": \" + f.message)\r\n  }\r\n\r\n  let fixed = 0\r\n  let updatedContent = content\r\n  for (const fixable of FIXABLE_RULES) {\r\n    const failure = failures.find((f: any) => f.ruleId === fixable.ruleId)\r\n    if (failure) {\r\n      const newContent = fixable.fix(updatedContent)\r\n      if (newContent !== updatedContent) {\r\n        updatedContent = newContent\r\n        fixed++\r\n        console.log(\"  Fixed: \" + fixable.description)\r\n      }\r\n    }\r\n  }\r\n\r\n  if (fixed > 0) {\r\n    writeFileSync(filePath, updatedContent, 'utf-8')\r\n    console.log(\"Applied \" + fixed + \" auto-fix(es) to \" + filePath)\r\n    console.log('Remaining violations require manual fixes.')\r\n  } else {\r\n    console.log('No auto-fixable violations. All require manual intervention.')\r\n  }\r\n\r\n  process.exit(failures.length > fixed ? 1 : 0)\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from 'fs'\r\nimport { resolve, dirname } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport { loadEnvelope, type ArchitectureEnvelope } from '../envelope/index.js'\r\n\r\nfunction sanitizeForLog(s: string): string {\r\n  return s.replace(/[\\r\\n]+/g, ' ')\r\n}\r\n\r\nfunction errorMessage(err: unknown): string {\r\n  return err instanceof Error ? err.message : String(err)\r\n}\r\n\r\nfunction argValue(args: string[], name: string): string | undefined {\r\n  const eqForm = args.find(a => a.startsWith(`${name}=`))\r\n  if (eqForm) {\r\n    return eqForm.split('=').slice(1).join('=')\r\n  }\r\n  const idx = args.indexOf(name)\r\n  if (idx >= 0 && idx + 1 < args.length) {\r\n    return args[idx + 1]\r\n  }\r\n  return undefined\r\n}\r\n\r\nexport type BoundaryType = 'writable' | 'read_only' | 'forbidden'\r\n\r\nexport interface DerivedRule {\r\n  rule_id: string\r\n  rule_type?: string\r\n  blocking?: boolean\r\n  severity?: string\r\n  scope?: string\r\n  source?: string\r\n  message?: string\r\n  written_to?: string\r\n}\r\n\r\nexport interface DerivedBoundary {\r\n  module: string\r\n  boundary_type?: BoundaryType\r\n  change_level?: string\r\n  paths?: string[]\r\n  derived_rules?: DerivedRule[]\r\n}\r\n\r\nexport interface GateDerivation {\r\n  request_id: string\r\n  derived_at?: string\r\n  envelope_path?: string\r\n  spec_documents?: string[]\r\n  boundaries?: DerivedBoundary[]\r\n  open_questions?: Array<string | Record<string, unknown>>\r\n  notes?: string\r\n  [key: string]: unknown\r\n}\r\n\r\nexport interface GateRenderInput {\r\n  derivation: GateDerivation\r\n  envelope?: ArchitectureEnvelope | null\r\n  sourcePaths: {\r\n    derivation: string\r\n    envelope?: string\r\n    out?: string\r\n  }\r\n  generatedAt: string\r\n}\r\n\r\nexport function loadGateDerivation(path: string): GateDerivation {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Gate derivation file not found: ${path}`)\r\n  }\r\n  const raw = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(raw) ?? {}\r\n  if (!parsed || typeof parsed !== 'object') {\r\n    throw new Error(`Gate derivation file is not a YAML mapping: ${path}`)\r\n  }\r\n  if (!parsed.request_id) {\r\n    throw new Error(`Gate derivation missing required field: request_id (in ${path})`)\r\n  }\r\n  return parsed as GateDerivation\r\n}\r\n\r\nexport function handleGateRenderReport(args: string[]): void {\r\n  const derivationPath = argValue(args, '--derivation')\r\n  const envelopePath = argValue(args, '--envelope')\r\n  const outPath = argValue(args, '--out')\r\n\r\n  if (!derivationPath || !outPath) {\r\n    console.error('Usage: harness-toolkit gate render-report --derivation=<path> [--envelope=<path>] --out=<path>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedDerivation = resolve(derivationPath)\r\n  const resolvedEnvelope = envelopePath ? resolve(envelopePath) : undefined\r\n  const resolvedOut = resolve(outPath)\r\n\r\n  if (!existsSync(resolvedDerivation)) {\r\n    console.error(`Derivation file not found: ${sanitizeForLog(resolvedDerivation)}`)\r\n    process.exit(1)\r\n  }\r\n  if (resolvedEnvelope && !existsSync(resolvedEnvelope)) {\r\n    console.error(`Envelope file not found: ${sanitizeForLog(resolvedEnvelope)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const derivation = loadGateDerivation(resolvedDerivation)\r\n    const envelope = resolvedEnvelope ? loadEnvelope(resolvedEnvelope) : null\r\n\r\n    const html = renderGateReportHtml({\r\n      derivation,\r\n      envelope,\r\n      sourcePaths: {\r\n        derivation: resolvedDerivation,\r\n        envelope: resolvedEnvelope,\r\n        out: resolvedOut,\r\n      },\r\n      generatedAt: new Date().toISOString(),\r\n    })\r\n\r\n    const outDir = dirname(resolvedOut)\r\n    if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true })\r\n    writeFileSync(resolvedOut, html, 'utf-8')\r\n\r\n    console.log(`Step-4 report written to: ${sanitizeForLog(resolvedOut)}`)\r\n    console.log(`  request_id: ${derivation.request_id}`)\r\n    console.log(`  envelope: ${resolvedEnvelope ? 'included' : 'skipped (not provided)'}`)\r\n    process.exit(0)\r\n  } catch (err) {\r\n    console.error(`Gate render-report failed: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\n// ---- HTML rendering helpers ----\r\n\r\nfunction escapeHtml(s: unknown): string {\r\n  if (s === null || s === undefined) return ''\r\n  const str = typeof s === 'string' ? s : String(s)\r\n  return str\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;')\r\n    .replace(/'/g, '&#39;')\r\n}\r\n\r\nconst RULE_TYPE_BADGE_CLASS: Record<string, string> = {\r\n  'drift-check': 'badge-warn',\r\n  'contract-check': 'badge-ok',\r\n}\r\n\r\nconst BOUNDARY_BADGE_CLASS: Record<string, string> = {\r\n  writable: 'badge-ok',\r\n  read_only: 'badge',\r\n  forbidden: 'badge-block',\r\n}\r\n\r\nexport function renderGateReportHtml(input: GateRenderInput): string {\r\n  const { derivation, envelope, sourcePaths, generatedAt } = input\r\n  const parts: string[] = []\r\n\r\n  parts.push(`<!doctype html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>Step-4 Gate Derivation Report — ${escapeHtml(derivation.request_id)}</title>\r\n<style>\r\n  :root { --fg:#1b1f24; --muted:#5b6470; --bg:#f7f8fa; --card:#fff; --border:#d8dde4; --accent:#2756c9; --ok:#1f7a3a; --warn:#a86600; --major:#a8321f; --block:#7a1f4b; }\r\n  * { box-sizing: border-box; }\r\n  body { font: 14px/1.55 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif; color: var(--fg); background: var(--bg); margin: 0; padding: 24px; }\r\n  .container { max-width: 1080px; margin: 0 auto; }\r\n  header { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 20px; }\r\n  header h1 { margin: 0 0 6px; font-size: 20px; }\r\n  header .meta { color: var(--muted); font-size: 13px; }\r\n  section { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 16px; }\r\n  section h2 { margin: 0 0 12px; font-size: 16px; border-bottom: 2px solid var(--border); padding-bottom: 6px; }\r\n  section h3 { margin: 18px 0 6px; font-size: 14px; color: var(--muted); font-weight: 600; }\r\n  .badges { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 8px; }\r\n  .badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; background: #eef1f6; color: var(--fg); }\r\n  .badge-ok { background: #e6f4ec; color: var(--ok); }\r\n  .badge-warn { background: #fdf3e3; color: var(--warn); }\r\n  .badge-major { background: #fcebe6; color: var(--major); }\r\n  .badge-block { background: #f7e8f0; color: var(--block); }\r\n  table { width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 13px; }\r\n  th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }\r\n  th { background: #f3f5f8; font-weight: 600; }\r\n  td code, p code { background: #f3f5f8; padding: 1px 5px; border-radius: 3px; font-size: 12.5px; font-family: \"SFMono-Regular\", Consolas, monospace; }\r\n  ul, ol { margin: 6px 0 6px 20px; padding: 0; }\r\n  li { margin: 3px 0; }\r\n  .path-list { font-family: \"SFMono-Regular\", Consolas, monospace; font-size: 12px; color: var(--muted); }\r\n  .forbidden td { color: var(--major); }\r\n  .ro td { color: var(--muted); }\r\n  .muted { color: var(--muted); }\r\n  footer { color: var(--muted); font-size: 12px; text-align: center; padding: 12px 0; }\r\n  .pill { display: inline-block; margin-right: 6px; padding: 1px 8px; border-radius: 3px; background: #eef1f6; font-size: 12px; }\r\n  .oq { border-left: 3px solid var(--accent); padding: 8px 12px; margin: 6px 0; background: #f3f5f8; border-radius: 0 4px 4px 0; }\r\n  .oq .id { font-weight: 600; font-family: \"SFMono-Regular\", Consolas, monospace; }\r\n  pre { background: #f3f5f8; padding: 8px 12px; border-radius: 4px; overflow: auto; }\r\n</style>\r\n</head>\r\n<body>\r\n<div class=\"container\">\r\n`)\r\n\r\n  // Header\r\n  const derivedAt = derivation.derived_at ?? generatedAt\r\n  const headerBadges: string[] = []\r\n  headerBadges.push(`<span class=\"badge\">derived_at: ${escapeHtml(derivedAt)}</span>`)\r\n  if (envelope) {\r\n    headerBadges.push(`<span class=\"badge\">max_parallel_slices: ${escapeHtml(envelope.absorption_budget.max_parallel_slices)}</span>`)\r\n  }\r\n  if (derivation.envelope_path) {\r\n    headerBadges.push(`<span class=\"badge\">envelope_path: ${escapeHtml(derivation.envelope_path)}</span>`)\r\n  }\r\n\r\n  parts.push(`<header>\r\n  <h1>Step-4 治理规则派生评审报告</h1>\r\n  <div class=\"meta\">request_id: <code>${escapeHtml(derivation.request_id)}</code></div>\r\n  <div class=\"badges\">${headerBadges.join('\\n    ')}</div>\r\n</header>\r\n`)\r\n\r\n  // Section 1 — 派生来源\r\n  parts.push(`<section>\r\n  <h2>1. 派生来源（Derivation Source）</h2>\r\n  <h3>Envelope path</h3>\r\n  ${derivation.envelope_path\r\n    ? `<p><code>${escapeHtml(derivation.envelope_path)}</code></p>`\r\n    : '<p class=\"muted\">(未声明)</p>'}\r\n\r\n  <h3>Spec documents (${derivation.spec_documents?.length ?? 0})</h3>\r\n  ${derivation.spec_documents && derivation.spec_documents.length > 0\r\n    ? `<ul>${derivation.spec_documents.map(d => `<li><code>${escapeHtml(d)}</code></li>`).join('')}</ul>`\r\n    : '<p class=\"muted\">(无)</p>'}\r\n${envelope ? `\r\n  <h3>Envelope module boundaries（参考）</h3>\r\n  ${renderBoundaryTables(envelope.module_boundaries)}\r\n` : ''}\r\n</section>\r\n`)\r\n\r\n  // Section 2 — 派生产出的规则（展平）\r\n  const allRules = (derivation.boundaries ?? []).flatMap(b => b.derived_rules ?? [])\r\n  parts.push(`<section>\r\n  <h2>2. 派生产出的规则（Derived Rules, 共 ${allRules.length} 条）</h2>\r\n  ${allRules.length > 0\r\n    ? `<table><thead><tr><th>rule_id</th><th>rule_type</th><th>blocking</th><th>severity</th><th>scope</th><th>source</th><th>message</th><th>written_to</th></tr></thead><tbody>${allRules.map(r => `<tr><td><code>${escapeHtml(r.rule_id)}</code></td><td>${r.rule_type ? `<span class=\"badge ${RULE_TYPE_BADGE_CLASS[r.rule_type] ?? 'badge'}\">${escapeHtml(r.rule_type)}</span>` : '<span class=\"muted\">—</span>'}</td><td>${r.blocking === undefined ? '<span class=\"muted\">—</span>' : r.blocking ? '是' : '否'}</td><td>${escapeHtml(r.severity) || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(r.scope) || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(r.source) || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(r.message) || '<span class=\"muted\">—</span>'}</td><td>${r.written_to ? `<code>${escapeHtml(r.written_to)}</code>` : '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>`\r\n    : '<p class=\"muted\">(无派生规则)</p>'}\r\n</section>\r\n`)\r\n\r\n  // Section 3 — 边界 → 规则映射\r\n  const boundaries = derivation.boundaries ?? []\r\n  parts.push(`<section>\r\n  <h2>3. 边界 → 规则映射（Boundary Mapping, 共 ${boundaries.length} 条边界）</h2>\r\n  ${boundaries.length > 0\r\n    ? boundaries.map(b => {\r\n        const rules = b.derived_rules ?? []\r\n        const btype = b.boundary_type ?? ''\r\n        return `<h3>${escapeHtml(b.module)} <span class=\"badge ${BOUNDARY_BADGE_CLASS[btype] ?? 'badge'}\">${escapeHtml(btype) || 'unknown'}</span> · change_level: ${escapeHtml(b.change_level ?? '—')} · 规则数: ${rules.length}</h3>\r\n        <p><span class=\"path-list\">${(b.paths ?? []).map(p => escapeHtml(p)).join('<br>')}</span></p>\r\n        ${rules.length > 0\r\n          ? `<table><thead><tr><th>rule_id</th><th>rule_type</th><th>blocking</th><th>message</th><th>written_to</th></tr></thead><tbody>${rules.map(r => `<tr><td><code>${escapeHtml(r.rule_id)}</code></td><td>${escapeHtml(r.rule_type) || '<span class=\"muted\">—</span>'}</td><td>${r.blocking === undefined ? '<span class=\"muted\">—</span>' : r.blocking ? '是' : '否'}</td><td>${escapeHtml(r.message) || '<span class=\"muted\">—</span>'}</td><td>${r.written_to ? `<code>${escapeHtml(r.written_to)}</code>` : '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>`\r\n          : '<p class=\"muted\">(此边界无派生规则)</p>'}`\r\n      }).join('\\n  ')\r\n    : '<p class=\"muted\">(无边界记录)</p>'}\r\n</section>\r\n`)\r\n\r\n  // Section 4 — Open questions\r\n  const oqs = derivation.open_questions ?? []\r\n  if (oqs.length > 0) {\r\n    parts.push(`<section>\r\n  <h2>4. Open questions / OQ (${oqs.length})</h2>\r\n  ${oqs.map(oq => {\r\n    if (typeof oq === 'string') return `<div class=\"oq\">${escapeHtml(oq)}</div>`\r\n    if (oq && typeof oq === 'object') {\r\n      const obj = oq as Record<string, unknown>\r\n      const id = obj['id'] ?? obj['oq_id'] ?? ''\r\n      const title = obj['title'] ?? obj['question'] ?? ''\r\n      const body = Object.entries(obj)\r\n        .filter(([k]) => !['id', 'oq_id', 'title', 'question'].includes(k))\r\n        .map(([k, v]) => `<div><strong>${escapeHtml(k)}:</strong> ${escapeHtml(typeof v === 'string' ? v : JSON.stringify(v))}</div>`)\r\n        .join('')\r\n      return `<div class=\"oq\"><div class=\"id\">${escapeHtml(String(id))}</div><div>${escapeHtml(String(title))}</div>${body}</div>`\r\n    }\r\n    return `<div class=\"oq\">${escapeHtml(JSON.stringify(oq))}</div>`\r\n  }).join('')}\r\n</section>\r\n`)\r\n  }\r\n\r\n  // Section 5 — 其他元数据\r\n  const knownKeys = new Set(['request_id', 'derived_at', 'envelope_path', 'spec_documents', 'boundaries', 'open_questions'])\r\n  const others = Object.entries(derivation).filter(([k]) => !knownKeys.has(k))\r\n  if (others.length > 0) {\r\n    parts.push(`<section>\r\n  <h2>5. 其他元数据</h2>\r\n  <table><tbody>${others.map(([k, v]) => `<tr><td><code>${escapeHtml(k)}</code></td><td>${escapeHtml(typeof v === 'string' ? v : JSON.stringify(v))}</td></tr>`).join('')}</tbody></table>\r\n</section>\r\n`)\r\n  }\r\n\r\n  // Footer\r\n  parts.push(`<footer>\r\n  生成于 ${escapeHtml(generatedAt)}<br>\r\n  <div class=\"path-list\">\r\n    derivation: ${escapeHtml(sourcePaths.derivation)}${sourcePaths.envelope ? `<br>envelope: ${escapeHtml(sourcePaths.envelope)}` : ''}${sourcePaths.out ? `<br>out: ${escapeHtml(sourcePaths.out)}` : ''}\r\n  </div>\r\n</footer>\r\n`)\r\n\r\n  parts.push(`</div>\r\n</body>\r\n</html>\r\n`)\r\n  return parts.join('')\r\n}\r\n\r\nfunction renderBoundaryTables(\r\n  bounds: {\r\n    writable?: Array<{ module: string; paths: string[]; change_level?: string }>\r\n    read_only?: Array<{ module: string; paths: string[] }>\r\n    forbidden?: Array<{ module: string; paths: string[] }>\r\n  },\r\n): string {\r\n  const writable = bounds?.writable ?? []\r\n  const readOnly = bounds?.read_only ?? []\r\n  const forbidden = bounds?.forbidden ?? []\r\n  return `\r\n  <h3>Writable (${writable.length})</h3>\r\n  ${writable.length > 0 ? `<table><thead><tr><th>module</th><th>paths</th><th>change_level</th></tr></thead><tbody>${writable.map(w => `<tr><td><code>${escapeHtml(w.module)}</code></td><td>${(w.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(w.change_level ?? 'L0')}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Read-only (${readOnly.length})</h3>\r\n  ${readOnly.length > 0 ? `<table class=\"ro\"><thead><tr><th>module</th><th>paths</th></tr></thead><tbody>${readOnly.map(r => `<tr><td><code>${escapeHtml(r.module)}</code></td><td>${(r.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Forbidden (${forbidden.length})</h3>\r\n  ${forbidden.length > 0 ? `<table class=\"forbidden\"><thead><tr><th>module</th><th>paths</th></tr></thead><tbody>${forbidden.map(f => `<tr><td><code>${escapeHtml(f.module)}</code></td><td>${(f.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}`\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from 'fs'\r\nimport { resolve, dirname } from 'path'\r\nimport { loadEnvelope, validateEnvelope, checkDrift } from '../envelope/index.js'\r\nimport {\r\n  loadBaseline,\r\n  loadDelta,\r\n  deriveEnvelope as deriveEnvelopeFromBaseline,\r\n} from '../envelope/baseline.js'\r\nimport { execSync } from 'child_process'\r\nimport { stringify as stringifyYaml, parse as parseYaml } from 'yaml'\r\n\r\nfunction sanitizeForLog(s: string): string {\r\n  return s.replace(/[\\r\\n]+/g, ' ')\r\n}\r\n\r\nfunction errorMessage(err: unknown): string {\r\n  return err instanceof Error ? err.message : String(err)\r\n}\r\n\r\nexport function handleEnvelopeValidate(args: string[]): void {\r\n  const envelopePath = args.find(a => !a.startsWith('--'))\r\n  if (!envelopePath) {\r\n    console.error('Usage: harness-toolkit envelope validate <envelope.yaml>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedPath = resolve(envelopePath)\r\n  if (!existsSync(resolvedPath)) {\r\n    console.error(`Envelope file not found: ${sanitizeForLog(resolvedPath)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const envelope = loadEnvelope(resolvedPath)\r\n    const validation = validateEnvelope(envelope)\r\n\r\n    if (validation.valid) {\r\n      console.log(`Valid envelope: ${envelope.request_id}`)\r\n      console.log(`  Writable modules: ${envelope.module_boundaries.writable.map(w => w.module).join(', ')}`)\r\n      console.log(`  Read-only modules: ${envelope.module_boundaries.read_only.map(r => r.module).join(', ')}`)\r\n      console.log(`  Forbidden modules: ${envelope.module_boundaries.forbidden.map(f => f.module).join(', ')}`)\r\n      process.exit(0)\r\n    } else {\r\n      console.error(`Invalid envelope:`)\r\n      for (const err of validation.errors) {\r\n        console.error(`  - ${err}`)\r\n      }\r\n      process.exit(1)\r\n    }\r\n  } catch (err) {\r\n    console.error(`Failed to parse envelope: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nexport function handleEnvelopeDrift(args: string[]): void {\r\n  const envelopePath = args.find(a => !a.startsWith('--'))\r\n  const projectRoot = args.find(a => a.startsWith('--project-root='))?.split('=')[1]\r\n    ?? args[args.indexOf('--project-root') + 1]\r\n    ?? process.cwd()\r\n\r\n  if (!envelopePath) {\r\n    console.error('Usage: harness-toolkit envelope drift <envelope.yaml> [--project-root=<dir>]')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedPath = resolve(envelopePath)\r\n  if (!existsSync(resolvedPath)) {\r\n    console.error(`Envelope file not found: ${sanitizeForLog(resolvedPath)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const envelope = loadEnvelope(resolvedPath)\r\n    const changedFiles = getChangedFiles(projectRoot)\r\n    const drift = checkDrift(envelope, changedFiles)\r\n\r\n    console.log(`Drift check for ${envelope.request_id}:`)\r\n    console.log(`  Total changed files: ${changedFiles.length}`)\r\n    console.log(`  Allowed: ${drift.allowed.length}`)\r\n    for (const f of drift.allowed) console.log(`    + ${sanitizeForLog(f)}`)\r\n    console.log(`  Unexpected: ${drift.unexpected.length}`)\r\n    for (const u of drift.unexpected) console.log(`    ! ${sanitizeForLog(u.file)}${u.change_level ? ` (level: ${u.change_level})` : ''}`)\r\n    console.log(`  Result: ${drift.passed ? 'PASSED' : 'FAILED'}`)\r\n\r\n    process.exit(drift.passed ? 0 : 1)\r\n  } catch (err) {\r\n    console.error(`Drift check failed: ${errorMessage(err)}`)\r\n    process.exit(2)\r\n  }\r\n}\r\n\r\nfunction getChangedFiles(projectRoot: string): string[] {\r\n  try {\r\n    const output = execSync('git diff --name-only HEAD', {\r\n      timeout: 10000,\r\n      stdio: 'pipe',\r\n      cwd: projectRoot,\r\n    }).toString().trim()\r\n    return output ? output.split('\\n').filter(Boolean) : []\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n\r\nfunction argValue(args: string[], name: string): string | undefined {\r\n  const eqForm = args.find(a => a.startsWith(`${name}=`))\r\n  if (eqForm) {\r\n    return eqForm.split('=').slice(1).join('=')\r\n  }\r\n  const idx = args.indexOf(name)\r\n  if (idx >= 0 && idx + 1 < args.length) {\r\n    return args[idx + 1]\r\n  }\r\n  return undefined\r\n}\r\n\r\nexport function handleEnvelopeRenderReport(args: string[]): void {\r\n  const deltaPath = argValue(args, '--delta')\r\n  const envelopePath = argValue(args, '--envelope')\r\n  const reviewPacketPath = argValue(args, '--review-packet')\r\n  const outPath = argValue(args, '--out')\r\n\r\n  if (!deltaPath || !envelopePath || !outPath) {\r\n    console.error('Usage: harness-toolkit envelope render-report --delta=<path> --envelope=<path> [--review-packet=<path>] --out=<path>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedDelta = resolve(deltaPath)\r\n  const resolvedEnvelope = resolve(envelopePath)\r\n  const resolvedReviewPacket = reviewPacketPath ? resolve(reviewPacketPath) : undefined\r\n  const resolvedOut = resolve(outPath)\r\n\r\n  if (!existsSync(resolvedDelta)) {\r\n    console.error(`Delta file not found: ${sanitizeForLog(resolvedDelta)}`)\r\n    process.exit(1)\r\n  }\r\n  if (!existsSync(resolvedEnvelope)) {\r\n    console.error(`Envelope file not found: ${sanitizeForLog(resolvedEnvelope)}`)\r\n    process.exit(1)\r\n  }\r\n  if (resolvedReviewPacket && !existsSync(resolvedReviewPacket)) {\r\n    console.error(`Review packet file not found: ${sanitizeForLog(resolvedReviewPacket)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const delta = loadDelta(resolvedDelta)\r\n    const envelope = loadEnvelope(resolvedEnvelope)\r\n    const reviewPacket = resolvedReviewPacket\r\n      ? parseYaml(readFileSync(resolvedReviewPacket, 'utf-8')) ?? null\r\n      : null\r\n\r\n    const html = renderEnvelopeReportHtml({\r\n      delta,\r\n      envelope,\r\n      reviewPacket: reviewPacket as Record<string, unknown> | null,\r\n      sourcePaths: {\r\n        delta: resolvedDelta,\r\n        envelope: resolvedEnvelope,\r\n        reviewPacket: resolvedReviewPacket,\r\n      },\r\n      generatedAt: new Date().toISOString(),\r\n    })\r\n\r\n    const outDir = dirname(resolvedOut)\r\n    if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true })\r\n    writeFileSync(resolvedOut, html, 'utf-8')\r\n\r\n    console.log(`Step-3 report written to: ${sanitizeForLog(resolvedOut)}`)\r\n    console.log(`  request_id: ${envelope.request_id}`)\r\n    console.log(`  delta request_id: ${delta.request_id}`)\r\n    console.log(`  review packet: ${resolvedReviewPacket ? 'included' : 'skipped (not provided)'}`)\r\n    process.exit(0)\r\n  } catch (err) {\r\n    console.error(`Envelope render-report failed: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\n// ---- HTML rendering helpers ----\r\n\r\nfunction escapeHtml(s: unknown): string {\r\n  if (s === null || s === undefined) return ''\r\n  const str = typeof s === 'string' ? s : String(s)\r\n  return str\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;')\r\n    .replace(/'/g, '&#39;')\r\n}\r\n\r\nconst UPGRADE_BADGE_CLASS: Record<string, string> = {\r\n  none: 'badge-ok',\r\n  'L2-escape': 'badge-warn',\r\n  'L3-rewrite': 'badge-major',\r\n  'baseline-breaking': 'badge-block',\r\n}\r\n\r\nexport interface RenderInput {\r\n  delta: import('../envelope/baseline.js').ArchitectureDelta\r\n  envelope: import('../envelope/index.js').ArchitectureEnvelope\r\n  reviewPacket: Record<string, unknown> | null\r\n  sourcePaths: {\r\n    delta: string\r\n    envelope: string\r\n    reviewPacket?: string\r\n  }\r\n  generatedAt: string\r\n}\r\n\r\nexport function renderEnvelopeReportHtml(input: RenderInput): string {\r\n  const { delta, envelope, reviewPacket, sourcePaths, generatedAt } = input\r\n  const parts: string[] = []\r\n\r\n  parts.push(`<!doctype html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>Step-3 Envelope Report — ${escapeHtml(envelope.request_id)}</title>\r\n<style>\r\n  :root { --fg:#1b1f24; --muted:#5b6470; --bg:#f7f8fa; --card:#fff; --border:#d8dde4; --accent:#2756c9; --ok:#1f7a3a; --warn:#a86600; --major:#a8321f; --block:#7a1f4b; }\r\n  * { box-sizing: border-box; }\r\n  body { font: 14px/1.55 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif; color: var(--fg); background: var(--bg); margin: 0; padding: 24px; }\r\n  .container { max-width: 1080px; margin: 0 auto; }\r\n  header { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 20px; }\r\n  header h1 { margin: 0 0 6px; font-size: 20px; }\r\n  header .meta { color: var(--muted); font-size: 13px; }\r\n  section { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 16px; }\r\n  section h2 { margin: 0 0 12px; font-size: 16px; border-bottom: 2px solid var(--border); padding-bottom: 6px; }\r\n  section h3 { margin: 18px 0 6px; font-size: 14px; color: var(--muted); font-weight: 600; }\r\n  .badges { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 8px; }\r\n  .badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; background: #eef1f6; color: var(--fg); }\r\n  .badge-ok { background: #e6f4ec; color: var(--ok); }\r\n  .badge-warn { background: #fdf3e3; color: var(--warn); }\r\n  .badge-major { background: #fcebe6; color: var(--major); }\r\n  .badge-block { background: #f7e8f0; color: var(--block); }\r\n  table { width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 13px; }\r\n  th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }\r\n  th { background: #f3f5f8; font-weight: 600; }\r\n  td code, p code { background: #f3f5f8; padding: 1px 5px; border-radius: 3px; font-size: 12.5px; font-family: \"SFMono-Regular\", Consolas, monospace; }\r\n  ul, ol { margin: 6px 0 6px 20px; padding: 0; }\r\n  li { margin: 3px 0; }\r\n  .path-list { font-family: \"SFMono-Regular\", Consolas, monospace; font-size: 12px; color: var(--muted); }\r\n  .forbidden td { color: var(--major); }\r\n  .ro td { color: var(--muted); }\r\n  .muted { color: var(--muted); }\r\n  footer { color: var(--muted); font-size: 12px; text-align: center; padding: 12px 0; }\r\n  .pill { display: inline-block; margin-right: 6px; padding: 1px 8px; border-radius: 3px; background: #eef1f6; font-size: 12px; }\r\n  .oq { border-left: 3px solid var(--accent); padding: 8px 12px; margin: 6px 0; background: #f3f5f8; border-radius: 0 4px 4px 0; }\r\n  .oq .id { font-weight: 600; font-family: \"SFMono-Regular\", Consolas, monospace; }\r\n  pre { background: #f3f5f8; padding: 8px 12px; border-radius: 4px; overflow: auto; }\r\n</style>\r\n</head>\r\n<body>\r\n<div class=\"container\">\r\n`)\r\n\r\n  // Header\r\n  parts.push(`<header>\r\n  <h1>Step-3 架构契约评审报告</h1>\r\n  <div class=\"meta\">request_id: <code>${escapeHtml(envelope.request_id)}</code> · based_on_baseline: <code>${escapeHtml(delta.based_on_baseline)}</code></div>\r\n  <div class=\"badges\">\r\n    <span class=\"badge ${UPGRADE_BADGE_CLASS[delta.升级标记] ?? 'badge'}\">升级标记: ${escapeHtml(delta.升级标记)}</span>\r\n    <span class=\"badge\">delta request_id: ${escapeHtml(delta.request_id)}</span>\r\n    <span class=\"badge\">max_parallel_slices: ${escapeHtml(envelope.absorption_budget.max_parallel_slices)}</span>\r\n  </div>\r\n</header>\r\n`)\r\n\r\n  // Delta section\r\n  parts.push(`<section>\r\n  <h2>1. Delta（本轮架构增量）</h2>\r\n  <h3>理由</h3>\r\n  <p>${escapeHtml(delta.理由) || '<span class=\"muted\">(未填写)</span>'}</p>\r\n\r\n  <h3>冲击不变量 (${delta.冲击不变量.length})</h3>\r\n  ${delta.冲击不变量.length > 0 ? `<ul>${delta.冲击不变量.map(i => `<li>${escapeHtml(i)}</li>`).join('')}</ul>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Gate 变更 (${delta.gate_变更.length})</h3>\r\n  ${delta.gate_变更.length > 0 ? `<table><thead><tr><th>gate_id</th><th>change</th><th>reason</th></tr></thead><tbody>${delta.gate_变更.map(g => `<tr><td><code>${escapeHtml(g.gate_id)}</code></td><td>${escapeHtml(g.change)}</td><td>${escapeHtml(g.reason)}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Module boundary 增量</h3>\r\n  ${renderBoundaryTables(delta.delta.module_boundaries, true)}\r\n\r\n  <h3>Declared interface 增量 (${delta.delta.declared_interfaces?.length ?? 0})</h3>\r\n  ${renderInterfaceTable(delta.delta.declared_interfaces ?? [])}\r\n</section>\r\n`)\r\n\r\n  // Envelope section\r\n  parts.push(`<section>\r\n  <h2>2. Derived Envelope（合并后架构契约）</h2>\r\n  ${envelope.legal_layer ? `\r\n  <h3>Legal layer</h3>\r\n  ${renderLegalLayer(envelope.legal_layer)}\r\n  ` : ''}\r\n  <h3>Module boundaries（合并后）</h3>\r\n  ${renderBoundaryTables(envelope.module_boundaries, false)}\r\n  <h3>Absorption budget</h3>\r\n  <p><span class=\"pill\">max_parallel_slices: ${escapeHtml(envelope.absorption_budget.max_parallel_slices)}</span></p>\r\n</section>\r\n`)\r\n\r\n  // Review packet section\r\n  if (reviewPacket) {\r\n    parts.push(`<section>\r\n  <h2>3. Review Packet（H1/H2 评审包）</h2>\r\n  ${renderReviewPacket(reviewPacket)}\r\n</section>\r\n`)\r\n  }\r\n\r\n  // Footer\r\n  parts.push(`<footer>\r\n  生成于 ${escapeHtml(generatedAt)}<br>\r\n  <div class=\"path-list\">\r\n    delta: ${escapeHtml(sourcePaths.delta)}<br>\r\n    envelope: ${escapeHtml(sourcePaths.envelope)}${sourcePaths.reviewPacket ? `<br>review-packet: ${escapeHtml(sourcePaths.reviewPacket)}` : ''}\r\n  </div>\r\n</footer>\r\n`)\r\n\r\n  parts.push(`</div>\r\n</body>\r\n</html>\r\n`)\r\n  return parts.join('')\r\n}\r\n\r\nfunction renderBoundaryTables(\r\n  bounds: {\r\n    writable?: Array<{ module: string; paths: string[]; change_level?: string }>\r\n    read_only?: Array<{ module: string; paths: string[] }>\r\n    forbidden?: Array<{ module: string; paths: string[] }>\r\n  } | undefined,\r\n  isDelta: boolean,\r\n): string {\r\n  const writable = bounds?.writable ?? []\r\n  const readOnly = bounds?.read_only ?? []\r\n  const forbidden = bounds?.forbidden ?? []\r\n  const prefix = isDelta ? '新增' : ''\r\n  return `\r\n  <h3>Writable (${prefix}${writable.length})</h3>\r\n  ${writable.length > 0 ? `<table><thead><tr><th>module</th><th>paths</th><th>change_level</th></tr></thead><tbody>${writable.map(w => `<tr><td><code>${escapeHtml(w.module)}</code></td><td>${(w.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(w.change_level ?? 'L0')}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Read-only (${prefix}${readOnly.length})</h3>\r\n  ${readOnly.length > 0 ? `<table class=\"ro\"><thead><tr><th>module</th><th>paths</th></tr></thead><tbody>${readOnly.map(r => `<tr><td><code>${escapeHtml(r.module)}</code></td><td>${(r.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n\r\n  <h3>Forbidden (${prefix}${forbidden.length})</h3>\r\n  ${forbidden.length > 0 ? `<table class=\"forbidden\"><thead><tr><th>module</th><th>paths</th></tr></thead><tbody>${forbidden.map(f => `<tr><td><code>${escapeHtml(f.module)}</code></td><td>${(f.paths ?? []).map(p => `<div class=\"path-list\">${escapeHtml(p)}</div>`).join('') || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>` : '<p class=\"muted\">(无)</p>'}`\r\n}\r\n\r\nfunction renderInterfaceTable(\r\n  ifaces: Array<{ module: string; source_glob?: string; exports?: string[] }>,\r\n): string {\r\n  if (ifaces.length === 0) return '<p class=\"muted\">(无)</p>'\r\n  return `<table><thead><tr><th>module</th><th>source_glob</th><th>exports</th></tr></thead><tbody>${ifaces.map(i => `<tr><td><code>${escapeHtml(i.module)}</code></td><td>${escapeHtml(i.source_glob ?? '')}</td><td>${(i.exports ?? []).map(e => `<span class=\"pill\">${escapeHtml(e)}</span>`).join('') || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}</tbody></table>`\r\n}\r\n\r\nfunction renderLegalLayer(legal: NonNullable<import('../envelope/index.js').ArchitectureEnvelope['legal_layer']>): string {\r\n  const archRows = (legal.architectural ?? []).map(a => `<tr><td><code>${escapeHtml(a.scope)}</code></td><td>${escapeHtml(a.enforcement)}</td></tr>`).join('')\r\n  const codeRows = (legal.code ?? []).map(c => `<tr><td><code>${escapeHtml(c.scope)}</code></td><td>${escapeHtml(c.enforcement)}</td></tr>`).join('')\r\n  return `\r\n  <h3>Architectural layer</h3>\r\n  ${archRows ? `<table><thead><tr><th>scope</th><th>enforcement</th></tr></thead><tbody>${archRows}</tbody></table>` : '<p class=\"muted\">(无)</p>'}\r\n  <h3>Code layer</h3>\r\n  ${codeRows ? `<table><thead><tr><th>scope</th><th>enforcement</th></tr></thead><tbody>${codeRows}</tbody></table>` : '<p class=\"muted\">(无)</p>'}`\r\n}\r\n\r\nfunction renderReviewPacket(rp: Record<string, unknown>): string {\r\n  const parts: string[] = []\r\n\r\n  const views = rp['views_4plus1']\r\n  if (views && typeof views === 'object') {\r\n    parts.push('<h3>4+1 视图</h3>')\r\n    parts.push(`<pre>${escapeHtml(JSON.stringify(views, null, 2))}</pre>`)\r\n  }\r\n\r\n  const invariants = rp['invariants']\r\n  if (Array.isArray(invariants)) {\r\n    parts.push(`<h3>Invariants (${invariants.length})</h3>`)\r\n    parts.push(`<ul>${invariants.map(inv => `<li>${escapeHtml(typeof inv === 'string' ? inv : JSON.stringify(inv))}</li>`).join('')}</ul>`)\r\n  }\r\n\r\n  const oqs = rp['open_questions']\r\n  if (Array.isArray(oqs)) {\r\n    parts.push(`<h3>Open questions / OQ (${oqs.length})</h3>`)\r\n    parts.push(oqs.map((oq: unknown) => {\r\n      if (typeof oq === 'string') return `<div class=\"oq\">${escapeHtml(oq)}</div>`\r\n      if (oq && typeof oq === 'object') {\r\n        const obj = oq as Record<string, unknown>\r\n        const id = obj['id'] ?? obj['oq_id'] ?? ''\r\n        const title = obj['title'] ?? obj['question'] ?? ''\r\n        const body = Object.entries(obj)\r\n          .filter(([k]) => !['id', 'oq_id', 'title', 'question'].includes(k))\r\n          .map(([k, v]) => `<div><strong>${escapeHtml(k)}:</strong> ${escapeHtml(typeof v === 'string' ? v : JSON.stringify(v))}</div>`)\r\n          .join('')\r\n        return `<div class=\"oq\"><div class=\"id\">${escapeHtml(String(id))}</div><div>${escapeHtml(String(title))}</div>${body}</div>`\r\n      }\r\n      return `<div class=\"oq\">${escapeHtml(JSON.stringify(oq))}</div>`\r\n    }).join(''))\r\n  }\r\n\r\n  for (const key of ['h1_checkpoints', 'h2_checkpoints']) {\r\n    const v = rp[key]\r\n    if (Array.isArray(v)) {\r\n      parts.push(`<h3>${escapeHtml(key)} (${v.length})</h3>`)\r\n      parts.push(`<ul>${v.map(item => `<li>${escapeHtml(typeof item === 'string' ? item : JSON.stringify(item))}</li>`).join('')}</ul>`)\r\n    }\r\n  }\r\n\r\n  // Other top-level keys\r\n  const knownKeys = new Set(['views_4plus1', 'invariants', 'open_questions', 'h1_checkpoints', 'h2_checkpoints'])\r\n  const others = Object.entries(rp).filter(([k]) => !knownKeys.has(k))\r\n  if (others.length > 0) {\r\n    parts.push('<h3>其他元数据</h3>')\r\n    parts.push(`<table><tbody>${others.map(([k, v]) => `<tr><td><code>${escapeHtml(k)}</code></td><td>${escapeHtml(typeof v === 'string' ? v : JSON.stringify(v))}</td></tr>`).join('')}</tbody></table>`)\r\n  }\r\n\r\n  return parts.join('\\n') || '<p class=\"muted\">(无内容)</p>'\r\n}\r\n\r\nexport function handleEnvelopeDerive(args: string[]): void {\r\n  const baselinePath = argValue(args, '--baseline')\r\n  const deltaPath = argValue(args, '--delta')\r\n  const outPath = argValue(args, '--out')\r\n\r\n  if (!baselinePath || !outPath) {\r\n    console.error('Usage: harness-toolkit envelope derive --baseline=<path> [--delta=<path>] --out=<envelope.yaml>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedBaseline = resolve(baselinePath)\r\n  const resolvedDelta = deltaPath ? resolve(deltaPath) : undefined\r\n  const resolvedOut = resolve(outPath)\r\n\r\n  if (!existsSync(resolvedBaseline)) {\r\n    console.error(`Baseline file not found: ${sanitizeForLog(resolvedBaseline)}`)\r\n    process.exit(1)\r\n  }\r\n  if (resolvedDelta && !existsSync(resolvedDelta)) {\r\n    console.error(`Delta file not found: ${sanitizeForLog(resolvedDelta)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const baseline = loadBaseline(resolvedBaseline)\r\n    const delta = resolvedDelta ? loadDelta(resolvedDelta) : undefined\r\n    const envelope = deriveEnvelopeFromBaseline(baseline, delta)\r\n\r\n    const outDir = dirname(resolvedOut)\r\n    if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true })\r\n    writeFileSync(resolvedOut, stringifyYaml(envelope, { sortMapEntries: false }), 'utf-8')\r\n\r\n    console.log(`Derived envelope written to: ${sanitizeForLog(resolvedOut)}`)\r\n    console.log(`  request_id: ${envelope.request_id}`)\r\n    console.log(`  Writable modules: ${envelope.module_boundaries.writable.map(w => w.module).join(', ') || '(none)'}`)\r\n    console.log(`  Source: ${delta ? 'baseline + delta' : 'baseline projection (0→1 mode)'}`)\r\n    process.exit(0)\r\n  } catch (err) {\r\n    console.error(`Envelope derive failed: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nexport function handleEnvelopeRender4plus1Delta(args: string[]): void {\r\n  const baselinePath = argValue(args, '--baseline')\r\n  const deltaPath = argValue(args, '--delta')\r\n  const outDir = argValue(args, '--out-dir')\r\n  const views = argValue(args, '--views')\r\n\r\n  if (!baselinePath || !deltaPath || !outDir) {\r\n    console.error(\r\n      'Usage: harness-toolkit envelope render-4plus1-delta --baseline=<baseline.yaml> --delta=<delta.yaml> --out-dir=<dir> [--views=logical,process,development,physical,scenarios]'\r\n    )\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedBaseline = resolve(baselinePath)\r\n  const resolvedDelta = resolve(deltaPath)\r\n  const resolvedOutDir = resolve(outDir)\r\n\r\n  if (!existsSync(resolvedBaseline)) {\r\n    console.error(`Baseline file not found: ${sanitizeForLog(resolvedBaseline)}`)\r\n    process.exit(1)\r\n  }\r\n  if (!existsSync(resolvedDelta)) {\r\n    console.error(`Delta file not found: ${sanitizeForLog(resolvedDelta)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  // 定位 helper 脚本:优先 SKILL_DIR 环境变量(由 harness-toolkit init 注入),\r\n  // 否则 fallback 到内置 vendored 路径(.claude/skills/fireworks-tech-graph/scripts/)\r\n  const skillDir = process.env.HARNESS_SKILL_DIR\r\n  const candidates: string[] = []\r\n  if (skillDir) {\r\n    candidates.push(resolve(skillDir, 'fireworks-tech-graph', 'scripts', 'render-4plus1-delta.py'))\r\n  }\r\n  candidates.push(resolve(process.cwd(), '.claude', 'skills', 'fireworks-tech-graph', 'scripts', 'render-4plus1-delta.py'))\r\n\r\n  let scriptPath = ''\r\n  for (const c of candidates) {\r\n    if (existsSync(c)) {\r\n      scriptPath = c\r\n      break\r\n    }\r\n  }\r\n  if (!scriptPath) {\r\n    console.error(\r\n      `render-4plus1-delta.py not found. Searched:\\n  ${candidates.join('\\n  ')}\\n` +\r\n        'Ensure fireworks-tech-graph skill is vendored (harness-toolkit init) or set HARNESS_SKILL_DIR.'\r\n    )\r\n    process.exit(1)\r\n  }\r\n\r\n  // 定位 python3\r\n  const pyBin = process.env.PYTHON || 'python3'\r\n\r\n  const cmdArgs = [scriptPath, '--baseline', resolvedBaseline, '--delta', resolvedDelta, '--out-dir', resolvedOutDir]\r\n  if (views) {\r\n    cmdArgs.push('--views', views)\r\n  }\r\n\r\n  try {\r\n    execSync(`${pyBin} ${cmdArgs.map(a => `\"${a}\"`).join(' ')}`, { stdio: 'inherit' })\r\n    process.exit(0)\r\n  } catch (err) {\r\n    console.error(`render-4plus1-delta failed: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs'\r\nimport { dirname } from 'path'\r\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml'\r\nimport {\r\n  type ArchitectureEnvelope,\r\n  type ModuleBoundary,\r\n  type ChangeLevel,\r\n  type EnvelopeValidation,\r\n} from './index.js'\r\n\r\nexport interface DeclaredInterface {\r\n  module: string\r\n  source_glob: string\r\n  exports: string[]\r\n}\r\n\r\nexport interface ArchitectureBaseline {\r\n  version: string\r\n  frozen_at: string\r\n  /**\r\n   * Git revision at freeze time (full 40-char SHA). Written by step-8 freeze\r\n   * via `git rev-parse HEAD`. Reconcile (step-7) uses this as the interface-diff\r\n   * baseline to compute per-file added/removed/changed exports. See ADR-0022.\r\n   * Optional for backward compatibility — when absent, reconcile falls back\r\n   * to `git rev-list --before=<frozen_at> -1`.\r\n   */\r\n  frozen_at_sha?: string\r\n  frozen_by_req: string\r\n  legal_layer?: ArchitectureEnvelope['legal_layer']\r\n  module_boundaries: {\r\n    writable: ModuleBoundary[]\r\n    read_only: ModuleBoundary[]\r\n    forbidden: ModuleBoundary[]\r\n  }\r\n  declared_interfaces: DeclaredInterface[]\r\n  absorption_budget: { max_parallel_slices: number }\r\n}\r\n\r\nexport type UpgradeFlag = 'none' | 'L2-escape' | 'L3-rewrite' | 'baseline-breaking'\r\n\r\nexport interface GateChange {\r\n  gate_id: string\r\n  change: string\r\n  reason: string\r\n}\r\n\r\nexport interface ArchitectureDelta {\r\n  request_id: string\r\n  based_on_baseline: string\r\n  delta: {\r\n    legal_layer?: ArchitectureEnvelope['legal_layer']\r\n    module_boundaries?: {\r\n      writable?: ModuleBoundary[]\r\n      read_only?: ModuleBoundary[]\r\n      forbidden?: ModuleBoundary[]\r\n    }\r\n    declared_interfaces?: DeclaredInterface[]\r\n    absorption_budget?: { max_parallel_slices: number }\r\n  }\r\n  理由: string\r\n  冲击不变量: string[]\r\n  gate_变更: GateChange[]\r\n  升级标记: UpgradeFlag\r\n}\r\n\r\nexport function loadBaseline(path: string): ArchitectureBaseline {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Baseline file not found: ${path}`)\r\n  }\r\n  const raw = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(raw)\r\n  return normalizeBaseline(parsed)\r\n}\r\n\r\nexport function writeBaseline(path: string, baseline: ArchitectureBaseline): void {\r\n  const dir = dirname(path)\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n  const yaml = stringifyYaml(baseline, { sortMapEntries: false })\r\n  writeFileSync(path, yaml, 'utf-8')\r\n}\r\n\r\nexport function loadDelta(path: string): ArchitectureDelta {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Delta file not found: ${path}`)\r\n  }\r\n  const raw = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(raw)\r\n  return normalizeDelta(parsed)\r\n}\r\n\r\nexport function writeDelta(path: string, delta: ArchitectureDelta): void {\r\n  const dir = dirname(path)\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n  const yaml = stringifyYaml(delta, { sortMapEntries: false })\r\n  writeFileSync(path, yaml, 'utf-8')\r\n}\r\n\r\nconst UPGRADE_FLAGS: readonly UpgradeFlag[] = ['none', 'L2-escape', 'L3-rewrite', 'baseline-breaking']\r\n\r\nexport function validateBaseline(baseline: ArchitectureBaseline): EnvelopeValidation {\r\n  const errors: string[] = []\r\n  const { writable, read_only, forbidden } = baseline.module_boundaries\r\n\r\n  if (writable.length === 0 && read_only.length === 0 && forbidden.length === 0) {\r\n    errors.push('module_boundaries has no entries — at least one writable path is required')\r\n  }\r\n  if (writable.length === 0) {\r\n    errors.push('module_boundaries.writable is empty — deny-by-default requires at least one allowed path')\r\n  }\r\n  if (!baseline.declared_interfaces) {\r\n    errors.push('declared_interfaces is missing — graphify diff requires declared interfaces')\r\n  } else if (!Array.isArray(baseline.declared_interfaces)) {\r\n    errors.push('declared_interfaces must be an array')\r\n  }\r\n  if (!baseline.frozen_by_req) {\r\n    errors.push('frozen_by_req is required (use the originating REQ-ID; empty string only for 0→1 baseline)')\r\n  }\r\n  if (!baseline.version) {\r\n    errors.push('version is required')\r\n  }\r\n\r\n  return { valid: errors.length === 0, errors }\r\n}\r\n\r\nexport function validateDelta(delta: ArchitectureDelta): EnvelopeValidation {\r\n  const errors: string[] = []\r\n\r\n  if (!delta.request_id) {\r\n    errors.push('request_id is required')\r\n  }\r\n  if (!delta.based_on_baseline) {\r\n    errors.push('based_on_baseline is required — delta must declare which baseline version it was authored against')\r\n  }\r\n  if (typeof delta.理由 !== 'string' || delta.理由.trim() === '') {\r\n    errors.push('理由 is required — explain why this update is needed')\r\n  }\r\n  if (!Array.isArray(delta.冲击不变量) || delta.冲击不变量.length === 0) {\r\n    errors.push('冲击不变量 is required — list impacted invariants (use [] only if explicitly none, but field must list them)')\r\n  }\r\n  if (!Array.isArray(delta.gate_变更)) {\r\n    errors.push('gate_变更 must be an array (may be empty)')\r\n  }\r\n  if (!UPGRADE_FLAGS.includes(delta.升级标记)) {\r\n    errors.push(`升级标记 must be one of: ${UPGRADE_FLAGS.join(', ')}`)\r\n  }\r\n  if (!delta.delta || typeof delta.delta !== 'object') {\r\n    errors.push('delta field is required — must contain the overlay on baseline')\r\n  }\r\n\r\n  return { valid: errors.length === 0, errors }\r\n}\r\n\r\nexport function mergeBaselineDelta(baseline: ArchitectureBaseline, delta: ArchitectureDelta): ArchitectureBaseline {\r\n  const d = delta.delta\r\n  const mergedWritable = d.module_boundaries?.writable\r\n    ? [...baseline.module_boundaries.writable, ...d.module_boundaries.writable]\r\n    : baseline.module_boundaries.writable\r\n  const mergedReadOnly = d.module_boundaries?.read_only\r\n    ? [...baseline.module_boundaries.read_only, ...d.module_boundaries.read_only]\r\n    : baseline.module_boundaries.read_only\r\n  const mergedForbidden = d.module_boundaries?.forbidden\r\n    ? [...baseline.module_boundaries.forbidden, ...d.module_boundaries.forbidden]\r\n    : baseline.module_boundaries.forbidden\r\n\r\n  const mergedInterfaces = d.declared_interfaces\r\n    ? mergeDeclaredInterfaces(baseline.declared_interfaces, d.declared_interfaces)\r\n    : baseline.declared_interfaces\r\n\r\n  return {\r\n    version: baseline.version,\r\n    frozen_at: baseline.frozen_at,\r\n    frozen_at_sha: baseline.frozen_at_sha,\r\n    frozen_by_req: baseline.frozen_by_req,\r\n    legal_layer: d.legal_layer ?? baseline.legal_layer,\r\n    module_boundaries: {\r\n      writable: mergedWritable,\r\n      read_only: mergedReadOnly,\r\n      forbidden: mergedForbidden,\r\n    },\r\n    declared_interfaces: mergedInterfaces,\r\n    absorption_budget: d.absorption_budget ?? baseline.absorption_budget,\r\n  }\r\n}\r\n\r\nexport function deriveEnvelope(\r\n  baseline: ArchitectureBaseline,\r\n  delta?: ArchitectureDelta,\r\n): ArchitectureEnvelope {\r\n  const merged = delta ? mergeBaselineDelta(baseline, delta) : baseline\r\n  return {\r\n    version: merged.version,\r\n    request_id: delta?.request_id ?? merged.frozen_by_req,\r\n    legal_layer: merged.legal_layer,\r\n    module_boundaries: merged.module_boundaries,\r\n    absorption_budget: merged.absorption_budget,\r\n  }\r\n}\r\n\r\nexport function seedBaselineFromEnvelope(\r\n  envelope: ArchitectureEnvelope,\r\n  reqId: string,\r\n): ArchitectureBaseline {\r\n  return {\r\n    version: envelope.version,\r\n    frozen_at: '',\r\n    frozen_by_req: reqId,\r\n    legal_layer: envelope.legal_layer,\r\n    module_boundaries: envelope.module_boundaries,\r\n    declared_interfaces: [],\r\n    absorption_budget: envelope.absorption_budget,\r\n  }\r\n}\r\n\r\nexport function freezeBaseline(\r\n  baseline: ArchitectureBaseline,\r\n  delta: ArchitectureDelta,\r\n  frozenAt: string,\r\n  frozenAtSha?: string,\r\n): ArchitectureBaseline {\r\n  const merged = mergeBaselineDelta(baseline, delta)\r\n  return {\r\n    ...merged,\r\n    frozen_at: frozenAt,\r\n    frozen_at_sha: frozenAtSha ?? merged.frozen_at_sha,\r\n    frozen_by_req: delta.request_id,\r\n  }\r\n}\r\n\r\nfunction mergeDeclaredInterfaces(\r\n  existing: DeclaredInterface[],\r\n  additions: DeclaredInterface[],\r\n): DeclaredInterface[] {\r\n  const byModule = new Map<string, DeclaredInterface>()\r\n  for (const i of existing) {\r\n    byModule.set(i.module, { ...i, exports: [...i.exports] })\r\n  }\r\n  for (const add of additions) {\r\n    const cur = byModule.get(add.module)\r\n    if (cur) {\r\n      const set = new Set([...cur.exports, ...add.exports])\r\n      cur.exports = [...set]\r\n      cur.source_glob = add.source_glob || cur.source_glob\r\n    } else {\r\n      byModule.set(add.module, { ...add, exports: [...add.exports] })\r\n    }\r\n  }\r\n  return [...byModule.values()]\r\n}\r\n\r\nfunction normalizeBaseline(raw: any): ArchitectureBaseline {\r\n  if (!raw || typeof raw !== 'object') {\r\n    throw new Error('Baseline YAML is empty or not an object')\r\n  }\r\n  if (!raw.module_boundaries) {\r\n    throw new Error('Baseline missing required field: module_boundaries')\r\n  }\r\n  const defaultLevel: ChangeLevel = 'L0'\r\n  return {\r\n    version: raw.version ?? '1.0',\r\n    frozen_at: raw.frozen_at ?? '',\r\n    frozen_at_sha: typeof raw.frozen_at_sha === 'string' && raw.frozen_at_sha.trim()\r\n      ? raw.frozen_at_sha.trim()\r\n      : undefined,\r\n    frozen_by_req: raw.frozen_by_req ?? '',\r\n    legal_layer: raw.legal_layer,\r\n    module_boundaries: {\r\n      writable: (raw.module_boundaries.writable ?? []).map((w: any) => ({\r\n        module: w.module,\r\n        paths: w.paths ?? [],\r\n        change_level: (w.change_level ?? defaultLevel) as ChangeLevel,\r\n      })),\r\n      read_only: (raw.module_boundaries.read_only ?? []).map((r: any) => ({\r\n        module: r.module,\r\n        paths: r.paths ?? [],\r\n      })),\r\n      forbidden: (raw.module_boundaries.forbidden ?? []).map((f: any) => ({\r\n        module: f.module,\r\n        paths: f.paths ?? [],\r\n      })),\r\n    },\r\n    declared_interfaces: (raw.declared_interfaces ?? []).map((i: any) => ({\r\n      module: i.module,\r\n      source_glob: i.source_glob ?? '',\r\n      exports: i.exports ?? [],\r\n    })),\r\n    absorption_budget: {\r\n      max_parallel_slices: raw.absorption_budget?.max_parallel_slices ?? 1,\r\n    },\r\n  }\r\n}\r\n\r\nfunction normalizeDelta(raw: any): ArchitectureDelta {\r\n  if (!raw || typeof raw !== 'object') {\r\n    throw new Error('Delta YAML is empty or not an object')\r\n  }\r\n  const d = raw.delta ?? {}\r\n  return {\r\n    request_id: raw.request_id ?? '',\r\n    based_on_baseline: raw.based_on_baseline ?? '',\r\n    delta: {\r\n      legal_layer: d.legal_layer,\r\n      module_boundaries: d.module_boundaries\r\n        ? {\r\n            writable: (d.module_boundaries.writable ?? []).map((w: any) => ({\r\n              module: w.module,\r\n              paths: w.paths ?? [],\r\n              change_level: (w.change_level ?? 'L0') as ChangeLevel,\r\n            })),\r\n            read_only: (d.module_boundaries.read_only ?? []).map((r: any) => ({\r\n              module: r.module,\r\n              paths: r.paths ?? [],\r\n            })),\r\n            forbidden: (d.module_boundaries.forbidden ?? []).map((f: any) => ({\r\n              module: f.module,\r\n              paths: f.paths ?? [],\r\n            })),\r\n          }\r\n        : undefined,\r\n      declared_interfaces: (d.declared_interfaces ?? []).map((i: any) => ({\r\n        module: i.module,\r\n        source_glob: i.source_glob ?? '',\r\n        exports: i.exports ?? [],\r\n      })),\r\n      absorption_budget: d.absorption_budget,\r\n    },\r\n    理由: raw['理由'] ?? '',\r\n    冲击不变量: raw['冲击不变量'] ?? [],\r\n    gate_变更: (raw['gate_变更'] ?? []).map((g: any) => ({\r\n      gate_id: g.gate_id ?? '',\r\n      change: g.change ?? '',\r\n      reason: g.reason ?? '',\r\n    })),\r\n    升级标记: (raw['升级标记'] ?? 'none') as UpgradeFlag,\r\n  }\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, writeFileSync, mkdirSync, readFileSync } from 'fs'\r\nimport { resolve, dirname } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\n\r\nfunction sanitizeForLog(s: string): string {\r\n  return s.replace(/[\\r\\n]+/g, ' ')\r\n}\r\n\r\nfunction errorMessage(err: unknown): string {\r\n  return err instanceof Error ? err.message : String(err)\r\n}\r\n\r\nfunction argValue(args: string[], name: string): string | undefined {\r\n  const eqForm = args.find(a => a.startsWith(`${name}=`))\r\n  if (eqForm) {\r\n    return eqForm.split('=').slice(1).join('=')\r\n  }\r\n  const idx = args.indexOf(name)\r\n  if (idx >= 0 && idx + 1 < args.length) {\r\n    return args[idx + 1]\r\n  }\r\n  return undefined\r\n}\r\n\r\ninterface ModuleEntry {\r\n  name: string\r\n  kind?: string\r\n  evidence?: string\r\n  note?: string\r\n  drift_from_baseline?: string\r\n}\r\n\r\ninterface DepEntry {\r\n  from?: string\r\n  to?: string\r\n  direction?: string\r\n  kind?: string\r\n  evidence?: string\r\n  forbidden_per_baseline?: string | boolean\r\n}\r\n\r\ninterface ContractEntry {\r\n  interface?: string\r\n  producer?: string\r\n  consumer?: unknown\r\n  kind?: string\r\n  evidence?: string\r\n  breaking_risk?: string\r\n}\r\n\r\ninterface StateEntry {\r\n  entity?: string\r\n  owner_module?: string\r\n  concurrency?: string\r\n  kind?: string\r\n  evidence?: string\r\n  drift_from_baseline?: string\r\n}\r\n\r\ninterface TestEntry {\r\n  target?: string\r\n  kind?: string\r\n  test_kind?: string\r\n  evidence?: string\r\n  covers_requirement?: string\r\n  gap?: string\r\n}\r\n\r\ninterface DriftEntry {\r\n  dimension?: string\r\n  baseline_says?: string\r\n  code_says?: string\r\n  severity?: string\r\n  propose_action?: string\r\n}\r\n\r\nexport interface CodeScanEvidence {\r\n  req_id: string\r\n  generated_at?: string\r\n  mode?: string\r\n  模块?: ModuleEntry[]\r\n  依赖?: DepEntry[]\r\n  契约?: ContractEntry[]\r\n  状态?: StateEntry[]\r\n  测试?: TestEntry[]\r\n  漂移?: DriftEntry[]\r\n}\r\n\r\nexport function loadCodeScanEvidence(path: string): CodeScanEvidence {\r\n  if (!existsSync(path)) {\r\n    throw new Error(`Evidence file not found: ${path}`)\r\n  }\r\n  const text = readFileSync(path, 'utf-8')\r\n  const parsed = parseYaml(text)\r\n  if (!parsed || typeof parsed !== 'object') {\r\n    throw new Error(`Invalid evidence YAML (not an object): ${path}`)\r\n  }\r\n  if (!(parsed as CodeScanEvidence).req_id) {\r\n    throw new Error(`Evidence missing required field: req_id (in ${path})`)\r\n  }\r\n  return parsed as CodeScanEvidence\r\n}\r\n\r\nexport function handleCodeScanRenderReport(args: string[]): void {\r\n  const inPath = argValue(args, '--in')\r\n  const outPath = argValue(args, '--out')\r\n\r\n  if (!inPath || !outPath) {\r\n    console.error('Usage: harness-toolkit code-scan render-report --in=<evidence.yaml> --out=<report.html>')\r\n    process.exit(2)\r\n  }\r\n\r\n  const resolvedIn = resolve(inPath)\r\n  const resolvedOut = resolve(outPath)\r\n\r\n  if (!existsSync(resolvedIn)) {\r\n    console.error(`Evidence file not found: ${sanitizeForLog(resolvedIn)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const evidence = loadCodeScanEvidence(resolvedIn)\r\n    const html = renderCodeScanReportHtml({\r\n      evidence,\r\n      sourcePath: resolvedIn,\r\n      generatedAt: new Date().toISOString(),\r\n    })\r\n\r\n    const outDir = dirname(resolvedOut)\r\n    if (!existsSync(outDir)) mkdirSync(outDir, { recursive: true })\r\n    writeFileSync(resolvedOut, html, 'utf-8')\r\n\r\n    console.log(`Step-2 report written to: ${sanitizeForLog(resolvedOut)}`)\r\n    console.log(`  request_id: ${evidence.req_id}`)\r\n    console.log(`  mode: ${evidence.mode ?? '(unspecified)'}`)\r\n    process.exit(0)\r\n  } catch (err) {\r\n    console.error(`Code-scan render-report failed: ${errorMessage(err)}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\n// ---- HTML rendering helpers ----\r\n\r\nfunction escapeHtml(s: unknown): string {\r\n  if (s === null || s === undefined) return ''\r\n  const str = typeof s === 'string' ? s : String(s)\r\n  return str\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;')\r\n    .replace(/'/g, '&#39;')\r\n}\r\n\r\nconst KIND_BADGE_CLASS: Record<string, string> = {\r\n  fact: 'badge-ok',\r\n  inference: 'badge-info',\r\n}\r\n\r\nconst SEVERITY_BADGE_CLASS: Record<string, string> = {\r\n  cosmetic: 'badge',\r\n  substantive: 'badge-warn',\r\n  breaking: 'badge-block',\r\n}\r\n\r\nexport interface CodeScanRenderInput {\r\n  evidence: CodeScanEvidence\r\n  sourcePath: string\r\n  generatedAt: string\r\n}\r\n\r\nexport function renderCodeScanReportHtml(input: CodeScanRenderInput): string {\r\n  const { evidence, sourcePath, generatedAt } = input\r\n  const parts: string[] = []\r\n\r\n  parts.push(`<!doctype html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>Step-2 Code Scan Report — ${escapeHtml(evidence.req_id)}</title>\r\n<style>\r\n  :root { --fg:#1b1f24; --muted:#5b6470; --bg:#f7f8fa; --card:#fff; --border:#d8dde4; --accent:#2756c9; --ok:#1f7a3a; --warn:#a86600; --major:#a8321f; --block:#7a1f4b; --info:#2756c9; }\r\n  * { box-sizing: border-box; }\r\n  body { font: 14px/1.55 -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif; color: var(--fg); background: var(--bg); margin: 0; padding: 24px; }\r\n  .container { max-width: 1080px; margin: 0 auto; }\r\n  header { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 20px; }\r\n  header h1 { margin: 0 0 6px; font-size: 20px; }\r\n  header .meta { color: var(--muted); font-size: 13px; }\r\n  section { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 18px 22px; margin-bottom: 16px; overflow-x: auto; }\r\n  section h2 { margin: 0 0 12px; font-size: 16px; border-bottom: 2px solid var(--border); padding-bottom: 6px; }\r\n  section h3 { margin: 18px 0 6px; font-size: 14px; color: var(--muted); font-weight: 600; }\r\n  .badges { margin-top: 8px; display: flex; flex-wrap: wrap; gap: 8px; }\r\n  .badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; background: #eef1f6; color: var(--fg); }\r\n  .badge-ok { background: #e6f4ec; color: var(--ok); }\r\n  .badge-info { background: #e6effd; color: var(--info); }\r\n  .badge-warn { background: #fdf3e3; color: var(--warn); }\r\n  .badge-major { background: #fcebe6; color: var(--major); }\r\n  .badge-block { background: #f7e8f0; color: var(--block); }\r\n  table { width: 100%; border-collapse: collapse; margin: 8px 0; font-size: 13px; }\r\n  th, td { text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: top; }\r\n  th { background: #f3f5f8; font-weight: 600; }\r\n  td code, p code { background: #f3f5f8; padding: 1px 5px; border-radius: 3px; font-size: 12.5px; font-family: \"SFMono-Regular\", Consolas, monospace; overflow-wrap: anywhere; word-break: break-word; }\r\n  ul, ol { margin: 6px 0 6px 20px; padding: 0; }\r\n  li { margin: 3px 0; }\r\n  .path-list { font-family: \"SFMono-Regular\", Consolas, monospace; font-size: 12px; color: var(--muted); }\r\n  .muted { color: var(--muted); }\r\n  footer { color: var(--muted); font-size: 12px; text-align: center; padding: 12px 0; }\r\n  .pill { display: inline-block; margin-right: 6px; padding: 1px 8px; border-radius: 3px; background: #eef1f6; font-size: 12px; }\r\n  .skip-notice { background: #fdf3e3; border: 1px solid var(--warn); border-radius: 8px; padding: 18px 22px; margin-bottom: 16px; color: var(--warn); }\r\n  .skip-notice h2 { margin: 0 0 6px; font-size: 16px; border: none; padding: 0; color: var(--warn); }\r\n  pre { background: #f3f5f8; padding: 8px 12px; border-radius: 4px; overflow: auto; }\r\n</style>\r\n</head>\r\n<body>\r\n<div class=\"container\">\r\n`)\r\n\r\n  // Header\r\n  const mode = evidence.mode ?? '(unspecified)'\r\n  parts.push(`<header>\r\n  <h1>Step-2 代码扫描证据报告</h1>\r\n  <div class=\"meta\">req_id: <code>${escapeHtml(evidence.req_id)}</code> · mode: <code>${escapeHtml(mode)}</code>${evidence.generated_at ? ` · generated_at: <code>${escapeHtml(evidence.generated_at)}</code>` : ''}</div>\r\n  <div class=\"badges\">\r\n    <span class=\"badge\">req_id: ${escapeHtml(evidence.req_id)}</span>\r\n    <span class=\"badge\">mode: ${escapeHtml(mode)}</span>\r\n  </div>\r\n</header>\r\n`)\r\n\r\n  // 0→1-no-baseline banner: scanning still runs, but surface the missing-baseline guidance.\r\n  if (evidence.mode === '0→1-no-baseline') {\r\n    parts.push(`<div class=\"skip-notice\">\r\n  <h2>Baseline 待建设</h2>\r\n  <p>未发现 <code>docs/4plus1/baseline.yaml</code>。五个事实 section 已记录代码现状；漂移 section 中所有 <code>baseline_says</code> 标记为 <code>(unspecified - baseline 待建设)</code>。</p>\r\n  <p>下一步：step-3 envelope 基于本 evidence 合成首版 baseline；step-8 baseline freeze 冻结后转入 1→N 模式。</p>\r\n</div>\r\n`)\r\n  }\r\n\r\n  // Six sections in canonical order — rendered in both 1→N and 0→1-no-baseline modes.\r\n  parts.push(renderSection('1. 模块（模块边界）', evidence.模块, renderModulesTable))\r\n  parts.push(renderSection('2. 依赖（依赖方向）', evidence.依赖, renderDepsTable))\r\n  parts.push(renderSection('3. 契约（接口契约）', evidence.契约, renderContractsTable))\r\n  parts.push(renderSection('4. 状态（状态归属）', evidence.状态, renderStateTable))\r\n  parts.push(renderSection('5. 测试（测试覆盖）', evidence.测试, renderTestsTable))\r\n  parts.push(renderSection('6. 漂移（baseline 对比）', evidence.漂移, renderDriftTable))\r\n\r\n  // Footer\r\n  parts.push(`<footer>\r\n  本报告由 <code>harness-toolkit code-scan render-report</code> 生成于 ${escapeHtml(generatedAt)}<br>\r\n  <div class=\"path-list\">evidence: ${escapeHtml(sourcePath)}</div>\r\n</footer>\r\n`)\r\n\r\n  parts.push(`</div>\r\n</body>\r\n</html>\r\n`)\r\n  return parts.join('')\r\n}\r\n\r\nfunction renderSection<T>(title: string, entries: T[] | undefined, renderTable: (entries: T[]) => string): string {\r\n  const count = entries?.length ?? 0\r\n  return `<section>\r\n  <h2>${escapeHtml(title)} (${count})</h2>\r\n  ${count > 0 ? renderTable(entries!) : '<p class=\"muted\">(无)</p>'}\r\n</section>\r\n`\r\n}\r\n\r\nfunction kindBadge(kind?: string): string {\r\n  if (!kind) return '<span class=\"muted\">—</span>'\r\n  const cls = KIND_BADGE_CLASS[kind] ?? 'badge'\r\n  return `<span class=\"badge ${cls}\">${escapeHtml(kind)}</span>`\r\n}\r\n\r\nfunction severityBadge(severity?: string): string {\r\n  if (!severity) return '<span class=\"muted\">—</span>'\r\n  const cls = SEVERITY_BADGE_CLASS[severity] ?? 'badge'\r\n  return `<span class=\"badge ${cls}\">${escapeHtml(severity)}</span>`\r\n}\r\n\r\nfunction renderEvidenceCell(evidence?: string): string {\r\n  if (!evidence) return '<span class=\"muted\">—</span>'\r\n  return `<code>${escapeHtml(evidence)}</code>`\r\n}\r\n\r\nfunction renderModulesTable(entries: ModuleEntry[]): string {\r\n  return `<table><thead><tr><th>name</th><th>kind</th><th>evidence</th><th>note</th><th>drift_from_baseline</th></tr></thead><tbody>\r\n${entries.map(e => `<tr><td><code>${escapeHtml(e.name)}</code></td><td>${kindBadge(e.kind)}</td><td>${renderEvidenceCell(e.evidence)}</td><td>${escapeHtml(e.note) || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(e.drift_from_baseline) || '<span class=\"muted\">none</span>'}</td></tr>`).join('')}\r\n</tbody></table>`\r\n}\r\n\r\nfunction renderDepsTable(entries: DepEntry[]): string {\r\n  return `<table><thead><tr><th>from</th><th>to</th><th>direction</th><th>kind</th><th>evidence</th><th>forbidden_per_baseline</th></tr></thead><tbody>\r\n${entries.map(e => `<tr><td><code>${escapeHtml(e.from)}</code></td><td><code>${escapeHtml(e.to)}</code></td><td>${escapeHtml(e.direction) || '<span class=\"muted\">—</span>'}</td><td>${kindBadge(e.kind)}</td><td>${renderEvidenceCell(e.evidence)}</td><td>${escapeHtml(e.forbidden_per_baseline) ?? '<span class=\"muted\">unknown</span>'}</td></tr>`).join('')}\r\n</tbody></table>`\r\n}\r\n\r\nfunction renderContractsTable(entries: ContractEntry[]): string {\r\n  return `<table><thead><tr><th>interface</th><th>producer</th><th>consumer</th><th>kind</th><th>evidence</th><th>breaking_risk</th></tr></thead><tbody>\r\n${entries.map(e => {\r\n  const consumer = Array.isArray(e.consumer) ? e.consumer.map(c => `<span class=\"pill\">${escapeHtml(c)}</span>`).join('') : escapeHtml(String(e.consumer ?? ''))\r\n  return `<tr><td><code>${escapeHtml(e.interface)}</code></td><td><code>${escapeHtml(e.producer)}</code></td><td>${consumer || '<span class=\"muted\">—</span>'}</td><td>${kindBadge(e.kind)}</td><td>${renderEvidenceCell(e.evidence)}</td><td>${escapeHtml(e.breaking_risk) || '<span class=\"muted\">none</span>'}</td></tr>`\r\n}).join('')}\r\n</tbody></table>`\r\n}\r\n\r\nfunction renderStateTable(entries: StateEntry[]): string {\r\n  return `<table><thead><tr><th>entity</th><th>owner_module</th><th>concurrency</th><th>kind</th><th>evidence</th><th>drift_from_baseline</th></tr></thead><tbody>\r\n${entries.map(e => `<tr><td><code>${escapeHtml(e.entity)}</code></td><td><code>${escapeHtml(e.owner_module)}</code></td><td>${escapeHtml(e.concurrency) || '<span class=\"muted\">—</span>'}</td><td>${kindBadge(e.kind)}</td><td>${renderEvidenceCell(e.evidence)}</td><td>${escapeHtml(e.drift_from_baseline) || '<span class=\"muted\">none</span>'}</td></tr>`).join('')}\r\n</tbody></table>`\r\n}\r\n\r\nfunction renderTestsTable(entries: TestEntry[]): string {\r\n  return `<table><thead><tr><th>target</th><th>kind</th><th>test_kind</th><th>evidence</th><th>covers_requirement</th><th>gap</th></tr></thead><tbody>\r\n${entries.map(e => `<tr><td><code>${escapeHtml(e.target)}</code></td><td>${kindBadge(e.kind)}</td><td>${escapeHtml(e.test_kind) || '<span class=\"muted\">—</span>'}</td><td>${renderEvidenceCell(e.evidence)}</td><td>${escapeHtml(e.covers_requirement) || '<span class=\"muted\">—</span>'}</td><td>${escapeHtml(e.gap) || '<span class=\"muted\">—</span>'}</td></tr>`).join('')}\r\n</tbody></table>`\r\n}\r\n\r\nfunction renderDriftTable(entries: DriftEntry[]): string {\r\n  return `<table><thead><tr><th>dimension</th><th>baseline_says</th><th>code_says</th><th>severity</th><th>propose_action</th></tr></thead><tbody>\r\n${entries.map(e => `<tr><td><code>${escapeHtml(e.dimension)}</code></td><td>${escapeHtml(e.baseline_says) || '<span class=\"muted\">(unspecified)</span>'}</td><td>${escapeHtml(e.code_says) || '<span class=\"muted\">—</span>'}</td><td>${severityBadge(e.severity)}</td><td>${escapeHtml(e.propose_action) || '<span class=\"muted\">none</span>'}</td></tr>`).join('')}\r\n</tbody></table>`\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { resolve, join } from 'path'\r\nimport { loadPipelineConfig, initPipelineState } from '../pipeline/runner.js'\r\nimport { loadState, saveState, advanceToNextStage, resumeFromReview } from '../pipeline/index.js'\r\nimport { resolveBacktrack } from '../pipeline/resolver.js'\r\n\r\nexport function handleStep(args: string[]): void {\r\n  const stepNum = args.find(a => !a.startsWith('--'))\r\n  if (!stepNum) {\r\n    console.error('Usage: harness-toolkit step <N> [--pipeline=<path>] [--project-root=<dir>]')\r\n    process.exit(2)\r\n  }\r\n\r\n  const pipelinePath = args.find(a => a.startsWith('--pipeline='))?.split('=')[1]\r\n    ?? args[args.indexOf('--pipeline') + 1]\r\n    ?? findPipelineYaml()\r\n  const projectRoot = args.find(a => a.startsWith('--project-root='))?.split('=')[1]\r\n    ?? args[args.indexOf('--project-root') + 1]\r\n    ?? process.cwd()\r\n\r\n  if (!existsSync(resolve(pipelinePath))) {\r\n    console.error(`Pipeline file not found: ${pipelinePath}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const config = loadPipelineConfig(resolve(pipelinePath))\r\n    const stepName = findStepName(config, stepNum)\r\n\r\n    if (!stepName) {\r\n      console.error(`Step ${stepNum} not found in pipeline ${config.name}`)\r\n      process.exit(1)\r\n    }\r\n\r\n    const stateDir = join(projectRoot, '.harness', '.pipeline')\r\n    const statePath = join(stateDir, 'state.json')\r\n    let state = existsSync(statePath)\r\n      ? loadState(stateDir)\r\n      : initPipelineState(config, `REQ-auto-${Date.now()}`, { pipeline: resolve(pipelinePath) })\r\n\r\n    if (!state.stages[stepName]) {\r\n      console.error(`Step ${stepName} not found in pipeline state`)\r\n      process.exit(1)\r\n    }\r\n\r\n    const completedSteps = new Set(\r\n      Object.entries(state.stages)\r\n        .filter(([, s]) => s.status === 'completed')\r\n        .map(([name]) => name)\r\n    )\r\n\r\n    if (!completedSteps.has(stepName)) {\r\n      const backtrack = resolveBacktrack(config, stepName, completedSteps)\r\n      if (backtrack.needsExecution.length > 1 || (backtrack.needsExecution.length === 1 && backtrack.needsExecution[0] !== stepName)) {\r\n        console.log(`Backtracking: steps ${backtrack.needsExecution.filter(s => s !== stepName).join(', ')} must execute first`)\r\n        for (const step of backtrack.needsExecution) {\r\n          if (step !== stepName) {\r\n            console.log(`  -> ${step} (upstream dependency)`)\r\n          }\r\n        }\r\n      }\r\n\r\n      if (backtrack.downstreamReset.length > 0) {\r\n        console.log(`Downstream steps to reset: ${backtrack.downstreamReset.join(', ')}`)\r\n      }\r\n    }\r\n\r\n    console.log(`Triggering step: ${stepName}`)\r\n    state = advanceToNextStage(state, stateDir)\r\n    saveState(state, stateDir)\r\n    console.log(`Step ${stepName} status: ${state.stages[stepName]?.status ?? 'unknown'}`)\r\n  } catch (err: any) {\r\n    console.error(`Step trigger failed: ${err.message}`)\r\n    process.exit(2)\r\n  }\r\n}\r\n\r\nexport function handlePipelineStatus(args: string[]): void {\r\n  const projectRoot = args.find(a => a.startsWith('--project-root='))?.split('=')[1]\r\n    ?? args[args.indexOf('--project-root') + 1]\r\n    ?? process.cwd()\r\n  const pipelinePath = args.find(a => a.startsWith('--pipeline='))?.split('=')[1]\r\n    ?? args[args.indexOf('--pipeline') + 1]\r\n    ?? findPipelineYaml()\r\n\r\n  if (existsSync(resolve(pipelinePath))) {\r\n    try {\r\n      const config = loadPipelineConfig(resolve(pipelinePath))\r\n      console.log(`Pipeline: ${config.name}`)\r\n      if (config.governance_root) console.log(`Governance root: ${config.governance_root}`)\r\n      if (config.dependencies) {\r\n        console.log(`Dependencies:`)\r\n        for (const [step, deps] of Object.entries(config.dependencies)) {\r\n          console.log(`  ${step} <- ${deps.join(', ')}`)\r\n        }\r\n      }\r\n      console.log(`Stages (${config.stages.length}):`)\r\n      for (const stage of config.stages) {\r\n        const optional = stage.optional ? ' [optional]' : ''\r\n        const checkpoint = stage.checkpoint ? ` [${stage.checkpoint.id}]` : ''\r\n        console.log(`  ${stage.name} (${stage.mode})${optional}${checkpoint}`)\r\n      }\r\n    } catch (err: any) {\r\n      console.error(`Failed to load pipeline: ${err.message}`)\r\n    }\r\n  } else {\r\n    console.log('No pipeline.yaml found')\r\n  }\r\n\r\n  const stateDir = join(projectRoot, '.harness', '.pipeline')\r\n  const statePath = join(stateDir, 'state.json')\r\n  if (existsSync(statePath)) {\r\n    try {\r\n      const state = loadState(stateDir)\r\n      console.log(`\\nCurrent stage: ${state.currentStage}`)\r\n      console.log(`Request ID: ${state.requestId}`)\r\n      for (const [name, stage] of Object.entries(state.stages)) {\r\n        const icon = stage.status === 'completed' ? '✓' : stage.status === 'in_progress' ? '→' : stage.status === 'rejected' ? '✗' : '·'\r\n        console.log(`  ${icon} ${name}: ${stage.status}`)\r\n      }\r\n    } catch (err: any) {\r\n      console.error(`Failed to load pipeline state: ${err.message}`)\r\n    }\r\n  } else {\r\n    console.log('\\nNo pipeline state found')\r\n  }\r\n}\r\n\r\nfunction findStepName(config: any, stepNum: string): string | undefined {\r\n  const idx = parseInt(stepNum, 10) - 1\r\n  if (!isNaN(idx) && idx >= 0 && idx < config.stages.length) {\r\n    return config.stages[idx].name\r\n  }\r\n  return config.stages.find((s: any) => s.name === stepNum)?.name\r\n}\r\n\r\nfunction findPipelineYaml(): string {\r\n  const cwd = process.cwd()\r\n  for (const name of ['pipeline.yaml', 'pipeline-full.yaml', 'pipeline-incremental.yaml', 'pipeline-lightweight.yaml']) {\r\n    if (existsSync(join(cwd, name))) return join(cwd, name)\r\n  }\r\n  return 'pipeline.yaml'\r\n}\r\n","import { existsSync, mkdirSync, writeFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { PipelineConfig } from './runner.js'\r\n\r\nexport interface BacktrackResult {\r\n  needsExecution: string[]\r\n  downstreamReset: string[]\r\n}\r\n\r\nexport interface ResolverContext {\r\n  governanceRoot: string\r\n  requestId: string\r\n  existingArtifacts: Map<string, string>\r\n  mode: 'online' | 'backlog'\r\n  userIntent?: string\r\n  mayTouchRedLine?: boolean\r\n}\r\n\r\nexport interface ResolverResult {\r\n  artifactId: string\r\n  path: string\r\n  confidence: 'high' | 'low'\r\n  questionsAsked: number\r\n  question?: string\r\n  skipped?: boolean\r\n}\r\n\r\n/** Maps an artifactId to its governance tier subdirectory (per 10-governance layout).\r\n *  Unknown artifactIds fall back to `architecture-envelopes` as the safe default. */\r\nfunction tierForArtifact(artifactId: string): string {\r\n  const versionIntentIds = new Set([\r\n    'PRD.md',\r\n    'step-1-PRD.md',\r\n    'raw-intent.yaml',\r\n    'step-1-raw-intent.yaml',\r\n    'version-requirements.yaml',\r\n    'step-1-version-requirements.yaml',\r\n  ])\r\n  if (versionIntentIds.has(artifactId)) {\r\n    return 'version-intents'\r\n  }\r\n\r\n  const reviewPacketIds = new Set(['review-packet.yaml', 'step-3-review-packet.yaml'])\r\n  if (reviewPacketIds.has(artifactId)) {\r\n    return 'review-packets'\r\n  }\r\n\r\n  const deliveryIds = new Set([\r\n    'delivery-projection.yaml',\r\n    'step-5-delivery-projection.yaml',\r\n    'implementation-evidence.yaml',\r\n    'step-6-implementation-evidence.yaml',\r\n    'post-projection-check.yaml',\r\n    'step-7-post-projection-check.yaml',\r\n    'reconcile.html',\r\n    'step-7-reconcile.html',\r\n  ])\r\n  if (deliveryIds.has(artifactId)) {\r\n    return 'delivery-projections'\r\n  }\r\n\r\n  const baselineIds = new Set([\r\n    'baseline-decision.yaml',\r\n    'step-8-baseline-decision.yaml',\r\n    'release-notes.md',\r\n    'step-9-release-notes.md',\r\n    'baseline.yaml',\r\n  ])\r\n  if (baselineIds.has(artifactId)) {\r\n    return 'baselines'\r\n  }\r\n\r\n  // step-2-code-scan-evidence, step-3-architecture-envelope, step-3-delta, step-4-gate-derivation, reports\r\n  return 'architecture-envelopes'\r\n}\r\n\r\nexport function resolveBacktrack(\r\n  config: PipelineConfig,\r\n  targetStep: string,\r\n  completedSteps: Set<string>,\r\n): BacktrackResult {\r\n  const deps = config.dependencies ?? {}\r\n  const needsExecution = new Set<string>()\r\n  const downstreamReset = new Set<string>()\r\n\r\n  // Walk dependency graph backwards from targetStep\r\n  function walkUp(step: string) {\r\n    if (completedSteps.has(step)) return\r\n    needsExecution.add(step)\r\n    const stepDeps = deps[step] ?? []\r\n    for (const dep of stepDeps) {\r\n      walkUp(dep)\r\n    }\r\n  }\r\n\r\n  // Find all steps that depend on targetStep (directly or transitively)\r\n  function findDownstream(step: string): string[] {\r\n    const result: string[] = []\r\n    for (const [s, d] of Object.entries(deps)) {\r\n      if (d.includes(step)) {\r\n        result.push(s)\r\n        result.push(...findDownstream(s))\r\n      }\r\n    }\r\n    return result\r\n  }\r\n\r\n  // Calculate upstream needs\r\n  walkUp(targetStep)\r\n\r\n  // If targetStep was already completed (re-execution), reset downstream\r\n  if (completedSteps.has(targetStep)) {\r\n    needsExecution.add(targetStep)\r\n    const downstream = findDownstream(targetStep)\r\n    for (const d of downstream) {\r\n      downstreamReset.add(d)\r\n    }\r\n  }\r\n\r\n  return {\r\n    needsExecution: [...needsExecution],\r\n    downstreamReset: [...downstreamReset],\r\n  }\r\n}\r\n\r\nconst MINIMAL_ENVELOPE_TEMPLATE = `version: \"1.0\"\r\nrequest_id: \"{request_id}\"\r\nmodule_boundaries:\r\n  writable:\r\n    - module: \"change-scope\"\r\n      paths: [\"src/**\"]\r\n      change_level: L0\r\n  read_only: []\r\n  forbidden:\r\n    - module: \"protected\"\r\n      paths: [\"src/core/**\"]\r\nabsorption_budget:\r\n  max_parallel_slices: 1\r\n`\r\n\r\nconst CONSERVATIVE_ENVELOPE_TEMPLATE = `version: \"1.0\"\r\nrequest_id: \"{request_id}\"\r\nmodule_boundaries:\r\n  writable: []\r\n  read_only: []\r\n  forbidden:\r\n    - module: \"everything\"\r\n      paths: [\"**\"]\r\nabsorption_budget:\r\n  max_parallel_slices: 1\r\n`\r\n\r\nexport class BacklogMinimalResolver {\r\n  async resolve(artifactId: string, context: ResolverContext): Promise<ResolverResult> {\r\n    // Skip if already present\r\n    const existing = context.existingArtifacts.get(artifactId)\r\n    if (existing && existsSync(existing)) {\r\n      return { artifactId, path: existing, confidence: 'high', questionsAsked: 0, skipped: true }\r\n    }\r\n\r\n    const isHighConfidence = context.userIntent && context.userIntent.trim().length > 0\r\n    const mayTouchRedLine = context.mayTouchRedLine ?? false\r\n\r\n    // Low confidence + might touch red line → ask one question\r\n    if (!isHighConfidence && mayTouchRedLine) {\r\n      return {\r\n        artifactId,\r\n        path: '',\r\n        confidence: 'low',\r\n        questionsAsked: 1,\r\n        question: `The change scope might touch protected modules. Allow changes to all of src/? (yes/no)`,\r\n      }\r\n    }\r\n\r\n    // Generate the artifact\r\n    const template = isHighConfidence ? MINIMAL_ENVELOPE_TEMPLATE : CONSERVATIVE_ENVELOPE_TEMPLATE\r\n    const content = template.replace('{request_id}', context.requestId)\r\n    const artifactDir = join(context.governanceRoot, tierForArtifact(artifactId), context.requestId)\r\n    const artifactPath = join(artifactDir, artifactId)\r\n\r\n    mkdirSync(artifactDir, { recursive: true })\r\n    writeFileSync(artifactPath, content, 'utf-8')\r\n\r\n    return {\r\n      artifactId,\r\n      path: artifactPath,\r\n      confidence: isHighConfidence ? 'high' : 'low',\r\n      questionsAsked: 0,\r\n    }\r\n  }\r\n}\r\n\r\nconst FULL_ENVELOPE_TEMPLATE = `version: \"1.0\"\r\nrequest_id: \"{request_id}\"\r\nlegal_layer:\r\n  architectural:\r\n    - scope: \"module boundaries\"\r\n      enforcement: \"drift-check\"\r\n  code:\r\n    - scope: \"content patterns\"\r\n      enforcement: \"regex-check\"\r\nmodule_boundaries:\r\n  writable:\r\n    - module: \"{writable_module}\"\r\n      paths: [\"{writable_paths}\"]\r\n      change_level: L0\r\n  read_only:\r\n    - module: \"{read_only_module}\"\r\n      paths: [\"{read_only_paths}\"]\r\n  forbidden:\r\n    - module: \"{forbidden_module}\"\r\n      paths: [\"{forbidden_paths}\"]\r\nabsorption_budget:\r\n  max_parallel_slices: 2\r\n`\r\n\r\nexport class OnlineFullResolver {\r\n  async resolve(artifactId: string, context: ResolverContext): Promise<ResolverResult> {\r\n    // Skip if already present\r\n    const existing = context.existingArtifacts.get(artifactId)\r\n    if (existing && existsSync(existing)) {\r\n      return { artifactId, path: existing, confidence: 'high', questionsAsked: 0, skipped: true }\r\n    }\r\n\r\n    // Online mode: derive from user intent\r\n    const intent = context.userIntent ?? ''\r\n    const writableModule = this.extractModuleName(intent, 'new-module')\r\n    const readOnlyModule = this.extractReadOnlyModule(intent, 'shared')\r\n    const forbiddenModule = this.extractForbiddenModule(intent, 'protected')\r\n\r\n    const content = FULL_ENVELOPE_TEMPLATE\r\n      .replace(/{request_id}/g, context.requestId)\r\n      .replace(/{writable_module}/g, writableModule)\r\n      .replace(/{writable_paths}/g, `src/${writableModule}/**`)\r\n      .replace(/{read_only_module}/g, readOnlyModule)\r\n      .replace(/{read_only_paths}/g, `src/${readOnlyModule}/**`)\r\n      .replace(/{forbidden_module}/g, forbiddenModule)\r\n      .replace(/{forbidden_paths}/g, `src/${forbiddenModule}/**`)\r\n\r\n    const artifactDir = join(context.governanceRoot, tierForArtifact(artifactId), context.requestId)\r\n    const artifactPath = join(artifactDir, artifactId)\r\n\r\n    mkdirSync(artifactDir, { recursive: true })\r\n    writeFileSync(artifactPath, content, 'utf-8')\r\n\r\n    return {\r\n      artifactId,\r\n      path: artifactPath,\r\n      confidence: intent ? 'high' : 'low',\r\n      questionsAsked: 0,\r\n    }\r\n  }\r\n\r\n  private extractModuleName(intent: string, fallback: string): string {\r\n    const moduleMatch = intent.match(/(?:add|build|create|implement)\\s+(?:a\\s+)?(?:new\\s+)?(\\w+)\\s+(?:module|feature|component)/i)\r\n    return moduleMatch?.[1]?.toLowerCase() ?? fallback\r\n  }\r\n\r\n  private extractReadOnlyModule(intent: string, fallback: string): string {\r\n    const match = intent.match(/(\\w+)\\s+(?:is\\s+)?read[- ]?only/i)\r\n    return match?.[1]?.toLowerCase() ?? fallback\r\n  }\r\n\r\n  private extractForbiddenModule(intent: string, fallback: string): string {\r\n    const match = intent.match(/forbid(?:den)?\\s+(\\w+)/i)\r\n    return match?.[1]?.toLowerCase() ?? fallback\r\n  }\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { resolve, join, dirname } from 'path'\r\nimport { reconcile } from '../reconcile/index.js'\r\nimport type { ReconcileResult } from '../reconcile/types.js'\r\nimport { stringify as stringifyYaml } from 'yaml'\r\n\r\nfunction argValue(args: string[], name: string): string | undefined {\r\n  const eqForm = args.find(a => a.startsWith(`${name}=`))\r\n  if (eqForm) return eqForm.split('=').slice(1).join('=')\r\n  const idx = args.indexOf(name)\r\n  if (idx >= 0 && idx + 1 < args.length) return args[idx + 1]\r\n  return undefined\r\n}\r\n\r\nexport async function handleReconcile(args: string[]): Promise<void> {\r\n  const projectRoot = argValue(args, '--project-root') ?? process.cwd()\r\n  const contractDir = argValue(args, '--contract-dir')\r\n  const outputHtml = argValue(args, '--output-html')\r\n  const baselinePath = argValue(args, '--baseline')\r\n  const deltaPath = argValue(args, '--delta')\r\n  const requestId = argValue(args, '--request-id')\r\n  const narrativePath = argValue(args, '--narrative')\r\n  const outputYaml = argValue(args, '--output-yaml')\r\n  const envelopePath = args.find(a => !a.startsWith('--'))\r\n\r\n  const hasDualSource = baselinePath || deltaPath\r\n  if (!envelopePath && !hasDualSource) {\r\n    console.error('Usage: harness-toolkit reconcile (<envelope.yaml> | --baseline=<path> [--delta=<path>])')\r\n    console.error('                                      [--project-root=<dir>] [--contract-dir=<dir>]')\r\n    console.error('                                      [--output-html=<path>] [--output-yaml=<path>] [--request-id=<REQ-ID>]')\r\n    console.error('                                      [--narrative=<markdown-path>]')\r\n    process.exit(2)\r\n  }\r\n\r\n  if (envelopePath && !hasDualSource) {\r\n    const resolvedPath = resolve(envelopePath)\r\n    if (!existsSync(resolvedPath)) {\r\n      console.error(`Envelope file not found: ${resolvedPath}`)\r\n      process.exit(1)\r\n    }\r\n  }\r\n  if (baselinePath && !existsSync(resolve(baselinePath))) {\r\n    console.error(`Baseline file not found: ${resolve(baselinePath)}`)\r\n    process.exit(1)\r\n  }\r\n  if (deltaPath && !existsSync(resolve(deltaPath))) {\r\n    console.error(`Delta file not found: ${resolve(deltaPath)}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  try {\r\n    const request = {\r\n      envelopePath: envelopePath && !hasDualSource ? resolve(envelopePath) : undefined,\r\n      baselinePath: baselinePath ? resolve(baselinePath) : undefined,\r\n      deltaPath: deltaPath ? resolve(deltaPath) : undefined,\r\n      projectRoot,\r\n      contractDir: contractDir ? resolve(contractDir) : undefined,\r\n      requestId,\r\n      narrativePath,\r\n    }\r\n\r\n    const result = await reconcile(request)\r\n\r\n    printBetaStdout(request, result)\r\n\r\n    // C2: Write YAML output (step-7-post-projection-check.yaml)\r\n    if (outputYaml) {\r\n      const yaml = buildReconcileYaml(result, request)\r\n      const yamlPath = resolve(outputYaml)\r\n      mkdirSync(dirname(yamlPath), { recursive: true })\r\n      writeFileSync(yamlPath, stringifyYaml(yaml), 'utf-8')\r\n      console.log(`\\nYAML report: ${yamlPath}`)\r\n    }\r\n\r\n    if (result.htmlReport && outputHtml) {\r\n      writeFileSync(resolve(outputHtml), result.htmlReport, 'utf-8')\r\n      console.log(`\\nHTML report: ${resolve(outputHtml)}`)\r\n    }\r\n\r\n    process.exit(result.phase1.passed ? 0 : 1)\r\n  } catch (err: any) {\r\n    console.error(`Reconcile failed: ${err.message}`)\r\n    process.exit(2)\r\n  }\r\n}\r\n\r\nfunction buildReconcileYaml(\r\n  result: ReconcileResult,\r\n  request: { requestId?: string; narrativePath?: string },\r\n): Record<string, unknown> {\r\n  const { phase1, phase2 } = result\r\n  const reqId = phase2?.narrative.requestId ?? request.requestId ?? '(unknown)'\r\n  const narrative = phase2?.narrative ?? {}\r\n\r\n  const yaml: Record<string, unknown> = {\r\n    request_id: reqId,\r\n    timestamp: new Date().toISOString(),\r\n    phase1: {\r\n      passed: phase1.passed,\r\n      blocked: phase1.blocked,\r\n      drift_check: phase1.driftCheck.passed,\r\n      contract_check: phase1.contractCheck.passed,\r\n      gate_check: phase1.gateCheck.passed,\r\n      unexpected: phase1.driftCheck.unexpected,\r\n      breaking_changes: phase1.contractCheck.breakingChanges,\r\n    },\r\n  }\r\n\r\n  if (phase2) {\r\n    const totalAdded = phase2.interfaceFileDiffs.reduce((n, d) => n + d.added.length, 0)\r\n    const totalRemoved = phase2.interfaceFileDiffs.reduce((n, d) => n + d.removed.length, 0)\r\n    const totalChanged = phase2.interfaceFileDiffs.reduce((n, d) => n + d.changed.length, 0)\r\n\r\n    yaml.phase2 = {\r\n      modules: phase2.moduleDiffs.length,\r\n      other_files: phase2.otherFiles.length,\r\n      interfaces: { added: totalAdded, removed: totalRemoved, changed: totalChanged },\r\n      governance_drift: {\r\n        vs_delta: phase2.governanceDrift.vsDelta.map(d => d.file),\r\n        vs_baseline: phase2.governanceDrift.vsBaseline.map(d => d.file),\r\n        unexpected: phase2.governanceDrift.unexpected.map(d => d.file),\r\n      },\r\n      sha_warnings: phase2.shaWarnings,\r\n      skip_reason: phase2.skipReason ?? null,\r\n      verdict: narrative.h3Verdict?.decision ?? (phase1.passed ? 'PASSED' : 'BLOCKED'),\r\n      caveats: narrative.h3Verdict?.caveats ?? [],\r\n      defects: (narrative.defectsFixed ?? []).map(d => ({ id: d.id, symptom: d.symptom, file: d.file })),\r\n      arch_adjustments: (narrative.architectureAdjustments ?? []).map(a => ({ item: a.item, rationale: a.rationale })),\r\n    }\r\n  }\r\n\r\n  return yaml\r\n}\r\n\r\nfunction printBetaStdout(request: { requestId?: string; narrativePath?: string }, result: ReconcileResult): void {\r\n  const { phase1, phase2 } = result\r\n  const reqId = phase2?.narrative.requestId ?? request.requestId ?? '(unknown)'\r\n  const narrative = phase2?.narrative ?? {}\r\n\r\n  const skipReason = phase2?.skipReason\r\n  const verdict = skipReason\r\n    ? `SKIPPED — ${skipReason}`\r\n    : (narrative.h3Verdict?.decision ?? (phase1.passed ? 'PASSED' : 'BLOCKED'))\r\n\r\n  console.log(`═══ Reconcile: ${reqId} ═══`)\r\n  console.log(`Verdict: ${verdict}`)\r\n  console.log('')\r\n\r\n  if (phase2) {\r\n    const totalAdded = phase2.interfaceFileDiffs.reduce((n, d) => n + d.added.length, 0)\r\n    const totalRemoved = phase2.interfaceFileDiffs.reduce((n, d) => n + d.removed.length, 0)\r\n    const totalChanged = phase2.interfaceFileDiffs.reduce((n, d) => n + d.changed.length, 0)\r\n\r\n    console.log('Dashboard:')\r\n    console.log(`  Modules: ${phase2.moduleDiffs.length}  ·  Other files: ${phase2.otherFiles.length}  ·  Interfaces: +${totalAdded}/-${totalRemoved}/~${totalChanged}`)\r\n    const drift = phase2.governanceDrift\r\n    console.log(`  Drift: Δ=${drift.vsDelta.length} B=${drift.vsBaseline.length} ✗=${drift.unexpected.length}  ·  Defects: ${narrative.defectsFixed?.length ?? 0}  ·  Arch adjustments: ${narrative.architectureAdjustments?.length ?? 0}`)\r\n\r\n    if (phase2.shaWarnings.length > 0) {\r\n      console.log('')\r\n      for (const w of phase2.shaWarnings) console.log(`  ⚠ ${w}`)\r\n    }\r\n\r\n    if (narrative.narrativeMarkdown) {\r\n      console.log('')\r\n      console.log('Main flows (from --narrative):')\r\n      for (const line of narrative.narrativeMarkdown.split('\\n').slice(0, 5)) {\r\n        if (line.trim()) console.log(`  ${line.trim()}`)\r\n      }\r\n    } else if (narrative.architectureAdjustments?.length) {\r\n      console.log('')\r\n      console.log('Main flows (from architecture adjustments):')\r\n      for (const a of narrative.architectureAdjustments.slice(0, 3)) {\r\n        console.log(`  - ${a.item}`)\r\n      }\r\n    }\r\n\r\n    if (narrative.defectsFixed?.length) {\r\n      console.log('')\r\n      console.log(`Top defects (showing ${Math.min(5, narrative.defectsFixed.length)} of ${narrative.defectsFixed.length}):`)\r\n      for (const d of narrative.defectsFixed.slice(0, 5)) {\r\n        const file = d.file ? `  ${d.file}` : ''\r\n        console.log(`  ${d.id.padEnd(32)}${file}`)\r\n      }\r\n    }\r\n\r\n    if (narrative.h3Verdict?.caveats?.length) {\r\n      console.log('')\r\n      console.log('H3 caveats:')\r\n      for (const c of narrative.h3Verdict.caveats) console.log(`  - ${c}`)\r\n    }\r\n  } else {\r\n    console.log('Phase 1: Deterministic Checks')\r\n    console.log(`  Drift check:   ${phase1.driftCheck.passed ? 'PASSED' : 'FAILED'}`)\r\n    for (const u of phase1.driftCheck.unexpected) console.log(`    ! ${u.file}`)\r\n    console.log(`  Contract check: ${phase1.contractCheck.passed ? 'PASSED' : 'FAILED'}`)\r\n    for (const bc of phase1.contractCheck.breakingChanges) console.log(`    ! ${bc}`)\r\n    console.log(`  Gate check:    ${phase1.gateCheck.passed ? 'PASSED' : 'FAILED'}`)\r\n    console.log(`  Overall:       ${phase1.passed ? 'PASSED' : 'BLOCKED — phase 2 skipped'}`)\r\n  }\r\n}\r\n","import { execSync } from 'child_process'\r\nimport { existsSync, readFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport {\r\n  loadEnvelope,\r\n  checkDrift,\r\n  pathMatchesGlob,\r\n  type ArchitectureEnvelope,\r\n} from '../envelope/index.js'\r\nimport {\r\n  loadBaseline,\r\n  loadDelta,\r\n  deriveEnvelope as deriveEnvelopeFromBaseline,\r\n  type ArchitectureBaseline,\r\n  type ArchitectureDelta,\r\n} from '../envelope/baseline.js'\r\nimport { inferProjectGraph } from '../graphify/index.js'\r\nimport { diffInterfaces } from '../graphify/diff.js'\r\nimport {\r\n  parseExportsFromGitRevision,\r\n  parseExportsFromWorkingTree,\r\n  resolveBaselineSha,\r\n  diffExportSnapshots,\r\n} from '../graphify/parse-exports.js'\r\nimport { loadStep7Evidence, loadNarrativeMarkdown } from './narrative.js'\r\nimport type {\r\n  ReconcileRequest,\r\n  ReconcilePhase1Result,\r\n  ReconcilePhase2Result,\r\n  ReconcileResult,\r\n  ModuleDiff,\r\n  InterfaceFileDiff,\r\n  InterfaceDiff,\r\n  GovernanceDrift,\r\n  ChangeNarrative,\r\n} from './types.js'\r\n\r\nexport type { ReconcileRequest, ReconcilePhase1Result, ReconcilePhase2Result, ReconcileResult } from './types.js'\r\n\r\ninterface ResolvedTarget {\r\n  baseline: ArchitectureBaseline | null\r\n  delta: ArchitectureDelta | null\r\n  envelope: ArchitectureEnvelope\r\n}\r\n\r\nfunction resolveTarget(request: ReconcileRequest): ResolvedTarget {\r\n  if (!request.baselinePath || !existsSync(request.baselinePath)) {\r\n    if (request.envelopePath && existsSync(request.envelopePath)) {\r\n      const env = loadEnvelope(request.envelopePath)\r\n      const baseline: ArchitectureBaseline = {\r\n        version: env.version,\r\n        frozen_at: '',\r\n        frozen_by_req: env.request_id,\r\n        legal_layer: env.legal_layer,\r\n        module_boundaries: env.module_boundaries,\r\n        declared_interfaces: [],\r\n        absorption_budget: env.absorption_budget,\r\n      }\r\n      return { baseline, delta: null, envelope: env }\r\n    }\r\n    throw new Error(\r\n      `Reconcile requires either baselinePath (preferred) or envelopePath (legacy). ` +\r\n        `Got baselinePath=${request.baselinePath ?? '<undefined>'}.`,\r\n    )\r\n  }\r\n\r\n  const baseline = loadBaseline(request.baselinePath)\r\n  const delta = request.deltaPath && existsSync(request.deltaPath) ? loadDelta(request.deltaPath) : null\r\n\r\n  let envelope: ArchitectureEnvelope\r\n  if (request.envelopePath && existsSync(request.envelopePath)) {\r\n    envelope = loadEnvelope(request.envelopePath)\r\n  } else {\r\n    envelope = deriveEnvelopeFromBaseline(baseline, delta ?? undefined)\r\n  }\r\n\r\n  return { baseline, delta, envelope }\r\n}\r\n\r\n/**\r\n * Files and directories created or modified by `harness-toolkit init`.\r\n * These are scaffold artifacts that should never count as governance drift.\r\n *\r\n * When a user runs `harness-toolkit init` before step-7 reconcile, the init\r\n * process may append to CLAUDE.md (router block), add entries to .gitignore,\r\n * and create .pipeline/, gates/, .claude/, CONTEXT.md, pipeline templates,\r\n * and other scaffold files. None of these are declared in any envelope writable\r\n * module, so the drift check would (incorrectly) flag them as unexpected and\r\n * BLOCK Phase 2.\r\n */\r\nconst INIT_SCAFFOLD_DRIFT_EXCLUSIONS = [\r\n  'CLAUDE.md',\r\n  '.gitignore',\r\n  'CONTEXT.md',\r\n  'pipeline.yaml',\r\n  'pipeline-full.yaml',\r\n  'pipeline-incremental.yaml',\r\n  'pipeline-lightweight.yaml',\r\n  'git-strategy.yaml',\r\n  'teams/**',\r\n  '.pipeline/**',\r\n  '.claude/**',\r\n  '.trae/**',\r\n  '.opencode/**',\r\n  '.harness/**',\r\n  'scripts/hooks/**',\r\n  'gates/**',\r\n]\r\n\r\n/**\r\n * Return true if `filePath` is an init scaffold artifact that should be\r\n * excluded from governance drift checks.\r\n */\r\nfunction isInitScaffoldFile(filePath: string): boolean {\r\n  for (const pattern of INIT_SCAFFOLD_DRIFT_EXCLUSIONS) {\r\n    if (pathMatchesGlob(filePath, pattern)) return true\r\n  }\r\n  return false\r\n}\r\n\r\nexport async function runPhase1(request: ReconcileRequest): Promise<ReconcilePhase1Result> {\r\n  const { envelope, baseline } = resolveTarget(request)\r\n\r\n  let driftPassed = true\r\n  let unexpected: Array<{ file: string; change_level?: string }> = []\r\n\r\n  const targetEnvelope = resolveTargetEnvelope(request)\r\n  if (targetEnvelope) {\r\n    const sinceSha = baseline?.frozen_at_sha ?? null\r\n    const allChangedFiles = getChangedFiles(request.projectRoot, sinceSha)\r\n    // Filter out init scaffold files — they are not governance-significant\r\n    const changedFiles = allChangedFiles.filter(f => !isInitScaffoldFile(f))\r\n    const drift = checkDrift(targetEnvelope, changedFiles)\r\n    driftPassed = drift.passed\r\n    unexpected = drift.unexpected\r\n  }\r\n\r\n  let contractPassed = true\r\n  const breakingChanges: string[] = []\r\n\r\n  if (request.contractDir && existsSync(request.contractDir)) {\r\n    const { readdirSync, readFileSync } = await import('fs')\r\n    const { join } = await import('path')\r\n    for (const entry of readdirSync(request.contractDir)) {\r\n      if (!entry.endsWith('.json')) continue\r\n      const content = readFileSync(join(request.contractDir, entry), 'utf-8')\r\n      const contract = JSON.parse(content)\r\n      if (contract.breakingChanges && Array.isArray(contract.breakingChanges)) {\r\n        for (const bc of contract.breakingChanges) {\r\n          breakingChanges.push(`${contract.module ?? entry}: ${bc.type} ${bc.name ?? ''}`.trim())\r\n        }\r\n      }\r\n    }\r\n    contractPassed = breakingChanges.length === 0\r\n  }\r\n\r\n  const gateCheckPassed = driftPassed && contractPassed\r\n\r\n  return {\r\n    passed: driftPassed && contractPassed && gateCheckPassed,\r\n    blocked: !driftPassed || !contractPassed,\r\n    driftCheck: { passed: driftPassed, unexpected },\r\n    contractCheck: { passed: contractPassed, breakingChanges },\r\n    gateCheck: { passed: gateCheckPassed, warnings: 0 },\r\n  }\r\n}\r\n\r\nexport async function runPhase2(\r\n  request: ReconcileRequest,\r\n  _phase1: ReconcilePhase1Result,\r\n): Promise<ReconcilePhase2Result> {\r\n  const { baseline } = resolveTarget(request)\r\n\r\n  const sinceShaInfo = baseline\r\n    ? resolveBaselineSha(request.projectRoot, baseline.frozen_at_sha, baseline.frozen_at)\r\n    : { sha: null, source: 'none' as const, warning: 'baseline missing — interface diff disabled' }\r\n\r\n  const allChangedFiles = getChangedFiles(request.projectRoot, sinceShaInfo.sha)\r\n  // Filter out init scaffold files — they are not governance-significant\r\n  const changedFiles = allChangedFiles.filter(f => !isInitScaffoldFile(f))\r\n\r\n  // Module diff split: src/ → modules, everything else → otherFiles\r\n  const { moduleDiffs, otherFiles } = computeModuleDiffs(changedFiles)\r\n\r\n  // Y2 interface diff: baseline SHA vs HEAD per file\r\n  const interfaceFileDiffs = sinceShaInfo.sha\r\n    ? await computeInterfaceFileDiffs(request.projectRoot, sinceShaInfo.sha, changedFiles)\r\n    : []\r\n\r\n  // Legacy interface diff (envelope.declared_interfaces vs ts-morph scan) — kept for backward compat\r\n  const interfaceDiffs = await computeInterfaceDiffs(request)\r\n\r\n  const governanceDrift = computeGovernanceDrift(request, changedFiles)\r\n\r\n  const { narrative, evidenceWarnings } = assembleNarrative(request)\r\n\r\n  const shaWarnings: string[] = []\r\n  if (sinceShaInfo.warning) shaWarnings.push(sinceShaInfo.warning)\r\n  shaWarnings.push(...evidenceWarnings)\r\n\r\n  // A6: Detect 0→1 no-op — no product code changes and baseline not frozen\r\n  let skipReason: string | undefined\r\n  if (changedFiles.length === 0 && !sinceShaInfo.sha) {\r\n    skipReason = '0→1 无产品代码改动且 baseline 未冻结，对账跳过（无产品代码可对账）'\r\n  } else if (changedFiles.length === 0) {\r\n    skipReason = '无产品代码改动（仅有 init/scaffold 类文件），对账跳过'\r\n  }\r\n\r\n  return {\r\n    moduleDiffs,\r\n    otherFiles,\r\n    interfaceFileDiffs,\r\n    interfaceDiffs,\r\n    governanceDrift,\r\n    narrative,\r\n    shaWarnings,\r\n    skipReason,\r\n  }\r\n}\r\n\r\nexport async function reconcile(request: ReconcileRequest): Promise<ReconcileResult> {\r\n  const phase1 = await runPhase1(request)\r\n\r\n  if (phase1.blocked) {\r\n    return { phase1 }\r\n  }\r\n\r\n  const phase2 = await runPhase2(request, phase1)\r\n  const htmlReport = generateHtmlReport(request, phase1, phase2)\r\n\r\n  return { phase1, phase2, htmlReport }\r\n}\r\n\r\n/**\r\n * All changed files since the given SHA (committed + uncommitted + untracked).\r\n * If sinceSha is null, falls back to uncommitted-only (legacy `git diff --name-only HEAD`).\r\n */\r\nfunction getChangedFiles(projectRoot: string, sinceSha: string | null): string[] {\r\n  const set = new Set<string>()\r\n  const collect = (cmd: string) => {\r\n    try {\r\n      const out = execSync(cmd, { timeout: 10000, stdio: ['ignore', 'pipe', 'pipe'], cwd: projectRoot })\r\n        .toString().trim()\r\n      if (out) for (const f of out.split('\\n').filter(Boolean)) set.add(f.replace(/\\\\/g, '/'))\r\n    } catch {\r\n      // git not available / sha invalid — skip\r\n    }\r\n  }\r\n\r\n  if (sinceSha) {\r\n    collect(`git diff --name-only ${sinceSha} HEAD`)\r\n    collect(`git diff --name-only HEAD`)\r\n    collect(`git ls-files --others --exclude-standard`)\r\n  } else {\r\n    collect(`git diff --name-only HEAD`)\r\n  }\r\n\r\n  return [...set].sort()\r\n}\r\n\r\nfunction resolveTargetEnvelope(request: ReconcileRequest): ArchitectureEnvelope | undefined {\r\n  if (request.envelopePath && existsSync(request.envelopePath)) {\r\n    return loadEnvelope(request.envelopePath)\r\n  }\r\n  if (request.baselinePath && existsSync(request.baselinePath)) {\r\n    const baseline = loadBaseline(request.baselinePath)\r\n    const delta = request.deltaPath && existsSync(request.deltaPath)\r\n      ? loadDelta(request.deltaPath)\r\n      : undefined\r\n    return deriveEnvelopeFromBaseline(baseline, delta)\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction computeModuleDiffs(changedFiles: string[]): { moduleDiffs: ModuleDiff[]; otherFiles: string[] } {\r\n  const modules = new Map<string, { before: Set<string>; after: Set<string> }>()\r\n  const otherFiles: string[] = []\r\n\r\n  for (const file of changedFiles) {\r\n    if (file.startsWith('src/')) {\r\n      const parts = file.split('/')\r\n      const moduleName = parts.length >= 2 ? parts[1] : 'src'\r\n      if (!modules.has(moduleName)) {\r\n        modules.set(moduleName, { before: new Set(), after: new Set() })\r\n      }\r\n      modules.get(moduleName)!.after.add(file)\r\n    } else {\r\n      otherFiles.push(file)\r\n    }\r\n  }\r\n\r\n  const moduleDiffs: ModuleDiff[] = []\r\n  for (const [name, diff] of modules) {\r\n    moduleDiffs.push({\r\n      moduleName: name,\r\n      before: [...diff.before],\r\n      after: [...diff.after],\r\n      added: [...diff.after].filter(f => !diff.before.has(f)),\r\n      removed: [...diff.before].filter(f => !diff.after.has(f)),\r\n    })\r\n  }\r\n  moduleDiffs.sort((a, b) => a.moduleName.localeCompare(b.moduleName))\r\n  otherFiles.sort()\r\n\r\n  return { moduleDiffs, otherFiles }\r\n}\r\n\r\nasync function computeInterfaceFileDiffs(\r\n  projectRoot: string,\r\n  sha: string,\r\n  changedFiles: string[],\r\n): Promise<InterfaceFileDiff[]> {\r\n  // TypeScript: src/ prefix, .ts extension, not declaration files\r\n  const tsFiles = changedFiles.filter(f => f.startsWith('src/') && f.endsWith('.ts') && !f.endsWith('.d.ts'))\r\n  // Java: .java extension (any path — Maven modules are not always under src/)\r\n  const javaFiles = changedFiles.filter(f => f.endsWith('.java') && !f.endsWith('.d.ts'))\r\n\r\n  if (tsFiles.length === 0 && javaFiles.length === 0) return []\r\n\r\n  const results: InterfaceFileDiff[] = []\r\n\r\n  // TypeScript symbol diff (ts-morph based)\r\n  if (tsFiles.length > 0) {\r\n    const [before, after] = await Promise.all([\r\n      parseExportsFromGitRevision(projectRoot, sha, tsFiles),\r\n      parseExportsFromWorkingTree(projectRoot, tsFiles),\r\n    ])\r\n    results.push(...diffExportSnapshots(before, after))\r\n  }\r\n\r\n  // Java symbol diff (regex-based — no full Java parser needed for drift detection)\r\n  if (javaFiles.length > 0) {\r\n    const javaDiffs = await computeJavaFileDiffs(projectRoot, sha, javaFiles)\r\n    results.push(...javaDiffs)\r\n  }\r\n\r\n  return results.sort((a, b) => a.file.localeCompare(b.file))\r\n}\r\n\r\n/**\r\n * Compute per-file Java symbol diffs using regex-based declaration extraction.\r\n * Parses public interface/class/enum/record declarations from each file at\r\n * the baseline SHA and at HEAD, then diffs the symbol sets.\r\n */\r\nasync function computeJavaFileDiffs(\r\n  projectRoot: string,\r\n  sha: string,\r\n  javaFiles: string[],\r\n): Promise<InterfaceFileDiff[]> {\r\n  const results: InterfaceFileDiff[] = []\r\n\r\n  for (const file of javaFiles) {\r\n    const normalizedFile = file.replace(/\\\\/g, '/')\r\n\r\n    // Extract symbols at baseline SHA\r\n    const beforeSymbols: Array<{ name: string; kind: string }> = []\r\n    try {\r\n      const beforeContent = execSync(`git show ${sha}:${normalizedFile}`, {\r\n        cwd: projectRoot,\r\n        stdio: ['ignore', 'pipe', 'pipe'],\r\n        timeout: 5000,\r\n        maxBuffer: 5 * 1024 * 1024,\r\n      }).toString('utf-8')\r\n      beforeSymbols.push(...extractJavaSymbols(beforeContent))\r\n    } catch {\r\n      // File didn't exist at baseline — all current symbols will show as \"added\"\r\n    }\r\n\r\n    // Extract symbols at HEAD\r\n    const afterSymbols: Array<{ name: string; kind: string }> = []\r\n    try {\r\n      const afterContent = readFileSync(join(projectRoot, normalizedFile), 'utf-8')\r\n      afterSymbols.push(...extractJavaSymbols(afterContent))\r\n    } catch {\r\n      // File deleted — skip\r\n      continue\r\n    }\r\n\r\n    const beforeMap = new Map(beforeSymbols.map(s => [s.name, s]))\r\n    const afterMap = new Map(afterSymbols.map(s => [s.name, s]))\r\n\r\n    const added = afterSymbols.filter(s => !beforeMap.has(s.name))\r\n    const removed = beforeSymbols.filter(s => !afterMap.has(s.name))\r\n    const changed = afterSymbols.filter(s => {\r\n      const old = beforeMap.get(s.name)\r\n      return old && old.kind !== s.kind\r\n    })\r\n\r\n    if (added.length > 0 || removed.length > 0 || changed.length > 0) {\r\n      results.push({ file: normalizedFile, added, removed, changed })\r\n    }\r\n  }\r\n\r\n  return results\r\n}\r\n\r\n/**\r\n * Extract Java public type declarations via regex.\r\n * Returns { name, kind } pairs for public interface/class/enum/record declarations.\r\n */\r\nfunction extractJavaSymbols(content: string): Array<{ name: string; kind: string }> {\r\n  if (!content.trim()) return []\r\n  const symbols: Array<{ name: string; kind: string }> = []\r\n  const re = /public\\s+(?:abstract\\s+)?(interface|class|enum|record)\\s+(\\w+)/g\r\n  let match: RegExpExecArray | null\r\n  while ((match = re.exec(content)) !== null) {\r\n    symbols.push({ name: match[2], kind: match[1] })\r\n  }\r\n  return symbols\r\n}\r\n\r\nasync function computeInterfaceDiffs(request: ReconcileRequest): Promise<InterfaceDiff[]> {\r\n  const declared = request.baselinePath && existsSync(request.baselinePath)\r\n    ? loadBaseline(request.baselinePath).declared_interfaces\r\n    : []\r\n\r\n  if (declared.length === 0) {\r\n    return []\r\n  }\r\n\r\n  try {\r\n    const inferred = await inferProjectGraph(request.projectRoot)\r\n    return diffInterfaces(declared, inferred)\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n\r\n/**\r\n * Single-exit classification — fixes the historical duplicate-push bug where\r\n * the same file could appear in both vsDelta and unexpected buckets.\r\n */\r\nfunction computeGovernanceDrift(request: ReconcileRequest, changedFiles: string[]): GovernanceDrift {\r\n  const vsDelta: Array<{ file: string; status: 'expected' }> = []\r\n  const vsBaseline: Array<{ file: string; status: 'new' | 'modified' | 'unchanged' }> = []\r\n  const unexpected: Array<{ file: string; status: 'unexpected' }> = []\r\n\r\n  const baseline = request.baselinePath && existsSync(request.baselinePath)\r\n    ? loadBaseline(request.baselinePath)\r\n    : undefined\r\n  const delta = baseline && request.deltaPath && existsSync(request.deltaPath)\r\n    ? loadDelta(request.deltaPath)\r\n    : undefined\r\n\r\n  const baselineWritableGlobs = baseline?.module_boundaries.writable.flatMap(m => m.paths) ?? []\r\n  const deltaWritableGlobs = delta?.delta.module_boundaries?.writable?.flatMap(m => m.paths) ?? []\r\n\r\n  for (const f of changedFiles) {\r\n    const inDelta = deltaWritableGlobs.some(g => pathMatchesGlob(f, g))\r\n    const inBaseline = baselineWritableGlobs.some(g => pathMatchesGlob(f, g))\r\n\r\n    if (inDelta) {\r\n      vsDelta.push({ file: f, status: 'expected' })\r\n    } else if (inBaseline) {\r\n      vsBaseline.push({ file: f, status: 'modified' })\r\n    } else {\r\n      unexpected.push({ file: f, status: 'unexpected' })\r\n    }\r\n  }\r\n\r\n  return { vsDelta, vsBaseline, unexpected }\r\n}\r\n\r\nfunction assembleNarrative(request: ReconcileRequest): { narrative: ChangeNarrative; evidenceWarnings: string[] } {\r\n  const { narrative: fromEvidence, warnings } = loadStep7Evidence(request.projectRoot, request.requestId)\r\n  const narrativeMarkdown = loadNarrativeMarkdown(request.projectRoot, request.narrativePath)\r\n\r\n  if (narrativeMarkdown) {\r\n    return { narrative: { ...fromEvidence, narrativeMarkdown }, evidenceWarnings: warnings }\r\n  }\r\n  return { narrative: fromEvidence, evidenceWarnings: warnings }\r\n}\r\n\r\nfunction generateHtmlReport(\r\n  request: ReconcileRequest,\r\n  phase1: ReconcilePhase1Result,\r\n  phase2: ReconcilePhase2Result,\r\n): string {\r\n  return renderDashboard(request, phase1, phase2)\r\n}\r\n\r\n// ============================================================\r\n// HTML rendering — dashboard + collapsible cards\r\n// ============================================================\r\n\r\nfunction renderDashboard(\r\n  request: ReconcileRequest,\r\n  phase1: ReconcilePhase1Result,\r\n  phase2: ReconcilePhase2Result,\r\n): string {\r\n  const { narrative, moduleDiffs, otherFiles, interfaceFileDiffs, governanceDrift, shaWarnings } = phase2\r\n  const reqId = narrative.requestId ?? request.requestId ?? '(unknown)'\r\n\r\n  const totalAdded = interfaceFileDiffs.reduce((n, d) => n + d.added.length, 0)\r\n  const totalRemoved = interfaceFileDiffs.reduce((n, d) => n + d.removed.length, 0)\r\n  const totalChanged = interfaceFileDiffs.reduce((n, d) => n + d.changed.length, 0)\r\n\r\n  const verdict = narrative.h3Verdict?.decision ?? (phase1.passed ? 'PASSED' : 'BLOCKED')\r\n  const verdictClass = phase1.passed ? 'verdict-pass' : 'verdict-warn'\r\n\r\n  const perfTargetMet = narrative.performanceBaseline?.targetMet\r\n  const perfIndicator = perfTargetMet === undefined ? '—' : perfTargetMet ? '✓' : '✗'\r\n\r\n  const cards: string[] = []\r\n\r\n  // Card: Modules\r\n  cards.push(renderCard('modules', `📦 本次改动模块 (${moduleDiffs.length})`, renderModulesBody(moduleDiffs, otherFiles)))\r\n\r\n  // Card: API Interface Diff\r\n  cards.push(renderCard('interfaces', `🔌 API 接口 diff (+${totalAdded} / -${totalRemoved} / ~${totalChanged})`, renderInterfacesBody(interfaceFileDiffs)))\r\n\r\n  // Card: Governance Drift (three buckets)\r\n  cards.push(renderCard('drift', `🛡 治理漂移 (Δ=${governanceDrift.vsDelta.length} B=${governanceDrift.vsBaseline.length} ✗=${governanceDrift.unexpected.length})`, renderDriftBody(governanceDrift)))\r\n\r\n  if (narrative.defectsFixed?.length) {\r\n    cards.push(renderCard('defects', `🐛 Defects Fixed (${narrative.defectsFixed.length})`, renderDefectsBody(narrative.defectsFixed)))\r\n  }\r\n  if (narrative.architectureAdjustments?.length) {\r\n    cards.push(renderCard('arch', `🏗 Architecture Adjustments (${narrative.architectureAdjustments.length})`, renderArchBody(narrative.architectureAdjustments)))\r\n  }\r\n  if (narrative.performanceBaseline) {\r\n    cards.push(renderCard('perf', `⏱ Performance Baseline`, renderPerfBody(narrative.performanceBaseline)))\r\n  }\r\n  if (narrative.h3Verdict?.caveats?.length) {\r\n    cards.push(renderCard('caveats', `⚠ H3 Caveats`, renderCaveatsBody(narrative.h3Verdict.caveats)))\r\n  }\r\n\r\n  return `<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<title>Reconcile Report — ${escapeHtml(reqId)}</title>\r\n<style>\r\n:root {\r\n  --bg: #fafbfc; --card: #ffffff; --border: #e1e4e8; --text: #24292e; --muted: #6a737d;\r\n  --green: #28a745; --red: #d73a49; --yellow: #dbab09; --blue: #0366d6;\r\n  --pass-bg: #dcffe4; --pass-fg: #176f2c; --warn-bg: #fff5b1; --warn-fg: #614a04;\r\n}\r\n* { box-sizing: border-box; }\r\nbody { font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Helvetica Neue\", sans-serif; margin: 0; padding: 24px; background: var(--bg); color: var(--text); line-height: 1.5; }\r\nh1 { margin: 0 0 4px; font-size: 22px; }\r\nh2 { margin: 0 0 12px; font-size: 16px; }\r\n.container { max-width: 1100px; margin: 0 auto; }\r\n\r\n.dashboard { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 20px; margin-bottom: 16px; }\r\n.dashboard-header { display: flex; justify-content: space-between; align-items: baseline; flex-wrap: wrap; gap: 12px; }\r\n.verdict { padding: 4px 12px; border-radius: 12px; font-weight: 600; font-size: 14px; }\r\n.verdict-pass { background: var(--pass-bg); color: var(--pass-fg); }\r\n.verdict-warn { background: var(--warn-bg); color: var(--warn-fg); }\r\n.metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 12px; margin: 16px 0; }\r\n.metric { background: var(--bg); border: 1px solid var(--border); border-radius: 6px; padding: 10px 12px; text-align: center; }\r\n.metric-value { font-size: 22px; font-weight: 700; }\r\n.metric-label { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; }\r\n.metric-value.green { color: var(--green); }\r\n.metric-value.red { color: var(--red); }\r\n.metric-value.yellow { color: var(--yellow); }\r\n.metric-value.muted { color: var(--muted); }\r\n.flows { background: var(--bg); border-left: 3px solid var(--blue); padding: 10px 14px; border-radius: 4px; margin-top: 12px; }\r\n.flows h3 { margin: 0 0 6px; font-size: 13px; color: var(--muted); text-transform: uppercase; }\r\n.flows-body { font-size: 14px; white-space: pre-wrap; }\r\n\r\n.card { background: var(--card); border: 1px solid var(--border); border-radius: 8px; margin-bottom: 12px; }\r\n.card summary { padding: 14px 18px; cursor: pointer; font-weight: 600; font-size: 15px; list-style: none; display: flex; justify-content: space-between; align-items: center; }\r\n.card summary::-webkit-details-marker { display: none; }\r\n.card summary::before { content: '▸'; margin-right: 8px; color: var(--muted); transition: transform 0.15s; display: inline-block; }\r\n.card[open] summary::before { transform: rotate(90deg); }\r\n.card-body { padding: 0 18px 16px; }\r\n\r\ntable { border-collapse: collapse; width: 100%; font-size: 13px; }\r\nth, td { padding: 6px 10px; text-align: left; border-bottom: 1px solid var(--border); }\r\nth { background: var(--bg); font-weight: 600; color: var(--muted); text-transform: uppercase; font-size: 11px; letter-spacing: 0.5px; }\r\ntd { vertical-align: top; }\r\n\r\n.badge { display: inline-block; min-width: 18px; padding: 1px 6px; margin-right: 6px; border-radius: 3px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; font-weight: 700; }\r\n.badge-add { background: #dcffe4; color: #176f2c; }\r\n.badge-rm { background: #ffe0e0; color: #820f1a; }\r\n.badge-chg { background: #fff5b1; color: #614a04; }\r\n.kind { color: var(--muted); font-size: 11px; font-family: ui-monospace, monospace; }\r\n\r\n.file-block { margin: 8px 0; padding: 8px 10px; background: var(--bg); border-radius: 4px; }\r\n.file-block .file-name { font-family: ui-monospace, monospace; font-size: 13px; font-weight: 600; margin-bottom: 4px; word-break: break-all; }\r\n.symbol-row { font-family: ui-monospace, monospace; font-size: 13px; padding: 1px 0; }\r\n\r\n.warning { background: var(--warn-bg); color: var(--warn-fg); padding: 6px 12px; border-radius: 4px; font-size: 13px; margin-bottom: 8px; }\r\n.provenance { margin-top: 24px; color: var(--muted); font-size: 12px; border-top: 1px solid var(--border); padding-top: 12px; }\r\nul { padding-left: 20px; margin: 8px 0; }\r\nli { margin: 4px 0; }\r\ncode { background: var(--bg); padding: 1px 4px; border-radius: 3px; font-family: ui-monospace, monospace; font-size: 12px; }\r\n</style>\r\n</head>\r\n<body>\r\n<div class=\"container\">\r\n<h1>Reconcile Report</h1>\r\n<h2 style=\"color:var(--muted);font-weight:400;\">REQ-ID: <code>${escapeHtml(reqId)}</code></h2>\r\n\r\n<div class=\"dashboard\">\r\n  <div class=\"dashboard-header\">\r\n    <div><strong>H3 Verdict:</strong> <span class=\"verdict ${verdictClass}\">${escapeHtml(verdict)}</span></div>\r\n    <div style=\"color:var(--muted);font-size:12px;\">Generated ${escapeHtml(new Date().toISOString())}</div>\r\n  </div>\r\n\r\n  <div class=\"metrics\">\r\n    <div class=\"metric\"><div class=\"metric-value\">${moduleDiffs.length}</div><div class=\"metric-label\">Modules</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value muted\">${otherFiles.length}</div><div class=\"metric-label\">Other Files</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value green\">+${totalAdded}</div><div class=\"metric-label\">API Added</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value red\">-${totalRemoved}</div><div class=\"metric-label\">API Removed</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value yellow\">~${totalChanged}</div><div class=\"metric-label\">API Changed</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value ${governanceDrift.unexpected.length ? 'red' : 'green'}\">${governanceDrift.unexpected.length}</div><div class=\"metric-label\">Drift</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value ${narrative.defectsFixed?.length ? 'red' : 'muted'}\">${narrative.defectsFixed?.length ?? 0}</div><div class=\"metric-label\">Defects</div></div>\r\n    <div class=\"metric\"><div class=\"metric-value ${perfIndicator === '✓' ? 'green' : perfIndicator === '✗' ? 'red' : 'muted'}\">${perfIndicator}</div><div class=\"metric-label\">Perf Target</div></div>\r\n  </div>\r\n\r\n  ${narrative.narrativeMarkdown\r\n    ? `<div class=\"flows\"><h3>📌 主要流程</h3><div class=\"flows-body\">${escapeHtml(narrative.narrativeMarkdown)}</div></div>`\r\n    : ''}\r\n</div>\r\n\r\n${shaWarnings.map(w => `<div class=\"warning\">${escapeHtml(w)}</div>`).join('')}\r\n\r\n${cards.join('\\n')}\r\n\r\n<div class=\"provenance\">\r\n  <div>Phase 1: drift <strong>${phase1.driftCheck.passed ? 'PASSED' : 'FAILED'}</strong> · contract <strong>${phase1.contractCheck.passed ? 'PASSED' : 'FAILED'}</strong> · gate <strong>${phase1.gateCheck.passed ? 'PASSED' : 'FAILED'}</strong></div>\r\n  <div>Baseline: <code>${escapeHtml(request.baselinePath ?? '(envelope mode)')}</code>${request.deltaPath ? ` · Delta: <code>${escapeHtml(request.deltaPath)}</code>` : ''}</div>\r\n</div>\r\n</div>\r\n</body>\r\n</html>`\r\n}\r\n\r\nfunction renderCard(id: string, title: string, body: string): string {\r\n  return `<details class=\"card\" id=\"${id}\"><summary>${title}</summary><div class=\"card-body\">${body}</div></details>`\r\n}\r\n\r\nfunction renderModulesBody(modules: ModuleDiff[], otherFiles: string[]): string {\r\n  if (modules.length === 0 && otherFiles.length === 0) {\r\n    return '<p style=\"color:var(--muted);\">No changed files detected.</p>'\r\n  }\r\n  let html = ''\r\n  if (modules.length > 0) {\r\n    html += '<table><thead><tr><th>Module</th><th>Added</th><th>Removed</th></tr></thead><tbody>'\r\n    for (const m of modules) {\r\n      html += `<tr><td><code>${escapeHtml(m.moduleName)}</code></td><td>${m.added.length}</td><td>${m.removed.length}</td></tr>`\r\n    }\r\n    html += '</tbody></table>'\r\n  }\r\n  if (otherFiles.length > 0) {\r\n    html += `<h3 style=\"margin-top:16px;font-size:13px;color:var(--muted);\">Other Files (${otherFiles.length})</h3>`\r\n    html += '<ul>'\r\n    for (const f of otherFiles) {\r\n      html += `<li><code>${escapeHtml(f)}</code></li>`\r\n    }\r\n    html += '</ul>'\r\n  }\r\n  return html\r\n}\r\n\r\nfunction renderInterfacesBody(diffs: InterfaceFileDiff[]): string {\r\n  if (diffs.length === 0) {\r\n    return '<p style=\"color:var(--muted);\">No interface (TypeScript or Java) changes detected.</p>'\r\n  }\r\n  return diffs.map(d => {\r\n    const rows: string[] = []\r\n    for (const s of d.added) {\r\n      rows.push(`<div class=\"symbol-row\"><span class=\"badge badge-add\">+</span>${escapeHtml(s.name)} <span class=\"kind\">(${escapeHtml(s.kind)})</span></div>`)\r\n    }\r\n    for (const s of d.removed) {\r\n      rows.push(`<div class=\"symbol-row\"><span class=\"badge badge-rm\">-</span>${escapeHtml(s.name)} <span class=\"kind\">(${escapeHtml(s.kind)})</span></div>`)\r\n    }\r\n    for (const s of d.changed) {\r\n      rows.push(`<div class=\"symbol-row\"><span class=\"badge badge-chg\">~</span>${escapeHtml(s.name)} <span class=\"kind\">(${escapeHtml(s.kind)})</span></div>`)\r\n    }\r\n    return `<div class=\"file-block\"><div class=\"file-name\">${escapeHtml(d.file)}</div>${rows.join('')}</div>`\r\n  }).join('')\r\n}\r\n\r\nfunction renderDriftBody(drift: GovernanceDrift): string {\r\n  const bucket = (title: string, items: Array<{ file: string; status: string }>, cls: string) => {\r\n    if (items.length === 0) return ''\r\n    return `<h3 style=\"font-size:13px;color:var(--muted);margin-top:12px;\">${escapeHtml(title)} (${items.length})</h3>\r\n      <ul>${items.map(i => `<li><code>${escapeHtml(i.file)}</code> <span class=\"kind\">${escapeHtml(i.status)}</span></li>`).join('')}</ul>`\r\n  }\r\n  return (\r\n    bucket('vsDelta — expected per this round', drift.vsDelta, 'green') +\r\n    bucket('vsBaseline — touched baseline-writable', drift.vsBaseline, 'yellow') +\r\n    bucket('unexpected — drift beyond declared scopes', drift.unexpected, 'red')\r\n  )\r\n}\r\n\r\nfunction renderDefectsBody(defects: NonNullable<ChangeNarrative['defectsFixed']>): string {\r\n  return defects.map(d => `\r\n    <div class=\"file-block\">\r\n      <div class=\"file-name\">${escapeHtml(d.id)}${d.file ? ` · <code>${escapeHtml(d.file)}</code>` : ''}</div>\r\n      ${d.symptom ? `<div><strong>Symptom:</strong> ${escapeHtml(d.symptom)}</div>` : ''}\r\n      ${d.root_cause ? `<div><strong>Root cause:</strong> ${escapeHtml(d.root_cause)}</div>` : ''}\r\n      ${d.fix ? `<div><strong>Fix:</strong> ${escapeHtml(d.fix)}</div>` : ''}\r\n      ${d.verification ? `<div><strong>Verification:</strong> ${escapeHtml(d.verification)}</div>` : ''}\r\n    </div>\r\n  `).join('')\r\n}\r\n\r\nfunction renderArchBody(adjs: NonNullable<ChangeNarrative['architectureAdjustments']>): string {\r\n  return adjs.map(a => `\r\n    <div class=\"file-block\">\r\n      <div class=\"file-name\">${escapeHtml(a.item)}</div>\r\n      ${a.rationale ? `<div><strong>Rationale:</strong> ${escapeHtml(a.rationale)}</div>` : ''}\r\n      ${a.impact?.length ? `<div><strong>Impact:</strong><ul>${a.impact.map(i => `<li>${escapeHtml(i)}</li>`).join('')}</ul></div>` : ''}\r\n      ${a.h3Decision ? `<div><strong>H3 Decision:</strong> ${escapeHtml(a.h3Decision)}</div>` : ''}\r\n    </div>\r\n  `).join('')\r\n}\r\n\r\nfunction renderPerfBody(perf: NonNullable<ChangeNarrative['performanceBaseline']>): string {\r\n  const rows: string[] = []\r\n  if (perf.targetMs !== undefined) rows.push(`<tr><td>Target</td><td>&lt; ${perf.targetMs}ms</td></tr>`)\r\n  if (perf.p50OverheadMs !== undefined) rows.push(`<tr><td>p50 overhead</td><td>${perf.p50OverheadMs}ms</td></tr>`)\r\n  if (perf.typicalOverheadMs) rows.push(`<tr><td>Typical overhead</td><td>${escapeHtml(perf.typicalOverheadMs)}</td></tr>`)\r\n  if (perf.targetMet !== undefined) rows.push(`<tr><td>Target met</td><td>${perf.targetMet ? '✓ yes' : '✗ no'}</td></tr>`)\r\n  return rows.length ? `<table><tbody>${rows.join('')}</tbody></table>` : '<p style=\"color:var(--muted);\">Performance data incomplete.</p>'\r\n}\r\n\r\nfunction renderCaveatsBody(caveats: string[]): string {\r\n  return `<ul>${caveats.map(c => `<li>${escapeHtml(c)}</li>`).join('')}</ul>`\r\n}\r\n\r\nfunction escapeHtml(s: string): string {\r\n  return s\r\n    .replace(/&/g, '&amp;')\r\n    .replace(/</g, '&lt;')\r\n    .replace(/>/g, '&gt;')\r\n    .replace(/\"/g, '&quot;')\r\n    .replace(/'/g, '&#39;')\r\n}\r\n","import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { join, relative, sep, basename } from 'path'\r\nimport { parseExports } from './parse-exports.js'\r\n\r\nexport interface InferredInterface {\r\n  module: string\r\n  source_glob: string\r\n  exports: string[]\r\n}\r\n\r\n/**\r\n * Infer the project's module→export mapping.\r\n *\r\n * Priority: TypeScript first (flat src/ tree), then Maven/Java multi-module\r\n * (pom.xml <modules> → src/main/java), then a structured scan of the project\r\n * root for common source layouts.\r\n *\r\n * Returns empty array only when no source files are found in any recognized\r\n * layout — never silently returns empty for a real project.\r\n */\r\nexport async function inferProjectGraph(projectRoot: string): Promise<InferredInterface[]> {\r\n  if (!existsSync(projectRoot)) {\r\n    throw new Error(`Project root not found: ${projectRoot}`)\r\n  }\r\n\r\n  // 1. Try TypeScript (flat src/ with .ts files)\r\n  const tsSrcDir = join(projectRoot, 'src')\r\n  if (existsSync(tsSrcDir)) {\r\n    const tsFiles = collectTsFiles(tsSrcDir)\r\n    if (tsFiles.length > 0) {\r\n      return await inferTsGraph(projectRoot, tsFiles)\r\n    }\r\n  }\r\n\r\n  // 2. Try Maven multi-module Java (pom.xml with <modules>)\r\n  const pomPath = join(projectRoot, 'pom.xml')\r\n  if (existsSync(pomPath)) {\r\n    const javaGraph = await inferMavenJavaGraph(projectRoot, pomPath)\r\n    if (javaGraph.length > 0) return javaGraph\r\n  }\r\n\r\n  // 3. Generic recursive Java scan (no pom.xml, but .java files exist somewhere)\r\n  const javaFiles = collectJavaFilesRecursive(projectRoot)\r\n  if (javaFiles.length > 0) {\r\n    return await inferJavaGraphFromFiles(projectRoot, javaFiles)\r\n  }\r\n\r\n  return []\r\n}\r\n\r\n// ─── TypeScript pipeline ───────────────────────────────────────────────\r\n\r\nasync function inferTsGraph(\r\n  projectRoot: string,\r\n  files: string[],\r\n): Promise<InferredInterface[]> {\r\n  const byModule = new Map<string, InferredInterface>()\r\n\r\n  for (const absPath of files) {\r\n    const rel = relative(projectRoot, absPath).replace(/\\\\/g, '/')\r\n    if (!rel.startsWith('src/')) continue\r\n\r\n    let content: string\r\n    try {\r\n      content = readFileSync(absPath, 'utf-8')\r\n    } catch {\r\n      continue\r\n    }\r\n    if (!content.trim()) continue\r\n\r\n    const symbols = await parseExports(content, rel)\r\n    const moduleName = deriveModuleName(rel)\r\n\r\n    const existing = byModule.get(moduleName)\r\n    const names = symbols.map(s => s.name)\r\n    if (existing) {\r\n      existing.exports.push(...names)\r\n    } else {\r\n      byModule.set(moduleName, {\r\n        module: moduleName,\r\n        source_glob: `src/${moduleName}/**/*.ts`,\r\n        exports: [...names],\r\n      })\r\n    }\r\n  }\r\n\r\n  for (const iface of byModule.values()) {\r\n    iface.exports = [...new Set(iface.exports)].sort()\r\n  }\r\n\r\n  return [...byModule.values()].sort((a, b) => a.module.localeCompare(b.module))\r\n}\r\n\r\nfunction collectTsFiles(srcDir: string): string[] {\r\n  const out: string[] = []\r\n  const walk = (dir: string) => {\r\n    let entries: string[]\r\n    try {\r\n      entries = readdirSync(dir)\r\n    } catch {\r\n      return\r\n    }\r\n    for (const name of entries) {\r\n      if (name === 'node_modules') continue\r\n      const full = join(dir, name)\r\n      let st\r\n      try {\r\n        st = statSync(full)\r\n      } catch {\r\n        continue\r\n      }\r\n      if (st.isDirectory()) {\r\n        walk(full)\r\n      } else if (st.isFile() && full.endsWith('.ts') && !full.endsWith('.d.ts')) {\r\n        out.push(full)\r\n      }\r\n    }\r\n  }\r\n  walk(srcDir)\r\n  return out\r\n}\r\n\r\n// ─── Maven / Java pipeline ─────────────────────────────────────────────\r\n\r\n/**\r\n * Parse `<module>` entries from a Maven pom.xml.\r\n * Returns module directory names relative to project root.\r\n */\r\nfunction parseMavenModules(pomPath: string): string[] {\r\n  let content: string\r\n  try {\r\n    content = readFileSync(pomPath, 'utf-8')\r\n  } catch {\r\n    return []\r\n  }\r\n\r\n  const modules: string[] = []\r\n  // Match <module>name</module> — supports whitespace and optional <modules> wrapper\r\n  const re = /<module>\\s*([^<\\s]+)\\s*<\\/module>/gi\r\n  let match: RegExpExecArray | null\r\n  while ((match = re.exec(content)) !== null) {\r\n    modules.push(match[1])\r\n  }\r\n  return modules\r\n}\r\n\r\n/**\r\n * Build the graph from a Maven multi-module project.\r\n *\r\n * 1. Parse pom.xml for <module> entries.\r\n * 2. For each module, scan {module}/src/main/java/ for .java files.\r\n * 3. Extract public interface/class/enum/record declarations via regex.\r\n * 4. If no <module> entries, fall back to recursive .java scan from root.\r\n */\r\nasync function inferMavenJavaGraph(\r\n  projectRoot: string,\r\n  pomPath: string,\r\n): Promise<InferredInterface[]> {\r\n  const modules = parseMavenModules(pomPath)\r\n  const pomDir = join(pomPath, '..') // dirname\r\n\r\n  if (modules.length === 0) return []\r\n\r\n  const results: InferredInterface[] = []\r\n\r\n  for (const mod of modules) {\r\n    const modDir = join(pomDir, mod)\r\n    const javaSrcDir = join(modDir, 'src', 'main', 'java')\r\n    if (!existsSync(javaSrcDir)) continue\r\n\r\n    const javaFiles = collectJavaFiles(javaSrcDir)\r\n    if (javaFiles.length === 0) continue\r\n\r\n    const exports = extractJavaSymbolsFromFiles(javaFiles)\r\n    if (exports.length === 0) continue\r\n\r\n    results.push({\r\n      module: mod,\r\n      source_glob: `${mod}/src/main/java/**/*.java`,\r\n      exports: [...new Set(exports)].sort(),\r\n    })\r\n  }\r\n\r\n  return results.sort((a, b) => a.module.localeCompare(b.module))\r\n}\r\n\r\n/**\r\n * Collect .java files under a single source root (non-recursive into sub-modules,\r\n * since Maven modules are already split at the pom level).\r\n */\r\nfunction collectJavaFiles(srcDir: string): string[] {\r\n  const out: string[] = []\r\n  const walk = (dir: string) => {\r\n    let entries: string[]\r\n    try {\r\n      entries = readdirSync(dir)\r\n    } catch {\r\n      return\r\n    }\r\n    for (const name of entries) {\r\n      const full = join(dir, name)\r\n      let st\r\n      try {\r\n        st = statSync(full)\r\n      } catch {\r\n        continue\r\n      }\r\n      if (st.isDirectory()) {\r\n        walk(full)\r\n      } else if (st.isFile() && full.endsWith('.java')) {\r\n        out.push(full)\r\n      }\r\n    }\r\n  }\r\n  walk(srcDir)\r\n  return out\r\n}\r\n\r\n/**\r\n * Recursive .java scan from project root (fallback when no pom.xml or no <modules>).\r\n */\r\nfunction collectJavaFilesRecursive(projectRoot: string): string[] {\r\n  const out: string[] = []\r\n  const walk = (dir: string) => {\r\n    let entries: string[]\r\n    try {\r\n      entries = readdirSync(dir)\r\n    } catch {\r\n      return\r\n    }\r\n    for (const name of entries) {\r\n      if (name === 'node_modules' || name === '.git' || name === 'target') continue\r\n      const full = join(dir, name)\r\n      let st\r\n      try {\r\n        st = statSync(full)\r\n      } catch {\r\n        continue\r\n      }\r\n      if (st.isDirectory()) {\r\n        walk(full)\r\n      } else if (st.isFile() && full.endsWith('.java')) {\r\n        out.push(full)\r\n      }\r\n    }\r\n  }\r\n  walk(projectRoot)\r\n  return out\r\n}\r\n\r\n/**\r\n * Extract Java public type declarations (interface, class, enum, record)\r\n * from a list of .java file paths. Uses regex-based extraction — no full\r\n * Java parser dependency.\r\n *\r\n * Matches patterns like:\r\n *   public interface Foo\r\n *   public class Foo\r\n *   public abstract class Foo\r\n *   public enum Foo\r\n *   public record Foo\r\n *\r\n * Skips non-public types (package-private, protected, private).\r\n */\r\nfunction extractJavaSymbolsFromFiles(filePaths: string[]): string[] {\r\n  const symbols = new Set<string>()\r\n\r\n  for (const filePath of filePaths) {\r\n    let content: string\r\n    try {\r\n      content = readFileSync(filePath, 'utf-8')\r\n    } catch {\r\n      continue\r\n    }\r\n    if (!content.trim()) continue\r\n\r\n    // Match public (abstract)? (interface|class|enum|record) Name\r\n    // Using a simple regex — covers 95%+ of real-world Java declarations\r\n    const re = /public\\s+(?:abstract\\s+)?(interface|class|enum|record)\\s+(\\w+)/g\r\n    let match: RegExpExecArray | null\r\n    while ((match = re.exec(content)) !== null) {\r\n      // Skip inner classes (preceded by a type name on the same line before \"class\")\r\n      // and annotation declarations (@interface)\r\n      symbols.add(match[2])\r\n    }\r\n  }\r\n\r\n  return [...symbols].sort()\r\n}\r\n\r\n/**\r\n * Build graph from a flat collection of .java files (no Maven module structure).\r\n * Derives module names from the relative path: src/main/java → parent dir.\r\n */\r\nasync function inferJavaGraphFromFiles(\r\n  projectRoot: string,\r\n  javaFiles: string[],\r\n): Promise<InferredInterface[]> {\r\n  const byModule = new Map<string, { exports: Set<string>; sourceRoot: string }>()\r\n\r\n  for (const absPath of javaFiles) {\r\n    const rel = relative(projectRoot, absPath).replace(/\\\\/g, '/')\r\n    const moduleName = deriveJavaModuleName(rel)\r\n    const record = byModule.get(moduleName)\r\n\r\n    let content: string\r\n    try {\r\n      content = readFileSync(absPath, 'utf-8')\r\n    } catch {\r\n      continue\r\n    }\r\n    if (!content.trim()) continue\r\n\r\n    const re = /public\\s+(?:abstract\\s+)?(interface|class|enum|record)\\s+(\\w+)/g\r\n    let match: RegExpExecArray | null\r\n    const names: string[] = []\r\n    while ((match = re.exec(content)) !== null) {\r\n      names.push(match[2])\r\n    }\r\n\r\n    if (record) {\r\n      for (const n of names) record.exports.add(n)\r\n    } else {\r\n      byModule.set(moduleName, {\r\n        exports: new Set(names),\r\n        sourceRoot: deriveJavaSourceGlob(rel),\r\n      })\r\n    }\r\n  }\r\n\r\n  const results: InferredInterface[] = []\r\n  for (const [mod, rec] of byModule) {\r\n    if (rec.exports.size === 0) continue\r\n    results.push({\r\n      module: mod,\r\n      source_glob: rec.sourceRoot,\r\n      exports: [...rec.exports].sort(),\r\n    })\r\n  }\r\n\r\n  return results.sort((a, b) => a.module.localeCompare(b.module))\r\n}\r\n\r\n/**\r\n * Derive a module name from a relative Java file path.\r\n * For Maven: agent-bus/src/main/java/com/example/... → module = agent-bus\r\n * For flat: src/main/java/com/example/... → module = src (fallback)\r\n */\r\nfunction deriveJavaModuleName(relPath: string): string {\r\n  const parts = relPath.split('/')\r\n  // Maven style: {module}/src/main/java/...\r\n  const mainIdx = parts.indexOf('main')\r\n  if (mainIdx >= 2 && parts[mainIdx - 1] === 'src') {\r\n    // parts[0..mainIdx-2] is the module path\r\n    return parts.slice(0, mainIdx - 1).join('/')\r\n  }\r\n  // Flat: src/main/java/... or direct java files\r\n  const srcIdx = parts.indexOf('src')\r\n  if (srcIdx >= 0 && srcIdx < parts.length - 1) {\r\n    return parts.slice(0, srcIdx).join('/') || 'root'\r\n  }\r\n  return 'root'\r\n}\r\n\r\nfunction deriveJavaSourceGlob(relPath: string): string {\r\n  const parts = relPath.split('/')\r\n  const mainIdx = parts.indexOf('main')\r\n  if (mainIdx >= 2 && parts[mainIdx - 1] === 'src') {\r\n    const modPath = parts.slice(0, mainIdx - 1).join('/')\r\n    return `${modPath}/src/main/java/**/*.java`\r\n  }\r\n  return '**/*.java'\r\n}\r\n\r\n// ─── Shared helpers ────────────────────────────────────────────────────\r\n\r\nfunction deriveModuleName(relPath: string): string {\r\n  const parts = relPath.split('/')\r\n  if (parts.length >= 2 && parts[0] === 'src') {\r\n    return parts[1]\r\n  }\r\n  return 'root'\r\n}\r\n","import { execSync } from 'child_process'\r\nimport { readFileSync } from 'fs'\r\nimport { sep } from 'path'\r\n\r\n/**\r\n * A single exported symbol from a TypeScript source file.\r\n * Used by step-7 reconcile Y2 interface diff (baseline SHA vs HEAD).\r\n * See ADR-0022.\r\n */\r\nexport interface ExportSymbol {\r\n  name: string\r\n  /** 'function' | 'class' | 'interface' | 'type' | 'enum' | 'const' | 'other' */\r\n  kind: string\r\n}\r\n\r\n/**\r\n * Parse exports from TypeScript source content. Pure function — no file system access.\r\n *\r\n * Caller is responsible for providing the source string. For live files, use\r\n * readFileSync; for historical content, use parseExportsFromGitRevision which\r\n * shells out to `git show <sha>:<file>`.\r\n */\r\nexport async function parseExports(source: string, _fileName: string): Promise<ExportSymbol[]> {\r\n  const { Project } = await import('ts-morph')\r\n  const project = new Project({\r\n    compilerOptions: {\r\n      allowJs: false,\r\n      declaration: false,\r\n      skipLibCheck: true,\r\n      noEmit: true,\r\n    },\r\n    useInMemoryFileSystem: true,\r\n  })\r\n\r\n  // Memory FS path must end in .ts for ts-morph to parse as TS\r\n  const memPath = '/in-memory.ts'\r\n  const sourceFile = project.createSourceFile(memPath, source, { overwrite: true })\r\n\r\n    const symbols: ExportSymbol[] = []\r\n  for (const sym of sourceFile.getExportSymbols() as Array<{ getName(): string; getDeclarations(): Array<{ getKindName(): string | (() => string) }> }>) {\r\n    symbols.push({\r\n      name: sym.getName(),\r\n      kind: classifySymbolKind(sym),\r\n    })\r\n  }\r\n  return symbols\r\n}\r\n\r\n/**\r\n * Parse exports from a list of files at a specific git revision.\r\n *\r\n * For each file: `git show <sha>:<file>` to fetch historical content, then parseExports.\r\n * Deleted files (file exists at HEAD but not at <sha>) are skipped with the returned map\r\n * reflecting absence — caller can diff against HEAD exports to compute \"added\".\r\n *\r\n * Returns map keyed by repo-relative file path (forward slashes).\r\n */\r\nexport async function parseExportsFromGitRevision(\r\n  projectRoot: string,\r\n  sha: string,\r\n  files: string[],\r\n): Promise<Map<string, ExportSymbol[]>> {\r\n  const result = new Map<string, ExportSymbol[]>()\r\n\r\n  for (const file of files) {\r\n    let content: string\r\n    try {\r\n      content = execSync(`git show ${sha}:${file}`, {\r\n        cwd: projectRoot,\r\n        stdio: ['ignore', 'pipe', 'pipe'],\r\n        timeout: 5000,\r\n        maxBuffer: 5 * 1024 * 1024,\r\n      }).toString('utf-8')\r\n    } catch {\r\n      // File didn't exist at this revision (newly added at HEAD) — skip, will show as added\r\n      continue\r\n    }\r\n\r\n    if (!content.trim()) continue\r\n    const rel = normalizePath(file)\r\n    const symbols = await parseExports(content, rel)\r\n    result.set(rel, symbols)\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Read current exports from the working tree for a list of files.\r\n */\r\nexport async function parseExportsFromWorkingTree(\r\n  projectRoot: string,\r\n  files: string[],\r\n): Promise<Map<string, ExportSymbol[]>> {\r\n  const result = new Map<string, ExportSymbol[]>()\r\n\r\n  for (const file of files) {\r\n    const rel = normalizePath(file)\r\n    let content: string\r\n    try {\r\n      content = readFileSync(`${projectRoot}${sep}${rel}`, 'utf-8')\r\n    } catch {\r\n      continue\r\n    }\r\n    if (!content.trim()) continue\r\n    const symbols = await parseExports(content, rel)\r\n    result.set(rel, symbols)\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n/**\r\n * Resolve the git revision at baseline freeze time, per ADR-0022.\r\n *\r\n * 1. If baseline.frozen_at_sha is present, use it directly.\r\n * 2. Otherwise fall back to `git rev-list --before=<frozen_at> -1` and warn.\r\n *\r\n * Returns { sha, source } where source is 'baseline-field' | 'timestamp-fallback' | 'none'.\r\n */\r\nexport function resolveBaselineSha(\r\n  projectRoot: string,\r\n  frozenAtSha: string | undefined,\r\n  frozenAt: string,\r\n): { sha: string | null; source: 'baseline-field' | 'timestamp-fallback' | 'none'; warning?: string } {\r\n  if (frozenAtSha && /^[0-9a-f]{7,40}$/.test(frozenAtSha)) {\r\n    return { sha: frozenAtSha, source: 'baseline-field' }\r\n  }\r\n\r\n  if (!frozenAt) {\r\n    return {\r\n      sha: null,\r\n      source: 'none',\r\n      warning: 'baseline has no frozen_at_sha and no frozen_at — interface diff disabled',\r\n    }\r\n  }\r\n\r\n  try {\r\n    const sha = execSync(`git rev-list -1 --before=${frozenAt} --format=%H HEAD`, {\r\n      cwd: projectRoot,\r\n      stdio: ['ignore', 'pipe', 'pipe'],\r\n      timeout: 5000,\r\n    }).toString('utf-8').trim().split('\\n').filter(l => /^[0-9a-f]{40}$/.test(l))[0]\r\n\r\n    if (!sha) {\r\n      return {\r\n        sha: null,\r\n        source: 'none',\r\n        warning: `git rev-list --before=${frozenAt} returned no commit — interface diff disabled`,\r\n      }\r\n    }\r\n    return {\r\n      sha,\r\n      source: 'timestamp-fallback',\r\n      warning: `baseline.frozen_at_sha missing — using timestamp-fallback ${sha.slice(0, 8)} (precision may be off if same-second commits exist)`,\r\n    }\r\n  } catch (err: any) {\r\n    return {\r\n      sha: null,\r\n      source: 'none',\r\n      warning: `git rev-list failed: ${err.message?.split('\\n')[0] ?? err.message}`,\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Diff two snapshots of per-file exports. Returns per-file added/removed.\r\n * Signature change detection is left to future work (requires AST compare).\r\n */\r\nexport function diffExportSnapshots(\r\n  before: Map<string, ExportSymbol[]>,\r\n  after: Map<string, ExportSymbol[]>,\r\n): Array<{\r\n  file: string\r\n  added: ExportSymbol[]\r\n  removed: ExportSymbol[]\r\n  changed: ExportSymbol[]\r\n}> {\r\n  const allFiles = new Set<string>([...before.keys(), ...after.keys()])\r\n  const result: Array<{ file: string; added: ExportSymbol[]; removed: ExportSymbol[]; changed: ExportSymbol[] }> = []\r\n\r\n  for (const file of allFiles) {\r\n    const beforeSyms = before.get(file) ?? []\r\n    const afterSyms = after.get(file) ?? []\r\n    const beforeMap = new Map(beforeSyms.map(s => [s.name, s]))\r\n    const afterMap = new Map(afterSyms.map(s => [s.name, s]))\r\n\r\n    const added = afterSyms.filter(s => !beforeMap.has(s.name))\r\n    const removed = beforeSyms.filter(s => !afterMap.has(s.name))\r\n    const changed = afterSyms.filter(s => {\r\n      const old = beforeMap.get(s.name)\r\n      return old && old.kind !== s.kind\r\n    })\r\n\r\n    if (added.length || removed.length || changed.length) {\r\n      result.push({ file, added, removed, changed })\r\n    }\r\n  }\r\n\r\n  return result.sort((a, b) => a.file.localeCompare(b.file))\r\n}\r\n\r\nfunction normalizePath(p: string): string {\r\n  return p.replace(/\\\\/g, '/')\r\n}\r\n\r\nfunction classifySymbolKind(sym: { getDeclarations(): Array<{ getKindName(): string | (() => string) }> }): string {\r\n  try {\r\n    const decls = sym.getDeclarations()\r\n    if (!decls || decls.length === 0) return 'other'\r\n    const raw = decls[0].getKindName()\r\n    const kindName = typeof raw === 'function' ? (raw as () => string)() : raw\r\n    const lower = kindName.toLowerCase()\r\n    if (lower.includes('function')) return 'function'\r\n    if (lower.includes('class')) return 'class'\r\n    if (lower.includes('interface')) return 'interface'\r\n    if (lower.includes('typealias') || lower.includes('type')) return 'type'\r\n    if (lower.includes('enum')) return 'enum'\r\n    if (lower.includes('variable') || lower.includes('const')) return 'const'\r\n    return kindName || 'other'\r\n  } catch {\r\n    return 'other'\r\n  }\r\n}\r\n","import type { DeclaredInterface } from '../envelope/baseline.js'\r\nimport type { InterfaceDiff } from '../reconcile/types.js'\r\nimport type { InferredInterface } from './index.js'\r\n\r\nexport function diffInterfaces(\r\n  declared: DeclaredInterface[],\r\n  inferred: InferredInterface[],\r\n): InterfaceDiff[] {\r\n  const inferredByModule = new Map<string, InferredInterface>()\r\n  for (const i of inferred) {\r\n    inferredByModule.set(i.module, i)\r\n  }\r\n\r\n  const diffs: InterfaceDiff[] = []\r\n  const seenModules = new Set<string>()\r\n\r\n  for (const declared_i of declared) {\r\n    seenModules.add(declared_i.module)\r\n    const inferred_i = inferredByModule.get(declared_i.module)\r\n    const declaredExports = new Set(declared_i.exports)\r\n    const inferredExports = new Set(inferred_i?.exports ?? [])\r\n\r\n    const addedExports = [...inferredExports].filter(e => !declaredExports.has(e))\r\n    const removedExports = [...declaredExports].filter(e => !inferredExports.has(e))\r\n\r\n    if (addedExports.length > 0 || removedExports.length > 0) {\r\n      diffs.push({\r\n        module: declared_i.module,\r\n        addedExports,\r\n        removedExports,\r\n        changedSignatures: [],\r\n      })\r\n    }\r\n  }\r\n\r\n  for (const inferred_i of inferred) {\r\n    if (seenModules.has(inferred_i.module)) continue\r\n    if (inferred_i.exports.length > 0) {\r\n      diffs.push({\r\n        module: inferred_i.module,\r\n        addedExports: [...inferred_i.exports],\r\n        removedExports: [],\r\n        changedSignatures: [],\r\n      })\r\n    }\r\n  }\r\n\r\n  return diffs\r\n}\r\n","import { existsSync, readdirSync, readFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport type { ChangeNarrative } from './types.js'\r\n\r\nconst EVIDENCE_DIR_DEFAULT = '.harness/delivery-projections'\r\n\r\n/**\r\n * Discover and merge all step-7-*.yaml evidence files under\r\n * .harness/delivery-projections/{requestId}/. Files are merged in\r\n * alphabetical order; later files override earlier ones for the same top-level\r\n * key (rare in practice — usually only one step-7-*.yaml exists per REQ).\r\n *\r\n * Top-level keys not in ChangeNarrative are silently ignored; missing keys mean\r\n * that HTML card is omitted entirely.\r\n */\r\nexport function loadStep7Evidence(projectRoot: string, requestId?: string): { narrative: ChangeNarrative; warnings: string[] } {\r\n  if (!requestId) return { narrative: {}, warnings: [] }\r\n  const dir = join(projectRoot, EVIDENCE_DIR_DEFAULT, requestId)\r\n  if (!existsSync(dir)) return { narrative: {}, warnings: [] }\r\n\r\n  let entries: string[]\r\n  try {\r\n    entries = readdirSync(dir).filter(n => n.startsWith('step-7-') && n.endsWith('.yaml')).sort()\r\n  } catch {\r\n    return { narrative: {}, warnings: [] }\r\n  }\r\n  if (entries.length === 0) return { narrative: {}, warnings: [] }\r\n\r\n  const warnings: string[] = []\r\n  let merged: ChangeNarrative = { requestId }\r\n  for (const name of entries) {\r\n    try {\r\n      const raw = readFileSync(join(dir, name), 'utf-8')\r\n      const parsed = parseYaml(raw)\r\n      if (parsed == null || typeof parsed !== 'object') {\r\n        warnings.push(`step-7 evidence ${name} parsed to non-object — skipped`)\r\n        continue\r\n      }\r\n      merged = mergeEvidence(merged, parsed)\r\n    } catch (err: any) {\r\n      warnings.push(`step-7 evidence ${name} failed to parse: ${err.message?.split('\\n')[0] ?? err.message}`)\r\n    }\r\n  }\r\n  return { narrative: merged, warnings }\r\n}\r\n\r\nexport function loadNarrativeMarkdown(projectRoot: string, narrativePath?: string): string | undefined {\r\n  if (!narrativePath) return undefined\r\n  const full = join(projectRoot, narrativePath)\r\n  if (!existsSync(full)) return undefined\r\n  try {\r\n    const content = readFileSync(full, 'utf-8').trim()\r\n    return content || undefined\r\n  } catch {\r\n    return undefined\r\n  }\r\n}\r\n\r\nfunction mergeEvidence(merged: ChangeNarrative, parsed: any): ChangeNarrative {\r\n  const out: ChangeNarrative = { ...merged }\r\n\r\n  if (parsed?.H3_gate_decision) {\r\n    out.h3Verdict = {\r\n      decision: String(parsed.H3_gate_decision),\r\n      caveats: Array.isArray(parsed.caveats) ? parsed.caveats.map(String) : [],\r\n    }\r\n  }\r\n  if (Array.isArray(parsed?.defects_found_and_fixed)) {\r\n    out.defectsFixed = parsed.defects_found_and_fixed.map((d: any) => ({\r\n      id: String(d?.id ?? ''),\r\n      symptom: optStr(d?.symptom),\r\n      root_cause: optStr(d?.root_cause),\r\n      fix: optStr(d?.fix),\r\n      file: optStr(d?.file),\r\n      verification: optStr(d?.verification),\r\n    }))\r\n  }\r\n  if (parsed?.architecture_adjustment_confirmation) {\r\n    const adj = parsed.architecture_adjustment_confirmation\r\n    const arr = Array.isArray(adj) ? adj : [adj]\r\n    out.architectureAdjustments = arr.map((a: any) => ({\r\n      item: String(a?.item ?? ''),\r\n      rationale: optStr(a?.rationale),\r\n      impact: Array.isArray(a?.impact) ? a.impact.map(String) : undefined,\r\n      classification: optStr(a?.classification),\r\n      h3Decision: optStr(a?.H3_decision),\r\n    }))\r\n  }\r\n  if (parsed?.performance_baseline) {\r\n    const pb = parsed.performance_baseline\r\n    out.performanceBaseline = {\r\n      targetMs: num(pb?.target_ms),\r\n      p50OverheadMs: num(pb?.p50_overhead_ms),\r\n      typicalOverheadMs: optStr(pb?.typical_overhead_ms),\r\n      targetMet: bool(pb?.target_met),\r\n      raw: pb,\r\n    }\r\n  }\r\n  if (parsed?.e2e_validation) {\r\n    out.e2eValidation = {\r\n      acceptanceResult: optStr(parsed.e2e_validation.acceptance_result),\r\n      raw: parsed.e2e_validation,\r\n    }\r\n  }\r\n  if (parsed?.unit_tests_final_status) {\r\n    out.unitTestStatus = {\r\n      total: num(parsed.unit_tests_final_status.total),\r\n      failures: num(parsed.unit_tests_final_status.failures),\r\n      raw: parsed.unit_tests_final_status,\r\n    }\r\n  }\r\n\r\n  return out\r\n}\r\n\r\nfunction optStr(v: unknown): string | undefined {\r\n  return v == null ? undefined : String(v)\r\n}\r\nfunction num(v: unknown): number | undefined {\r\n  return typeof v === 'number' ? v : typeof v === 'string' && /^\\d+$/.test(v) ? Number(v) : undefined\r\n}\r\nfunction bool(v: unknown): boolean | undefined {\r\n  return typeof v === 'boolean' ? v : undefined\r\n}\r\n","// Copyright (C) 2024-2026 HarnessToolKit contributors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, readdirSync, copyFileSync, mkdirSync, statSync, readFileSync } from 'fs'\r\nimport { resolve, join, dirname, basename } from 'path'\r\nimport {\r\n  loadBaseline,\r\n  writeBaseline,\r\n  validateBaseline,\r\n  loadDelta,\r\n  validateDelta,\r\n  freezeBaseline,\r\n  seedBaselineFromEnvelope,\r\n  type ArchitectureBaseline,\r\n} from '../envelope/baseline.js'\r\nimport { loadEnvelope } from '../envelope/index.js'\r\nimport { inferProjectGraph } from '../graphify/index.js'\r\nimport { execSync } from 'child_process'\r\nimport { parse as parseYaml } from 'yaml'\r\n\r\nexport function handleBaseline(args: string[]): void {\r\n  const subCommand = args[0]\r\n  const subArgs = args.slice(1)\r\n\r\n  switch (subCommand) {\r\n    case 'load':\r\n      handleBaselineLoad(subArgs)\r\n      break\r\n    case 'validate':\r\n      handleBaselineValidate(subArgs)\r\n      break\r\n    case 'merge':\r\n      handleBaselineMerge(subArgs)\r\n      break\r\n    case 'freeze':\r\n      void handleBaselineFreeze(subArgs)\r\n      break\r\n    case 'seed':\r\n      handleBaselineSeed(subArgs)\r\n      break\r\n    case 'graphify':\r\n      void handleBaselineGraphify(subArgs)\r\n      break\r\n    case 'find-or-build':\r\n      handleBaselineFindOrBuild(subArgs)\r\n      break\r\n    default:\r\n      console.error('Usage: harness-toolkit baseline <load|validate|merge|freeze|seed|graphify|find-or-build>')\r\n      process.exit(2)\r\n  }\r\n}\r\n\r\nfunction argValue(args: string[], name: string): string | undefined {\r\n  const eqForm = args.find(a => a.startsWith(`${name}=`))\r\n  if (eqForm) return eqForm.split('=').slice(1).join('=')\r\n  const idx = args.indexOf(name)\r\n  if (idx >= 0 && idx + 1 < args.length) return args[idx + 1]\r\n  return undefined\r\n}\r\n\r\nfunction handleBaselineLoad(args: string[]): void {\r\n  const path = argValue(args, '--path')\r\n  if (!path) {\r\n    console.error('Usage: harness-toolkit baseline load --path=<baseline.yaml>')\r\n    process.exit(2)\r\n  }\r\n  const resolved = resolve(path)\r\n  if (!existsSync(resolved)) {\r\n    console.error(`Baseline file not found: ${resolved}`)\r\n    process.exit(1)\r\n  }\r\n  try {\r\n    const baseline = loadBaseline(resolved)\r\n    console.log(JSON.stringify(baseline, null, 2))\r\n    process.exit(0)\r\n  } catch (err: any) {\r\n    console.error(`Failed to load baseline: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nfunction handleBaselineValidate(args: string[]): void {\r\n  const path = argValue(args, '--path')\r\n  if (!path) {\r\n    console.error('Usage: harness-toolkit baseline validate --path=<baseline.yaml>')\r\n    process.exit(2)\r\n  }\r\n  const resolved = resolve(path)\r\n  if (!existsSync(resolved)) {\r\n    console.error(`Baseline file not found: ${resolved}`)\r\n    process.exit(1)\r\n  }\r\n  try {\r\n    const baseline = loadBaseline(resolved)\r\n    const validation = validateBaseline(baseline)\r\n    if (validation.valid) {\r\n      console.log(`Valid baseline: version=${baseline.version} frozen_by_req=${baseline.frozen_by_req}`)\r\n      console.log(`  Writable modules: ${baseline.module_boundaries.writable.map(w => w.module).join(', ')}`)\r\n      console.log(`  Declared interfaces: ${baseline.declared_interfaces.length}`)\r\n      process.exit(0)\r\n    } else {\r\n      console.error('Invalid baseline:')\r\n      for (const e of validation.errors) console.error(`  - ${e}`)\r\n      process.exit(1)\r\n    }\r\n  } catch (err: any) {\r\n    console.error(`Failed to load baseline: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nfunction handleBaselineMerge(args: string[]): void {\r\n  const baselinePath = argValue(args, '--baseline')\r\n  const deltaPath = argValue(args, '--delta')\r\n  const outPath = argValue(args, '--out')\r\n  if (!baselinePath || !deltaPath || !outPath) {\r\n    console.error('Usage: harness-toolkit baseline merge --baseline=<path> --delta=<path> --out=<path>')\r\n    process.exit(2)\r\n  }\r\n  const resolvedBaseline = resolve(baselinePath)\r\n  const resolvedDelta = resolve(deltaPath)\r\n  const resolvedOut = resolve(outPath)\r\n  if (!existsSync(resolvedBaseline)) {\r\n    console.error(`Baseline file not found: ${resolvedBaseline}`)\r\n    process.exit(1)\r\n  }\r\n  if (!existsSync(resolvedDelta)) {\r\n    console.error(`Delta file not found: ${resolvedDelta}`)\r\n    process.exit(1)\r\n  }\r\n  try {\r\n    const baseline = loadBaseline(resolvedBaseline)\r\n    const delta = loadDelta(resolvedDelta)\r\n    const merged = freezeBaseline(baseline, delta, baseline.frozen_at)\r\n    writeBaseline(resolvedOut, merged)\r\n    console.log(`Merged baseline written to: ${resolvedOut}`)\r\n    console.log(`  Writable modules: ${merged.module_boundaries.writable.length}`)\r\n    process.exit(0)\r\n  } catch (err: any) {\r\n    console.error(`Merge failed: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nasync function handleBaselineFreeze(args: string[]): Promise<void> {\r\n  const baselinePath = argValue(args, '--baseline')\r\n  const deltaPath = argValue(args, '--delta')\r\n  const reqId = argValue(args, '--req')\r\n  if (!baselinePath || !deltaPath || !reqId) {\r\n    console.error('Usage: harness-toolkit baseline freeze --baseline=<path> --delta=<path> --req=<REQ-ID>')\r\n    process.exit(2)\r\n  }\r\n  const resolvedBaseline = resolve(baselinePath)\r\n  const resolvedDelta = resolve(deltaPath)\r\n  if (!existsSync(resolvedBaseline)) {\r\n    console.error(`Baseline file not found: ${resolvedBaseline}`)\r\n    process.exit(1)\r\n  }\r\n  if (!existsSync(resolvedDelta)) {\r\n    console.error(`Delta file not found: ${resolvedDelta}`)\r\n    process.exit(1)\r\n  }\r\n  try {\r\n    const baseline = loadBaseline(resolvedBaseline)\r\n    const delta = loadDelta(resolvedDelta)\r\n    const deltaValidation = validateDelta(delta)\r\n    if (!deltaValidation.valid) {\r\n      console.error('Cannot freeze — delta is invalid:')\r\n      for (const e of deltaValidation.errors) console.error(`  - ${e}`)\r\n      process.exit(1)\r\n    }\r\n    if (delta.升级标记 === 'baseline-breaking') {\r\n      console.error('Cannot freeze — delta.升级标记 == baseline-breaking. Requires H4 checkpoint approval before freeze.')\r\n      console.error('  To override: re-author the delta with a non-breaking flag, or obtain explicit human ruling.')\r\n      process.exit(1)\r\n    }\r\n    if (delta.request_id !== reqId) {\r\n      console.error(`Mismatch: --req=${reqId} but delta.request_id=${delta.request_id}`)\r\n      process.exit(1)\r\n    }\r\n    const frozenAt = new Date().toISOString()\r\n    // Get current git HEAD SHA\r\n    let frozenAtSha: string | undefined\r\n    try {\r\n      frozenAtSha = execSync('git rev-parse HEAD', { timeout: 5000, stdio: ['ignore', 'pipe', 'pipe'], cwd: dirname(resolvedBaseline) }).toString().trim()\r\n      if (!frozenAtSha) frozenAtSha = undefined\r\n    } catch {\r\n      // git not available / not a repo — sha will be left undefined\r\n    }\r\n\r\n    // Scan project interfaces via graphify (A3/A4)\r\n    const projectRoot = dirname(resolvedBaseline)\r\n    let scannedInterfaces: Array<{ module: string; source_glob: string; exports: string[] }> = []\r\n    try {\r\n      scannedInterfaces = await inferProjectGraph(projectRoot)\r\n    } catch {\r\n      // graphify scan failed — proceed with existing declared_interfaces\r\n    }\r\n\r\n    const next = freezeBaseline(baseline, delta, frozenAt, frozenAtSha)\r\n    // Merge scanned interfaces into declared_interfaces\r\n    if (scannedInterfaces.length > 0) {\r\n      const existingModules = new Set(next.declared_interfaces.map(i => i.module))\r\n      for (const si of scannedInterfaces) {\r\n        if (!existingModules.has(si.module)) {\r\n          next.declared_interfaces.push({\r\n            module: si.module,\r\n            source_glob: si.source_glob,\r\n            exports: [...new Set(si.exports)].sort(),\r\n          })\r\n        }\r\n      }\r\n    }\r\n    writeBaseline(resolvedBaseline, next)\r\n    console.log(`Baseline frozen at ${frozenAt} by ${reqId}`)\r\n    if (frozenAtSha) console.log(`  SHA: ${frozenAtSha}`)\r\n    console.log(`  Writable modules now: ${next.module_boundaries.writable.length}`)\r\n    console.log(`  Declared interfaces: ${next.declared_interfaces.length}${scannedInterfaces.length > 0 ? ` (${scannedInterfaces.length} scanned via graphify)` : ''}`)\r\n    process.exit(0)\r\n  } catch (err: any) {\r\n    console.error(`Freeze failed: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nfunction handleBaselineSeed(args: string[]): void {\r\n  const fromEnvelope = argValue(args, '--from-envelope')\r\n  const outPath = argValue(args, '--out')\r\n  const reqId = argValue(args, '--req')\r\n  if (!fromEnvelope || !outPath || !reqId) {\r\n    console.error('Usage: harness-toolkit baseline seed --from-envelope=<path> --out=<path> --req=<REQ-ID>')\r\n    process.exit(2)\r\n  }\r\n  const resolvedEnv = resolve(fromEnvelope)\r\n  const resolvedOut = resolve(outPath)\r\n  if (!existsSync(resolvedEnv)) {\r\n    console.error(`Envelope file not found: ${resolvedEnv}`)\r\n    process.exit(1)\r\n  }\r\n  try {\r\n    const envelope = loadEnvelope(resolvedEnv)\r\n    const baseline: ArchitectureBaseline = seedBaselineFromEnvelope(envelope, reqId)\r\n    writeBaseline(resolvedOut, baseline)\r\n    console.log(`Baseline seeded from envelope and written to: ${resolvedOut}`)\r\n    console.log('  Note: declared_interfaces is empty. Run \"baseline graphify\" to scan, then \"baseline freeze\" to populate.')\r\n    process.exit(0)\r\n  } catch (err: any) {\r\n    console.error(`Seed failed: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nasync function handleBaselineGraphify(args: string[]): Promise<void> {\r\n  const projectRoot = argValue(args, '--project-root') ?? process.cwd()\r\n  const resolvedRoot = resolve(projectRoot)\r\n  if (!existsSync(resolvedRoot)) {\r\n    console.error(`Project root not found: ${resolvedRoot}`)\r\n    process.exit(2)\r\n  }\r\n  const asJson = args.includes('--json')\r\n  try {\r\n    const graph = await inferProjectGraph(resolvedRoot)\r\n    if (graph.length === 0) {\r\n      console.log('No interfaces detected.')\r\n      console.log('  This may mean: no recognized source layout (TypeScript src/, Maven pom.xml <modules>, or .java files) found.')\r\n      process.exit(1)\r\n    }\r\n    if (asJson) {\r\n      console.log(JSON.stringify(graph, null, 2))\r\n    } else {\r\n      for (const m of graph) {\r\n        console.log(`module: ${m.module}`)\r\n        console.log(`  source_glob: ${m.source_glob}`)\r\n        console.log(`  exports: [${m.exports.join(', ')}]`)\r\n      }\r\n      console.log(`\\n${graph.length} module(s) total.`)\r\n    }\r\n    process.exit(0)\r\n  } catch (err: any) {\r\n    console.error(`Graphify failed: ${err.message}`)\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\n// =============================================================================\r\n// find-or-build — 4+1 baseline「先找后建」前置检查\r\n//\r\n// 设计说明（ADR-0021 不适用）：ADR-0021 规定的元数据头格式只针对 LLM 一次\r\n// 性生成的 `.sh`/`.ps1` 脚本（首 5 行 shell 注释 + harness-ut 启动版本校\r\n// 验），不适用于 TS CLI 子命令。本函数用常规 JSDoc + 行内注释记录契约。\r\n//\r\n// 行为契约：\r\n//   - 四层信号检测：L1 元素模型 yaml / L2 模块边界 baseline / L3 视图 md /\r\n//     L4 渲染 SVG。每层独立 try/catch，单层失败不阻塞其他层。\r\n//   - 缺哪层补哪层：\r\n//       L1 missing → shell-out code_to_model.py scan\r\n//       L2 missing → WARN 不动手（INV-003：step-8 才 freeze）\r\n//       L3 missing → 拷贝 templates/view-template.md 到 6 个 view 骨架\r\n//       L4 missing → shell-out render-4plus1-baseline.py\r\n//   - L1 已存在但 baseline_rw.py check 失败（corrupted）：INV-002 不覆盖，\r\n//     只报错；--force-rebuild 显式 flag 才允许覆盖。\r\n//   - 幂等：每次 step-1 pre-flight 都跑，已存在层不动。\r\n// =============================================================================\r\n\r\ntype LayerId = 'L1' | 'L2' | 'L3' | 'L4'\r\ntype LayerStatus = 'exists' | 'created' | 'failed' | 'missing'\r\n\r\ninterface LayerReport {\r\n  layer: LayerId\r\n  status: LayerStatus\r\n  paths: string[]\r\n  detail?: string\r\n}\r\n\r\ninterface FindOrBuildReport {\r\n  projectRoot: string\r\n  layers: LayerReport[]\r\n  yamlStatus: 'draft' | 'reviewed' | 'corrupted' | 'none'\r\n}\r\n\r\nconst VIEW_FILE_NAMES = [\r\n  '00-system-context.md',\r\n  '01-logical-view.md',\r\n  '02-process-view.md',\r\n  '03-development-view.md',\r\n  '04-physical-view.md',\r\n  '05-scenarios-view.md',\r\n]\r\n\r\nconst BASELINE_SVG_NAMES = [\r\n  'logical-view-baseline.svg',\r\n  'process-view-baseline.svg',\r\n  'development-view-baseline.svg',\r\n  'physical-view-baseline.svg',\r\n  'scenarios-view-baseline.svg',\r\n]\r\n\r\nconst GLOB_EXCLUDE_DIRS = new Set([\r\n  'node_modules', '.git', 'dist', 'build', '.next', 'coverage', '.harness/.pipeline',\r\n])\r\n\r\nfunction handleBaselineFindOrBuild(args: string[]): void {\r\n  const projectRoot = argValue(args, '--project-root') ?? process.cwd()\r\n  const forceRebuild = args.includes('--force-rebuild')\r\n  const asJson = args.includes('--json')\r\n\r\n  const resolvedRoot = resolve(projectRoot)\r\n  if (!existsSync(resolvedRoot)) {\r\n    console.error(`Project root not found: ${resolvedRoot}`)\r\n    process.exit(1)\r\n  }\r\n\r\n  const report: FindOrBuildReport = {\r\n    projectRoot: resolvedRoot,\r\n    layers: [],\r\n    yamlStatus: 'none',\r\n  }\r\n\r\n  detectFourLayers(resolvedRoot, report)\r\n\r\n  // 逐层补齐——每层独立 try/catch\r\n  try { fillL1(resolvedRoot, report, forceRebuild) } catch (err: any) {\r\n    setFailed(report, 'L1', `fatal: ${err.message}`)\r\n  }\r\n  try { fillL3(resolvedRoot, report) } catch (err: any) {\r\n    setFailed(report, 'L3', `fatal: ${err.message}`)\r\n  }\r\n  try { fillL4(resolvedRoot, report) } catch (err: any) {\r\n    setFailed(report, 'L4', `fatal: ${err.message}`)\r\n  }\r\n  // L2 不补齐\r\n\r\n  if (asJson) {\r\n    console.log(JSON.stringify(report, null, 2))\r\n  } else {\r\n    printHumanReport(report)\r\n  }\r\n\r\n  // L1/L3/L4 任一 failed → exit 1；L2 missing 不算失败\r\n  const hasFailure = report.layers.some(\r\n    (l) => l.layer !== 'L2' && l.status === 'failed'\r\n  )\r\n  process.exit(hasFailure ? 1 : 0)\r\n}\r\n\r\nfunction setFailed(report: FindOrBuildReport, layer: LayerId, detail: string): void {\r\n  const existing = report.layers.find((l) => l.layer === layer)\r\n  if (existing) {\r\n    existing.status = 'failed'\r\n    existing.detail = detail\r\n  } else {\r\n    report.layers.push({ layer, status: 'failed', paths: [], detail })\r\n  }\r\n}\r\n\r\n// -----------------------------------------------------------------------------\r\n// 四层信号检测——三级路径优先级 + 单次 glob 扫描共享结果\r\n// -----------------------------------------------------------------------------\r\n\r\ninterface GlobCache {\r\n  yamlFiles: string[]\r\n  mdFiles: string[]\r\n  svgFiles: string[]\r\n}\r\n\r\nfunction detectFourLayers(projectRoot: string, report: FindOrBuildReport): void {\r\n  const cache: GlobCache = { yamlFiles: [], mdFiles: [], svgFiles: [] }\r\n  scanProject(projectRoot, '', cache, 0)\r\n\r\n  // ---- L1: *-baseline.yaml (排除 baseline.yaml 本身) ----\r\n  const l1Candidates: string[] = []\r\n  l1Candidates.push(\r\n    ...cache.yamlFiles\r\n      .filter((p) => p.startsWith('docs/4plus1/') && p !== 'docs/4plus1/baseline.yaml')\r\n      .filter((p) => p.endsWith('-baseline.yaml'))\r\n  )\r\n  l1Candidates.push(\r\n    ...cache.yamlFiles\r\n      .filter((p) => /^[^/]+-architecture\\//.test(p))\r\n      .filter((p) => p.endsWith('-baseline.yaml'))\r\n  )\r\n  l1Candidates.push(\r\n    ...cache.yamlFiles\r\n      .filter((p) => p.endsWith('-baseline.yaml') && !p.endsWith('/baseline.yaml') && p !== 'baseline.yaml')\r\n  )\r\n\r\n  const l1Path = firstExisting(projectRoot, l1Candidates)\r\n  if (l1Path) {\r\n    const yamlStatus = checkL1YamlStatus(projectRoot, l1Path)\r\n    report.layers.push({\r\n      layer: 'L1',\r\n      status: 'exists',\r\n      paths: [l1Path],\r\n      detail: `status: ${yamlStatus}`,\r\n    })\r\n    report.yamlStatus = yamlStatus\r\n  } else {\r\n    report.layers.push({ layer: 'L1', status: 'missing', paths: [] })\r\n  }\r\n\r\n  // ---- L2: baseline.yaml (governance baseline) ----\r\n  const l2Candidates: string[] = []\r\n  l2Candidates.push(...cache.yamlFiles.filter((p) => p === 'docs/4plus1/baseline.yaml'))\r\n  l2Candidates.push(...cache.yamlFiles.filter((p) => p === '.harness/baselines/baseline.yaml'))\r\n  l2Candidates.push(...cache.yamlFiles.filter((p) => p.endsWith('/baseline.yaml') && !p.endsWith('-baseline.yaml')))\r\n\r\n  const l2Path = firstExisting(projectRoot, l2Candidates)\r\n  if (l2Path) {\r\n    report.layers.push({ layer: 'L2', status: 'exists', paths: [l2Path] })\r\n  } else {\r\n    report.layers.push({\r\n      layer: 'L2',\r\n      status: 'missing',\r\n      paths: [],\r\n      detail: 'INV-003: L2 baseline.yaml frozen by harness-toolkit baseline freeze (after step-8). find-or-build does not author L2.',\r\n    })\r\n  }\r\n\r\n  // ---- L3: 6 个 view md ----\r\n  const l3Found: string[] = []\r\n  for (const name of VIEW_FILE_NAMES) {\r\n    const pri1 = `docs/4plus1/${name}`\r\n    if (cache.mdFiles.includes(pri1)) { l3Found.push(pri1); continue }\r\n    const pri2 = cache.mdFiles.find((p) => /\\/(4plus1|architecture)\\//.test(dirname(p)) && basename(p) === name)\r\n    if (pri2) { l3Found.push(pri2); continue }\r\n    const pri3 = cache.mdFiles.find((p) => {\r\n      if (basename(p) !== name) return false\r\n      const parent = dirname(p)\r\n      return /4plus1|architecture/.test(parent)\r\n    })\r\n    if (pri3) { l3Found.push(pri3); continue }\r\n  }\r\n\r\n  if (l3Found.length === VIEW_FILE_NAMES.length) {\r\n    report.layers.push({ layer: 'L3', status: 'exists', paths: l3Found })\r\n  } else if (l3Found.length > 0) {\r\n    report.layers.push({\r\n      layer: 'L3',\r\n      status: 'missing',\r\n      paths: l3Found,\r\n      detail: `only ${l3Found.length}/${VIEW_FILE_NAMES.length} view mds found`,\r\n    })\r\n  } else {\r\n    report.layers.push({ layer: 'L3', status: 'missing', paths: [] })\r\n  }\r\n\r\n  // ---- L4: 5 张 *-view-baseline.svg ----\r\n  const l4Found: string[] = []\r\n  for (const name of BASELINE_SVG_NAMES) {\r\n    const pri1 = `docs/4plus1/diagrams/${name}`\r\n    if (cache.svgFiles.includes(pri1)) { l4Found.push(pri1); continue }\r\n    const fallback = cache.svgFiles.find((p) => basename(p) === name)\r\n    if (fallback) { l4Found.push(fallback); continue }\r\n  }\r\n\r\n  if (l4Found.length === BASELINE_SVG_NAMES.length) {\r\n    report.layers.push({ layer: 'L4', status: 'exists', paths: l4Found })\r\n  } else if (l4Found.length > 0) {\r\n    report.layers.push({\r\n      layer: 'L4',\r\n      status: 'missing',\r\n      paths: l4Found,\r\n      detail: `only ${l4Found.length}/${BASELINE_SVG_NAMES.length} baseline SVGs found`,\r\n    })\r\n  } else {\r\n    report.layers.push({ layer: 'L4', status: 'missing', paths: [] })\r\n  }\r\n}\r\n\r\nfunction scanProject(\r\n  root: string,\r\n  relDir: string,\r\n  cache: GlobCache,\r\n  depth: number,\r\n): void {\r\n  if (depth > 12) return\r\n  const absDir = relDir ? join(root, relDir) : root\r\n  let entries: string[]\r\n  try {\r\n    entries = readdirSync(absDir)\r\n  } catch {\r\n    return\r\n  }\r\n  for (const name of entries) {\r\n    if (GLOB_EXCLUDE_DIRS.has(name)) continue\r\n    if (relDir.startsWith('.claude/skills/') && relDir.endsWith('/examples')) continue\r\n    const relPath = relDir ? `${relDir}/${name}` : name\r\n    let st\r\n    try {\r\n      st = statSync(join(absDir, name))\r\n    } catch {\r\n      continue\r\n    }\r\n    if (st.isDirectory()) {\r\n      scanProject(root, relPath, cache, depth + 1)\r\n    } else if (st.isFile()) {\r\n      if (name.endsWith('.yaml') || name.endsWith('.yml')) cache.yamlFiles.push(relPath)\r\n      else if (name.endsWith('.md')) cache.mdFiles.push(relPath)\r\n      else if (name.endsWith('.svg')) cache.svgFiles.push(relPath)\r\n    }\r\n  }\r\n}\r\n\r\nfunction firstExisting(projectRoot: string, relPaths: string[]): string | undefined {\r\n  for (const p of relPaths) {\r\n    if (existsSync(join(projectRoot, p))) return p\r\n  }\r\n  return undefined\r\n}\r\n\r\nfunction checkL1YamlStatus(\r\n  projectRoot: string,\r\n  relPath: string,\r\n): 'draft' | 'reviewed' | 'corrupted' | 'none' {\r\n  const abs = join(projectRoot, relPath)\r\n  const pyBin = process.env.PYTHON || 'python3'\r\n  const scriptPath = locateScript(['architecture-models-4plus1', 'scripts', 'baseline_rw.py'])\r\n  if (!scriptPath) return 'corrupted'\r\n  try {\r\n    execSync(`\"${pyBin}\" \"${scriptPath}\" check \"${abs}\"`, {\r\n      stdio: 'pipe',\r\n      env: { ...process.env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' },\r\n    })\r\n  } catch {\r\n    return 'corrupted'\r\n  }\r\n  try {\r\n    const content = readFileSync(abs, 'utf-8')\r\n    const doc = parseYaml(content) as { status?: string }\r\n    if (doc?.status === 'reviewed') return 'reviewed'\r\n    if (doc?.status === 'draft') return 'draft'\r\n    return 'none'\r\n  } catch {\r\n    return 'corrupted'\r\n  }\r\n}\r\n\r\n// -----------------------------------------------------------------------------\r\n// 逐层补齐\r\n// -----------------------------------------------------------------------------\r\n\r\nfunction fillL1(\r\n  projectRoot: string,\r\n  report: FindOrBuildReport,\r\n  forceRebuild: boolean,\r\n): void {\r\n  const l1 = report.layers.find((l) => l.layer === 'L1')\r\n  if (!l1) return\r\n\r\n  if (l1.status === 'exists') {\r\n    if (report.yamlStatus !== 'corrupted') return\r\n    if (!forceRebuild) {\r\n      l1.status = 'failed'\r\n      l1.detail = 'INV-002: L1 yaml exists but baseline_rw.py check failed (corrupted). Use --force-rebuild to overwrite, otherwise fix manually.'\r\n      return\r\n    }\r\n  }\r\n\r\n  const scriptPath = locateScript(['architecture-models-4plus1', 'scripts', 'code_to_model.py'])\r\n  if (!scriptPath) {\r\n    l1.status = 'failed'\r\n    l1.detail = 'code_to_model.py not found (skill not vendored?)'\r\n    return\r\n  }\r\n  const outDir = 'docs/4plus1'\r\n  const outPath = `${outDir}/harness-toolkit-baseline.yaml`\r\n  const absOutDir = join(projectRoot, outDir)\r\n  if (!existsSync(absOutDir)) mkdirSync(absOutDir, { recursive: true })\r\n\r\n  const codeRootAbs = existsSync(join(projectRoot, 'src'))\r\n    ? join(projectRoot, 'src')\r\n    : projectRoot\r\n  const pyBin = process.env.PYTHON || 'python3'\r\n  try {\r\n    execSync(\r\n      `\"${pyBin}\" \"${scriptPath}\" scan \"${codeRootAbs}\" --out \"${join(projectRoot, outPath)}\" --lang auto`,\r\n      { stdio: 'inherit', env: { ...process.env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' } },\r\n    )\r\n    l1.status = 'created'\r\n    l1.paths = [outPath]\r\n    l1.detail = 'created via code_to_model.py scan (status: draft)'\r\n    report.yamlStatus = 'draft'\r\n  } catch (err: any) {\r\n    l1.status = 'failed'\r\n    l1.detail = `code_to_model.py scan failed: ${err.message}`\r\n  }\r\n}\r\n\r\nfunction fillL3(projectRoot: string, report: FindOrBuildReport): void {\r\n  const l3 = report.layers.find((l) => l.layer === 'L3')\r\n  if (!l3 || l3.status === 'exists') return\r\n\r\n  const templatePath = locateScript(\r\n    ['architecture-models-4plus1', 'templates', 'view-template.md'],\r\n  )\r\n  if (!templatePath) {\r\n    l3.status = 'failed'\r\n    l3.detail = 'templates/view-template.md not found (skill not vendored?)'\r\n    return\r\n  }\r\n\r\n  const outDir = 'docs/4plus1'\r\n  const absOutDir = join(projectRoot, outDir)\r\n  if (!existsSync(absOutDir)) mkdirSync(absOutDir, { recursive: true })\r\n\r\n  const createdPaths: string[] = []\r\n  const existingPaths = new Set((l3.paths ?? []).map((p) => basename(p)))\r\n  for (const name of VIEW_FILE_NAMES) {\r\n    if (existingPaths.has(name)) continue\r\n    const absOut = join(absOutDir, name)\r\n    try {\r\n      copyFileSync(templatePath, absOut)\r\n      createdPaths.push(`${outDir}/${name}`)\r\n    } catch (err: any) {\r\n      l3.status = 'failed'\r\n      l3.detail = `failed to copy ${name}: ${err.message}`\r\n      return\r\n    }\r\n  }\r\n  l3.status = 'created'\r\n  l3.paths = [...(l3.paths ?? []), ...createdPaths]\r\n  l3.detail = `created ${createdPaths.length} view mds from view-template.md`\r\n}\r\n\r\nfunction fillL4(projectRoot: string, report: FindOrBuildReport): void {\r\n  const l4 = report.layers.find((l) => l.layer === 'L4')\r\n  if (!l4 || l4.status === 'exists') return\r\n\r\n  const l1 = report.layers.find((l) => l.layer === 'L1')\r\n  if (!l1 || (l1.status !== 'exists' && l1.status !== 'created')) {\r\n    l4.status = 'failed'\r\n    l4.detail = 'L1 yaml missing — render-4plus1-baseline.py requires baseline yaml. Fill L1 first.'\r\n    return\r\n  }\r\n\r\n  const scriptPath = locateScript(['fireworks-tech-graph', 'scripts', 'render-4plus1-baseline.py'])\r\n  if (!scriptPath) {\r\n    l4.status = 'failed'\r\n    l4.detail = 'render-4plus1-baseline.py not found (skill not vendored?)'\r\n    return\r\n  }\r\n\r\n  const l1RelPath = l1.paths[0]\r\n  const absBaseline = join(projectRoot, l1RelPath)\r\n  const outDir = 'docs/4plus1/diagrams'\r\n  const absOutDir = join(projectRoot, outDir)\r\n  if (!existsSync(absOutDir)) mkdirSync(absOutDir, { recursive: true })\r\n\r\n  const pyBin = process.env.PYTHON || 'python3'\r\n  try {\r\n    execSync(\r\n      `\"${pyBin}\" \"${scriptPath}\" --baseline \"${absBaseline}\" --out-dir \"${absOutDir}\"`,\r\n      { stdio: 'inherit', env: { ...process.env, PYTHONIOENCODING: 'utf-8', PYTHONUTF8: '1' } },\r\n    )\r\n    const created: string[] = []\r\n    for (const name of BASELINE_SVG_NAMES) {\r\n      const relPath = `${outDir}/${name}`\r\n      if (existsSync(join(projectRoot, relPath))) created.push(relPath)\r\n    }\r\n    if (created.length === BASELINE_SVG_NAMES.length) {\r\n      l4.status = 'created'\r\n      l4.paths = created\r\n      l4.detail = `rendered ${created.length} baseline SVGs`\r\n    } else {\r\n      l4.status = 'failed'\r\n      l4.detail = `only ${created.length}/${BASELINE_SVG_NAMES.length} SVGs created`\r\n      l4.paths = created\r\n    }\r\n  } catch (err: any) {\r\n    l4.status = 'failed'\r\n    l4.detail = `render-4plus1-baseline.py failed: ${err.message}`\r\n  }\r\n}\r\n\r\n// -----------------------------------------------------------------------------\r\n// 输出 / 定位工具\r\n// -----------------------------------------------------------------------------\r\n\r\nfunction printHumanReport(report: FindOrBuildReport): void {\r\n  console.log(`4+1 baseline find-or-build — project root: ${report.projectRoot}`)\r\n  console.log('')\r\n  for (const layer of report.layers) {\r\n    const icon =\r\n      layer.status === 'exists' ? '✓' :\r\n      layer.status === 'created' ? '+' :\r\n      layer.status === 'failed' ? '✗' :\r\n      layer.status === 'missing' ? '!' : '?'\r\n    const statusLabel =\r\n      layer.status === 'missing' && layer.layer === 'L2' ? 'WARN' :\r\n      layer.status.toUpperCase()\r\n    console.log(`  ${icon} ${layer.layer} [${statusLabel}]`)\r\n    for (const p of layer.paths) {\r\n      console.log(`      ${p}`)\r\n    }\r\n    if (layer.detail) {\r\n      console.log(`      detail: ${layer.detail}`)\r\n    }\r\n  }\r\n  console.log('')\r\n  if (report.yamlStatus !== 'none') {\r\n    console.log(`L1 yaml status: ${report.yamlStatus}`)\r\n    if (report.yamlStatus === 'draft') {\r\n      console.log('  → recommend code-driven mode in /architecture-models-4plus1 (refine draft to reviewed)')\r\n    } else if (report.yamlStatus === 'reviewed') {\r\n      console.log('  → recommend delta refine mode (use render-4plus1-delta.py for overlay rendering)')\r\n    }\r\n  }\r\n}\r\n\r\nfunction locateScript(relParts: string[]): string | undefined {\r\n  const skillDir = process.env.HARNESS_SKILL_DIR\r\n  const candidates: string[] = []\r\n  if (skillDir) {\r\n    candidates.push(resolve(skillDir, ...relParts))\r\n  }\r\n  candidates.push(resolve(process.cwd(), '.claude', 'skills', ...relParts))\r\n  for (const c of candidates) {\r\n    if (existsSync(c)) return c\r\n  }\r\n  return undefined\r\n}\r\n","// Copyright (C) HarnessToolKit Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { mkdirSync, existsSync, readFileSync, writeFileSync, rmSync } from 'fs'\r\nimport { join } from 'path'\r\nimport {\r\n  createDriver,\r\n  start,\r\n  extractDimensions,\r\n  generateQuestion,\r\n  processAnswer,\r\n  checkConvergence,\r\n  getDecisionTree,\r\n  recommendAnswer,\r\n  type HarnessStartDriver,\r\n} from '../pipeline/harness-start-driver.js'\r\nimport {\r\n  saveSessionState,\r\n  loadSessionState,\r\n  saveQAHistory,\r\n  loadAllQAHistory,\r\n  compressQAHistory,\r\n  calculateQAHistorySize,\r\n  type SessionState,\r\n} from './session.js'\r\n\r\nconst DRIVER_STATE_FILE = 'harness-start-driver.json'\r\nconst REQ_COUNTER_FILE = 'req-counter.json'\r\n\r\ninterface ReqCounter {\r\n  year: number\r\n  lastSeq: number\r\n}\r\n\r\nfunction reqCounterPath(dir: string): string {\r\n  return join(dir, '.harness/.pipeline', REQ_COUNTER_FILE)\r\n}\r\n\r\nfunction loadReqCounter(dir: string): ReqCounter {\r\n  const path = reqCounterPath(dir)\r\n  if (!existsSync(path)) {\r\n    return { year: 0, lastSeq: 0 }\r\n  }\r\n  try {\r\n    const raw = readFileSync(path, 'utf-8')\r\n    const parsed = JSON.parse(raw)\r\n    if (\r\n      typeof parsed?.year === 'number' &&\r\n      typeof parsed?.lastSeq === 'number'\r\n    ) {\r\n      return { year: parsed.year, lastSeq: parsed.lastSeq }\r\n    }\r\n  } catch {\r\n    // fall through to default\r\n  }\r\n  return { year: 0, lastSeq: 0 }\r\n}\r\n\r\nfunction saveReqCounter(dir: string, counter: ReqCounter): void {\r\n  const pipelineDir = join(dir, '.harness/.pipeline')\r\n  if (!existsSync(pipelineDir)) {\r\n    mkdirSync(pipelineDir, { recursive: true })\r\n  }\r\n  writeFileSync(reqCounterPath(dir), JSON.stringify(counter), 'utf-8')\r\n}\r\n\r\n/**\r\n * Generate the next request ID `REQ-YYYY-NNN`. The year resets when a new\r\n * calendar year is encountered, restarting the sequence at 1.\r\n */\r\nfunction generateNextRequestId(dir: string): string {\r\n  const currentYear = new Date().getFullYear()\r\n  const counter = loadReqCounter(dir)\r\n  const nextSeq =\r\n    counter.year === currentYear ? counter.lastSeq + 1 : 1\r\n  const id = `REQ-${currentYear}-${String(nextSeq).padStart(3, '0')}`\r\n  saveReqCounter(dir, { year: currentYear, lastSeq: nextSeq })\r\n  return id\r\n}\r\n\r\n// Strip surrounding single or double quotes that survive cmd.exe / nested\r\n// shell parsing (e.g. `cmd //c \"tool --dir=\\\"C:\\path\\\"\"` reaches us as\r\n// `'\"C:\\path\"'`). Without this, the literal quote chars end up in the path\r\n// and Windows treats the segment as drive-relative, prepending cwd and\r\n// producing paths like `D:\\cwd\\\"D:path\"\\.pipeline`.\r\nfunction unquote(s: string): string {\r\n  return s.replace(/^[\"']|[\"']$/g, '')\r\n}\r\n\r\nfunction argValue(args: string[], flag: string, fallback = ''): string {\r\n  const match = args.find(a => a.startsWith(flag))\r\n  if (!match) return fallback\r\n  // Take everything after the first '=' so answer values containing '=' survive.\r\n  // Matches gate-cli.ts argValue semantics.\r\n  return unquote(match.split('=').slice(1).join('='))\r\n}\r\n\r\nfunction driverStatePath(dir: string): string {\r\n  return join(dir, '.harness/.pipeline', DRIVER_STATE_FILE)\r\n}\r\n\r\nfunction loadDriver(dir: string): HarnessStartDriver | null {\r\n  const path = driverStatePath(dir)\r\n  if (!existsSync(path)) {\r\n    return null\r\n  }\r\n  try {\r\n    const raw = readFileSync(path, 'utf-8')\r\n    const state = JSON.parse(raw)\r\n    return {\r\n      requestId: state.requestId,\r\n      pipelineDir: state.pipelineDir,\r\n      context: state.context,\r\n      tree: state.tree,\r\n      started: state.started,\r\n      currentNodeId: state.currentNodeId,\r\n    }\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction saveDriver(driver: HarnessStartDriver): void {\r\n  const dir = join(driver.pipelineDir, '.harness/.pipeline')\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n  writeFileSync(driverStatePath(driver.pipelineDir), JSON.stringify(driver), 'utf-8')\r\n}\r\n\r\nfunction updateSessionState(driver: HarnessStartDriver, currentStep: number, currentAction: string): void {\r\n  const tree = driver.tree\r\n  const state: SessionState = {\r\n    requestId: driver.requestId,\r\n    pipeline: 'harness-start',\r\n    currentStep,\r\n    currentAction,\r\n    currentNodeId: driver.currentNodeId,\r\n    convergedCount: tree.nodes.filter(n => n.status === 'converged').length,\r\n    totalCount: tree.nodes.length,\r\n    prdStatus: 'draft',\r\n    gateResult: 'not_run',\r\n    lastUpdated: new Date().toISOString(),\r\n  }\r\n  saveSessionState(state, driver.pipelineDir)\r\n}\r\n\r\nexport function handleReqStart(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n  const explicit = argValue(args, '--request-id=')\r\n  const requestId = explicit || generateNextRequestId(dir)\r\n\r\n  const driver = createDriver({\r\n    requestId,\r\n    pipelineDir: dir,\r\n    context: { req: requestId, project_root: dir },\r\n  })\r\n  const result = start(driver)\r\n  saveDriver(driver)\r\n  updateSessionState(driver, 1, 'start')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqExtractDimensions(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n  const dimsRaw = argValue(args, '--dimensions=')\r\n  const dimensions = dimsRaw.split(',').map(d => d.trim()).filter(Boolean)\r\n\r\n  const driver = loadDriver(dir)\r\n  if (!driver) {\r\n    console.error(JSON.stringify({ error: 'Driver not started. Run req start first.' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const result = extractDimensions(driver, dimensions)\r\n  saveDriver(driver)\r\n  updateSessionState(driver, 2, 'extract_dimensions')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqNextQuestion(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n\r\n  const driver = loadDriver(dir)\r\n  if (!driver) {\r\n    console.error(JSON.stringify({ error: 'Driver not started. Run req start first.' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const result = generateQuestion(driver)\r\n  saveDriver(driver)\r\n\r\n  // Save QA history (question)\r\n  if (result.payload.currentNode) {\r\n    const node = driver.tree.nodes.find(n => n.id === result.payload.currentNode.id)\r\n    if (node) {\r\n      saveQAHistory(dir, node.id, node.title, node.question || node.title)\r\n    }\r\n  }\r\n\r\n  updateSessionState(driver, 3, 'ask_question')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqAnswer(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n  const answer = argValue(args, '--answer=')\r\n  const branchesRaw = argValue(args, '--new-branches=')\r\n  const newBranches = branchesRaw.split(',').map(b => b.trim()).filter(Boolean)\r\n\r\n  const driver = loadDriver(dir)\r\n  if (!driver) {\r\n    console.error(JSON.stringify({ error: 'Driver not started. Run req start first.' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  // Find current node before processing answer\r\n  const currentNode = driver.currentNodeId\r\n    ? driver.tree.nodes.find(n => n.id === driver.currentNodeId)\r\n    : null\r\n\r\n  const result = processAnswer(driver, answer, newBranches)\r\n  saveDriver(driver)\r\n\r\n  // P-4 guard: read back the persisted file and verify the answer survived\r\n  // intact. argValue already preserves '=' in answers; this catches any\r\n  // persistence-path truncation/corruption and turns silent data loss into an\r\n  // explicit failure — requirement capture must not lose data silently.\r\n  if (currentNode) {\r\n    const persistedNode = loadDriver(dir)?.tree.nodes.find(n => n.id === currentNode.id) ?? null\r\n    const persistedLen = persistedNode?.answer?.length ?? -1\r\n    if (persistedLen !== answer.length) {\r\n      console.error(JSON.stringify({\r\n        error: 'answer_persistence_mismatch',\r\n        nodeId: currentNode.id,\r\n        submittedLength: answer.length,\r\n        persistedLength: persistedLen,\r\n      }))\r\n      process.exit(1)\r\n    }\r\n  }\r\n\r\n  // Save QA history (answer) - update existing entry\r\n  if (currentNode) {\r\n    saveQAHistory(dir, currentNode.id, currentNode.title, currentNode.question || currentNode.title, answer)\r\n  }\r\n\r\n  updateSessionState(driver, 3, 'process_answer')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqStatus(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n\r\n  const driver = loadDriver(dir)\r\n  if (driver) {\r\n    const tree = getDecisionTree(driver)\r\n    const sessionState = loadSessionState(dir)\r\n    const qaHistories = loadAllQAHistory(dir)\r\n    const compressedQA = compressQAHistory(qaHistories)\r\n    const qaSize = calculateQAHistorySize(dir)\r\n\r\n    console.log(JSON.stringify({\r\n      status: 'active',\r\n      requestId: driver.requestId,\r\n      totalNodes: tree.nodes.length,\r\n      pendingCount: tree.nodes.filter(n => n.status === 'pending').length,\r\n      convergedCount: tree.nodes.filter(n => n.status === 'converged').length,\r\n      currentNodeId: driver.currentNodeId,\r\n      sessionState,\r\n      qaHistoryCount: qaHistories.length,\r\n      qaHistorySizeKB: Math.round(qaSize / 1024),\r\n    }))\r\n    return\r\n  }\r\n\r\n  // Driver missing: fall back to session-state.json + qa-log/ for read-only recovery view.\r\n  // Only applies to harness-start pipeline sessions.\r\n  const sessionState = loadSessionState(dir)\r\n  if (!sessionState || sessionState.pipeline !== 'harness-start') {\r\n    console.log(JSON.stringify({ status: 'not_started' }))\r\n    return\r\n  }\r\n\r\n  const qaHistories = loadAllQAHistory(dir)\r\n  const qaSize = calculateQAHistorySize(dir)\r\n  const pendingCount = Math.max(sessionState.totalCount - sessionState.convergedCount, 0)\r\n\r\n  console.log(JSON.stringify({\r\n    status: 'active',\r\n    requestId: sessionState.requestId,\r\n    totalNodes: sessionState.totalCount,\r\n    pendingCount,\r\n    convergedCount: sessionState.convergedCount,\r\n    currentNodeId: sessionState.currentNodeId,\r\n    sessionState,\r\n    qaHistoryCount: qaHistories.length,\r\n    qaHistorySizeKB: Math.round(qaSize / 1024),\r\n    recovered: true,\r\n  }))\r\n}\r\n\r\nexport function handleReqConverge(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n\r\n  const driver = loadDriver(dir)\r\n  if (!driver) {\r\n    console.error(JSON.stringify({ error: 'Driver not started. Run req start first.' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const result = checkConvergence(driver)\r\n  saveDriver(driver)\r\n  updateSessionState(driver, 5, 'check_convergence')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqRecommend(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n  const nodeIdRaw = argValue(args, '--node=')\r\n  const recommended = argValue(args, '--recommended=')\r\n\r\n  if (!nodeIdRaw) {\r\n    console.error(JSON.stringify({ error: 'Missing --node=<id> for req recommend' }))\r\n    process.exit(2)\r\n  }\r\n  const nodeId = Number.parseInt(nodeIdRaw, 10)\r\n  if (!Number.isFinite(nodeId)) {\r\n    console.error(JSON.stringify({ error: `Invalid --node value: ${nodeIdRaw}` }))\r\n    process.exit(2)\r\n  }\r\n\r\n  const driver = loadDriver(dir)\r\n  if (!driver) {\r\n    console.error(JSON.stringify({ error: 'Driver not started. Run req start first.' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const result = recommendAnswer(driver, nodeId, recommended)\r\n  saveDriver(driver)\r\n  updateSessionState(driver, 3, 'recommend_answer')\r\n\r\n  console.log(JSON.stringify(result))\r\n}\r\n\r\nexport function handleReqClear(args: string[]): void {\r\n  const dir = argValue(args, '--dir=', process.cwd())\r\n  const yes = args.includes('--yes')\r\n\r\n  const pipelineDir = join(dir, '.harness/.pipeline')\r\n  if (!existsSync(pipelineDir)) {\r\n    console.log(JSON.stringify({ status: 'no_session', dir }))\r\n    return\r\n  }\r\n\r\n  const targets = [\r\n    'harness-start-driver.json',\r\n    'session-state.json',\r\n  ]\r\n  const driverPath = join(pipelineDir, 'harness-start-driver.json')\r\n  const sessionPath = join(pipelineDir, 'session-state.json')\r\n  const qaLogDir = join(pipelineDir, 'qa-log')\r\n\r\n  if (!existsSync(driverPath) && !existsSync(sessionPath) && !existsSync(qaLogDir)) {\r\n    console.log(JSON.stringify({ status: 'nothing_to_clear', dir }))\r\n    return\r\n  }\r\n\r\n  if (!yes) {\r\n    console.log(JSON.stringify({\r\n      status: 'confirmation_required',\r\n      message: 'Refusing to delete without --yes',\r\n      willDelete: {\r\n        driver: existsSync(driverPath) ? driverPath : null,\r\n        session: existsSync(sessionPath) ? sessionPath : null,\r\n        qaLog: existsSync(qaLogDir) ? qaLogDir : null,\r\n      },\r\n    }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const deleted: string[] = []\r\n  for (const t of targets) {\r\n    const p2 = join(pipelineDir, t)\r\n    if (existsSync(p2)) {\r\n      rmSync(p2)\r\n      deleted.push(t)\r\n    }\r\n  }\r\n  if (existsSync(qaLogDir)) {\r\n    rmSync(qaLogDir, { recursive: true, force: true })\r\n    deleted.push('qa-log/')\r\n  }\r\n\r\n  console.log(JSON.stringify({ status: 'cleared', dir, deleted }))\r\n}\r\n","// Copyright (C) HarnessToolKit Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, mkdirSync, appendFileSync, writeFileSync, readFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport {\r\n  createTree,\r\n  addNode,\r\n  markConverged,\r\n  nextPending,\r\n  serialize,\r\n  deserialize,\r\n  setRecommendedAnswer,\r\n  setAnswer,\r\n  type DecisionTree,\r\n} from './decision-tree.js'\r\nimport { saveState, loadState, type PipelineState } from './index.js'\r\n\r\nexport interface StepResult {\r\n  nextAction: string\r\n  payload: Record<string, unknown>\r\n}\r\n\r\nexport interface HarnessStartDriver {\r\n  requestId: string\r\n  pipelineDir: string\r\n  context: Record<string, string>\r\n  tree: DecisionTree\r\n  started: boolean\r\n  currentNodeId: number | null\r\n}\r\n\r\nexport interface DriverConfig {\r\n  requestId: string\r\n  pipelineDir: string\r\n  context: Record<string, string>\r\n}\r\n\r\nfunction logPath(driver: HarnessStartDriver): string {\r\n  return join(driver.pipelineDir, '.harness', '.pipeline', 'execution-log.jsonl')\r\n}\r\n\r\nfunction logStep(driver: HarnessStartDriver, step: string, detail: Record<string, unknown> = {}): void {\r\n  const dir = join(driver.pipelineDir, '.harness', '.pipeline')\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n  const entry = {\r\n    timestamp: new Date().toISOString(),\r\n    requestId: driver.requestId,\r\n    step,\r\n    ...detail,\r\n  }\r\n  const line = JSON.stringify(entry) + '\\n'\r\n  appendFileSync(logPath(driver), line, 'utf-8')\r\n\r\n  // Also print to console\r\n  console.error(`[harness] Step: ${step}`, Object.keys(detail).length > 0 ? detail : '')\r\n}\r\n\r\nexport function createDriver(config: DriverConfig): HarnessStartDriver {\r\n  return {\r\n    requestId: config.requestId,\r\n    pipelineDir: config.pipelineDir,\r\n    context: config.context,\r\n    tree: createTree(),\r\n    started: false,\r\n    currentNodeId: null,\r\n  }\r\n}\r\n\r\nexport function start(driver: HarnessStartDriver): StepResult {\r\n  driver.started = true\r\n  logStep(driver, 'start', { requestId: driver.requestId })\r\n\r\n  return {\r\n    nextAction: 'extract_dimensions',\r\n    payload: {\r\n      requestId: driver.requestId,\r\n      message: 'Pipeline initialized. Provide user input to extract decision dimensions.',\r\n    },\r\n  }\r\n}\r\n\r\nexport function extractDimensions(driver: HarnessStartDriver, dimensions: string[]): StepResult {\r\n  if (!driver.started) {\r\n    throw new Error('Driver not started. Call start() first.')\r\n  }\r\n\r\n  for (const dim of dimensions) {\r\n    addNode(driver.tree, dim)\r\n  }\r\n  driver.currentNodeId = driver.tree.nodes[0]?.id ?? null\r\n\r\n  logStep(driver, 'extract_dimensions', {\r\n    dimensions,\r\n    count: dimensions.length,\r\n    currentNode: driver.tree.nodes[0]?.title,\r\n  })\r\n\r\n  const firstPending = nextPending(driver.tree)\r\n  return {\r\n    nextAction: firstPending ? 'ask_question' : 'check_convergence',\r\n    payload: {\r\n      currentNode: firstPending,\r\n      totalNodes: driver.tree.nodes.length,\r\n    },\r\n  }\r\n}\r\n\r\nexport function generateQuestion(driver: HarnessStartDriver): StepResult {\r\n  const pending = driver.currentNodeId\r\n    ? driver.tree.nodes.find(n => n.id === driver.currentNodeId)\r\n    : nextPending(driver.tree)\r\n\r\n  if (!pending) {\r\n    return {\r\n      nextAction: 'check_convergence',\r\n      payload: { converged: true },\r\n    }\r\n  }\r\n\r\n  driver.currentNodeId = pending.id\r\n\r\n  logStep(driver, 'generate_question', { nodeId: pending.id, title: pending.title })\r\n\r\n  const payload: Record<string, unknown> = {\r\n    questionPrompt: pending.title,\r\n    currentNode: { id: pending.id, title: pending.title },\r\n  }\r\n  // Surface a previously-stored grill-with-docs recommendation so the agent\r\n  // can present it to the user alongside the question.\r\n  if (pending.recommendedAnswer) {\r\n    payload.recommendedAnswer = pending.recommendedAnswer\r\n  }\r\n  return {\r\n    nextAction: 'ask_question',\r\n    payload,\r\n  }\r\n}\r\n\r\n// Record a grill-with-docs recommendation for a node. Agents call this after\r\n// exploring the codebase but before asking the user, so the recommendation\r\n// is preserved across session resumes and re-surfaces on subsequent\r\n// next-question calls.\r\nexport function recommendAnswer(\r\n  driver: HarnessStartDriver,\r\n  nodeId: number,\r\n  recommended: string,\r\n): StepResult {\r\n  const node = driver.tree.nodes.find(n => n.id === nodeId)\r\n  if (!node) {\r\n    throw new Error(`Node not found: ${nodeId}`)\r\n  }\r\n  setRecommendedAnswer(driver.tree, nodeId, recommended)\r\n  logStep(driver, 'recommend_answer', { nodeId, recommendedPreview: recommended.slice(0, 100) })\r\n  return {\r\n    nextAction: 'ask_question',\r\n    payload: {\r\n      nodeId,\r\n      recommendedAnswer: recommended,\r\n      currentNode: { id: node.id, title: node.title },\r\n    },\r\n  }\r\n}\r\n\r\nexport function processAnswer(\r\n  driver: HarnessStartDriver,\r\n  answer: string,\r\n  newBranches: string[],\r\n): StepResult {\r\n  const currentNodeId = driver.currentNodeId\r\n  if (currentNodeId === null) {\r\n    throw new Error('No current node to process answer for.')\r\n  }\r\n\r\n  // Mark current node as converged (answer received)\r\n  markConverged(driver.tree, currentNodeId)\r\n  // Persist the user's actual answer on the node so downstream steps can\r\n  // read each node's resolution directly without scanning qaHistory.\r\n  setAnswer(driver.tree, currentNodeId, answer)\r\n\r\n  // Add new branches as child nodes\r\n  for (const branch of newBranches) {\r\n    addNode(driver.tree, branch, currentNodeId)\r\n  }\r\n\r\n  logStep(driver, 'process_answer', {\r\n    nodeId: currentNodeId,\r\n    answerPreview: answer.slice(0, 100),\r\n    newBranches,\r\n  })\r\n\r\n  // Find next pending node\r\n  const pending = nextPending(driver.tree)\r\n  if (!pending) {\r\n    return {\r\n      nextAction: 'check_convergence',\r\n      payload: { converged: true },\r\n    }\r\n  }\r\n\r\n  driver.currentNodeId = pending.id\r\n  const payload: Record<string, unknown> = {\r\n    currentNode: { id: pending.id, title: pending.title },\r\n  }\r\n  if (pending.recommendedAnswer) {\r\n    payload.recommendedAnswer = pending.recommendedAnswer\r\n  }\r\n  return {\r\n    nextAction: 'ask_question',\r\n    payload,\r\n  }\r\n}\r\n\r\nexport function checkConvergence(driver: HarnessStartDriver): StepResult {\r\n  const pending = nextPending(driver.tree)\r\n  const converged = pending === null\r\n\r\n  logStep(driver, 'check_convergence', {\r\n    converged,\r\n    totalNodes: driver.tree.nodes.length,\r\n    convergedCount: driver.tree.nodes.filter(n => n.status === 'converged').length,\r\n    pendingCount: driver.tree.nodes.filter(n => n.status === 'pending').length,\r\n  })\r\n\r\n  if (converged) {\r\n    return {\r\n      nextAction: 'run_exit_gate',\r\n      payload: { converged: true },\r\n    }\r\n  }\r\n\r\n  driver.currentNodeId = pending!.id\r\n  const payload: Record<string, unknown> = {\r\n    converged: false,\r\n    currentNode: { id: pending!.id, title: pending!.title },\r\n  }\r\n  if (pending!.recommendedAnswer) {\r\n    payload.recommendedAnswer = pending!.recommendedAnswer\r\n  }\r\n  return {\r\n    nextAction: 'ask_question',\r\n    payload,\r\n  }\r\n}\r\n\r\nexport function getDecisionTree(driver: HarnessStartDriver): DecisionTree {\r\n  return driver.tree\r\n}\r\n","// Copyright (C) HarnessToolKit Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nexport type NodeStatus = 'pending' | 'converged'\r\n\r\nexport interface DecisionNode {\r\n  id: number\r\n  title: string\r\n  status: NodeStatus\r\n  parentId: number | null\r\n  // Optional grill-with-docs recommendation: the answer the agent proposes\r\n  // to the user for this decision point. Empty when the agent cannot make a\r\n  // confident recommendation and must ask the user open-endedly.\r\n  recommendedAnswer?: string\r\n  // The user's actual answer once this node is converged. Persisted by\r\n  // setAnswer() during processAnswer() so downstream steps can read each\r\n  // node's resolution directly from the tree without scanning qaHistory.\r\n  answer?: string\r\n  // ISO timestamp marking when the user's answer was recorded.\r\n  answeredAt?: string\r\n}\r\n\r\nexport interface DecisionTree {\r\n  nodes: DecisionNode[]\r\n  nextId: number\r\n}\r\n\r\nexport function createTree(): DecisionTree {\r\n  return { nodes: [], nextId: 1 }\r\n}\r\n\r\nexport function addNode(tree: DecisionTree, title: string, parentId: number | null = null): DecisionNode {\r\n  if (parentId !== null) {\r\n    if (!tree.nodes.some(n => n.id === parentId)) {\r\n      throw new Error(`Parent node not found: ${parentId}`)\r\n    }\r\n  }\r\n\r\n  const node: DecisionNode = {\r\n    id: tree.nextId,\r\n    title,\r\n    status: 'pending',\r\n    parentId,\r\n  }\r\n  tree.nodes.push(node)\r\n  tree.nextId++\r\n  return node\r\n}\r\n\r\nexport function markConverged(tree: DecisionTree, nodeId: number): void {\r\n  const node = tree.nodes.find(n => n.id === nodeId)\r\n  if (!node) {\r\n    throw new Error(`Node not found: ${nodeId}`)\r\n  }\r\n  node.status = 'converged'\r\n}\r\n\r\n// Attach (or clear) a grill-with-docs recommendation to a node. The agent\r\n// calls this after analyzing the codebase but before asking the user, so\r\n// the recommendation can be surfaced in the question prompt and preserved\r\n// across session resumes. Pass an empty string to clear.\r\nexport function setRecommendedAnswer(tree: DecisionTree, nodeId: number, recommended: string): void {\r\n  const node = tree.nodes.find(n => n.id === nodeId)\r\n  if (!node) {\r\n    throw new Error(`Node not found: ${nodeId}`)\r\n  }\r\n  if (recommended) {\r\n    node.recommendedAnswer = recommended\r\n  } else {\r\n    delete node.recommendedAnswer\r\n  }\r\n}\r\n\r\n// Persist the user's actual answer onto a node. Called by the driver's\r\n// processAnswer() so the answer survives on the node itself (not just in\r\n// qaHistory logs). Downstream steps read node.answer directly.\r\nexport function setAnswer(tree: DecisionTree, nodeId: number, answer: string): void {\r\n  const node = tree.nodes.find(n => n.id === nodeId)\r\n  if (!node) {\r\n    throw new Error(`Node not found: ${nodeId}`)\r\n  }\r\n  node.answer = answer\r\n  node.answeredAt = new Date().toISOString()\r\n}\r\n\r\nexport function nextPending(tree: DecisionTree): DecisionNode | null {\r\n  const roots = tree.nodes.filter(n => n.parentId === null)\r\n  for (const root of roots) {\r\n    const result = dfsFindPending(tree, root)\r\n    if (result) {\r\n      return result\r\n    }\r\n  }\r\n  return null\r\n}\r\n\r\nfunction dfsFindPending(tree: DecisionTree, node: DecisionNode): DecisionNode | null {\r\n  if (node.status === 'pending') {\r\n    return node\r\n  }\r\n  const children = tree.nodes.filter(n => n.parentId === node.id)\r\n  for (const child of children) {\r\n    const result = dfsFindPending(tree, child)\r\n    if (result) {\r\n      return result\r\n    }\r\n  }\r\n  return null\r\n}\r\n\r\nexport function serialize(tree: DecisionTree): string {\r\n  return JSON.stringify(tree)\r\n}\r\n\r\nexport function deserialize(json: string): DecisionTree {\r\n  return JSON.parse(json) as DecisionTree\r\n}\r\n","// Copyright (C) HarnessToolKit Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { mkdirSync, existsSync, readFileSync, writeFileSync, readdirSync } from 'fs'\r\nimport { join } from 'path'\r\n\r\nexport interface SessionState {\r\n  requestId: string\r\n  pipeline: string\r\n  currentStep: number\r\n  currentAction: string\r\n  currentNodeId: number | null\r\n  convergedCount: number\r\n  totalCount: number\r\n  prdStatus: 'draft' | 'approved' | 'rejected'\r\n  gateResult: 'passed' | 'blocked' | 'not_run'\r\n  lastUpdated: string\r\n}\r\n\r\nexport interface QAHistory {\r\n  nodeId: number\r\n  title: string\r\n  question?: string\r\n  answer?: string\r\n  timestamp?: string\r\n}\r\n\r\nconst SESSION_STATE_FILE = 'session-state.json'\r\nconst QA_LOG_DIR = 'qa-log'\r\n\r\nfunction sessionStatePath(pipelineDir: string): string {\r\n  return join(pipelineDir, '.harness', '.pipeline', SESSION_STATE_FILE)\r\n}\r\n\r\nfunction qaLogDir(pipelineDir: string): string {\r\n  return join(pipelineDir, '.harness', '.pipeline', QA_LOG_DIR)\r\n}\r\n\r\nfunction qaLogFilePath(pipelineDir: string, nodeId: number): string {\r\n  return join(qaLogDir(pipelineDir), 'node-' + String(nodeId).padStart(3, '0') + '.json')\r\n}\r\n\r\nexport function loadSessionState(pipelineDir: string): SessionState | null {\r\n  const path = sessionStatePath(pipelineDir)\r\n  if (!existsSync(path)) {\r\n    return null\r\n  }\r\n  try {\r\n    const raw = readFileSync(path, 'utf-8')\r\n    return JSON.parse(raw) as SessionState\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nexport function saveSessionState(state: SessionState, pipelineDir: string): void {\r\n  if (!pipelineDir) {\r\n    return\r\n  }\r\n\r\n  const dir = join(pipelineDir, '.harness', '.pipeline')\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n\r\n  state.lastUpdated = new Date().toISOString()\r\n  writeFileSync(sessionStatePath(pipelineDir), JSON.stringify(state, null, 2), 'utf-8')\r\n}\r\n\r\nexport function saveQAHistory(pipelineDir: string, nodeId: number, title: string, question?: string, answer?: string): void {\r\n  const dir = qaLogDir(pipelineDir)\r\n  if (!existsSync(dir)) {\r\n    mkdirSync(dir, { recursive: true })\r\n  }\r\n\r\n  const qa: QAHistory = {\r\n    nodeId,\r\n    title,\r\n    question,\r\n    answer,\r\n    timestamp: new Date().toISOString(),\r\n  }\r\n\r\n  writeFileSync(qaLogFilePath(pipelineDir, nodeId), JSON.stringify(qa, null, 2), 'utf-8')\r\n}\r\n\r\nexport function loadQAHistory(pipelineDir: string, nodeId: number): QAHistory | null {\r\n  const path = qaLogFilePath(pipelineDir, nodeId)\r\n  if (!existsSync(path)) {\r\n    return null\r\n  }\r\n  try {\r\n    const raw = readFileSync(path, 'utf-8')\r\n    return JSON.parse(raw) as QAHistory\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nexport function loadAllQAHistory(pipelineDir: string): QAHistory[] {\r\n  const dir = qaLogDir(pipelineDir)\r\n  if (!existsSync(dir)) {\r\n    return []\r\n  }\r\n\r\n  const files = readdirSync(dir).filter(f => f.startsWith('node-') && f.endsWith('.json'))\r\n  const histories: QAHistory[] = []\r\n\r\n  for (const file of files) {\r\n    try {\r\n      const raw = readFileSync(join(dir, file), 'utf-8')\r\n      histories.push(JSON.parse(raw) as QAHistory)\r\n    } catch {\r\n      // Skip invalid files\r\n    }\r\n  }\r\n\r\n  return histories.sort((a, b) => a.nodeId - b.nodeId)\r\n}\r\n\r\nexport function compressQAHistory(histories: QAHistory[]): { nodeId: number, summary: string }[] {\r\n  return histories.map(h => {\r\n    const q = h.question ? h.question.slice(0, 50) : h.title.slice(0, 50)\r\n    const a = h.answer ? ' -> ' + h.answer.slice(0, 50) : ''\r\n    return {\r\n      nodeId: h.nodeId,\r\n      summary: q + a,\r\n    }\r\n  })\r\n}\r\n\r\nexport function calculateQAHistorySize(pipelineDir: string): number {\r\n  const histories = loadAllQAHistory(pipelineDir)\r\n  const totalBytes = histories.reduce((sum, h) => {\r\n    return sum + JSON.stringify(h).length\r\n  }, 0)\r\n  return totalBytes\r\n}\r\n","// Copyright (C) HarnessToolKit Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { mkdirSync, existsSync, readFileSync, writeFileSync } from 'fs'\r\nimport { join } from 'path'\r\n\r\ninterface DevTaskState {\r\n  taskId: string\r\n  status: 'in_progress' | 'completed'\r\n  startedAt: string\r\n  completedAt?: string\r\n}\r\n\r\ninterface DevState {\r\n  tasks: Record<string, DevTaskState>\r\n}\r\n\r\nfunction devStatePath(dir: string): string {\r\n  return join(dir, '.harness', '.pipeline', 'dev-state.json')\r\n}\r\n\r\nfunction loadDevState(dir: string): DevState {\r\n  const path = devStatePath(dir)\r\n  if (!existsSync(path)) {\r\n    return { tasks: {} }\r\n  }\r\n  try {\r\n    return JSON.parse(readFileSync(path, 'utf-8'))\r\n  } catch {\r\n    return { tasks: {} }\r\n  }\r\n}\r\n\r\nfunction saveDevState(dir: string, state: DevState): void {\r\n  const pipelineDir = join(dir, '.harness', '.pipeline')\r\n  if (!existsSync(pipelineDir)) {\r\n    mkdirSync(pipelineDir, { recursive: true })\r\n  }\r\n  writeFileSync(devStatePath(dir), JSON.stringify(state), 'utf-8')\r\n}\r\n\r\nexport function handleDevStart(args: string[]): void {\r\n  const dir = args.find(a => a.startsWith('--dir='))?.split('=')[1] ?? process.cwd()\r\n  const taskId = args.find(a => a.startsWith('--task='))?.split('=')[1] ?? ''\r\n\r\n  if (!taskId) {\r\n    console.error(JSON.stringify({ error: '--task is required' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const state = loadDevState(dir)\r\n  state.tasks[taskId] = {\r\n    taskId,\r\n    status: 'in_progress',\r\n    startedAt: new Date().toISOString(),\r\n  }\r\n  saveDevState(dir, state)\r\n\r\n  console.log(JSON.stringify({\r\n    nextAction: 'execute_tdd',\r\n    payload: { taskId, status: 'in_progress' },\r\n  }))\r\n\r\n  console.error(`[harness] dev start: task ${taskId} started`)\r\n}\r\n\r\nexport function handleDevComplete(args: string[]): void {\r\n  const dir = args.find(a => a.startsWith('--dir='))?.split('=')[1] ?? process.cwd()\r\n  const taskId = args.find(a => a.startsWith('--task='))?.split('=')[1] ?? ''\r\n\r\n  if (!taskId) {\r\n    console.error(JSON.stringify({ error: '--task is required' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const state = loadDevState(dir)\r\n  if (!state.tasks[taskId]) {\r\n    console.error(JSON.stringify({ error: `Task ${taskId} not found` }))\r\n    process.exit(1)\r\n  }\r\n\r\n  state.tasks[taskId].status = 'completed'\r\n  state.tasks[taskId].completedAt = new Date().toISOString()\r\n  saveDevState(dir, state)\r\n\r\n  console.log(JSON.stringify({\r\n    nextAction: 'run_exit_gate',\r\n    payload: { taskId, status: 'completed' },\r\n  }))\r\n\r\n  console.error(`[harness] dev complete: task ${taskId} completed`)\r\n}\r\n\r\nexport function handleDevStatus(args: string[]): void {\r\n  const dir = args.find(a => a.startsWith('--dir='))?.split('=')[1] ?? process.cwd()\r\n\r\n  const state = loadDevState(dir)\r\n  const tasks = Object.values(state.tasks)\r\n  const inProgress = tasks.filter(t => t.status === 'in_progress')\r\n  const completed = tasks.filter(t => t.status === 'completed')\r\n\r\n  console.log(JSON.stringify({\r\n    totalTasks: tasks.length,\r\n    inProgress: inProgress.length,\r\n    completed: completed.length,\r\n    tasks: tasks.map(t => ({ taskId: t.taskId, status: t.status })),\r\n  }))\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { randomInt } from 'crypto'\r\n\r\nexport interface PortAllocator {\r\n  allocate(): number\r\n  release(port: number): void\r\n  releaseAll(): void\r\n  isAllocated(port: number): boolean\r\n  allocatedCount(): number\r\n}\r\n\r\nexport interface PortAllocatorOptions {\r\n  rangeMin?: number\r\n  rangeMax?: number\r\n  maxAttempts?: number\r\n}\r\n\r\nexport function createPortAllocator(options?: PortAllocatorOptions): PortAllocator {\r\n  const rangeMin = options?.rangeMin ?? 10000\r\n  const rangeMax = options?.rangeMax ?? 65535\r\n  const maxAttempts = options?.maxAttempts ?? 1000\r\n\r\n  const allocated = new Set<number>()\r\n\r\n  function allocate(): number {\r\n    for (let i = 0; i < maxAttempts; i++) {\r\n      const port = randomInt(rangeMin, rangeMax + 1)\r\n      if (!allocated.has(port)) {\r\n        allocated.add(port)\r\n        return port\r\n      }\r\n    }\r\n    throw new Error(`No available port found after ${maxAttempts} attempts in range ${rangeMin}-${rangeMax}`)\r\n  }\r\n\r\n  function release(port: number): void {\r\n    allocated.delete(port)\r\n  }\r\n\r\n  function releaseAll(): void {\r\n    allocated.clear()\r\n  }\r\n\r\n  function isAllocated(port: number): boolean {\r\n    return allocated.has(port)\r\n  }\r\n\r\n  function allocatedCount(): number {\r\n    return allocated.size\r\n  }\r\n\r\n  return { allocate, release, releaseAll, isAllocated, allocatedCount }\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { EnvSession } from './types.js'\r\n\r\nexport interface SessionStore {\r\n  create(session: EnvSession): void\r\n  get(sessionId: string): EnvSession | undefined\r\n  update(sessionId: string, patch: Partial<EnvSession>): void\r\n  remove(sessionId: string): void\r\n  list(filter?: { providerType?: string }): EnvSession[]\r\n}\r\n\r\nconst STATE_FILE = '.env-sessions.json'\r\n\r\nexport function createSessionStore(workDir: string): SessionStore {\r\n  const statePath = join(workDir, STATE_FILE)\r\n  const sessions = new Map<string, EnvSession>()\r\n\r\n  loadFromDisk()\r\n\r\n  function loadFromDisk(): void {\r\n    if (!existsSync(statePath)) {\r\n      return\r\n    }\r\n    try {\r\n      const raw = readFileSync(statePath, 'utf-8')\r\n      const data = JSON.parse(raw) as Record<string, EnvSession>\r\n      for (const [id, session] of Object.entries(data)) {\r\n        sessions.set(id, session)\r\n      }\r\n    } catch {\r\n      // corrupt file — start fresh\r\n    }\r\n  }\r\n\r\n  function persist(): void {\r\n    const obj: Record<string, EnvSession> = {}\r\n    for (const [id, session] of sessions) {\r\n      obj[id] = session\r\n    }\r\n    writeFileSync(statePath, JSON.stringify(obj, null, 2), 'utf-8')\r\n  }\r\n\r\n  function create(session: EnvSession): void {\r\n    sessions.set(session.sessionId, { ...session })\r\n    persist()\r\n  }\r\n\r\n  function get(sessionId: string): EnvSession | undefined {\r\n    const s = sessions.get(sessionId)\r\n    if (s) {\r\n      return { ...s }\r\n    }\r\n    return undefined\r\n  }\r\n\r\n  function update(sessionId: string, patch: Partial<EnvSession>): void {\r\n    const existing = sessions.get(sessionId)\r\n    if (!existing) {\r\n      throw new Error(`Session '${sessionId}' not found`)\r\n    }\r\n    sessions.set(sessionId, { ...existing, ...patch })\r\n    persist()\r\n  }\r\n\r\n  function remove(sessionId: string): void {\r\n    sessions.delete(sessionId)\r\n    persist()\r\n  }\r\n\r\n  function list(filter?: { providerType?: string }): EnvSession[] {\r\n    let result = [...sessions.values()]\r\n    if (filter?.providerType) {\r\n      result = result.filter((s) => {\r\n        return s.providerType === filter.providerType\r\n      })\r\n    }\r\n    return result.map((s) => {\r\n      return { ...s }\r\n    })\r\n  }\r\n\r\n  return { create, get, update, remove, list }\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { existsSync, readdirSync, readFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { ProviderManifest, ProviderInfo } from './types.js'\r\n\r\nexport interface ProviderLoader {\r\n  listProviders(): ProviderInfo[]\r\n  getManifest(providerType: string): ProviderManifest | undefined\r\n  getInstallHint(providerType: string): string\r\n}\r\n\r\nconst PROVIDER_PREFIX = 'harness-env-provider-'\r\n\r\nexport function createProviderLoader(projectRoot: string): ProviderLoader {\r\n  let cache: ProviderManifest[] | null = null\r\n\r\n  function scanProviders(): ProviderManifest[] {\r\n    if (cache) {\r\n      return cache\r\n    }\r\n\r\n    const nmDir = join(projectRoot, 'node_modules')\r\n    if (!existsSync(nmDir)) {\r\n      cache = []\r\n      return cache\r\n    }\r\n\r\n    const manifests: ProviderManifest[] = []\r\n\r\n    try {\r\n      const entries = readdirSync(nmDir, { withFileTypes: true })\r\n      for (const entry of entries) {\r\n        const name = entry.name\r\n        if (!name.startsWith(PROVIDER_PREFIX)) {\r\n          continue\r\n        }\r\n\r\n        const pkgJsonPath = join(nmDir, name, 'package.json')\r\n        if (!existsSync(pkgJsonPath)) {\r\n          continue\r\n        }\r\n\r\n        try {\r\n          const pkgJson = JSON.parse(readFileSync(pkgJsonPath, 'utf-8'))\r\n          const providerConfig = pkgJson.harnessProvider\r\n          if (providerConfig && providerConfig.type) {\r\n            manifests.push({\r\n              type: providerConfig.type,\r\n              packageName: name,\r\n              startCommand: providerConfig.startCommand || 'dist/index.js',\r\n              protocol: providerConfig.protocol || 'json-rpc-tcp',\r\n            })\r\n          }\r\n        } catch {\r\n          // skip corrupt package.json\r\n        }\r\n      }\r\n    } catch {\r\n      // permission or other FS error — empty list\r\n    }\r\n\r\n    cache = manifests\r\n    return cache\r\n  }\r\n\r\n  function listProviders(): ProviderInfo[] {\r\n    return scanProviders().map((m) => {\r\n      return { type: m.type, packageName: m.packageName, installed: true }\r\n    })\r\n  }\r\n\r\n  function getManifest(providerType: string): ProviderManifest | undefined {\r\n    return scanProviders().find((m) => {\r\n      return m.type === providerType\r\n    })\r\n  }\r\n\r\n  function getInstallHint(providerType: string): string {\r\n    return `Provider '${providerType}' not found. Install: npm install ${PROVIDER_PREFIX}${providerType}`\r\n  }\r\n\r\n  return { listProviders, getManifest, getInstallHint }\r\n}\r\n\r\nexport { discoverProviders }\r\nfunction discoverProviders(projectRoot: string): ProviderManifest[] {\r\n  return createProviderLoader(projectRoot).listProviders().map((info) => {\r\n    return {\r\n      type: info.type,\r\n      packageName: info.packageName,\r\n      startCommand: 'dist/index.js',\r\n      protocol: 'json-rpc-tcp' as const,\r\n    }\r\n  })\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { spawn, type ChildProcess } from 'child_process'\r\nimport { createConnection, type Socket } from 'net'\r\nimport { randomUUID } from 'crypto'\r\nimport type { ProviderManifest } from './types.js'\r\n\r\nconst LOCALHOST = 'localhost'\r\n\r\nexport interface ProviderBridge {\r\n  startProvider(manifest: ProviderManifest, port: number, workDir: string): Promise<StartResult>\r\n  getConnectionInfo(sessionId: string, port: number): Promise<Record<string, string>>\r\n  shutdownProvider(sessionId: string, port: number): Promise<void>\r\n  ping(port: number): Promise<boolean>\r\n}\r\n\r\nexport interface StartResult {\r\n  sessionId: string\r\n  pid: number\r\n  port: number\r\n  ready: boolean\r\n}\r\n\r\nconst READY_TIMEOUT_MS = 15_000\r\nconst RPC_TIMEOUT_MS = 5_000\r\n\r\nfunction waitForReady(port: number): Promise<boolean> {\r\n  return new Promise((resolve) => {\r\n    const timeout = setTimeout(() => {\r\n      sock.destroy()\r\n      resolve(false)\r\n    }, READY_TIMEOUT_MS)\r\n\r\n    let buffer = ''\r\n    const sock = createConnection({ host: LOCALHOST, port }, () => {\r\n      // connected — data listener below will catch ready notification\r\n    })\r\n\r\n    sock.on('data', (data: Buffer) => {\r\n      buffer += data.toString()\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop()!\r\n      for (const line of lines) {\r\n        if (!line.trim()) {\r\n          continue\r\n        }\r\n        try {\r\n          const msg = JSON.parse(line)\r\n          if (msg.method === 'provider/ready') {\r\n            clearTimeout(timeout)\r\n            sock.destroy()\r\n            resolve(true)\r\n            return\r\n          }\r\n        } catch {\r\n          // skip non-JSON lines\r\n        }\r\n      }\r\n    })\r\n\r\n    sock.on('error', () => {\r\n      // will retry via timeout\r\n    })\r\n  })\r\n}\r\n\r\nfunction sendRpc(port: number, method: string, params?: unknown): Promise<unknown> {\r\n  return new Promise((resolve, reject) => {\r\n    const timeout = setTimeout(() => {\r\n      sock.destroy()\r\n      reject(new Error(`RPC timeout for ${method}`))\r\n    }, RPC_TIMEOUT_MS)\r\n\r\n    const id = Date.now()\r\n    const request = { jsonrpc: '2.0', method, id, ...(params ? { params } : {}) }\r\n\r\n    let buffer = ''\r\n    const sock: Socket = createConnection({ host: LOCALHOST, port }, () => {\r\n      sock.write(JSON.stringify(request) + '\\n')\r\n    })\r\n\r\n    sock.on('data', (data: Buffer) => {\r\n      buffer += data.toString()\r\n      const lines = buffer.split('\\n')\r\n      buffer = lines.pop()!\r\n      for (const line of lines) {\r\n        if (!line.trim()) {\r\n          continue\r\n        }\r\n        try {\r\n          const msg = JSON.parse(line)\r\n          if (msg.id === id) {\r\n            clearTimeout(timeout)\r\n            sock.destroy()\r\n            if (msg.error) {\r\n              reject(new Error(msg.error.message || 'RPC error'))\r\n            } else {\r\n              resolve(msg.result)\r\n            }\r\n            return\r\n          }\r\n        } catch {\r\n          // skip\r\n        }\r\n      }\r\n    })\r\n\r\n    sock.on('error', (err) => {\r\n      clearTimeout(timeout)\r\n      reject(err)\r\n    })\r\n  })\r\n}\r\n\r\nexport function createProviderBridge(): ProviderBridge {\r\n  const processes = new Map<string, ChildProcess>()\r\n\r\n  async function startProvider(manifest: ProviderManifest, port: number, workDir: string): Promise<StartResult> {\r\n    const sessionId = randomUUID()\r\n    const child = spawn(process.execPath, [manifest.startCommand, `--port=${port}`], {\r\n      cwd: workDir,\r\n      stdio: ['pipe', 'pipe', 'pipe'],\r\n      detached: false,\r\n    })\r\n\r\n    processes.set(sessionId, child)\r\n\r\n    const ready = await waitForReady(port)\r\n\r\n    return {\r\n      sessionId,\r\n      pid: child.pid!,\r\n      port,\r\n      ready,\r\n    }\r\n  }\r\n\r\n  async function getConnectionInfo(_sessionId: string, port: number): Promise<Record<string, string>> {\r\n    const result = await sendRpc(port, 'provider/getConnectionInfo') as Record<string, string>\r\n    return result\r\n  }\r\n\r\n  async function shutdownProvider(sessionId: string, port: number): Promise<void> {\r\n    try {\r\n      await sendRpc(port, 'provider/shutdown')\r\n    } catch {\r\n      // provider may already be down\r\n    } finally {\r\n      const child = processes.get(sessionId)\r\n      if (child) {\r\n        try {\r\n          child.kill('SIGTERM')\r\n        } catch {\r\n          // already dead\r\n        }\r\n        processes.delete(sessionId)\r\n      }\r\n    }\r\n  }\r\n\r\n  async function ping(port: number): Promise<boolean> {\r\n    try {\r\n      const result = await sendRpc(port, 'ping')\r\n      return result === 'pong'\r\n    } catch {\r\n      return false\r\n    }\r\n  }\r\n\r\n  return { startProvider, getConnectionInfo, shutdownProvider, ping }\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport type { ChildProcess } from 'child_process'\r\nimport type { SessionStore } from './session-store.js'\r\nimport type { ProviderManifest } from './types.js'\r\nimport type { ProviderBridge } from './provider-bridge.js'\r\nimport type { PortAllocator } from './port-allocator.js'\r\n\r\nexport interface ProcessGuardian {\r\n  watch(sessionId: string, child: ChildProcess, manifest: ProviderManifest, workDir: string): void\r\n  unwatch(sessionId: string): void\r\n  shutdownAll(): void\r\n}\r\n\r\nconst MAX_RESTARTS = 3\r\n\r\nexport function createProcessGuardian(\r\n  sessionStore: SessionStore,\r\n  bridge: ProviderBridge,\r\n  portAllocator: PortAllocator,\r\n): ProcessGuardian {\r\n  const watched = new Map<string, ChildProcess>()\r\n\r\n  function watch(sessionId: string, child: ChildProcess, manifest: ProviderManifest, workDir: string): void {\r\n    watched.set(sessionId, child)\r\n\r\n    child.on('exit', async (code, signal) => {\r\n      watched.delete(sessionId)\r\n\r\n      const session = sessionStore.get(sessionId)\r\n      if (!session || session.status === 'stopping' || session.status === 'stopped') {\r\n        return\r\n      }\r\n\r\n      const currentRestartCount = (session.restartCount || 0) + 1\r\n\r\n      if (currentRestartCount > MAX_RESTARTS) {\r\n        sessionStore.update(sessionId, {\r\n          status: 'permanently_failed',\r\n          pid: null,\r\n          restartCount: currentRestartCount,\r\n        })\r\n        return\r\n      }\r\n\r\n      sessionStore.update(sessionId, {\r\n        status: 'crashed',\r\n        pid: null,\r\n        restartCount: currentRestartCount,\r\n      })\r\n\r\n      // Auto-restart\r\n      try {\r\n        const newPort = portAllocator.allocate()\r\n        const result = await bridge.startProvider(manifest, newPort, workDir)\r\n\r\n        sessionStore.update(sessionId, {\r\n          status: 'running',\r\n          pid: result.pid,\r\n          port: newPort,\r\n        })\r\n\r\n        // Watch the new process\r\n        const newChild = getChildProcess(result.sessionId)\r\n        if (newChild) {\r\n          watch(sessionId, newChild, manifest, workDir)\r\n        }\r\n      } catch {\r\n        sessionStore.update(sessionId, {\r\n          status: 'permanently_failed',\r\n          restartCount: currentRestartCount,\r\n        })\r\n      }\r\n    })\r\n  }\r\n\r\n  function getChildProcess(sessionId: string): ChildProcess | undefined {\r\n    return watched.get(sessionId)\r\n  }\r\n\r\n  function unwatch(sessionId: string): void {\r\n    watched.delete(sessionId)\r\n  }\r\n\r\n  async function shutdownAll(): Promise<void> {\r\n    const entries = [...watched.entries()]\r\n    watched.clear()\r\n\r\n    for (const [sessionId, child] of entries) {\r\n      try {\r\n        child.kill('SIGTERM')\r\n      } catch {\r\n        // already dead\r\n      }\r\n\r\n      const session = sessionStore.get(sessionId)\r\n      if (session) {\r\n        portAllocator.release(session.port)\r\n        sessionStore.update(sessionId, { status: 'stopped', pid: null })\r\n      }\r\n    }\r\n  }\r\n\r\n  return { watch, unwatch, shutdownAll }\r\n}\r\n","// Copyright (C) 2026 TheHarness Authors\r\n// Licensed under the Apache License, Version 2.0\r\n\r\nimport { createPortAllocator } from '../env/port-allocator.js'\r\nimport { createSessionStore } from '../env/session-store.js'\r\nimport { createProviderLoader } from '../env/provider-loader.js'\r\nimport { createProviderBridge } from '../env/provider-bridge.js'\r\nimport { createProcessGuardian } from '../env/process-guardian.js'\r\nimport { randomUUID } from 'crypto'\r\n\r\nfunction getDir(args: string[]): string {\r\n  return args.find((a) => { return a.startsWith('--dir=') })?.split('=')[1] ?? process.cwd()\r\n}\r\n\r\nfunction getOrchestrator(dir: string) {\r\n  const portAllocator = createPortAllocator()\r\n  const sessionStore = createSessionStore(dir)\r\n  const providerLoader = createProviderLoader(dir)\r\n  const bridge = createProviderBridge()\r\n  const guardian = createProcessGuardian(sessionStore, bridge, portAllocator)\r\n\r\n  process.on('exit', () => {\r\n    guardian.shutdownAll()\r\n    portAllocator.releaseAll()\r\n  })\r\n\r\n  return { portAllocator, sessionStore, providerLoader, bridge, guardian }\r\n}\r\n\r\nexport async function handleEnvStart(args: string[]): Promise<void> {\r\n  const dir = getDir(args)\r\n  const type = args.find((a) => { return a.startsWith('--type=') })?.split('=')[1]\r\n\r\n  if (!type) {\r\n    console.error(JSON.stringify({ error: 'Missing --type argument. Usage: env start --type=<providerType>' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const { portAllocator, sessionStore, providerLoader, bridge, guardian } = getOrchestrator(dir)\r\n\r\n  const manifest = providerLoader.getManifest(type)\r\n  if (!manifest) {\r\n    console.error(JSON.stringify({ error: providerLoader.getInstallHint(type) }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const port = portAllocator.allocate()\r\n  const sessionId = randomUUID()\r\n\r\n  sessionStore.create({\r\n    sessionId,\r\n    providerType: type,\r\n    status: 'starting',\r\n    pid: null,\r\n    port,\r\n    connectionInfo: {},\r\n    startedAt: new Date().toISOString(),\r\n    restartCount: 0,\r\n    workDir: dir,\r\n  })\r\n\r\n  try {\r\n    const result = await bridge.startProvider(manifest, port, dir)\r\n\r\n    if (!result.ready) {\r\n      sessionStore.update(sessionId, { status: 'stopped' })\r\n      portAllocator.release(port)\r\n      console.error(JSON.stringify({ error: `Provider '${type}' failed to start within 15s` }))\r\n      process.exit(1)\r\n    }\r\n\r\n    const connInfo = await bridge.getConnectionInfo(result.sessionId, port)\r\n\r\n    sessionStore.update(sessionId, {\r\n      status: 'running',\r\n      pid: result.pid,\r\n      connectionInfo: connInfo,\r\n    })\r\n\r\n    // Set up process guardian\r\n    guardian.watch(sessionId, process.pid! as any, manifest, dir)\r\n\r\n    console.log(JSON.stringify({\r\n      sessionId,\r\n      providerType: type,\r\n      status: 'running',\r\n      connectionInfo: connInfo,\r\n    }))\r\n  } catch (err: any) {\r\n    sessionStore.update(sessionId, { status: 'stopped' })\r\n    portAllocator.release(port)\r\n    console.error(JSON.stringify({ error: err.message }))\r\n    process.exit(1)\r\n  }\r\n}\r\n\r\nexport async function handleEnvStop(args: string[]): Promise<void> {\r\n  const dir = getDir(args)\r\n  const sessionId = args.find((a) => { return a.startsWith('--session=') })?.split('=')[1]\r\n\r\n  if (!sessionId) {\r\n    console.error(JSON.stringify({ error: 'Missing --session argument. Usage: env stop --session=<id>' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const { sessionStore, bridge, portAllocator, guardian } = getOrchestrator(dir)\r\n\r\n  const session = sessionStore.get(sessionId)\r\n  if (!session) {\r\n    console.error(JSON.stringify({ error: `Session '${sessionId}' not found` }))\r\n    process.exit(1)\r\n  }\r\n\r\n  sessionStore.update(sessionId, { status: 'stopping' })\r\n  guardian.unwatch(sessionId)\r\n\r\n  try {\r\n    await bridge.shutdownProvider(sessionId, session.port)\r\n  } catch {\r\n    // provider may already be down\r\n  }\r\n\r\n  portAllocator.release(session.port)\r\n  sessionStore.update(sessionId, { status: 'stopped', pid: null })\r\n\r\n  console.log(JSON.stringify({\r\n    sessionId,\r\n    status: 'stopped',\r\n    port: session.port,\r\n  }))\r\n}\r\n\r\nexport function handleEnvList(args: string[]): void {\r\n  const dir = getDir(args)\r\n  const type = args.find((a) => { return a.startsWith('--type=') })?.split('=')[1]\r\n\r\n  const { sessionStore } = getOrchestrator(dir)\r\n  const filter = type ? { providerType: type } : undefined\r\n  const sessions = sessionStore.list(filter)\r\n\r\n  console.log(JSON.stringify({ sessions }))\r\n}\r\n\r\nexport function handleEnvStatus(args: string[]): void {\r\n  const dir = getDir(args)\r\n  const sessionId = args.find((a) => { return a.startsWith('--session=') })?.split('=')[1]\r\n\r\n  if (!sessionId) {\r\n    console.error(JSON.stringify({ error: 'Missing --session argument. Usage: env status --session=<id>' }))\r\n    process.exit(1)\r\n  }\r\n\r\n  const { sessionStore } = getOrchestrator(dir)\r\n  const session = sessionStore.get(sessionId)\r\n\r\n  if (!session) {\r\n    console.error(JSON.stringify({ error: `Session '${sessionId}' not found` }))\r\n    process.exit(1)\r\n  }\r\n\r\n  console.log(JSON.stringify(session))\r\n}\r\n\r\nexport function handleEnvProviders(_args: string[]): void {\r\n  const dir = getDir([])\r\n  const { providerLoader } = getOrchestrator(dir)\r\n  const providers = providerLoader.listProviders()\r\n\r\n  console.log(JSON.stringify({ providers }))\r\n}\r\n","import { resolve } from 'path'\r\nimport { existsSync, mkdirSync, readFileSync, unlinkSync } from 'fs'\r\nimport { execFileSync } from 'child_process'\r\nimport { loadEnv } from './env-loader.js'\r\nimport { resolveMapping, type ResolvedMapping } from '../shared/mapping-resolver.js'\r\nimport { readOpenApi, type OpenApiOperation } from '../shared/openapi-reader.js'\r\nimport { buildPrompt, loadContextYaml } from './core/prompt-builder.js'\r\nimport { TestDesigner, type TestCase } from './core/test-designer.js'\r\nimport { BoundaryRunner, type BoundaryReport } from './boundary-runner.js'\r\nimport { runContract } from './contract-subcommand.js'\r\nimport { formatBoundaryReport, type ReporterOptions } from './reporter.js'\r\nimport { loadGoldSet, compareWithGoldSet, type GoldSetComparisonResult } from './gold-set.js'\r\nimport { detectBorderProject } from './plugins.js'\r\nimport { deriveFromRules, type RuleEngineResult } from './rule-engine.js'\r\n\r\nexport type ExitReason = 'pass' | 'fail' | 'config_error' | 'env_anomaly'\r\n\r\nconst EXIT_CODES: Record<ExitReason, number> = {\r\n  pass: 0,\r\n  fail: 1,\r\n  config_error: 2,\r\n  env_anomaly: 3,\r\n}\r\n\r\nexport function getExitCode(reason: ExitReason): number {\r\n  return EXIT_CODES[reason]\r\n}\r\n\r\nexport type ParsedArgs =\r\n  | { kind: 'help' }\r\n  | { kind: 'all' }\r\n  | { kind: 'contract' }\r\n  | { kind: 'boundary' }\r\n\r\nexport interface CliResult {\r\n  parsed: ParsedArgs\r\n  stdout: string\r\n  exitCode: number\r\n}\r\n\r\nexport type Scope = 'project' | 'pipeline' | 'all'\r\n\r\nexport interface HarnessBorderOptions {\r\n  mappingPath: string\r\n  envFile: string\r\n  contextFile?: string\r\n  goldSetDir: string\r\n  timeoutMs: number\r\n  concurrency: number\r\n  noCache: boolean\r\n  verbose: boolean\r\n  strictGoldSet: boolean\r\n  useColor: boolean\r\n  mode: 'rule' | 'llm' | 'hybrid'\r\n  scope: Scope\r\n  pipelineDir: string\r\n}\r\n\r\nconst HELP_TEXT = `Usage: harness-border [subcommand] [options]\r\n\r\nBoundary value test your deployed API via LLM-derived test plans.\r\n\r\nSubcommands:\r\n  (default)        Run both contract (golden path) and boundary (LLM-derived)\r\n  contract         Run only golden path (no LLM)\r\n  boundary         Run only boundary value tests (LLM)\r\n\r\nOptions:\r\n  --help              Show this help\r\n  --mapping <path>    Path to case-mapping.json (default: ./case-mapping.json)\r\n  --env-file <path>   Path to .env_test (default: ./.env_test)\r\n  --context-file <path>   Path to .harness-border/context.yaml (optional)\r\n  --gold-set-dir <path>   Gold Set directory (default: ./.harness-border/gold-set/)\r\n  --timeout <ms>      Per-case HTTP timeout (default: 5000)\r\n  --concurrency <n>   Concurrent requests (default: 4)\r\n  --no-cache          Disable session-level LLM cache\r\n  --verbose           Print prompt (redacted) + LLM response\r\n  --strict-gold-set   Treat Gold Set comparison failure as exit 1\r\n  --no-color          Disable ANSI colors in report\r\n  --mode <m>          Test design mode: rule (schema-derived), llm (LLM-derived), hybrid (default)\r\n  --scope <s>         Mapping scope: project (use --mapping as-is, default), pipeline (auto-generate from --pipeline-dir), all (union)\r\n  --pipeline-dir <d>  Directory scanned when --scope=pipeline (default: ./openapi/pipeline/)\r\n\r\nExit codes:\r\n  0  All cases passed\r\n  1  At least one boundary leaked (2xx instead of 4xx)\r\n  2  Configuration / environment / LLM error\r\n  3  Test environment anomaly (5xx > 50%)\r\n`\r\n\r\nconst SYSTEM_INSTRUCTION = `You design boundary value tests for an HTTP API.\r\n\r\nOUTPUT FORMAT: a single JSON array (no markdown, no prose, no comments). Example:\r\n[{\"method\":\"POST\",\"path\":\"/v1/x\",\"field\":\"name\",\"input\":\"\",\"expectedStatus\":400,\"rationale\":\"empty string violates minLength=1\"}]\r\n\r\nRULES:\r\n1. JSON only. No backticks, no commentary, no JavaScript (no .repeat(), no template literals in values).\r\n2. For each path produce 2-3 boundary cases max.\r\n3. method: HTTP verb in UPPERCASE (GET, POST, PUT, DELETE, PATCH).\r\n4. path: copy exactly from the spec, keep {param} placeholders.\r\n5. field: parameter or body field name; omit when testing whole-body or null body.\r\n6. input: ONLY JSON-serializable literals: null, true, false, number, or \"string\" with double quotes.\r\n   For oversized strings, write the literal repeated characters (e.g. \"aaaa...\"), NOT JS code.\r\n7. expectedStatus: 400 or 422.\r\n8. rationale: ONE short sentence (<= 20 words) stating which constraint is violated.\r\n9. ONLY boundary cases that should be REJECTED. No happy-path cases.`\r\n\r\nexport async function runHarnessBorder(args: string[]): Promise<CliResult> {\r\n  if (args.includes('--help') || args.includes('-h')) {\r\n    return { parsed: { kind: 'help' }, stdout: HELP_TEXT, exitCode: 0 }\r\n  }\r\n\r\n  const parsed = parseSubcommand(args)\r\n  if (parsed.kind === 'help') {\r\n    return { parsed, stdout: HELP_TEXT, exitCode: 0 }\r\n  }\r\n\r\n  const opts = parseOptions(parsed.kind, args)\r\n  const projectRoot = process.cwd()\r\n  const out: string[] = []\r\n  let llmCallCount = 0\r\n  let cacheHitCount = 0\r\n  let boundaryReport: BoundaryReport | null = null\r\n  let contractSummary = ''\r\n\r\n  out.push('[1/4] loading case-mapping.json (mode: ' + parsed.kind + ', scope: ' + opts.scope + ')')\r\n  const scopedMappingPath = resolveScopedMapping(out, projectRoot, opts)\r\n  if (!scopedMappingPath) {\r\n    return { parsed, stdout: out.join('\\n') + '\\n', exitCode: opts.scope === 'pipeline' ? 0 : 2 }\r\n  }\r\n  const mapping = loadMapping(out, projectRoot, scopedMappingPath)\r\n  out.push('[2/4] loading OpenAPI yamls')\r\n  const ops = mapping ? collectOps(out, mapping, projectRoot) : []\r\n\r\n  const env = loadEnv(opts.envFile)\r\n  if (!env) {\r\n    out.push('[config] .env_test not found or missing BASE_URL: ' + resolve(projectRoot, opts.envFile))\r\n    return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n  }\r\n\r\n  if (!mapping) {\r\n    return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n  }\r\n  if (ops.length === 0) {\r\n    out.push('[config] no operations found in mapped yamls')\r\n    return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n  }\r\n\r\n  const plugins = detectBorderProject(projectRoot)\r\n  const plugin = plugins[0]\r\n  const contextYaml = opts.contextFile ? loadContextYaml(resolve(projectRoot, opts.contextFile)) : undefined\r\n\r\n  if (parsed.kind === 'all' || parsed.kind === 'contract') {\r\n    out.push('[3/4] running contract (golden path) tests')\r\n    try {\r\n      const report = await runContract({\r\n        projectRoot,\r\n        baseUrl: env.BASE_URL,\r\n        concurrency: opts.concurrency,\r\n        timeoutMs: opts.timeoutMs,\r\n      })\r\n      contractSummary = renderContractSummary(report)\r\n    } catch (err: any) {\r\n      out.push('[contract error] ' + (err && err.message ? err.message : String(err)))\r\n      return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n    }\r\n  }\r\n\r\n  if (parsed.kind === 'all' || parsed.kind === 'boundary') {\r\n    let cases: TestCase[] = []\r\n    const ruleResult: RuleEngineResult | null =\r\n      (opts.mode === 'rule' || opts.mode === 'hybrid')\r\n        ? deriveFromRules(ops, { maxCasesPerOperation: 8, maxBodyDepth: 2, alwaysTestPathParamEmpty: true })\r\n        : null\r\n    if (ruleResult) {\r\n      cases.push(...ruleResult.cases)\r\n      out.push('[3/4] rule engine: ' + ruleResult.cases.length + ' cases from schema constraints (mode=' + opts.mode + ')')\r\n      out.push('       ' + ruleResult.stats.opsWithCases + '/' + ruleResult.stats.opsTotal + ' ops covered by rules')\r\n      if (ruleResult.opsWithNoCases.length > 0) {\r\n        const sample = ruleResult.opsWithNoCases.slice(0, 3).map((o) => o.method + ' ' + o.path).join(', ')\r\n        out.push('       ' + ruleResult.opsWithNoCases.length + ' ops have no derivable constraints: ' + sample + (ruleResult.opsWithNoCases.length > 3 ? ', ...' : ''))\r\n      }\r\n    }\r\n\r\n    const needLlm = opts.mode === 'llm' || (opts.mode === 'hybrid' && ruleResult !== null && ruleResult.opsWithNoCases.length > 0)\r\n    if (needLlm) {\r\n      const opsForLlm = opts.mode === 'llm'\r\n        ? ops\r\n        : ops.filter((op) => ruleResult!.opsWithNoCases.some((o) => o.method === op.method.toUpperCase() && o.path === op.path))\r\n      out.push('[3/4] calling LLM for ' + opsForLlm.length + ' ops (free-form or fallback)')\r\n      const built = buildPrompt({\r\n        systemInstruction: SYSTEM_INSTRUCTION,\r\n        caseMappingRaw: mapping.raw,\r\n        openapiSpec: mergeOpsToSpec(opsForLlm),\r\n        contextYaml,\r\n        pluginContext: plugin ? { name: plugin.name, language: plugin.language, framework: plugin.framework } : undefined,\r\n      })\r\n\r\n      if (opts.verbose) {\r\n        out.push('[verbose] redaction: ' + JSON.stringify(built.redacted))\r\n        out.push('[verbose] prompt hash: ' + built.hash)\r\n      }\r\n\r\n      const designer = new TestDesigner({ timeoutMs: 300000, noCache: opts.noCache })\r\n      let llmCases: TestCase[] = []\r\n      let rawText = ''\r\n      try {\r\n        const cacheStateBefore = cacheSize(designer)\r\n        const resp = await designer.design(built.prompt, built.hash)\r\n        llmCases = resp.cases\r\n        rawText = resp.rawText\r\n        const cacheStateAfter = cacheSize(designer)\r\n        if (opts.noCache) {\r\n          llmCallCount = 1\r\n          cacheHitCount = 0\r\n        } else {\r\n          llmCallCount = cacheStateAfter > cacheStateBefore ? 1 : 0\r\n          cacheHitCount = cacheStateAfter === cacheStateBefore && llmCases.length > 0 ? 1 : 0\r\n        }\r\n      } catch (err: any) {\r\n        out.push('[LLM error] ' + (err && err.message ? err.message : String(err)))\r\n        if (rawText) {\r\n          out.push('[verbose] raw LLM output (first 500 chars): ' + rawText.substring(0, 500))\r\n        }\r\n        return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n      }\r\n      cases.push(...llmCases)\r\n      if (opts.verbose) {\r\n        out.push('[verbose] LLM parsed OK, returned ' + llmCases.length + ' cases')\r\n      }\r\n    }\r\n\r\n    if (cases.length === 0) {\r\n      out.push('[config] no boundary cases generated (mode=' + opts.mode + ')')\r\n      return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 2 }\r\n    }\r\n\r\n    const gold = loadGoldSet(resolve(projectRoot, opts.goldSetDir))\r\n    const goldComparison: GoldSetComparisonResult = compareWithGoldSet(cases, gold)\r\n    if (gold.length > 0) {\r\n      out.push('[gold-set] ' + goldComparison.detail)\r\n    }\r\n    if (opts.strictGoldSet && gold.length > 0 && goldComparison.overallScore < 0.9) {\r\n      out.push('[gold-set] FAIL (strict): overallScore ' + goldComparison.overallScore.toFixed(2) + ' < 0.9')\r\n      return { parsed, stdout: out.join('\\n') + '\\n', exitCode: 1 }\r\n    }\r\n\r\n    out.push('[4/4] executing ' + cases.length + ' boundary cases')\r\n    const authHeader = env.AUTH_HEADER && env.AUTH_TOKEN\r\n      ? { name: env.AUTH_HEADER, value: env.AUTH_TOKEN }\r\n      : undefined\r\n    const runner = new BoundaryRunner({\r\n      baseUrl: env.BASE_URL,\r\n      timeoutMs: opts.timeoutMs,\r\n      authHeader,\r\n    })\r\n    boundaryReport = await runner.run(cases)\r\n\r\n    const reporterOpts: ReporterOptions = {\r\n      useColor: opts.useColor,\r\n      llmCallCount,\r\n      cacheHitCount,\r\n    }\r\n    out.push(formatBoundaryReport(boundaryReport, reporterOpts))\r\n  }\r\n\r\n  if (contractSummary) {\r\n    out.push(contractSummary)\r\n  }\r\n\r\n  const exitCode = boundaryReport\r\n    ? getExitCode(classify(boundaryReport))\r\n    : 0\r\n\r\n  return { parsed, stdout: out.join('\\n') + '\\n', exitCode }\r\n}\r\n\r\nfunction parseSubcommand(args: string[]): ParsedArgs {\r\n  if (args.length === 0) {\r\n    return { kind: 'all' }\r\n  }\r\n  const sub = args[0]\r\n  if (sub === 'contract') {\r\n    return { kind: 'contract' }\r\n  }\r\n  if (sub === 'boundary') {\r\n    return { kind: 'boundary' }\r\n  }\r\n  if (sub && sub.startsWith('--')) {\r\n    return { kind: 'all' }\r\n  }\r\n  throw new Error('cannot parse args: ' + JSON.stringify(args))\r\n}\r\n\r\nfunction parseOptions(kind: ParsedArgs['kind'], args: string[]): HarnessBorderOptions {\r\n  const rest = (kind === 'contract' || kind === 'boundary') ? args.slice(1) : args\r\n  const get = (flag: string): string | undefined => {\r\n    const i = rest.indexOf(flag)\r\n    if (i >= 0 && i + 1 < rest.length) {\r\n      return rest[i + 1]\r\n    }\r\n    const eq = rest.find((a) => a.startsWith(flag + '='))\r\n    if (eq) {\r\n      return eq.substring(flag.length + 1)\r\n    }\r\n    return undefined\r\n  }\r\n  const has = (flag: string): boolean => rest.includes(flag)\r\n  const num = (s: string | undefined, fallback: number): number => {\r\n    if (!s) {\r\n      return fallback\r\n    }\r\n    const n = parseInt(s, 10)\r\n    return Number.isFinite(n) ? n : fallback\r\n  }\r\n  const modeRaw = get('--mode') || 'hybrid'\r\n  const mode: 'rule' | 'llm' | 'hybrid' = (modeRaw === 'rule' || modeRaw === 'llm' || modeRaw === 'hybrid') ? modeRaw : 'hybrid'\r\n  const scopeRaw = get('--scope') || 'project'\r\n  const scope: Scope = (scopeRaw === 'project' || scopeRaw === 'pipeline' || scopeRaw === 'all') ? scopeRaw : 'project'\r\n  return {\r\n    mappingPath: get('--mapping') || './case-mapping.json',\r\n    envFile: get('--env-file') || './.env_test',\r\n    contextFile: get('--context-file'),\r\n    goldSetDir: get('--gold-set-dir') || './.harness-border/gold-set/',\r\n    timeoutMs: num(get('--timeout'), 5000),\r\n    concurrency: num(get('--concurrency'), 4),\r\n    noCache: has('--no-cache'),\r\n    verbose: has('--verbose'),\r\n    strictGoldSet: has('--strict-gold-set'),\r\n    useColor: !has('--no-color'),\r\n    mode: mode,\r\n    scope: scope,\r\n    pipelineDir: get('--pipeline-dir') || './openapi/pipeline/',\r\n  }\r\n}\r\n\r\nfunction loadMapping(out: string[], projectRoot: string, mappingPath: string): ResolvedMapping | null {\r\n  const file = resolve(projectRoot, mappingPath)\r\n  if (!existsSync(file)) {\r\n    out.push('[config] case-mapping.json not found: ' + file)\r\n    return null\r\n  }\r\n  try {\r\n    return resolveMapping(file)\r\n  } catch (err: any) {\r\n    out.push('[config] ' + (err && err.message ? err.message : String(err)))\r\n    return null\r\n  }\r\n}\r\n\r\nfunction resolveScopedMapping(out: string[], projectRoot: string, opts: HarnessBorderOptions): string | null {\r\n  if (opts.scope === 'project') {\r\n    return opts.mappingPath\r\n  }\r\n\r\n  const pipelineAbs = resolve(projectRoot, opts.pipelineDir)\r\n  if (!existsSync(pipelineAbs)) {\r\n    out.push('[scope] pipeline dir not found: ' + pipelineAbs + ' (nothing to test, SKIP)')\r\n    return null\r\n  }\r\n\r\n  const scriptPath = resolve(projectRoot, '.claude/skills/harness-border/scripts/generate-mapping.cjs')\r\n  if (!existsSync(scriptPath)) {\r\n    out.push('[scope] generate-mapping.cjs not found: ' + scriptPath)\r\n    return null\r\n  }\r\n\r\n  const cacheDir = resolve(projectRoot, '.harness-border')\r\n  if (!existsSync(cacheDir)) {\r\n    mkdirSync(cacheDir, { recursive: true })\r\n  }\r\n  const tmpMapping = resolve(cacheDir, 'scope-mapping.json')\r\n  if (existsSync(tmpMapping)) {\r\n    try {\r\n      unlinkSync(tmpMapping)\r\n    } catch {\r\n      /* ignore */\r\n    }\r\n  }\r\n\r\n  const searchDirs =\r\n    opts.scope === 'all'\r\n      ? opts.pipelineDir.replace(/\\/+$/, '') + ',openapi,swagger,api,apis,spec,specs'\r\n      : opts.pipelineDir.replace(/\\/+$/, '')\r\n\r\n  try {\r\n    execFileSync(\r\n      process.execPath,\r\n      [scriptPath, projectRoot, toRelative(tmpMapping, projectRoot), '--force'],\r\n      {\r\n        cwd: projectRoot,\r\n        env: Object.assign({}, process.env, { HARNESS_BORDER_SEARCH_DIRS: searchDirs }),\r\n        stdio: 'pipe',\r\n      }\r\n    )\r\n  } catch (err: any) {\r\n    const stderr = err && err.stderr ? err.stderr.toString() : ''\r\n    const stdout = err && err.stdout ? err.stdout.toString() : ''\r\n    out.push('[scope] generate-mapping.cjs failed: ' + (stderr || stdout || (err && err.message) || String(err)))\r\n    return null\r\n  }\r\n\r\n  if (!existsSync(tmpMapping)) {\r\n    out.push('[scope] generate-mapping.cjs exited 0 but ' + tmpMapping + ' missing')\r\n    return null\r\n  }\r\n\r\n  try {\r\n    const generated = JSON.parse(readFileSync(tmpMapping, 'utf-8'))\r\n    const count = generated && generated.mappings ? Object.keys(generated.mappings).length : 0\r\n    out.push('[scope] ' + opts.scope + ': generated mapping with ' + count + ' endpoint(s) from ' + searchDirs)\r\n    if (count === 0) {\r\n      out.push('[scope] no endpoints found in pipeline yamls (SKIP)')\r\n      try {\r\n        unlinkSync(tmpMapping)\r\n      } catch {\r\n        /* ignore */\r\n      }\r\n      return null\r\n    }\r\n  } catch (err: any) {\r\n    out.push('[scope] generated mapping unreadable: ' + (err && err.message ? err.message : String(err)))\r\n    return null\r\n  }\r\n\r\n  return tmpMapping\r\n}\r\n\r\nfunction toRelative(abs: string, projectRoot: string): string {\r\n  const rel = abs.startsWith(projectRoot) ? abs.substring(projectRoot.length).replace(/^[\\\\/]+/, '') : abs\r\n  return rel.split(/[\\\\/]/).join('/')\r\n}\r\n\r\nfunction collectOps(out: string[], mapping: ResolvedMapping, projectRoot: string): OpenApiOperation[] {\r\n  const ops: OpenApiOperation[] = []\r\n  const seen = new Set<string>()\r\n  for (const [endpoint, yamlRel] of Object.entries(mapping.mappings)) {\r\n    if (typeof yamlRel !== 'string') {\r\n      out.push('[warn] skipping non-string mapping for ' + endpoint + ' (value is ' + typeof yamlRel + ')')\r\n      continue\r\n    }\r\n    if (seen.has(yamlRel)) {\r\n      continue\r\n    }\r\n    seen.add(yamlRel)\r\n    const abs = resolve(projectRoot, yamlRel)\r\n    try {\r\n      const spec = readOpenApi(abs)\r\n      ops.push(...spec.operations)\r\n    } catch (err: any) {\r\n      out.push('[warn] ' + yamlRel + ': ' + (err && err.message ? err.message : String(err)))\r\n    }\r\n  }\r\n  return ops\r\n}\r\n\r\nfunction mergeOpsToSpec(ops: OpenApiOperation[]): unknown {\r\n  const paths: Record<string, any> = {}\r\n  for (const op of ops) {\r\n    if (!paths[op.path]) {\r\n      paths[op.path] = {}\r\n    }\r\n    paths[op.path][op.method] = {\r\n      operationId: op.operationId,\r\n      parameters: op.parameters,\r\n      requestBody: op.requestBody,\r\n      responses: op.responses,\r\n    }\r\n  }\r\n  return { paths }\r\n}\r\n\r\nfunction renderContractSummary(report: {\r\n  total: number\r\n  pass: number\r\n  fail: number\r\n  env_anomaly: number\r\n  results: Array<{ classification: string; method: string; path: string; status: number }>\r\n}): string {\r\n  const lines: string[] = []\r\n  lines.push('--- Contract (golden path) ---')\r\n  lines.push('Total: ' + report.total)\r\n  lines.push('Pass:  ' + report.pass)\r\n  lines.push('Fail:  ' + report.fail)\r\n  lines.push('Env:   ' + report.env_anomaly)\r\n  for (const r of report.results) {\r\n    const tag = r.classification === 'pass' ? '[OK]  ' : r.classification === 'env_anomaly' ? '[ENV] ' : '[LEAK]'\r\n    lines.push(tag + ' ' + String(r.method).toUpperCase() + ' ' + r.path + ' -> ' + r.status)\r\n  }\r\n  return lines.join('\\n')\r\n}\r\n\r\nfunction classify(report: BoundaryReport): ExitReason {\r\n  if (report.env_anomaly > report.total / 2) {\r\n    return 'env_anomaly'\r\n  }\r\n  if (report.fail > 0) {\r\n    return 'fail'\r\n  }\r\n  return 'pass'\r\n}\r\n\r\nfunction cacheSize(designer: TestDesigner): number {\r\n  const cache = (designer as unknown as { cache?: { size?: () => number } }).cache\r\n  if (cache && typeof cache.size === 'function') {\r\n    return cache.size()\r\n  }\r\n  return 0\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { resolve } from 'path'\r\n\r\nexport interface EnvConfig {\r\n  BASE_URL: string\r\n  AUTH_TOKEN?: string\r\n  AUTH_HEADER?: string\r\n  TLS_SKIP?: boolean\r\n}\r\n\r\nexport function loadEnv(filePath: string = '.env_test'): EnvConfig | null {\r\n  const file = resolve(filePath)\r\n  if (!existsSync(file)) {\r\n    return null\r\n  }\r\n  const content = readFileSync(file, 'utf-8')\r\n  const out: Partial<EnvConfig> = {}\r\n  for (const line of content.split('\\n')) {\r\n    const trimmed = line.trim()\r\n    if (!trimmed || trimmed.startsWith('#')) {\r\n      continue\r\n    }\r\n    const eq = trimmed.indexOf('=')\r\n    if (eq < 0) {\r\n      continue\r\n    }\r\n    const key = trimmed.substring(0, eq).trim()\r\n    const value = trimmed.substring(eq + 1).trim()\r\n    if (key === 'BASE_URL') {\r\n      out.BASE_URL = value\r\n    } else if (key === 'AUTH_TOKEN') {\r\n      out.AUTH_TOKEN = value\r\n    } else if (key === 'AUTH_HEADER') {\r\n      out.AUTH_HEADER = value\r\n    } else if (key === 'TLS_SKIP') {\r\n      out.TLS_SKIP = value === 'true'\r\n    }\r\n  }\r\n  if (!out.BASE_URL) {\r\n    return null\r\n  }\r\n  return out as EnvConfig\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { resolve, join } from 'path'\r\n\r\nexport interface ResolvedMapping {\r\n  file: string\r\n  raw: unknown\r\n  mappings: Record<string, string>\r\n}\r\n\r\nexport function resolveMapping(filePath?: string): ResolvedMapping {\r\n  const file = filePath ? resolve(filePath) : resolve(join(process.cwd(), 'case-mapping.json'))\r\n\r\n  if (!existsSync(file)) {\r\n    throw new Error(\r\n      '未找到 case-mapping.json: ' + file + '。请在项目根创建 case-mapping.json 或通过 --mapping 指定路径'\r\n    )\r\n  }\r\n\r\n  let raw: unknown\r\n  try {\r\n    const content = readFileSync(file, 'utf-8')\r\n    raw = JSON.parse(content)\r\n  } catch (err: any) {\r\n    throw new Error('case-mapping.json 解析失败: ' + file + ' - ' + err.message)\r\n  }\r\n\r\n  const mappings =\r\n    raw && typeof raw === 'object' && 'mappings' in raw && typeof (raw as any).mappings === 'object'\r\n      ? (raw as any).mappings\r\n      : (raw as Record<string, string>)\r\n\r\n  return { file, raw, mappings }\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { resolve } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\n\r\nexport interface OpenApiParameter {\r\n  name: string\r\n  in: 'path' | 'query' | 'header' | 'cookie'\r\n  required?: boolean\r\n  schema?: Record<string, any>\r\n}\r\n\r\nexport interface OpenApiRequestBody {\r\n  required?: boolean\r\n  schema: Record<string, any>\r\n}\r\n\r\nexport interface OpenApiOperation {\r\n  operationId?: string\r\n  method: string\r\n  path: string\r\n  parameters: OpenApiParameter[]\r\n  requestBody?: OpenApiRequestBody\r\n  responses: Record<string, any>\r\n}\r\n\r\nexport interface OpenApiSpec {\r\n  format: 'openapi-3.x' | 'swagger-2.0'\r\n  operations: OpenApiOperation[]\r\n}\r\n\r\nexport function readOpenApi(filePath: string): OpenApiSpec {\r\n  const file = resolve(filePath)\r\n  if (!existsSync(file)) {\r\n    throw new Error('OpenAPI 文件未找到: ' + file)\r\n  }\r\n\r\n  let doc: any\r\n  try {\r\n    const content = readFileSync(file, 'utf-8')\r\n    doc = parseYaml(content)\r\n  } catch (err: any) {\r\n    throw new Error('OpenAPI 解析失败: ' + file + ' - ' + err.message)\r\n  }\r\n\r\n  const isSwagger2 = doc && doc.swagger === '2.0'\r\n  const isOpenApi3 = doc && typeof doc.openapi === 'string' && doc.openapi.startsWith('3.')\r\n  if (!isSwagger2 && !isOpenApi3) {\r\n    throw new Error('OpenAPI 文件格式无法识别 (需 OpenAPI 3.x 或 Swagger 2.0): ' + file)\r\n  }\r\n\r\n  const operations: OpenApiOperation[] = []\r\n  for (const [path, pathItem] of Object.entries(doc.paths ?? {})) {\r\n    if (!pathItem || typeof pathItem !== 'object') {\r\n      continue\r\n    }\r\n    for (const method of ['get', 'post', 'put', 'patch', 'delete', 'head', 'options']) {\r\n      const op = (pathItem as any)[method]\r\n      if (!op || typeof op !== 'object') {\r\n        continue\r\n      }\r\n      operations.push(normalizeOperation(op, method, path, isSwagger2))\r\n    }\r\n  }\r\n\r\n  return { format: isOpenApi3 ? 'openapi-3.x' : 'swagger-2.0', operations }\r\n}\r\n\r\nfunction normalizeOperation(op: any, method: string, path: string, isSwagger2: boolean): OpenApiOperation {\r\n  const parameters: OpenApiParameter[] = []\r\n  for (const p of op.parameters ?? []) {\r\n    if (isSwagger2) {\r\n      parameters.push({\r\n        name: p.name,\r\n        in: p.in,\r\n        required: p.required,\r\n        schema: p.type\r\n          ? {\r\n              type: p.type,\r\n              ...(p.enum ? { enum: p.enum } : {}),\r\n              ...(p.minimum !== undefined ? { minimum: p.minimum } : {}),\r\n              ...(p.maximum !== undefined ? { maximum: p.maximum } : {}),\r\n              ...(p.minLength !== undefined ? { minLength: p.minLength } : {}),\r\n              ...(p.maxLength !== undefined ? { maxLength: p.maxLength } : {}),\r\n              ...(p.pattern ? { pattern: p.pattern } : {}),\r\n            }\r\n          : undefined,\r\n      })\r\n    } else {\r\n      parameters.push({ name: p.name, in: p.in, required: p.required, schema: p.schema })\r\n    }\r\n  }\r\n\r\n  let requestBody: OpenApiRequestBody | undefined\r\n  if (isSwagger2) {\r\n    const bodyParam = (op.parameters ?? []).find((p: any) => p.in === 'body')\r\n    if (bodyParam) {\r\n      requestBody = { required: bodyParam.required, schema: bodyParam.schema ?? {} }\r\n    }\r\n  } else if (op.requestBody && op.requestBody.content && op.requestBody.content['application/json']) {\r\n    requestBody = {\r\n      required: op.requestBody.required,\r\n      schema: op.requestBody.content['application/json'].schema,\r\n    }\r\n  }\r\n\r\n  return {\r\n    operationId: op.operationId,\r\n    method,\r\n    path,\r\n    parameters,\r\n    requestBody,\r\n    responses: op.responses ?? {},\r\n  }\r\n}\r\n","import { createHash } from 'crypto'\r\nimport { redact } from './redaction-gate.js'\r\nimport { readFileSync, existsSync } from 'fs'\r\nimport { resolve } from 'path'\r\n\r\nexport interface PromptInputs {\r\n  systemInstruction: string\r\n  caseMappingRaw: unknown\r\n  openapiSpec: unknown\r\n  contextYaml?: string\r\n  pluginContext?: { name: string; language: string; framework?: string }\r\n}\r\n\r\nexport interface BuiltPrompt {\r\n  prompt: string\r\n  hash: string\r\n  redacted: { redactedEmail: number; redactedPhone: number; redactedIdCard: number; redactedToken: number; redactedBusinessLogic: number }\r\n}\r\n\r\nexport function buildPrompt(inputs: PromptInputs): BuiltPrompt {\r\n  const sections: string[] = [inputs.systemInstruction]\r\n\r\n  sections.push('# Case Mapping (free-form)')\r\n  sections.push(JSON.stringify(inputs.caseMappingRaw, null, 2))\r\n\r\n  sections.push('# OpenAPI Spec')\r\n  sections.push(JSON.stringify(inputs.openapiSpec, null, 2))\r\n\r\n  if (inputs.contextYaml) {\r\n    sections.push('# Project Context (user-written)')\r\n    sections.push(inputs.contextYaml)\r\n  }\r\n\r\n  if (inputs.pluginContext) {\r\n    sections.push('# Plugin Context')\r\n    sections.push(JSON.stringify(inputs.pluginContext, null, 2))\r\n  }\r\n\r\n  sections.push('# Task')\r\n  sections.push('For each endpoint, derive boundary value test cases from the OpenAPI schema constraints. Output a TestPlan as a JSON array of cases: [{method, path, field, input, expectedStatus, rationale}]. expectedStatus must be 4xx for proper boundary rejection.')\r\n\r\n  const raw = sections.join('\\n\\n')\r\n  const result = redact(raw)\r\n  const hash = createHash('sha256').update(result.text).digest('hex')\r\n\r\n  return { prompt: result.text, hash, redacted: result.context }\r\n}\r\n\r\nexport function loadContextYaml(path: string): string | undefined {\r\n  const file = resolve(path)\r\n  if (!existsSync(file)) {\r\n    return undefined\r\n  }\r\n  return readFileSync(file, 'utf-8')\r\n}\r\n","const EMAIL_RE = /[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/gi\r\nconst PHONE_RE = /\\b1[3-9]\\d{9}\\b/g\r\nconst ID_CARD_RE = /\\b\\d{17}[\\dXx]\\b/g\r\nconst TOKEN_RE = /(?:token|api[_-]?key|secret|password)\\s*[:=]\\s*[\"']?([A-Za-z0-9_\\-./+=]{16,})[\"']?/gi\r\nconst BUSINESS_LOGIC_HINTS = ['businessLogic', 'implementation', 'serviceImpl']\r\n\r\nexport interface RedactionContext {\r\n  redactedEmail: number\r\n  redactedPhone: number\r\n  redactedIdCard: number\r\n  redactedToken: number\r\n  redactedBusinessLogic: number\r\n}\r\n\r\nexport interface RedactionResult {\r\n  text: string\r\n  context: RedactionContext\r\n}\r\n\r\nexport function redact(text: string, options: { redactEnvValues?: boolean } = {}): RedactionResult {\r\n  const ctx: RedactionContext = {\r\n    redactedEmail: 0,\r\n    redactedPhone: 0,\r\n    redactedIdCard: 0,\r\n    redactedToken: 0,\r\n    redactedBusinessLogic: 0,\r\n  }\r\n  let out = text\r\n\r\n  out = out.replace(EMAIL_RE, () => {\r\n    ctx.redactedEmail++\r\n    return '<redacted-email>'\r\n  })\r\n  out = out.replace(PHONE_RE, () => {\r\n    ctx.redactedPhone++\r\n    return '<redacted-phone>'\r\n  })\r\n  out = out.replace(ID_CARD_RE, () => {\r\n    ctx.redactedIdCard++\r\n    return '<redacted-idcard>'\r\n  })\r\n  if (options.redactEnvValues !== false) {\r\n    out = out.replace(TOKEN_RE, (_match, p1) => {\r\n      ctx.redactedToken++\r\n      return p1.substring(0, 4) + '...'\r\n    })\r\n  }\r\n  for (const hint of BUSINESS_LOGIC_HINTS) {\r\n    const re = new RegExp('//\\s*' + hint + '.*', 'gi')\r\n    out = out.replace(re, () => {\r\n      ctx.redactedBusinessLogic++\r\n      return '// <redacted-business-logic>'\r\n    })\r\n  }\r\n\r\n  return { text: out, context: ctx }\r\n}\r\n\r\nexport function containsSensitiveData(text: string): boolean {\r\n  return EMAIL_RE.test(text) || PHONE_RE.test(text) || ID_CARD_RE.test(text) || TOKEN_RE.test(text)\r\n}\r\n","import { spawnSync } from 'child_process'\r\nimport { SessionCache } from './session-cache.js'\r\n\r\nexport interface TestCase {\r\n  method: string\r\n  path: string\r\n  field?: string\r\n  input?: unknown\r\n  pathParams?: Record<string, string>\r\n  expectedStatus: number | number[]\r\n  rationale: string\r\n}\r\n\r\nexport interface LlmResponse {\r\n  rawText: string\r\n  cases: TestCase[]\r\n}\r\n\r\nexport interface LlmCallOptions {\r\n  prompt: string\r\n  timeoutMs: number\r\n  cliPath?: string\r\n}\r\n\r\nexport class TestDesigner {\r\n  private cache: SessionCache<LlmResponse> = new SessionCache()\r\n\r\n  constructor(private options: { cliPath?: string; timeoutMs: number; noCache?: boolean } = { timeoutMs: 60000 }) {}\r\n\r\n  async design(prompt: string, promptHash: string): Promise<LlmResponse> {\r\n    if (!this.options.noCache && this.cache.has(promptHash)) {\r\n      return this.cache.get(promptHash)!\r\n    }\r\n    const cli = this.options.cliPath ?? 'claude'\r\n    const result = spawnSync(cli, ['--print', '--output-format', 'text'], {\r\n      input: prompt,\r\n      timeout: this.options.timeoutMs,\r\n      encoding: 'utf-8',\r\n    })\r\n    if (result.error) {\r\n      throw new Error('LLM 调用失败: ' + result.error.message)\r\n    }\r\n    if (result.status !== 0) {\r\n      const preview = (result.stdout || '').substring(0, 200)\r\n      throw new Error('LLM 非零退出 (' + result.status + '), 输出前 200 字符: ' + preview)\r\n    }\r\n    const rawText = (result.stdout || '').trim()\r\n    const cases = this.parseTestCases(rawText)\r\n    const response: LlmResponse = { rawText, cases }\r\n    if (!this.options.noCache) {\r\n      this.cache.set(promptHash, response)\r\n    }\r\n    return response\r\n  }\r\n\r\n  parseTestCases(raw: string): TestCase[] {\r\n    const cleaned = this.stripCodeFences(raw)\r\n    let parsed: any\r\n    try {\r\n      parsed = JSON.parse(cleaned)\r\n    } catch (err: any) {\r\n      throw new Error('LLM 输出不是合法 JSON: ' + err.message + ' (前 200 字符): ' + cleaned.substring(0, 200))\r\n    }\r\n    if (!Array.isArray(parsed)) {\r\n      throw new Error('LLM 输出顶层不是数组: ' + cleaned.substring(0, 200))\r\n    }\r\n    const out: TestCase[] = []\r\n    for (const c of parsed) {\r\n      if (!c.method || !c.path || c.expectedStatus === undefined || !c.rationale) {\r\n        throw new Error('LLM 输出 case 字段缺失: ' + JSON.stringify(c).substring(0, 200))\r\n      }\r\n      out.push({\r\n        method: String(c.method),\r\n        path: String(c.path),\r\n        field: c.field,\r\n        input: c.input,\r\n        pathParams: c.pathParams && typeof c.pathParams === 'object' ? (c.pathParams as Record<string, string>) : undefined,\r\n        expectedStatus: c.expectedStatus,\r\n        rationale: String(c.rationale),\r\n      })\r\n    }\r\n    return out\r\n  }\r\n\r\n  private stripCodeFences(text: string): string {\r\n    return text\r\n      .replace(/^```(?:json)?\\s*/i, '')\r\n      .replace(/```\\s*$/, '')\r\n      .trim()\r\n  }\r\n}\r\n","export class SessionCache<T> {\r\n  private store = new Map<string, T>()\r\n\r\n  get(key: string): T | undefined {\r\n    return this.store.get(key)\r\n  }\r\n\r\n  set(key: string, value: T): void {\r\n    this.store.set(key, value)\r\n  }\r\n\r\n  has(key: string): boolean {\r\n    return this.store.has(key)\r\n  }\r\n\r\n  clear(): void {\r\n    this.store.clear()\r\n  }\r\n\r\n  get size(): number {\r\n    return this.store.size\r\n  }\r\n}\r\n","import type { TestCase } from './core/test-designer.js'\r\n\r\nexport type Classification = 'pass' | 'fail' | 'env_anomaly'\r\n\r\nexport interface BoundaryCaseResult {\r\n  method: string\r\n  path: string\r\n  field?: string\r\n  input?: unknown\r\n  expectedStatus: number | number[]\r\n  actualStatus: number\r\n  classification: Classification\r\n  rationale: string\r\n  latencyMs: number\r\n}\r\n\r\nexport interface BoundaryReport {\r\n  total: number\r\n  pass: number\r\n  fail: number\r\n  env_anomaly: number\r\n  results: BoundaryCaseResult[]\r\n}\r\n\r\nexport interface BoundaryRunnerOptions {\r\n  baseUrl: string\r\n  timeoutMs: number\r\n  authHeader?: { name: string; value: string }\r\n}\r\n\r\nexport class BoundaryRunner {\r\n  constructor(private options: BoundaryRunnerOptions) {}\r\n\r\n  async run(cases: TestCase[]): Promise<BoundaryReport> {\r\n    const results: BoundaryCaseResult[] = []\r\n    for (const c of cases) {\r\n      const r = await this.executeOne(c)\r\n      results.push(r)\r\n    }\r\n    return {\r\n      total: results.length,\r\n      pass: results.filter((x) => x.classification === 'pass').length,\r\n      fail: results.filter((x) => x.classification === 'fail').length,\r\n      env_anomaly: results.filter((x) => x.classification === 'env_anomaly').length,\r\n      results,\r\n    }\r\n  }\r\n\r\n  private async executeOne(c: TestCase): Promise<BoundaryCaseResult> {\r\n    const pathParams = (c as unknown as { pathParams?: Record<string, string> }).pathParams\r\n    let resolvedPath = c.path\r\n    if (pathParams) {\r\n      resolvedPath = resolvedPath.replace(/\\{(\\w+)\\}/g, (_m, name: string) => {\r\n        const v = pathParams[name]\r\n        if (v === undefined) {\r\n          return '{' + name + '}'\r\n        }\r\n        return encodeURIComponent(v)\r\n      })\r\n    }\r\n    const url = this.options.baseUrl.replace(/\\/$/, '') + (resolvedPath.startsWith('/') ? resolvedPath : '/' + resolvedPath)\r\n    const headers: Record<string, string> = { 'content-type': 'application/json' }\r\n    if (this.options.authHeader) headers[this.options.authHeader.name] = this.options.authHeader.value\r\n    const controller = new AbortController()\r\n    const timer = setTimeout(() => controller.abort(), this.options.timeoutMs)\r\n    const start = Date.now()\r\n    try {\r\n      const res = await fetch(url, {\r\n        method: c.method,\r\n        headers,\r\n        body: c.input !== undefined ? JSON.stringify(c.input) : undefined,\r\n        signal: controller.signal,\r\n      })\r\n      const latencyMs = Date.now() - start\r\n      const expected = Array.isArray(c.expectedStatus) ? c.expectedStatus : [c.expectedStatus]\r\n      const classification: Classification =\r\n        res.status >= 500 ? 'env_anomaly' : expected.includes(res.status) ? 'pass' : 'fail'\r\n      return { ...c, actualStatus: res.status, classification, latencyMs }\r\n    } catch (err: any) {\r\n      return {\r\n        ...c,\r\n        actualStatus: 0,\r\n        classification: 'env_anomaly',\r\n        rationale: c.rationale,\r\n        latencyMs: Date.now() - start,\r\n      }\r\n    } finally {\r\n      clearTimeout(timer)\r\n    }\r\n  }\r\n}\r\n","import { readOpenApi, type OpenApiOperation } from '../shared/openapi-reader.js'\r\n\r\nexport type Classification = 'pass' | 'fail' | 'env_anomaly'\r\n\r\nexport interface GoldenPathRequest {\r\n  method: string\r\n  url: string\r\n  body?: unknown\r\n  headers?: Record<string, string>\r\n}\r\n\r\nexport interface BuildRequestOptions {\r\n  baseUrl: string\r\n  pathParams?: Record<string, string>\r\n  queryParams?: Record<string, string | number | boolean>\r\n}\r\n\r\nexport function buildGoldenPathRequest(\r\n  op: OpenApiOperation,\r\n  options: BuildRequestOptions,\r\n): GoldenPathRequest {\r\n  const path = substitutePathParams(op.path, options.pathParams ?? {})\r\n  const query = { ...extractQueryDefaults(op), ...(options.queryParams ?? {}) }\r\n  const url = buildUrl(options.baseUrl, path, query)\r\n\r\n  let body: unknown\r\n  if (op.requestBody && op.requestBody.schema) {\r\n    const schema: Record<string, any> = op.requestBody.schema\r\n    if (schema.example !== undefined) {\r\n      body = schema.example\r\n    } else {\r\n      body = constructBodyFromSchema(schema)\r\n    }\r\n  }\r\n\r\n  return {\r\n    method: op.method.toUpperCase(),\r\n    url,\r\n    body,\r\n    headers: { 'content-type': 'application/json' },\r\n  }\r\n}\r\n\r\nfunction substitutePathParams(path: string, params: Record<string, string>): string {\r\n  return path.replace(/\\{(\\w+)\\}/g, (_, name) => {\r\n    const v = params[name]\r\n    if (v === undefined) {\r\n      throw new Error('path 参数未提供: ' + name)\r\n    }\r\n    return encodeURIComponent(v)\r\n  })\r\n}\r\n\r\nfunction extractQueryDefaults(op: OpenApiOperation): Record<string, string | number | boolean> {\r\n  const defaults: Record<string, string | number | boolean> = {}\r\n  for (const p of op.parameters) {\r\n    if (p.in !== 'query') {\r\n      continue\r\n    }\r\n    const s = p.schema\r\n    if (!s) {\r\n      continue\r\n    }\r\n    if (s.default !== undefined) {\r\n      defaults[p.name] = s.default\r\n    } else if (s.type === 'integer' || s.type === 'number') {\r\n      defaults[p.name] = 1\r\n    } else if (s.type === 'string') {\r\n      defaults[p.name] = 'test'\r\n    } else if (s.type === 'boolean') {\r\n      defaults[p.name] = false\r\n    }\r\n  }\r\n  return defaults\r\n}\r\n\r\nfunction buildUrl(base: string, path: string, query: Record<string, string | number | boolean>): string {\r\n  const baseClean = base.replace(/\\/$/, '')\r\n  const pathClean = path.startsWith('/') ? path : '/' + path\r\n  const qs = Object.entries(query)\r\n    .map(([k, v]) => encodeURIComponent(k) + '=' + encodeURIComponent(String(v)))\r\n    .join('&')\r\n  return qs ? baseClean + pathClean + '?' + qs : baseClean + pathClean\r\n}\r\n\r\nfunction constructBodyFromSchema(schema: Record<string, any>): unknown {\r\n  if (schema.example !== undefined) {\r\n    return schema.example\r\n  }\r\n  if (schema.type === 'object' || schema.properties) {\r\n    const obj: Record<string, unknown> = {}\r\n    for (const [k, sub] of Object.entries(schema.properties ?? {}) as [string, Record<string, any>][]) {\r\n      obj[k] = defaultForSchema(sub)\r\n    }\r\n    return obj\r\n  }\r\n  return defaultForSchema(schema)\r\n}\r\n\r\nfunction defaultForSchema(schema: Record<string, any>): unknown {\r\n  if (schema.example !== undefined) {\r\n    return schema.example\r\n  }\r\n  if (schema.default !== undefined) {\r\n    return schema.default\r\n  }\r\n  if (schema.enum && Array.isArray(schema.enum) && schema.enum.length > 0) {\r\n    return schema.enum[0]\r\n  }\r\n  switch (schema.type) {\r\n    case 'string':\r\n      return 'test'\r\n    case 'integer':\r\n    case 'number':\r\n      return 0\r\n    case 'boolean':\r\n      return false\r\n    case 'array':\r\n      return []\r\n    case 'object':\r\n      return {}\r\n    default:\r\n      return null\r\n  }\r\n}\r\n\r\nexport function classifyResponse(status: number): Classification {\r\n  if (status >= 200 && status < 300) {\r\n    return 'pass'\r\n  }\r\n  if (status >= 500) {\r\n    return 'env_anomaly'\r\n  }\r\n  return 'fail'\r\n}\r\n\r\nexport interface GoldenPathReport {\r\n  total: number\r\n  pass: number\r\n  fail: number\r\n  env_anomaly: number\r\n  results: Array<{\r\n    operationId?: string\r\n    method: string\r\n    path: string\r\n    status: number\r\n    classification: Classification\r\n    latencyMs: number\r\n  }>\r\n}\r\n\r\nexport interface RunnerOptions {\r\n  baseUrl: string\r\n  concurrency: number\r\n  timeoutMs: number\r\n  authHeader?: { name: string; value: string }\r\n}\r\n\r\nexport class GoldenPathRunner {\r\n  constructor(private options: RunnerOptions) {}\r\n\r\n  async run(ops: OpenApiOperation[]): Promise<GoldenPathReport> {\r\n    const results: GoldenPathReport['results'] = []\r\n    const queue = [...ops]\r\n    const workers: Promise<void>[] = []\r\n    const limit = Math.max(1, this.options.concurrency)\r\n\r\n    for (let i = 0; i < limit; i++) {\r\n      workers.push(this.worker(queue, results))\r\n    }\r\n    await Promise.all(workers)\r\n\r\n    const report: GoldenPathReport = {\r\n      total: results.length,\r\n      pass: results.filter((r) => r.classification === 'pass').length,\r\n      fail: results.filter((r) => r.classification === 'fail').length,\r\n      env_anomaly: results.filter((r) => r.classification === 'env_anomaly').length,\r\n      results,\r\n    }\r\n    return report\r\n  }\r\n\r\n  private async worker(\r\n    queue: OpenApiOperation[],\r\n    results: GoldenPathReport['results'],\r\n  ): Promise<void> {\r\n    while (queue.length > 0) {\r\n      const op = queue.shift()\r\n      if (!op) {\r\n        break\r\n      }\r\n      const result = await this.executeOne(op)\r\n      results.push(result)\r\n    }\r\n  }\r\n\r\n  private async executeOne(op: OpenApiOperation): Promise<GoldenPathReport['results'][number]> {\r\n    const req = buildGoldenPathRequest(op, { baseUrl: this.options.baseUrl })\r\n    const headers: Record<string, string> = { ...(req.headers ?? {}) }\r\n    if (this.options.authHeader) {\r\n      headers[this.options.authHeader.name] = this.options.authHeader.value\r\n    }\r\n    const controller = new AbortController()\r\n    const timer = setTimeout(() => controller.abort(), this.options.timeoutMs)\r\n    const start = Date.now()\r\n    try {\r\n      const res = await fetch(req.url, {\r\n        method: req.method,\r\n        headers,\r\n        body: req.body !== undefined ? JSON.stringify(req.body) : undefined,\r\n        signal: controller.signal,\r\n      })\r\n      const latencyMs = Date.now() - start\r\n      return {\r\n        operationId: op.operationId,\r\n        method: op.method,\r\n        path: op.path,\r\n        status: res.status,\r\n        classification: classifyResponse(res.status),\r\n        latencyMs,\r\n      }\r\n    } catch (err: any) {\r\n      const latencyMs = Date.now() - start\r\n      return {\r\n        operationId: op.operationId,\r\n        method: op.method,\r\n        path: op.path,\r\n        status: 0,\r\n        classification: 'env_anomaly',\r\n        latencyMs,\r\n      }\r\n    } finally {\r\n      clearTimeout(timer)\r\n    }\r\n  }\r\n}\r\n\r\nexport { readOpenApi }\r\n","import { readOpenApi, type OpenApiOperation } from '../shared/openapi-reader.js'\r\nimport { resolveMapping } from '../shared/mapping-resolver.js'\r\nimport { GoldenPathRunner, type GoldenPathReport } from '../smoke-test/golden-path.js'\r\nimport { loadEnv } from './env-loader.js'\r\n\r\nexport interface ContractSubcommandOptions {\r\n  projectRoot: string\r\n  baseUrl: string\r\n  concurrency: number\r\n  timeoutMs: number\r\n}\r\n\r\nexport async function runContract(opts: ContractSubcommandOptions): Promise<GoldenPathReport> {\r\n  const mapping = resolveMapping(opts.projectRoot + '/case-mapping.json')\r\n  const allOps: OpenApiOperation[] = []\r\n  for (const yamlPath of Object.values(mapping.mappings)) {\r\n    const abs = require('node:path').resolve(opts.projectRoot, yamlPath)\r\n    const spec = readOpenApi(abs)\r\n    allOps.push(...spec.operations)\r\n  }\r\n  const runner = new GoldenPathRunner({ baseUrl: opts.baseUrl, concurrency: opts.concurrency, timeoutMs: opts.timeoutMs })\r\n  return runner.run(allOps)\r\n}\r\n","import type { BoundaryReport } from './boundary-runner.js'\r\n\r\nexport type Color = 'green' | 'red' | 'yellow' | 'gray'\r\n\r\nconst ANSI: Record<Color, { open: string; close: string }> = {\r\n  green: { open: '\\x1b[32m', close: '\\x1b[0m' },\r\n  red: { open: '\\x1b[31m', close: '\\x1b[0m' },\r\n  yellow: { open: '\\x1b[33m', close: '\\x1b[0m' },\r\n  gray: { open: '\\x1b[90m', close: '\\x1b[0m' },\r\n}\r\n\r\nexport function colorize(text: string, color: Color, useColor: boolean): string {\r\n  if (!useColor) {\r\n    return text\r\n  }\r\n  const c = ANSI[color]\r\n  return c.open + text + c.close\r\n}\r\n\r\nexport interface ReporterOptions {\r\n  useColor: boolean\r\n  llmCallCount: number\r\n  cacheHitCount: number\r\n}\r\n\r\nexport function formatBoundaryReport(report: BoundaryReport, options: ReporterOptions): string {\r\n  const lines: string[] = []\r\n  lines.push('--- Summary ---')\r\n  lines.push('Total: ' + report.total)\r\n  lines.push(colorize('Pass: ' + report.pass, 'green', options.useColor))\r\n  lines.push(colorize('Fail: ' + report.fail, 'red', options.useColor))\r\n  lines.push(colorize('Env:  ' + report.env_anomaly, 'yellow', options.useColor))\r\n  lines.push('LLM calls: ' + options.llmCallCount + ', cache hits: ' + options.cacheHitCount)\r\n\r\n  const failed = report.results.filter((r) => r.classification !== 'pass')\r\n  if (failed.length > 0) {\r\n    lines.push('--- Failures ---')\r\n    for (const r of failed) {\r\n      const tag = r.classification === 'env_anomaly' ? '[ENV]' : '[LEAK]'\r\n      const color: Color = r.classification === 'env_anomaly' ? 'yellow' : 'red'\r\n      const fieldPart = r.field ? ' (' + r.field + ' = ' + JSON.stringify(r.input) + ')' : ''\r\n      lines.push(\r\n        colorize(tag, color, options.useColor) +\r\n          ' ' +\r\n          r.method +\r\n          ' ' +\r\n          r.path +\r\n          fieldPart +\r\n          ' → ' +\r\n          r.actualStatus +\r\n          ' (expected ' +\r\n          JSON.stringify(r.expectedStatus) +\r\n          ') ' +\r\n          r.rationale,\r\n      )\r\n    }\r\n  }\r\n  return lines.join('\\n') + '\\n'\r\n}\r\n","import { readFileSync, readdirSync, existsSync } from 'fs'\r\nimport { join, resolve } from 'path'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport type { TestCase } from './core/test-designer.js'\r\n\r\nexport interface GoldSetEntry {\r\n  endpoint: string\r\n  method: string\r\n  expectedCases: Array<{ field?: string; input?: unknown; expectedStatus: number | number[] }>\r\n}\r\n\r\nexport interface GoldSetComparisonResult {\r\n  endpointCoverage: number\r\n  fieldCoverage: number\r\n  overallScore: number\r\n  missingEndpoints: string[]\r\n  missingFields: Array<{ endpoint: string; field: string }>\r\n  detail: string\r\n}\r\n\r\nexport function loadGoldSet(dirPath: string): GoldSetEntry[] {\r\n  const dir = resolve(dirPath)\r\n  if (!existsSync(dir)) {\r\n    return []\r\n  }\r\n  const entries: GoldSetEntry[] = []\r\n  for (const file of readdirSync(dir)) {\r\n    if (!file.endsWith('.yaml') && !file.endsWith('.yml')) {\r\n      continue\r\n    }\r\n    const raw = parseYaml(readFileSync(join(dir, file), 'utf-8'))\r\n    if (raw && raw.endpoint && raw.method && Array.isArray(raw.expectedCases)) {\r\n      entries.push(raw as GoldSetEntry)\r\n    }\r\n  }\r\n  return entries\r\n}\r\n\r\nexport function compareWithGoldSet(llmCases: TestCase[], gold: GoldSetEntry[]): GoldSetComparisonResult {\r\n  if (gold.length === 0) {\r\n    return { endpointCoverage: 1, fieldCoverage: 1, overallScore: 1, missingEndpoints: [], missingFields: [], detail: 'no gold set' }\r\n  }\r\n  const goldEndpoints = new Set(gold.map((g) => g.method.toUpperCase() + ' ' + g.endpoint))\r\n  const llmEndpoints = new Set(llmCases.map((c) => c.method.toUpperCase() + ' ' + c.path))\r\n  const coveredEndpoints = [...goldEndpoints].filter((e) => llmEndpoints.has(e))\r\n  const endpointCoverage = coveredEndpoints.length / goldEndpoints.size\r\n\r\n  let totalGoldFields = 0\r\n  let coveredFields = 0\r\n  const missingFields: Array<{ endpoint: string; field: string }> = []\r\n  for (const g of gold) {\r\n    const key = g.method.toUpperCase() + ' ' + g.endpoint\r\n    const matchingLlm = llmCases.filter((c) => c.method.toUpperCase() + ' ' + c.path === key)\r\n    for (const ec of g.expectedCases) {\r\n      if (ec.field) {\r\n        totalGoldFields++\r\n        if (matchingLlm.some((c) => c.field === ec.field)) {\r\n          coveredFields++\r\n        } else {\r\n          missingFields.push({ endpoint: key, field: ec.field })\r\n        }\r\n      }\r\n    }\r\n  }\r\n  const fieldCoverage = totalGoldFields > 0 ? coveredFields / totalGoldFields : 1\r\n  const overallScore = (endpointCoverage + fieldCoverage) / 2\r\n  return {\r\n    endpointCoverage,\r\n    fieldCoverage,\r\n    overallScore,\r\n    missingEndpoints: [...goldEndpoints].filter((e) => !llmEndpoints.has(e)),\r\n    missingFields,\r\n    detail: 'endpoint=' + (endpointCoverage * 100).toFixed(1) + '%, field=' + (fieldCoverage * 100).toFixed(1) + '%',\r\n  }\r\n}\r\n","import { readFileSync, existsSync } from 'fs'\r\nimport { join } from 'path'\r\n\r\nexport type PluginLanguage = 'java' | 'typescript' | 'javascript' | 'python' | string\r\n\r\nexport interface HarnessBorderPlugin {\r\n  name: string\r\n  language: PluginLanguage\r\n  framework?: string\r\n  packageName: string\r\n}\r\n\r\nexport function detectBorderProject(projectRoot: string): HarnessBorderPlugin[] {\r\n  const plugins: HarnessBorderPlugin[] = []\r\n  if (existsSync(join(projectRoot, 'pom.xml')) || existsSync(join(projectRoot, 'build.gradle')) || existsSync(join(projectRoot, 'build.gradle.kts'))) {\r\n    plugins.push({ name: 'harness-border-plugin-java', language: 'java', framework: 'spring-boot', packageName: 'harness-border-plugin-java' })\r\n  }\r\n  const pkg = join(projectRoot, 'package.json')\r\n  if (existsSync(pkg)) {\r\n    try {\r\n      const manifest = JSON.parse(readFileSync(pkg, 'utf-8'))\r\n      const deps = { ...(manifest.dependencies ?? {}), ...(manifest.devDependencies ?? {}) }\r\n      let framework: string | undefined\r\n      if (deps['@nestjs/core']) framework = 'nestjs'\r\n      else if (deps['express']) framework = 'express'\r\n      const language: PluginLanguage = deps['typescript'] || manifest.devDependencies?.typescript ? 'typescript' : 'javascript'\r\n      plugins.push({ name: 'harness-border-plugin-node', language, framework, packageName: 'harness-border-plugin-node' })\r\n    } catch {\r\n      // ignore\r\n    }\r\n  }\r\n  return plugins\r\n}\r\n","import type { OpenApiOperation } from '../shared/openapi-reader.js'\r\nimport type { TestCase } from './core/test-designer.js'\r\n\r\nexport interface RuleEngineOptions {\r\n  maxCasesPerOperation: number\r\n  maxBodyDepth: number\r\n  alwaysTestPathParamEmpty: boolean\r\n}\r\n\r\nconst DEFAULT_OPTIONS: RuleEngineOptions = {\r\n  maxCasesPerOperation: 8,\r\n  maxBodyDepth: 2,\r\n  alwaysTestPathParamEmpty: true,\r\n}\r\n\r\nexport interface RuleEngineResult {\r\n  cases: TestCase[]\r\n  opsWithNoCases: Array<{ method: string; path: string; reason: string }>\r\n  stats: {\r\n    opsTotal: number\r\n    opsWithCases: number\r\n    opsFreeForm: number\r\n    casesByType: Record<string, number>\r\n  }\r\n}\r\n\r\nexport function deriveFromRules(\r\n  ops: OpenApiOperation[],\r\n  options: Partial<RuleEngineOptions> = {},\r\n): RuleEngineResult {\r\n  const opts = { ...DEFAULT_OPTIONS, ...options }\r\n  const cases: TestCase[] = []\r\n  const opsWithNoCases: Array<{ method: string; path: string; reason: string }> = []\r\n  const casesByType: Record<string, number> = {}\r\n\r\n  const bump = (k: string): void => {\r\n    casesByType[k] = (casesByType[k] ?? 0) + 1\r\n  }\r\n\r\n  for (const op of ops) {\r\n    const method = op.method.toUpperCase()\r\n    const pathParamNames = extractPathParams(op.path)\r\n    const opCases: TestCase[] = []\r\n    const reasonTags: string[] = []\r\n\r\n    if (pathParamNames.length > 0) {\r\n      const pc = derivePathParamCases(method, op.path, pathParamNames, opts)\r\n      opCases.push(...pc)\r\n      for (const _ of pc) {\r\n        bump('path-param')\r\n      }\r\n    }\r\n\r\n    const queryParams = op.parameters.filter((p) => (p.in as string) === 'query' || (p.in as string) === 'header')\r\n    for (const param of queryParams) {\r\n      const s = param.schema\r\n      if (!s) {\r\n        continue\r\n      }\r\n      const pc = deriveFromSchema(method, op.path, param.name, s, true)\r\n      opCases.push(...pc)\r\n      for (const _ of pc) {\r\n        bump('query-header')\r\n      }\r\n    }\r\n\r\n    const bodyParam = op.parameters.find((p) => (p.in as string) === 'body')\r\n    if (bodyParam?.schema) {\r\n      const before = opCases.length\r\n      walkBody(method, op.path, bodyParam.schema, '', 0, opts.maxBodyDepth, opCases, bump, reasonTags)\r\n      if (opCases.length === before) {\r\n        reasonTags.push('body has no derivable constraints')\r\n      }\r\n    }\r\n    if (op.requestBody?.schema) {\r\n      const before = opCases.length\r\n      walkBody(method, op.path, op.requestBody.schema, '', 0, opts.maxBodyDepth, opCases, bump, reasonTags)\r\n      if (opCases.length === before) {\r\n        reasonTags.push('requestBody has no derivable constraints')\r\n      }\r\n    }\r\n\r\n    if (opCases.length === 0) {\r\n      opsWithNoCases.push({\r\n        method,\r\n        path: op.path,\r\n        reason: reasonTags.length > 0 ? reasonTags.join('; ') : 'no path/query/body constraints',\r\n      })\r\n    } else {\r\n      cases.push(...opCases.slice(0, opts.maxCasesPerOperation))\r\n    }\r\n  }\r\n\r\n  return {\r\n    cases,\r\n    opsWithNoCases,\r\n    stats: {\r\n      opsTotal: ops.length,\r\n      opsWithCases: ops.length - opsWithNoCases.length,\r\n      opsFreeForm: opsWithNoCases.length,\r\n      casesByType,\r\n    },\r\n  }\r\n}\r\n\r\nfunction extractPathParams(path: string): string[] {\r\n  const matches = path.match(/\\{(\\w+)\\}/g) ?? []\r\n  return matches.map((m) => m.slice(1, -1))\r\n}\r\n\r\nfunction derivePathParamCases(\r\n  method: string,\r\n  path: string,\r\n  paramNames: string[],\r\n  opts: RuleEngineOptions,\r\n): TestCase[] {\r\n  const cases: TestCase[] = []\r\n  for (const name of paramNames) {\r\n    if (opts.alwaysTestPathParamEmpty) {\r\n      cases.push({\r\n        method,\r\n        path,\r\n        field: name,\r\n        input: '',\r\n        pathParams: { [name]: '' },\r\n        expectedStatus: 400,\r\n        rationale: 'path param ' + name + ' violates minLength=1 (empty string)',\r\n      })\r\n    }\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field: name,\r\n      input: 'a'.repeat(65),\r\n      pathParams: { [name]: 'a'.repeat(65) },\r\n      expectedStatus: 400,\r\n      rationale: 'path param ' + name + ' exceeds maxLength=64',\r\n    })\r\n  }\r\n  return cases\r\n}\r\n\r\nfunction deriveFromSchema(\r\n  method: string,\r\n  path: string,\r\n  field: string,\r\n  schema: any,\r\n  includeTypeMismatch: boolean,\r\n): TestCase[] {\r\n  const cases: TestCase[] = []\r\n  if (!schema || typeof schema !== 'object') {\r\n    return cases\r\n  }\r\n\r\n  if (typeof schema.minLength === 'number' && schema.minLength > 0) {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: 'x'.repeat(Math.max(0, schema.minLength - 1)),\r\n      expectedStatus: 400,\r\n      rationale: field + ' below minLength=' + schema.minLength,\r\n    })\r\n  }\r\n  if (typeof schema.maxLength === 'number') {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: 'x'.repeat(schema.maxLength + 1),\r\n      expectedStatus: 400,\r\n      rationale: field + ' exceeds maxLength=' + schema.maxLength,\r\n    })\r\n  }\r\n  if (typeof schema.minimum === 'number') {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: schema.minimum - 1,\r\n      expectedStatus: 400,\r\n      rationale: field + ' below minimum=' + schema.minimum,\r\n    })\r\n  }\r\n  if (typeof schema.maximum === 'number') {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: schema.maximum + 1,\r\n      expectedStatus: 400,\r\n      rationale: field + ' exceeds maximum=' + schema.maximum,\r\n    })\r\n  }\r\n  if (Array.isArray(schema.enum) && schema.enum.length > 0) {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: 'INVALID_ENUM_VALUE',\r\n      expectedStatus: 400,\r\n      rationale: field + ' not in enum [' + schema.enum.join(', ') + ']',\r\n    })\r\n  }\r\n  if (typeof schema.pattern === 'string') {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: '!@#$%',\r\n      expectedStatus: 400,\r\n      rationale: field + ' fails pattern ' + schema.pattern,\r\n    })\r\n  }\r\n  if (includeTypeMismatch && (schema.type === 'integer' || schema.type === 'number')) {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: 'not-a-number',\r\n      expectedStatus: 400,\r\n      rationale: field + ' wrong type (string for ' + schema.type + ')',\r\n    })\r\n  }\r\n  if (schema.type === 'boolean' && includeTypeMismatch) {\r\n    cases.push({\r\n      method,\r\n      path,\r\n      field,\r\n      input: 'not-a-bool',\r\n      expectedStatus: 400,\r\n      rationale: field + ' wrong type (string for boolean)',\r\n    })\r\n  }\r\n\r\n  return cases\r\n}\r\n\r\nfunction walkBody(\r\n  method: string,\r\n  path: string,\r\n  schema: any,\r\n  prefix: string,\r\n  depth: number,\r\n  maxDepth: number,\r\n  out: TestCase[],\r\n  bump: (k: string) => void,\r\n  reasonTags: string[],\r\n): void {\r\n  if (depth > maxDepth) {\r\n    reasonTags.push('body depth exceeds ' + maxDepth)\r\n    return\r\n  }\r\n  if (!schema || typeof schema !== 'object') {\r\n    return\r\n  }\r\n\r\n  if (schema.properties && typeof schema.properties === 'object') {\r\n    let derivedAny = false\r\n    for (const [name, sub] of Object.entries(schema.properties)) {\r\n      const fieldPath = prefix ? prefix + '.' + name : name\r\n      const subSchema = sub as any\r\n      if (!subSchema || typeof subSchema !== 'object') {\r\n        continue\r\n      }\r\n      if (subSchema.type === 'object' && subSchema.properties) {\r\n        walkBody(method, path, subSchema, fieldPath, depth + 1, maxDepth, out, bump, reasonTags)\r\n        derivedAny = true\r\n        continue\r\n      }\r\n      if (subSchema.type === 'array') {\r\n        reasonTags.push('body has array field (skipped)')\r\n        continue\r\n      }\r\n      const derived = deriveFromSchema(method, path, fieldPath, subSchema, false)\r\n      if (derived.length > 0) {\r\n        derivedAny = true\r\n        for (const _ of derived) {\r\n          bump('body-field')\r\n        }\r\n        out.push(...derived)\r\n      }\r\n    }\r\n    if (!derivedAny) {\r\n      reasonTags.push('body has no derivable constraints')\r\n    }\r\n    return\r\n  }\r\n\r\n  if (Array.isArray(schema.allOf)) {\r\n    for (const part of schema.allOf) {\r\n      walkBody(method, path, part, prefix, depth + 1, maxDepth, out, bump, reasonTags)\r\n    }\r\n    return\r\n  }\r\n\r\n  reasonTags.push('body schema has no properties')\r\n}\r\n","import { getStatus, prepareInputs, resolveContext } from './pipeline/skill-driver.js'\r\nimport { loadPipelineConfig } from './pipeline/runner.js'\r\nimport { runGate, checkRegexOnContent } from './gate-engine/index.js'\r\nimport { runInit, formatReport } from './commands/init.js'\r\nimport { runUpdate, formatUpdateReport } from './commands/update.js'\r\nimport { handleGateFix } from './gate-fix.js'\r\nimport { handleGateRenderReport } from './commands/gate-cli.js'\r\nimport { handleEnvelopeValidate, handleEnvelopeDrift, handleEnvelopeDerive, handleEnvelopeRenderReport, handleEnvelopeRender4plus1Delta } from './commands/envelope-cli.js'\r\nimport { handleCodeScanRenderReport } from './commands/code-scan-cli.js'\r\nimport { handleBaseline } from './commands/baseline-cli.js'\r\nimport { handleStep, handlePipelineStatus } from './commands/step-cli.js'\r\nimport { handleReconcile } from './commands/reconcile-cli.js'\r\nimport { handleBaseline } from './commands/baseline-cli.js'\r\nimport {\r\n  handleReqStart,\r\n  handleReqExtractDimensions,\r\n  handleReqNextQuestion,\r\n  handleReqAnswer,\r\n  handleReqStatus,\r\n  handleReqConverge,\r\n  handleReqRecommend,\r\n  handleReqClear,\r\n} from './commands/req.js'\r\nimport {\r\n  handleDevStart,\r\n  handleDevComplete,\r\n  handleDevStatus,\r\n} from './commands/dev-cli.js'\r\nimport {\r\n  handleEnvStart,\r\n  handleEnvStop,\r\n  handleEnvList,\r\n  handleEnvStatus,\r\n  handleEnvProviders,\r\n} from './commands/env-cli.js'\r\nimport { runHarnessBorder } from './harness-border/cli.js'\r\nimport { resolve } from 'path'\r\nimport { readFileSync, writeFileSync, existsSync } from 'fs'\r\nimport type { GateRule } from './gate-engine/types.js'\r\nimport { withTelemetry } from './telemetry/index.js'\r\nimport { VERSION } from './version.js'\r\nimport { runUpdateCheck } from './commands/update-check.js'\r\nimport { handleSkillUsed } from './commands/skill-used.js'\r\nimport { handleLoop } from './commands/loop-cli.js'\r\nimport { resetBranchSyncState, getBranchSyncState } from './telemetry/branch-sync.js'\r\n\r\nconst args = process.argv.slice(2)\r\nconst command = args[0]\r\n\r\nfunction dispatch(): void {\r\n  switch (command) {\r\n  case 'version':\r\n    console.log(`harness-toolkit v${VERSION}`)\r\n    break\r\n\r\n  case 'status': {\r\n    const cwd = args[1] ?? process.cwd()\r\n    console.log(getStatus(cwd))\r\n    break\r\n  }\r\n\r\n  case 'update-check': {\r\n    const targetDir = args.find(a => !a.startsWith('--') && a !== 'update-check') ?? process.cwd()\r\n    const jsonOut = args.includes('--json')\r\n    const checkRemote =\r\n      args.includes('--check-remote') ||\r\n      process.env.HARNESS_TOOLKIT_CHECK_REMOTE === '1'\r\n    runUpdateCheck(targetDir, { checkRemote })\r\n      .then((r) => {\r\n        if (jsonOut) {\r\n          console.log(JSON.stringify(r, null, 2))\r\n        } else {\r\n          console.log(r.message)\r\n        }\r\n        process.exit(r.status === 'update-available' ? 1 : 0)\r\n      })\r\n      .catch((err) => {\r\n        console.error(`update-check failed: ${(err as Error).message}`)\r\n        process.exit(2)\r\n      })\r\n    break\r\n  }\r\n\r\n  case 'init': {\r\n    const targetDir = args.find(a => !a.startsWith('--') && a !== 'init') ?? process.cwd()\r\n    const force = args.includes('--force')\r\n    const installHooks = !args.includes('--no-hooks')\r\n    const skipStandaloneSkills = args.includes('--no-matt-pocock-skills')\r\n    const result = runInit(targetDir, force, installHooks, skipStandaloneSkills)\r\n    console.log(formatReport(result))\r\n    break\r\n  }\r\n\r\n  case 'update': {\r\n    const targetDir = args.find(a => !a.startsWith('--') && a !== 'update') ?? process.cwd()\r\n    const opts = {\r\n      force: args.includes('--force'),\r\n      interactive: args.includes('--interactive') || args.includes('-i'),\r\n      dryRun: args.includes('--dry-run'),\r\n      hooks: !args.includes('--no-hooks'),\r\n      permissions: !args.includes('--no-permissions'),\r\n      skipStandaloneSkills: args.includes('--no-matt-pocock-skills'),\r\n    }\r\n    runUpdate(targetDir, opts)\r\n      .then((result) => {\r\n        console.log(formatUpdateReport(result))\r\n        if (result.conflicts.length > 0 && !opts.force && !opts.interactive) {\r\n          process.exit(1)\r\n        }\r\n      })\r\n      .catch((err) => {\r\n        console.error(`update failed: ${(err as Error).message}`)\r\n        process.exit(1)\r\n      })\r\n    break\r\n  }\r\n\r\n  case 'gate': {\r\n    const subCommand = args[1]\r\n    if (subCommand === 'check' && args.includes('--stdin')) {\r\n      handleGateCheckStdin()\r\n    } else if (subCommand === 'fix') {\r\n      handleGateFix(args)\r\n    } else if (subCommand === 'render-report') {\r\n      handleGateRenderReport(args.slice(2))\r\n    } else {\r\n      console.error('Usage: harness-rd-toolkit gate <check --stdin|fix <file>|render-report>')\r\n      process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'prepare': {\r\n    const workDir = args[1] ?? process.cwd()\r\n    const pipelinePath = args.find(a => a.startsWith('--pipeline='))?.split('=')[1]\r\n      ?? args[args.indexOf('--pipeline') + 1]\r\n      ?? 'pipeline.yaml'\r\n    const resolvedPipeline = resolve(pipelinePath)\r\n\r\n    try {\r\n      const config = loadPipelineConfig(resolvedPipeline)\r\n      const created = prepareInputs(config, workDir)\r\n      if (created.length === 0) {\r\n        console.log('All input files already exist. No templates created.')\r\n      } else {\r\n        console.log(`Created ${created.length} template input file(s):`)\r\n        for (const f of created) {\r\n          console.log(`  + ${f}`)\r\n        }\r\n        console.log('')\r\n        console.log('Fill templates with real content before running /harness-design.')\r\n      }\r\n    } catch (err: any) {\r\n      console.error(`Failed to prepare inputs: ${err.message}`)\r\n      process.exit(1)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'req': {\r\n    const subCommand = args[1]\r\n    const subArgs = args.slice(2)\r\n    switch (subCommand) {\r\n      case 'start':\r\n        handleReqStart(subArgs)\r\n        break\r\n      case 'extract-dimensions':\r\n        handleReqExtractDimensions(subArgs)\r\n        break\r\n      case 'next-question':\r\n        handleReqNextQuestion(subArgs)\r\n        break\r\n      case 'answer':\r\n        handleReqAnswer(subArgs)\r\n        break\r\n      case 'status':\r\n        handleReqStatus(subArgs)\r\n        break\r\n      case 'converge':\r\n        handleReqConverge(subArgs)\r\n        break\r\n      case 'recommend':\r\n        handleReqRecommend(subArgs)\r\n        break\r\n      case 'clear':\r\n        handleReqClear(subArgs)\r\n        break\r\n      default:\r\n        console.error('Usage: harness-toolkit req <start|extract-dimensions|next-question|answer|recommend|status|converge|clear>')\r\n        process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'dev': {\r\n    const subCommand = args[1]\r\n    const subArgs = args.slice(2)\r\n    switch (subCommand) {\r\n      case 'start':\r\n        handleDevStart(subArgs)\r\n        break\r\n      case 'complete':\r\n        handleDevComplete(subArgs)\r\n        break\r\n      case 'status':\r\n        handleDevStatus(subArgs)\r\n        break\r\n      default:\r\n        console.error('Usage: harness-toolkit dev <start|complete|status>')\r\n        process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\ncase 'env': {\r\n    const envSubCommand = args[1]\r\n    const envSubArgs = args.slice(2)\r\n    switch (envSubCommand) {\r\n      case 'start':\r\n        handleEnvStart(envSubArgs)\r\n        break\r\n      case 'stop':\r\n        handleEnvStop(envSubArgs)\r\n        break\r\n      case 'list':\r\n        handleEnvList(envSubArgs)\r\n        break\r\n      case 'status':\r\n        handleEnvStatus(envSubArgs)\r\n        break\r\n      case 'providers':\r\n        handleEnvProviders(envSubArgs)\r\n        break\r\n      default:\r\n        console.error(\"Usage: harness-toolkit env <start|stop|list|status|providers>\")\r\n        process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'harness-border': {\r\n    void runHarnessBorder(args.slice(1)).then((result) => {\r\n      process.stdout.write(result.stdout)\r\n      process.exit(result.exitCode)\r\n    }).catch((err) => {\r\n      process.stderr.write('harness-border failed: ' + (err && err.message ? err.message : String(err)) + '\\n')\r\n      process.exit(2)\r\n    })\r\n    break\r\n  }\r\n\r\n  case 'loop': {\r\n    try {\r\n      handleLoop(args.slice(1))\r\n    } catch (err) {\r\n      process.stderr.write('loop failed: ' + (err && err.message ? err.message : String(err)) + '\\n')\r\n      process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\ncase 'envelope': {\r\n    const subCmd = args[1]\r\n    const subArgs = args.slice(2)\r\n    if (subCmd === 'validate') {\r\n      handleEnvelopeValidate(subArgs)\r\n    } else if (subCmd === 'drift') {\r\n      handleEnvelopeDrift(subArgs)\r\n    } else if (subCmd === 'derive') {\r\n      handleEnvelopeDerive(subArgs)\r\n    } else if (subCmd === 'render-report') {\r\n      handleEnvelopeRenderReport(subArgs)\r\n    } else if (subCmd === 'render-4plus1-delta') {\r\n      handleEnvelopeRender4plus1Delta(subArgs)\r\n    } else {\r\n      console.error('Usage: harness-toolkit envelope <validate|drift|derive|render-report|render-4plus1-delta>')\r\n      process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'code-scan': {\r\n    const subCmd = args[1]\r\n    const subArgs = args.slice(2)\r\n    if (subCmd === 'render-report') {\r\n      handleCodeScanRenderReport(subArgs)\r\n    } else {\r\n      console.error('Usage: harness-toolkit code-scan <render-report>')\r\n      process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'baseline': {\r\n    handleBaseline(args.slice(1))\r\n    break\r\n  }\r\n\r\n  case 'step': {\r\n    const stepArgs = args.slice(1)\r\n    handleStep(stepArgs)\r\n    break\r\n  }\r\n\r\n  case 'pipeline': {\r\n    const pipelineSub = args[1]\r\n    const pipelineSubArgs = args.slice(2)\r\n    if (pipelineSub === 'status') {\r\n      handlePipelineStatus(pipelineSubArgs)\r\n    } else {\r\n      console.error('Usage: harness-toolkit pipeline status')\r\n      process.exit(2)\r\n    }\r\n    break\r\n  }\r\n\r\n  case 'reconcile': {\r\n    const reconcileArgs = args.slice(1)\r\n    void handleReconcile(reconcileArgs)\r\n    break\r\n  }\r\n\r\n  case 'help':\r\n  case undefined:\r\n    console.log('harness-rd-toolkit — RD Paradigm 3.0 pipeline toolkit')\r\n    console.log('')\r\n    console.log('Commands:')\r\n    console.log('  version                        Print version')\r\n    console.log('  init [dir]                     Initialize scaffold in target directory')\r\n    console.log('  update [dir]                   Sync harness capabilities into target (merge, preserve local edits)')\r\n    console.log('    --force                      Overwrite existing files')\r\n    console.log('    --no-hooks                   Skip installing Claude Code hooks (hooks installed by default)')\r\n    console.log('    --no-matt-pocock-skills      Skip Standalone Skill installation')\r\n    console.log('  status [dir]                   Show pipeline status')\r\n    console.log('  update-check [dir]             Check whether a newer harness-toolkit is available')\r\n    console.log('    --json                       Emit JSON result instead of one-line message')\r\n    console.log('    --check-remote               Query remote registry for latest published version')\r\n    console.log('  prepare [dir]                  Create template input files for pipeline')\r\n    console.log('    --pipeline=<path>            Path to pipeline.yaml (default: ./pipeline.yaml)')\r\n    console.log('  gate check --stdin             Run gate checks from stdin JSON')\r\n    console.log('  gate fix <file>                Auto-fix fixable gate violations in a file')\r\n    console.log('  gate render-report --derivation=<path> [--envelope=<path>] --out=<path>')\r\n    console.log('                                     Render step-4 gate-derivation YAML into a human-readable HTML report')\r\n    console.log('  req start                      Start requirements analysis')\r\n    console.log('    --dir=<path>                 Working directory')\r\n    console.log('    --request-id=<id>            Request ID')\r\n    console.log('  req extract-dimensions         Extract decision dimensions')\r\n    console.log('    --dimensions=<csv>           Comma-separated dimension names')\r\n    console.log('  req next-question              Get next interrogation question')\r\n    console.log('  req answer                     Process user answer')\r\n    console.log('    --answer=<text>              User answer text')\r\n    console.log('    --new-branches=<csv>         New branch names')\r\n    console.log('  req recommend                  Attach a recommended answer to a decision node')\r\n    console.log('    --node=<id>                  Target node id')\r\n    console.log('    --recommended=<text>         Recommended answer (empty to clear)')\r\n    console.log('  req status                     Show requirements status')\r\n    console.log('  req converge                   Check convergence')\r\n    console.log('  req clear                      Clear all requirements session state')\r\n    console.log('    --dir=<path>                 Working directory')\r\n    console.log('    --yes                        Skip confirmation (required to actually delete)')\r\n    console.log('  dev start                      Start a TDD task')\r\n    console.log('    --task=<id>                  Task ID')\r\n    console.log('  dev complete                   Mark TDD task complete')\r\n    console.log('    --task=<id>                  Task ID')\r\n    console.log('  dev status                     Show TDD progress')\r\n    console.log('  env start --type=<provider>    Start an environment resource')\r\n    console.log('  env stop --session=<id>        Stop an environment resource')\r\n    console.log('  env list [--type=<provider>]   List active environment sessions')\r\n    console.log('  env status --session=<id>      Show session details')\r\n    console.log('  env providers                  List installed providers')\r\n    console.log('  harness-border [subcommand]     Boundary value test deployed API (LLM-driven)')\r\nconsole.log('  envelope validate <yaml>          Validate architecture envelope')\r\n    console.log('  envelope drift <yaml>              Check drift against envelope')\r\n        console.log('  envelope derive --baseline=<path>  Derive envelope from baseline + optional delta')\r\n    console.log('                                     [--delta=<path>] --out=<path>')\r\n    console.log('  envelope render-report --delta=<path> --envelope=<path> [--review-packet=<path>] --out=<path>')\r\n    console.log('                                     Render step-3 YAML artifacts into a human-readable HTML report')\r\n    console.log('  code-scan render-report --in=<evidence.yaml> --out=<report.html>')\r\n    console.log('                                     Render step-2 code-scan-evidence YAML into a human-readable HTML report')\r\n    console.log('  baseline <load|validate|merge|     Manage frozen architecture baseline + 4+1 baseline pre-flight')\r\n    console.log('              freeze|seed|graphify|find-or-build>  (see harness-toolkit baseline <sub> --help)')\r\n    console.log('  step <N>                           Trigger pipeline step (with backtracking)')\r\n    console.log('  pipeline status                    Show pipeline config and state')\r\n    console.log('  reconcile <yaml>                   Run two-phase reconcile engine')\r\n    console.log('  help                           Print this help')\r\n    break\r\n\r\n  default:\r\n    if (command === 'skill-used') {\r\n      handleSkillUsed(args.slice(1))\r\n      break\r\n    }\r\n    if (command === 'telemetry-reset') {\r\n      resetBranchSyncState()\r\n      console.log('[telemetry] branch-sync failure counter reset.')\r\n      break\r\n    }\r\n    if (command === 'telemetry-status') {\r\n      const state = getBranchSyncState()\r\n      console.log(JSON.stringify(state, null, 2))\r\n      break\r\n    }\r\n    console.error(`Unknown command: ${command}`)\r\n    process.exit(1)\r\n}\r\n}\r\n\r\nwithTelemetry(args, () => {\r\n  dispatch()\r\n})\r\n\r\nasync function handleGateCheckStdin(): Promise<void> {\r\n  let input = ''\r\n  process.stdin.setEncoding('utf-8')\r\n  for await (const chunk of process.stdin) {\r\n    input += chunk\r\n  }\r\n\r\n  if (!input.trim()) {\r\n    process.stderr.write('No input provided on stdin\\n')\r\n    process.exit(2)\r\n  }\r\n\r\n  let request: any\r\n  try {\r\n    request = JSON.parse(input)\r\n  } catch {\r\n    process.stderr.write('Invalid JSON input\\n')\r\n    process.exit(2)\r\n  }\r\n\r\n  try {\r\n    const report = await runGate(request)\r\n    const response = {\r\n      binding: report.binding,\r\n      blocked: report.blocked,\r\n      warnings: report.warnings,\r\n      results: report.results,\r\n    }\r\n    process.stdout.write(JSON.stringify(response) + '\\n', () => {\r\n      process.exit(report.blocked ? 1 : 0)\r\n    })\r\n  } catch (err: any) {\r\n    process.stderr.write(`Gate check error: ${err.message}\\n`)\r\n    process.exit(2)\r\n  }\r\n}\r\n","import type { TelemetryEvent } from './types.js'\r\n\r\nlet pendingEvent: TelemetryEvent | null = null\r\n\r\n// Node's built-in fetch (undici) ignores HTTP_PROXY/HTTPS_PROXY env vars.\r\n// Respect them explicitly so CLI works behind corporate proxies / local VPNs.\r\n// Lazy-load undici's ProxyAgent only when a proxy env var is set.\r\nlet proxyDispatcherPromise: Promise<{ dispatcher?: unknown } | null> | null = null\r\nfunction getProxyDispatcher(): Promise<{ dispatcher?: unknown } | null> {\r\n  if (proxyDispatcherPromise) return proxyDispatcherPromise\r\n  const proxyUrl = process.env.HTTPS_PROXY || process.env.https_proxy || process.env.HTTP_PROXY || process.env.http_proxy\r\n  if (!proxyUrl) {\r\n    proxyDispatcherPromise = Promise.resolve({})\r\n    return proxyDispatcherPromise\r\n  }\r\n  proxyDispatcherPromise = (async () => {\r\n    try {\r\n      const undici = await import('undici')\r\n      return { dispatcher: new undici.ProxyAgent(proxyUrl) }\r\n    } catch {\r\n      return null\r\n    }\r\n  })()\r\n  return proxyDispatcherPromise\r\n}\r\n\r\nexport function reportEvent(event: TelemetryEvent, config: { endpoint: string; authToken: string | null; timeoutMs: number; debug: boolean }): void {\r\n  pendingEvent = event\r\n  if (config.debug) {\r\n    process.stderr.write(`[telemetry-debug] ${JSON.stringify(event)}\\n`)\r\n  }\r\n  // fire-and-forget: do not await, swallow all errors\r\n  void sendEvent(event, config).catch(() => {\r\n    // silent failure — telemetry must never affect CLI behavior\r\n  })\r\n}\r\n\r\nasync function sendEvent(event: TelemetryEvent, config: { endpoint: string; authToken: string | null; timeoutMs: number; debug: boolean }): Promise<void> {\r\n  const controller = new AbortController()\r\n  const timer = setTimeout(() => controller.abort(), config.timeoutMs)\r\n  try {\r\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' }\r\n    if (config.authToken) headers['Authorization'] = `Bearer ${config.authToken}`\r\n    const proxy = await getProxyDispatcher()\r\n    const res = await fetch(config.endpoint, {\r\n      method: 'POST',\r\n      headers,\r\n      body: JSON.stringify(event),\r\n      signal: controller.signal,\r\n      keepalive: true,\r\n      ...(proxy?.dispatcher ? { dispatcher: proxy.dispatcher as never } : {}),\r\n    })\r\n    if (!res.ok) {\r\n      // silent — discard\r\n    }\r\n  } finally {\r\n    clearTimeout(timer)\r\n  }\r\n}\r\n\r\nexport { sendEvent }\r\n\r\nexport function reportIdentity(emailHash: string, email: string, config: { endpoint: string; authToken: string | null; timeoutMs: number; debug: boolean }): void {\r\n  if (config.debug) {\r\n    process.stderr.write(`[telemetry-debug] identify ${emailHash}\\n`)\r\n  }\r\n  void sendIdentify(emailHash, email, config).catch(() => {\r\n    // silent — telemetry must never affect CLI behavior\r\n  })\r\n}\r\n\r\nasync function sendIdentify(emailHash: string, email: string, config: { endpoint: string; authToken: string | null; timeoutMs: number; debug: boolean }): Promise<void> {\r\n  const identifyUrl = config.endpoint.replace(/\\/v1\\/events$/, '/v1/identify')\r\n  if (identifyUrl === config.endpoint) return // endpoint not /v1/events; skip\r\n  const controller = new AbortController()\r\n  const timer = setTimeout(() => controller.abort(), config.timeoutMs)\r\n  try {\r\n    const headers: Record<string, string> = { 'Content-Type': 'application/json' }\r\n    if (config.authToken) headers['Authorization'] = `Bearer ${config.authToken}`\r\n    const proxy = await getProxyDispatcher()\r\n    const res = await fetch(identifyUrl, {\r\n      method: 'POST',\r\n      headers,\r\n      body: JSON.stringify({ email_hash: emailHash, email }),\r\n      signal: controller.signal,\r\n      keepalive: true,\r\n      ...(proxy?.dispatcher ? { dispatcher: proxy.dispatcher as never } : {}),\r\n    })\r\n    if (!res.ok) {\r\n      // silent — discard\r\n    }\r\n  } finally {\r\n    clearTimeout(timer)\r\n  }\r\n}\r\n\r\nexport function getPendingEvent(): TelemetryEvent | null {\r\n  return pendingEvent\r\n}\r\n\r\nexport function clearPending(): void {\r\n  pendingEvent = null\r\n}\r\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { homedir } from 'os'\r\nimport { join } from 'path'\r\n\r\nconst ID_FILE_DIR = join(homedir(), '.harness-toolkit')\r\nconst ID_FILE_PATH = join(ID_FILE_DIR, 'telemetry-id.json')\r\nconst CONFIG_FILE_PATH = join(ID_FILE_DIR, 'config.json')\r\n\r\nexport interface TelemetryConfig {\r\n  enabled: boolean\r\n  endpoint: string\r\n  authToken: string | null\r\n  timeoutMs: number\r\n  debug: boolean\r\n  branchSyncEnabled: boolean\r\n  gitcodeToken: string | null\r\n}\r\n\r\n// Flat key-value mirror of env var names. Env vars override file values.\r\n// Example: { \"HARNESS_TELEMETRY_AUTH_TOKEN\": \"dev-token-please-change\" }\r\ntype ConfigFile = Record<string, string>\r\n\r\nfunction loadConfigFile(): ConfigFile {\r\n  try {\r\n    if (!existsSync(CONFIG_FILE_PATH)) return {}\r\n    const raw = readFileSync(CONFIG_FILE_PATH, 'utf-8')\r\n    const parsed = JSON.parse(raw)\r\n    if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return {}\r\n    const out: ConfigFile = {}\r\n    for (const [k, v] of Object.entries(parsed as Record<string, unknown>)) {\r\n      if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') {\r\n        out[k] = String(v)\r\n      }\r\n    }\r\n    return out\r\n  } catch {\r\n    return {}\r\n  }\r\n}\r\n\r\nfunction lookup(key: string, file: ConfigFile): string | undefined {\r\n  return process.env[key] ?? file[key]\r\n}\r\n\r\nexport function isTelemetryEnabled(): boolean {\r\n  if (process.env.HARNESS_TELEMETRY_DISABLED === '1') return false\r\n  if (process.env.DO_NOT_TRACK === '1') return false\r\n  return true\r\n}\r\n\r\nexport function isTelemetryDisabledByFlag(args: string[]): boolean {\r\n  return args.includes('--no-telemetry')\r\n}\r\n\r\nexport function loadConfig(args: string[]): TelemetryConfig {\r\n  const file = loadConfigFile()\r\n  const enabled = isTelemetryEnabled() && !isTelemetryDisabledByFlag(args)\r\n  const endpoint = lookup('HARNESS_TELEMETRY_ENDPOINT', file) ?? 'https://harness-telemetry.harness-wfq.workers.dev/v1/events'\r\n  const authToken = lookup('HARNESS_TELEMETRY_AUTH_TOKEN', file) ?? null\r\n  const timeoutMs = Number.parseInt(lookup('HARNESS_TELEMETRY_TIMEOUT_MS', file) ?? '3000', 10)\r\n  const debug = lookup('HARNESS_TELEMETRY_DEBUG', file) === '1'\r\n  const branchSyncEnabled = lookup('HARNESSTOOLKIT_BRANCH_SYNC', file) !== '0'\r\n  // Optional PAT for environments without cached git credential helper (CI etc.).\r\n  // When set, branch-sync injects it into the origin URL via http.extraHeader.\r\n  const gitcodeToken = lookup('HARNESSTOOLKIT_GITCODE_TOKEN', file) ?? null\r\n  return { enabled, endpoint, authToken, timeoutMs, debug, branchSyncEnabled, gitcodeToken }\r\n}\r\n\r\nexport function telemetryIdFilePath(): string {\r\n  return ID_FILE_PATH\r\n}\r\n\r\nexport function hasTelemetryIdFile(): boolean {\r\n  return existsSync(ID_FILE_PATH)\r\n}\r\n\r\nexport function ensureTelemetryNoticePrinted(): boolean {\r\n  if (!hasTelemetryIdFile()) {\r\n    return true\r\n  }\r\n  return false\r\n}\r\n\r\nexport function markTelemetryNoticePrinted(): void {\r\n  if (!existsSync(ID_FILE_DIR)) {\r\n    mkdirSync(ID_FILE_DIR, { recursive: true })\r\n  }\r\n}\r\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs'\r\nimport { homedir, hostname, networkInterfaces } from 'os'\r\nimport { join } from 'path'\r\nimport { createHash, randomUUID } from 'crypto'\r\nimport { execSync } from 'child_process'\r\nimport type { Identifiers } from './types.js'\r\n\r\nconst ID_FILE_DIR = join(homedir(), '.harness-toolkit')\r\nconst ID_FILE_PATH = join(ID_FILE_DIR, 'telemetry-id.json')\r\nconst MACHINE_ID_PATH = join(ID_FILE_DIR, 'machine-id.txt')\r\n\r\ninterface StoredId {\r\n  uuid: string\r\n  email_hash?: string\r\n  machine_hash?: string\r\n}\r\n\r\nfunction loadStored(): StoredId | null {\r\n  if (!existsSync(ID_FILE_PATH)) return null\r\n  try {\r\n    const raw = readFileSync(ID_FILE_PATH, 'utf-8')\r\n    const parsed = JSON.parse(raw) as StoredId\r\n    if (parsed?.uuid && typeof parsed.uuid === 'string') return parsed\r\n  } catch {\r\n    // fall through to regenerate\r\n  }\r\n  return null\r\n}\r\n\r\nfunction save(stored: StoredId): void {\r\n  if (!existsSync(ID_FILE_DIR)) {\r\n    mkdirSync(ID_FILE_DIR, { recursive: true })\r\n  }\r\n  writeFileSync(ID_FILE_PATH, JSON.stringify(stored, null, 2), 'utf-8')\r\n}\r\n\r\nfunction ensureUuid(stored: StoredId | null): { stored: StoredId; created: boolean } {\r\n  if (stored?.uuid) return { stored, created: false }\r\n  const fresh: StoredId = { uuid: randomUUID() }\r\n  return { stored: fresh, created: true }\r\n}\r\n\r\nfunction readGitEmail(): string | null {\r\n  try {\r\n    const email = execSync('git config user.email', { encoding: 'utf-8', timeout: 2000 }).trim()\r\n    return email || null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\n/**\r\n * Raw git user.email, used by branch-sync.ts to derive the\r\n * client-telemetry/<sanitized-email> branch name.\r\n * Returns null when git is unavailable or email is unset — caller must skip.\r\n */\r\nexport function getEmail(): string | null {\r\n  return readGitEmail()\r\n}\r\n\r\nfunction hashEmail(email: string): string {\r\n  return createHash('sha256').update(email, 'utf-8').digest('hex')\r\n}\r\n\r\nfunction getMacAddress(): string | null {\r\n  try {\r\n    const interfaces = networkInterfaces()\r\n    for (const name of Object.keys(interfaces)) {\r\n      const nets = interfaces[name]\r\n      if (!nets) continue\r\n      for (const net of nets) {\r\n        if (!net.internal && net.mac && net.mac !== '00:00:00:00:00:00') {\r\n          return net.mac\r\n        }\r\n      }\r\n    }\r\n  } catch {\r\n    // fall through\r\n  }\r\n  return null\r\n}\r\n\r\nfunction computeMachineHash(): string {\r\n  const host = hostname() ?? 'unknown'\r\n  const mac = getMacAddress() ?? 'no-mac'\r\n  return createHash('sha256').update(`${host}:${mac}`, 'utf-8').digest('hex')\r\n}\r\n\r\n// Persistent machine_id — written once to ~/.harness-toolkit/machine-id.txt,\r\n// never regenerated. Survives telemetry-id.json resets so the same machine\r\n// always counts as one user regardless of how many times user_uuid rotates.\r\nfunction loadMachineId(): string | null {\r\n  try {\r\n    if (!existsSync(MACHINE_ID_PATH)) return null\r\n    const raw = readFileSync(MACHINE_ID_PATH, 'utf-8').trim()\r\n    return raw || null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n\r\nfunction writeMachineId(id: string): void {\r\n  try {\r\n    if (!existsSync(ID_FILE_DIR)) mkdirSync(ID_FILE_DIR, { recursive: true })\r\n    writeFileSync(MACHINE_ID_PATH, id, 'utf-8')\r\n  } catch {\r\n    // best-effort; never block CLI\r\n  }\r\n}\r\n\r\nfunction ensureMachineId(): string {\r\n  const existing = loadMachineId()\r\n  if (existing) return existing\r\n  // Derive from machine_hash + a random component so it's stable per machine\r\n  // (machine_hash is deterministic from hostname+MAC) but not guessable.\r\n  const hash = computeMachineHash()\r\n  const id = `${hash.slice(0, 16)}-${randomUUID()}`\r\n  writeMachineId(id)\r\n  return id\r\n}\r\n\r\nexport function resolveIdentifiers(): Identifiers {\r\n  let stored = loadStored()\r\n  const ensured = ensureUuid(stored)\r\n  stored = ensured.stored\r\n\r\n  if (!stored.email_hash) {\r\n    const email = readGitEmail()\r\n    stored.email_hash = email ? hashEmail(email) : 'no-email'\r\n  }\r\n  if (!stored.machine_hash) {\r\n    stored.machine_hash = computeMachineHash()\r\n  }\r\n\r\n  save(stored)\r\n  const mid = ensureMachineId()\r\n  return {\r\n    user_uuid: stored.uuid,\r\n    email_hash: stored.email_hash,\r\n    machine_hash: stored.machine_hash,\r\n    machine_id: mid,\r\n  }\r\n}\r\n\r\nexport function isFreshRun(): boolean {\r\n  return !existsSync(ID_FILE_PATH)\r\n}\r\n\r\nexport function markNoticeShown(): void {\r\n  resolveIdentifiers()\r\n}\r\n","// Branch-sync telemetry channel — parallel to HTTP telemetry (client.ts).\r\n//\r\n// Pushes a per-user trace to gitcode.com under refs/heads/client-telemetry/<sanitized-email>.\r\n// start phase: ensureBranch() — create the branch if absent (writes .gitkeep).\r\n// end phase:   pushSession()  — update profile.json + append one line to sessions/<YYYY-MM-DD>.jsonl.\r\n//\r\n// All git operations act on a long-lived per-user bare-ish clone at\r\n// ~/.harness-toolkit/branch-clone/ — NOT the user's working repo; we never\r\n// touch their working tree. Each mutation uses an ephemeral `git worktree`\r\n// to stage file edits, then commits and pushes. A module-level mutex\r\n// serializes access so concurrent CLI invocations from the same user\r\n// (and Node process) don't race on shared refs.\r\n//\r\n// Everything is fire-and-forget: errors are caught and discarded; telemetry\r\n// must never affect CLI behavior (mirrors client.ts semantics).\r\n//\r\n// Payload fields come straight from withTelemetry's TelemetryEvent\r\n// (command / subcommand / duration_ms / exit_code). No transcript parsing,\r\n// no second source of truth — per G4 sign-off Q1 (\"skill\" = harness-toolkit\r\n// CLI subcommand).\r\n\r\nimport { spawn } from 'child_process'\r\nimport { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'fs'\r\nimport { homedir } from 'os'\r\nimport { join } from 'path'\r\nimport type { ClientBranchProfile, CliInvocation } from './types.js'\r\n\r\nconst REMOTE_URL = 'https://gitcode.com/SETools/HarnessToolKit.git'\r\nconst BRANCH_PREFIX = 'client-telemetry'\r\nconst CLONE_DIR = join(homedir(), '.harness-toolkit', 'branch-clone')\r\nconst STATE_FILE = join(homedir(), '.harness-toolkit', 'branch-sync-state.json')\r\nconst SPAWN_TIMEOUT_MS = 8000\r\nconst MAX_FAILURES = 3\r\n\r\nexport interface BranchSyncConfig {\r\n  enabled: boolean\r\n  token: string | null\r\n  debug: boolean\r\n}\r\n\r\ninterface BranchSyncState {\r\n  failures: number\r\n  lastFailAt: string | null\r\n  lastFailReason: string | null\r\n  disabled: boolean\r\n}\r\n\r\nfunction loadState(): BranchSyncState {\r\n  try {\r\n    if (!existsSync(STATE_FILE)) return { failures: 0, lastFailAt: null, lastFailReason: null, disabled: false }\r\n    const raw = readFileSync(STATE_FILE, 'utf-8')\r\n    const parsed = JSON.parse(raw) as Partial<BranchSyncState>\r\n    return {\r\n      failures: parsed.failures ?? 0,\r\n      lastFailAt: parsed.lastFailAt ?? null,\r\n      lastFailReason: parsed.lastFailReason ?? null,\r\n      disabled: parsed.disabled ?? false,\r\n    }\r\n  } catch {\r\n    return { failures: 0, lastFailAt: null, lastFailReason: null, disabled: false }\r\n  }\r\n}\r\n\r\nfunction saveState(state: BranchSyncState): void {\r\n  try {\r\n    const dir = join(homedir(), '.harness-toolkit')\r\n    if (!existsSync(dir)) mkdirSync(dir, { recursive: true })\r\n    writeFileSync(STATE_FILE, JSON.stringify(state, null, 2), 'utf-8')\r\n  } catch {\r\n    // state file is best-effort; never block CLI\r\n  }\r\n}\r\n\r\nfunction recordFailure(reason: string): void {\r\n  const state = loadState()\r\n  state.failures += 1\r\n  state.lastFailAt = new Date().toISOString()\r\n  state.lastFailReason = reason\r\n  if (state.failures >= MAX_FAILURES) {\r\n    state.disabled = true\r\n    process.stderr.write(\r\n      `[telemetry] branch-sync 已连续失败 ${MAX_FAILURES} 次，已停止上报。\\n` +\r\n      `最近原因: ${reason}\\n` +\r\n      '常见原因：\\n' +\r\n      '  1. git user.email 未设置 → 运行: git config --global user.email \"<用户名>@gitcode.com\"\\n' +\r\n      '  2. gitcode 凭据未配置 → 运行: git config --global credential.helper manager\\n' +\r\n      '     然后任意 git push 会弹出浏览器登录 gitcode，凭据存入 Windows Credential Manager\\n' +\r\n      '  3. 网络问题 → 检查能否访问 gitcode.com\\n' +\r\n      \"修复后运行 'harness-toolkit telemetry-reset' 重置失败计数。\\n\" +\r\n      '（不影响 CLI 功能；遥测数据仅用于运营统计）\\n'\r\n    )\r\n  }\r\n  saveState(state)\r\n}\r\n\r\nfunction recordSuccess(): void {\r\n  const state = loadState()\r\n  if (state.failures > 0 || state.disabled) {\r\n    state.failures = 0\r\n    state.disabled = false\r\n    state.lastFailAt = null\r\n    state.lastFailReason = null\r\n    saveState(state)\r\n  }\r\n}\r\n\r\nfunction isDisabled(): boolean {\r\n  return loadState().disabled\r\n}\r\n\r\ninterface GitResult {\r\n  ok: boolean\r\n  stdout: string\r\n  stderr: string\r\n}\r\n\r\n// Simple promise-chain mutex so concurrent ensureBranch/pushSession calls\r\n// inside the same process serialize on the shared clone.\r\nlet chain: Promise<unknown> = Promise.resolve()\r\nfunction withLock<T>(fn: () => Promise<T>): Promise<T> {\r\n  const next = chain.then(fn, fn)\r\n  chain = next.then(\r\n    () => undefined,\r\n    () => undefined,\r\n  )\r\n  return next\r\n}\r\n\r\nfunction runGit(args: string[], opts: { cwd: string; envToken?: string | null }): Promise<GitResult> {\r\n  return new Promise((resolve) => {\r\n    const env: NodeJS.ProcessEnv = { ...process.env }\r\n    // Forbid interactive credential prompts on the TTY. Without this, on a\r\n    // machine with no cached credential helper, `git clone/push` opens /dev/tty\r\n    // directly (bypassing stdio) and blocks the CLI on a Username/Password prompt.\r\n    // Setting 0 makes git fail fast non-interactively; the surrounding try/catch\r\n    // swallows it — preserving the fire-and-forget invariant. Credential helpers,\r\n    // PAT injection (envToken), and askpass are left untouched.\r\n    env.GIT_TERMINAL_PROMPT = '0'\r\n    // CI / clean environments: inject PAT via http.extraHeader when provided.\r\n    // Local users with cached credential helper leave token unset; the\r\n    // helper satisfies auth transparently.\r\n    if (opts.envToken) {\r\n      env.GIT_HTTP_EXTRAHEADER = `Authorization: Basic ${Buffer.from(`:${opts.envToken}`).toString('base64')}`\r\n    }\r\n    const child = spawn('git', args, { cwd: opts.cwd, env, stdio: ['ignore', 'pipe', 'pipe'] })\r\n    let stdout = ''\r\n    let stderr = ''\r\n    let settled = false\r\n    const timer = setTimeout(() => {\r\n      if (settled) return\r\n      settled = true\r\n      try { child.kill('SIGKILL') } catch { /* noop */ }\r\n      resolve({ ok: false, stdout, stderr: `timeout after ${SPAWN_TIMEOUT_MS}ms` })\r\n    }, SPAWN_TIMEOUT_MS)\r\n    child.stdout.on('data', (c) => { stdout += c.toString() })\r\n    child.stderr.on('data', (c) => { stderr += c.toString() })\r\n    child.on('error', (err) => {\r\n      if (settled) return\r\n      settled = true\r\n      clearTimeout(timer)\r\n      resolve({ ok: false, stdout, stderr: String(err) })\r\n    })\r\n    child.on('close', (code) => {\r\n      if (settled) return\r\n      settled = true\r\n      clearTimeout(timer)\r\n      resolve({ ok: code === 0, stdout, stderr })\r\n    })\r\n    // Fire-and-forget invariant: none of this op's handles (child process,\r\n    // stdio pipes, spawn-timeout timer) may hold the parent's event loop.\r\n    // Without unref, a slow/hanging git op — or the ~15-op ensureBranch +\r\n    // pushSession chain compounding at 8s per op — keeps the CLI alive after\r\n    // its user-visible work finishes, so the shell never returns (needs\r\n    // Ctrl+C). Unref lets the parent exit independently; the timers still\r\n    // fire (and SIGKILL stale children) whenever the parent IS alive for\r\n    // other reasons (e.g. `env start`, whose own provider child is NOT\r\n    // unref'd and intentionally keeps the CLI in the foreground).\r\n    child.unref?.()\r\n    child.stdout?.unref?.()\r\n    child.stderr?.unref?.()\r\n    timer.unref()\r\n  })\r\n}\r\n\r\nfunction debugLog(config: BranchSyncConfig, msg: string): void {\r\n  if (config.debug) {\r\n    process.stderr.write(`[branch-sync-debug] ${msg}\\n`)\r\n  }\r\n}\r\n\r\nexport function sanitizeEmail(email: string): string {\r\n  // Per G3-Q3 chosen branch: [^a-z0-9]+ → '-', lowercase.\r\n  // Keeps email readable while conforming to git ref naming rules\r\n  // (no '.', '@', '..', 'lock', case-insensitive collision etc.).\r\n  return email.toLowerCase().replace(/[^a-z0-9]+/g, '-')\r\n}\r\n\r\nfunction branchName(sanitizedEmail: string): string {\r\n  return `${BRANCH_PREFIX}/${sanitizedEmail}`\r\n}\r\n\r\nasync function ensureClone(config: BranchSyncConfig): Promise<boolean> {\r\n  if (existsSync(join(CLONE_DIR, '.git'))) return true\r\n  try {\r\n    mkdirSync(CLONE_DIR, { recursive: true })\r\n  } catch {\r\n    return false\r\n  }\r\n  // --no-checkout: we never need a working tree on the clone itself;\r\n  // we use `git worktree add` for file edits in ephemeral dirs.\r\n  const res = await runGit(\r\n    ['clone', '--no-checkout', '--origin=origin', REMOTE_URL, CLONE_DIR],\r\n    { cwd: homedir(), envToken: config.token },\r\n  )\r\n  if (!res.ok) {\r\n    debugLog(config, `clone failed: ${res.stderr}`)\r\n    try { rmSync(CLONE_DIR, { recursive: true, force: true }) } catch { /* noop */ }\r\n    return false\r\n  }\r\n  return true\r\n}\r\n\r\nasync function fetchTelemetryRefs(config: BranchSyncConfig): Promise<void> {\r\n  await runGit(\r\n    ['fetch', 'origin', `+refs/heads/${BRANCH_PREFIX}/*:refs/remotes/origin/${BRANCH_PREFIX}/*`],\r\n    { cwd: CLONE_DIR, envToken: config.token },\r\n  )\r\n}\r\n\r\nasync function remoteBranchExists(branch: string): Promise<boolean> {\r\n  const res = await runGit(\r\n    ['show-ref', '--verify', '--quiet', `refs/remotes/origin/${branch}`],\r\n    { cwd: CLONE_DIR, envToken: null },\r\n  )\r\n  return res.ok\r\n}\r\n\r\nasync function withWorktree<T>(\r\n  branch: string,\r\n  config: BranchSyncConfig,\r\n  fn: (wtPath: string) => Promise<T>,\r\n): Promise<T | null> {\r\n  const worktree = join(CLONE_DIR, '_wt')\r\n  await runGit(['worktree', 'remove', '--force', worktree], { cwd: CLONE_DIR, envToken: null })\r\n  await runGit(['worktree', 'prune'], { cwd: CLONE_DIR, envToken: null })\r\n  const wtAdd = await runGit(\r\n    ['worktree', 'add', '--detach', '--no-checkout', worktree, branch],\r\n    { cwd: CLONE_DIR, envToken: null },\r\n  )\r\n  if (!wtAdd.ok) {\r\n    debugLog(config, `worktree add failed for ${branch}: ${wtAdd.stderr}`)\r\n    return null\r\n  }\r\n  try {\r\n    return await fn(worktree)\r\n  } finally {\r\n    await runGit(['worktree', 'remove', '--force', worktree], { cwd: CLONE_DIR, envToken: null })\r\n    await runGit(['worktree', 'prune'], { cwd: CLONE_DIR, envToken: null })\r\n  }\r\n}\r\n\r\n/**\r\n * Ensure the client-telemetry/<sanitizedEmail> branch exists on origin.\r\n * Called from withTelemetry's start phase. Fire-and-forget.\r\n */\r\nexport function ensureBranch(sanitizedEmail: string, config: BranchSyncConfig): Promise<void> {\r\n  if (!config.enabled || !sanitizedEmail) return Promise.resolve()\r\n  if (isDisabled()) {\r\n    debugLog(config, 'branch-sync disabled due to prior failures; skipping ensureBranch')\r\n    return Promise.resolve()\r\n  }\r\n  return withLock(async () => {\r\n    try {\r\n      if (!(await ensureClone(config))) {\r\n        recordFailure('clone failed')\r\n        return\r\n      }\r\n      const branch = branchName(sanitizedEmail)\r\n      await fetchTelemetryRefs(config)\r\n      if (await remoteBranchExists(branch)) {\r\n        recordSuccess()\r\n        return\r\n      }\r\n\r\n      const mainRes = await runGit(\r\n        ['show-ref', '--verify', '--quiet', 'refs/remotes/origin/main'],\r\n        { cwd: CLONE_DIR, envToken: null },\r\n      )\r\n      const startPoint = mainRes.ok ? 'refs/remotes/origin/main' : 'HEAD'\r\n      const setRef = await runGit(\r\n        ['update-ref', `refs/heads/${branch}`, startPoint],\r\n        { cwd: CLONE_DIR, envToken: null },\r\n      )\r\n      if (!setRef.ok) {\r\n        debugLog(config, `ensureBranch update-ref failed: ${setRef.stderr}`)\r\n        recordFailure(`update-ref failed: ${setRef.stderr.slice(0, 120)}`)\r\n        return\r\n      }\r\n\r\n      const result = await withWorktree(branch, config, async (wtPath) => {\r\n        await runGit(['checkout', branch], { cwd: wtPath, envToken: null })\r\n        writeFileSync(join(wtPath, '.gitkeep'), '', 'utf-8')\r\n        await runGit(['add', '.gitkeep'], { cwd: wtPath, envToken: null })\r\n        await runGit(\r\n          ['commit', '-m', 'chore(client-telemetry): register user', '--allow-empty'],\r\n          { cwd: wtPath, envToken: null },\r\n        )\r\n        const pushRes = await runGit(\r\n          ['push', 'origin', `${branch}:${branch}`],\r\n          { cwd: wtPath, envToken: config.token },\r\n        )\r\n        return pushRes.ok\r\n      })\r\n      if (result !== true) {\r\n        debugLog(config, `ensureBranch push failed (result=${String(result)})`)\r\n        recordFailure(`push failed: ensureBranch`)\r\n      } else {\r\n        recordSuccess()\r\n      }\r\n    } catch (err) {\r\n      debugLog(config, `ensureBranch unexpected: ${String(err)}`)\r\n      recordFailure(`unexpected: ${String(err).slice(0, 120)}`)\r\n    }\r\n  })\r\n}\r\n\r\n/**\r\n * Update profile.json + append one line to sessions/<YYYY-MM-DD>.jsonl on the\r\n * user's client-telemetry/<sanitizedEmail> branch.\r\n * Called from withTelemetry's end phase. Fire-and-forget.\r\n */\r\nexport function pushSession(\r\n  sanitizedEmail: string,\r\n  profilePayload: ClientBranchProfile,\r\n  sessionPayload: CliInvocation,\r\n  config: BranchSyncConfig,\r\n): Promise<void> {\r\n  if (!config.enabled || !sanitizedEmail) return Promise.resolve()\r\n  if (isDisabled()) {\r\n    debugLog(config, 'branch-sync disabled due to prior failures; skipping pushSession')\r\n    return Promise.resolve()\r\n  }\r\n  return withLock(async () => {\r\n    try {\r\n      if (!(await ensureClone(config))) {\r\n        recordFailure('clone failed')\r\n        return\r\n      }\r\n      const branch = branchName(sanitizedEmail)\r\n      await fetchTelemetryRefs(config)\r\n      if (!(await remoteBranchExists(branch))) {\r\n        debugLog(config, `pushSession: branch ${branch} not on remote, skipping`)\r\n        recordFailure(`branch ${branch} not on remote`)\r\n        return\r\n      }\r\n\r\n      await runGit(\r\n        ['update-ref', `refs/heads/${branch}`, `refs/remotes/origin/${branch}`],\r\n        { cwd: CLONE_DIR, envToken: null },\r\n      )\r\n\r\n      const result = await withWorktree(branch, config, async (wtPath) => {\r\n        await runGit(['checkout', branch], { cwd: wtPath, envToken: null })\r\n\r\n        let prev: ClientBranchProfile | null = null\r\n        const prevProfileRes = await runGit(\r\n          ['show', `${branch}:profile.json`],\r\n          { cwd: wtPath, envToken: null },\r\n        )\r\n        if (prevProfileRes.ok) {\r\n          try {\r\n            prev = JSON.parse(prevProfileRes.stdout) as ClientBranchProfile\r\n          } catch {\r\n            prev = null\r\n          }\r\n        }\r\n        const mergedProfile: ClientBranchProfile = {\r\n          ...profilePayload,\r\n          first_seen: prev?.first_seen ?? profilePayload.first_seen,\r\n          session_count: (prev?.session_count ?? 0) + 1,\r\n        }\r\n        writeFileSync(join(wtPath, 'profile.json'), JSON.stringify(mergedProfile, null, 2) + '\\n', 'utf-8')\r\n\r\n        const day = sessionPayload.ts.slice(0, 10)\r\n        const sessionsDir = join(wtPath, 'sessions')\r\n        if (!existsSync(sessionsDir)) mkdirSync(sessionsDir, { recursive: true })\r\n        const sessionsFile = join(sessionsDir, `${day}.jsonl`)\r\n        let existing = ''\r\n        if (existsSync(sessionsFile)) {\r\n          try { existing = readFileSync(sessionsFile, 'utf-8') } catch { existing = '' }\r\n        }\r\n        writeFileSync(sessionsFile, existing + JSON.stringify(sessionPayload) + '\\n', 'utf-8')\r\n\r\n        await runGit(['add', 'profile.json', `sessions/${day}.jsonl`], { cwd: wtPath, envToken: null })\r\n        const commitRes = await runGit(\r\n          ['commit', '-m', `chore(client-telemetry): session ${sessionPayload.session_id.slice(0, 8)}`],\r\n          { cwd: wtPath, envToken: null },\r\n        )\r\n        if (!commitRes.ok) {\r\n          debugLog(config, `pushSession commit skipped: ${commitRes.stderr}`)\r\n          // Commit skipped often means no delta — not a real failure. Don't bump counter.\r\n          return true\r\n        }\r\n        const pushRes = await runGit(\r\n          ['push', '--force-with-lease', 'origin', `${branch}:${branch}`],\r\n          { cwd: wtPath, envToken: config.token },\r\n        )\r\n        return pushRes.ok\r\n      })\r\n      if (result !== true) {\r\n        debugLog(config, `pushSession push failed (result=${String(result)})`)\r\n        recordFailure(`push failed: pushSession`)\r\n      } else {\r\n        recordSuccess()\r\n      }\r\n    } catch (err) {\r\n      debugLog(config, `pushSession unexpected: ${String(err)}`)\r\n      recordFailure(`unexpected: ${String(err).slice(0, 120)}`)\r\n    }\r\n  })\r\n}\r\n\r\n// Test-only escape hatch — clears the long-lived clone so tests can reseed.\r\nexport function _resetCloneForTests(): void {\r\n  try { rmSync(CLONE_DIR, { recursive: true, force: true }) } catch { /* noop */ }\r\n}\r\n\r\n// Public reset — clears the failure counter so a user can recover after\r\n// fixing git config / credentials. Wired to `harness-toolkit telemetry-reset`.\r\nexport function resetBranchSyncState(): void {\r\n  saveState({ failures: 0, lastFailAt: null, lastFailReason: null, disabled: false })\r\n}\r\n\r\nexport function getBranchSyncState(): BranchSyncState {\r\n  return loadState()\r\n}\r\n","import { reportEvent, reportIdentity } from './client.js'\r\nimport { loadConfig, markTelemetryNoticePrinted } from './config.js'\r\nimport { resolveIdentifiers, isFreshRun, markNoticeShown, getEmail } from './identifiers.js'\r\nimport { ensureBranch, pushSession, sanitizeEmail, type BranchSyncConfig } from './branch-sync.js'\r\nimport { userInfo, platform } from 'os'\r\nimport type { TelemetryEvent, ClientBranchProfile, CliInvocation } from './types.js'\r\n\r\nconst TOOLKIT_VERSION = '0.1.0'\r\n\r\nfunction detectHost(): string {\r\n  if (process.env.HARNESS_HOST) return process.env.HARNESS_HOST\r\n  if (process.env.CLAUDE_CODE || process.env.CLAUDECODE) return 'claude-code'\r\n  if (process.env.TRAE_USER_DATA_DIR || process.env.TRAE) return 'trae'\r\n  if (process.env.CURSOR_TRACE_DIR || process.env.CURSOR_DEBUG) return 'cursor'\r\n  return 'cli'\r\n}\r\n\r\nexport function withTelemetry(args: string[], fn: () => void | Promise<void>): void {\r\n  const config = loadConfig(args)\r\n  const startTime = Date.now()\r\n  const command = args[0] ?? 'help'\r\n  const subcommand = args[1] ?? null\r\n\r\n  if (config.enabled && isFreshRun()) {\r\n    process.stdout.write(\r\n      '[telemetry] harness-toolkit collects anonymous usage data. Set HARNESS_TELEMETRY_DISABLED=1 to opt out.\\n'\r\n    )\r\n    markTelemetryNoticePrinted()\r\n    markNoticeShown()\r\n  }\r\n\r\n  const sessionId = cryptoRandomUUID()\r\n  let reported = false\r\n\r\n  const branchSyncConfig: BranchSyncConfig = {\r\n    enabled: config.enabled && config.branchSyncEnabled,\r\n    token: config.gitcodeToken,\r\n    debug: config.debug,\r\n  }\r\n  const email = getEmail()\r\n  const sanitizedEmail = email ? sanitizeEmail(email) : ''\r\n\r\n  if (config.enabled && !email) {\r\n    const osUser = safeOsUser()\r\n    const suggestedUser = osUser || 'your-username'\r\n    process.stderr.write(\r\n      '[telemetry] 未检测到 git user.email，branch-sync 通道无法上报遥测数据。\\n' +\r\n      `请设置（用你的 gitcode 用户名替换 \"${suggestedUser}\"）：\\n` +\r\n      `  git config --global user.email \"${suggestedUser}@gitcode.com\"\\n` +\r\n      '设置后再次运行 harness-toolkit 即可自动创建 client-telemetry/<email> 分支。\\n'\r\n    )\r\n  }\r\n\r\n  const sendStart = (): void => {\r\n    if (!config.enabled) return\r\n    try {\r\n      const ids = resolveIdentifiers()\r\n      const event: TelemetryEvent = {\r\n        id: sessionId,\r\n        phase: 'start',\r\n        ts: new Date().toISOString(),\r\n        user_uuid: ids.user_uuid,\r\n        email_hash: ids.email_hash,\r\n        machine_hash: ids.machine_hash,\r\n        machine_id: ids.machine_id,\r\n        os_user: safeOsUser(),\r\n        client_ip: '',\r\n        command,\r\n        subcommand,\r\n        duration_ms: 0,\r\n        exit_code: 0,\r\n        toolkit_version: TOOLKIT_VERSION,\r\n        host: detectHost(),\r\n      }\r\n      reportEvent(event, { endpoint: config.endpoint, authToken: config.authToken, timeoutMs: config.timeoutMs, debug: config.debug })\r\n    } catch {\r\n      // silent — telemetry must never affect CLI behavior\r\n    }\r\n    if (sanitizedEmail) {\r\n      void ensureBranch(sanitizedEmail, branchSyncConfig)\r\n    }\r\n  }\r\n\r\n  sendStart()\r\n\r\n  if (email) {\r\n    const ids = resolveIdentifiers()\r\n    if (ids.email_hash && ids.email_hash !== 'no-email') {\r\n      reportIdentity(ids.email_hash, email, { endpoint: config.endpoint, authToken: config.authToken, timeoutMs: config.timeoutMs, debug: config.debug })\r\n    }\r\n  }\r\n\r\n  const runAndReport = (exitCode: number): void => {\r\n    if (reported) return\r\n    if (!config.enabled) return\r\n    reported = true\r\n    const endTs = new Date().toISOString()\r\n    try {\r\n      const ids = resolveIdentifiers()\r\n      const event: TelemetryEvent = {\r\n        id: sessionId,\r\n        phase: 'end',\r\n        ts: endTs,\r\n        user_uuid: ids.user_uuid,\r\n        email_hash: ids.email_hash,\r\n        machine_hash: ids.machine_hash,\r\n        machine_id: ids.machine_id,\r\n        os_user: safeOsUser(),\r\n        client_ip: '',\r\n        command,\r\n        subcommand,\r\n        duration_ms: Date.now() - startTime,\r\n        exit_code: exitCode,\r\n        toolkit_version: TOOLKIT_VERSION,\r\n        host: detectHost(),\r\n      }\r\n      reportEvent(event, { endpoint: config.endpoint, authToken: config.authToken, timeoutMs: config.timeoutMs, debug: config.debug })\r\n    } catch {\r\n      // silent\r\n    }\r\n    if (sanitizedEmail) {\r\n      const profilePayload: ClientBranchProfile = {\r\n        sanitized_email: sanitizedEmail,\r\n        toolkit_version: TOOLKIT_VERSION,\r\n        os: platform(),\r\n        node_version: process.version,\r\n        first_seen: endTs,\r\n        last_seen: endTs,\r\n        session_count: 0,\r\n      }\r\n      const sessionPayload: CliInvocation = {\r\n        ts: endTs,\r\n        session_id: sessionId,\r\n        command,\r\n        subcommand,\r\n        duration_ms: Date.now() - startTime,\r\n        exit_code: exitCode,\r\n      }\r\n      void pushSession(sanitizedEmail, profilePayload, sessionPayload, branchSyncConfig)\r\n    }\r\n  }\r\n\r\n  const safeExitCode = (): number => {\r\n    const code = process.exitCode\r\n    if (typeof code === 'number') return code\r\n    return 0\r\n  }\r\n\r\n  // Fallbacks for process.exit() / uncaught errors. Normal path reports end\r\n  // when fn resolves (below) so the fetch has time to complete before exit.\r\n  process.on('beforeExit', () => {\r\n    runAndReport(safeExitCode())\r\n  })\r\n  process.on('exit', () => {\r\n    runAndReport(safeExitCode())\r\n  })\r\n\r\n  try {\r\n    Promise.resolve(fn()).then(\r\n      () => runAndReport(safeExitCode()),\r\n      (err) => {\r\n        runAndReport(1)\r\n        throw err\r\n      },\r\n    )\r\n  } catch (err) {\r\n    runAndReport(1)\r\n    throw err\r\n  }\r\n}\r\n\r\nfunction cryptoRandomUUID(): string {\r\n  // Use Web Crypto (Node 18+) to avoid 'crypto' module import overhead in hot path\r\n  if (typeof globalThis.crypto?.randomUUID === 'function') {\r\n    return globalThis.crypto.randomUUID()\r\n  }\r\n  // Fallback\r\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n    const r = (Math.random() * 16) | 0\r\n    const v = c === 'x' ? r : (r & 0x3) | 0x8\r\n    return v.toString(16)\r\n  })\r\n}\r\n\r\nfunction safeOsUser(): string {\r\n  try {\r\n    return userInfo().username || ''\r\n  } catch {\r\n    return ''\r\n  }\r\n}\r\n\r\n// Re-export so callers/tests can access branch-sync primitives directly.\r\nexport { ensureBranch, pushSession, sanitizeEmail }\r\nexport type { BranchSyncConfig }\r\n","export const VERSION = '0.1.0'\r\n\r\n/**\r\n * Semver-ish comparison. Returns >0 if a>b, 0 if equal, <0 if a<b.\r\n *\r\n * Strips pre-release (-rc.1) and build metadata (+sha.abc) suffixes before\r\n * comparing — for the toolkit's purposes \"1.0.0-rc.1\" and \"1.0.0\" are the\r\n * same release. Within a segment, numeric strings compare numerically;\r\n * non-numeric strings compare lexically (so \"alpha\" < \"beta\"). Mixed\r\n * numeric/non-numeric at the same position fall back to lexical on the\r\n * raw segment text.\r\n */\r\nexport function compareVersions(a: string, b: string): number {\r\n  const strip = (v: string) => String(v).split(/[-+]/)[0]\r\n  const pa = strip(a).split('.')\r\n  const pb = strip(b).split('.')\r\n  const len = Math.max(pa.length, pb.length)\r\n  for (let i = 0; i < len; i++) {\r\n    const sa = pa[i] ?? '0'\r\n    const sb = pb[i] ?? '0'\r\n    const na = parseInt(sa, 10)\r\n    const nb = parseInt(sb, 10)\r\n    const aIsNum = !Number.isNaN(na) && String(na) === sa\r\n    const bIsNum = !Number.isNaN(nb) && String(nb) === sb\r\n    if (aIsNum && bIsNum) {\r\n      if (na !== nb) return na - nb\r\n    } else {\r\n      // At least one is non-numeric → lexical compare on raw segment text.\r\n      if (sa !== sb) return sa < sb ? -1 : 1\r\n    }\r\n  }\r\n  return 0\r\n}\r\n\r\n/**\r\n * Resolve the latest published version from the remote registry.\r\n *\r\n * Default registry is the npm registry (`https://registry.npmjs.org`) using\r\n * the package's own `name` field from package.json. Override via `registry`\r\n * option or `HARNESS_TOOLKIT_REGISTRY` env var. Network failures degrade\r\n * silently to `null` — the caller (update-check) treats null as \"unknown\"\r\n * and falls back to the local-only comparison signal.\r\n */\r\nexport interface ResolveRemoteLatestOptions {\r\n  fetch?: typeof fetch\r\n  registry?: string\r\n  timeoutMs?: number\r\n}\r\n\r\ninterface PackageMetadata {\r\n  version?: unknown\r\n  'dist-tags'?: { latest?: unknown } | null\r\n}\r\n\r\nconst DEFAULT_REGISTRY = 'https://registry.npmjs.org'\r\n\r\nexport async function resolveRemoteLatest(\r\n  opts: ResolveRemoteLatestOptions = {},\r\n): Promise<string | null> {\r\n  const packageName = '@wefq1981/harness-toolkit'\r\n  const registryBase =\r\n    opts.registry ??\r\n    process.env.HARNESS_TOOLKIT_REGISTRY ??\r\n    DEFAULT_REGISTRY\r\n  const url = `${registryBase.replace(/\\/$/, '')}/${encodeURIComponent(packageName)}`\r\n  const timeoutMs = opts.timeoutMs ?? 5000\r\n  const fetchImpl = opts.fetch ?? fetch\r\n\r\n  try {\r\n    const controller = new AbortController()\r\n    const timer = setTimeout(() => controller.abort(), timeoutMs)\r\n    const res = await fetchImpl(url, {\r\n      signal: controller.signal,\r\n      headers: { 'accept': 'application/json' },\r\n    })\r\n    clearTimeout(timer)\r\n    if (!res.ok) {\r\n      return null\r\n    }\r\n    const json = (await res.json()) as PackageMetadata\r\n    const latestViaDistTags =\r\n      json?.['dist-tags'] && typeof json['dist-tags'].latest === 'string'\r\n        ? json['dist-tags'].latest\r\n        : null\r\n    if (latestViaDistTags) {\r\n      return latestViaDistTags\r\n    }\r\n    if (typeof json?.version === 'string') {\r\n      return json.version\r\n    }\r\n    return null\r\n  } catch {\r\n    return null\r\n  }\r\n}\r\n","/**\r\n * Client-side toolkit state: .harness-toolkit-state/ directory.\r\n *\r\n * This directory is OWNED by the toolkit. Users should not edit it. It is NOT\r\n * a \"user configuration\" surface and does not enjoy the requirement's protection\r\n * (\"未获得认可不允许修改客户已经做的配置\") — it is the toolkit's own bookkeeping.\r\n *\r\n * Contents:\r\n *   installed-version      — single-line string, the toolkit version last synced\r\n *   deletions.txt          — relative paths the user has permanently rejected\r\n *                            (one per line, forward-slash). update() must NOT\r\n *                            recreate these files when dest is missing.\r\n *   last-sync-at.json      — { at: ISO, files: { <relPath>: <sha256> } }\r\n *                            quick diff entry; full hash recompute still authoritative\r\n */\r\n\r\nimport {\r\n  existsSync,\r\n  mkdirSync,\r\n  readFileSync,\r\n  writeFileSync,\r\n} from 'fs'\r\nimport { join } from 'path'\r\n\r\nexport const STATE_DIR = '.harness-toolkit-state'\r\nexport const STATE_INSTALLED_VERSION = 'installed-version'\r\nexport const STATE_DELETIONS = 'deletions.txt'\r\nexport const STATE_LAST_SYNC = 'last-sync-at.json'\r\nexport const STATE_LAST_NOTIFIED_AT = 'last-notified-at'\r\nexport const STATE_LAST_NOTIFIED_VERSION = 'last-notified-version'\r\n\r\nexport interface ClientState {\r\n  installedVersion: string | null\r\n  deletions: ReadonlySet<string>\r\n  lastSyncAt: { at: string; files: Record<string, string> } | null\r\n  /** Last time SessionStart hook surfaced an upgrade prompt (ISO), or null. */\r\n  lastNotifiedAt: string | null\r\n  /** The toolkit version we last notified the user about, or null. */\r\n  lastNotifiedVersion: string | null\r\n}\r\n\r\nexport function stateDir(targetDir: string): string {\r\n  return join(targetDir, STATE_DIR)\r\n}\r\n\r\nexport function readState(targetDir: string): ClientState {\r\n  const dir = stateDir(targetDir)\r\n  let installedVersion: string | null = null\r\n  if (existsSync(join(dir, STATE_INSTALLED_VERSION))) {\r\n    installedVersion = readFileSync(join(dir, STATE_INSTALLED_VERSION), 'utf-8').trim() || null\r\n  }\r\n  let lastNotifiedAt: string | null = null\r\n  if (existsSync(join(dir, STATE_LAST_NOTIFIED_AT))) {\r\n    lastNotifiedAt = readFileSync(join(dir, STATE_LAST_NOTIFIED_AT), 'utf-8').trim() || null\r\n  }\r\n  let lastNotifiedVersion: string | null = null\r\n  if (existsSync(join(dir, STATE_LAST_NOTIFIED_VERSION))) {\r\n    lastNotifiedVersion = readFileSync(join(dir, STATE_LAST_NOTIFIED_VERSION), 'utf-8').trim() || null\r\n  }\r\n  let deletions = new Set<string>()\r\n  if (existsSync(join(dir, STATE_DELETIONS))) {\r\n    const raw = readFileSync(join(dir, STATE_DELETIONS), 'utf-8')\r\n    deletions = new Set(\r\n      raw\r\n        .split(/\\r?\\n/)\r\n        .map((l) => l.trim())\r\n        .filter((l) => l.length > 0 && !l.startsWith('#')),\r\n    )\r\n  }\r\n  let lastSyncAt: ClientState['lastSyncAt'] = null\r\n  if (existsSync(join(dir, STATE_LAST_SYNC))) {\r\n    try {\r\n      const parsed = JSON.parse(readFileSync(join(dir, STATE_LAST_SYNC), 'utf-8'))\r\n      if (\r\n        typeof parsed === 'object' &&\r\n        parsed !== null &&\r\n        typeof (parsed as { at?: unknown }).at === 'string' &&\r\n        typeof (parsed as { files?: unknown }).files === 'object'\r\n      ) {\r\n        lastSyncAt = parsed as ClientState['lastSyncAt']\r\n      }\r\n    } catch {\r\n      lastSyncAt = null\r\n    }\r\n  }\r\n  return { installedVersion, deletions, lastSyncAt, lastNotifiedAt, lastNotifiedVersion }\r\n}\r\n\r\nexport function writeLastNotified(targetDir: string, version: string): void {\r\n  const dir = stateDir(targetDir)\r\n  mkdirSync(dir, { recursive: true })\r\n  writeFileSync(join(dir, STATE_LAST_NOTIFIED_AT), new Date().toISOString(), 'utf-8')\r\n  writeFileSync(join(dir, STATE_LAST_NOTIFIED_VERSION), version, 'utf-8')\r\n}\r\n\r\nexport function writeInstalledVersion(targetDir: string, version: string): void {\r\n  const dir = stateDir(targetDir)\r\n  mkdirSync(dir, { recursive: true })\r\n  writeFileSync(join(dir, STATE_INSTALLED_VERSION), version, 'utf-8')\r\n}\r\n\r\nexport function writeLastSync(\r\n  targetDir: string,\r\n  fileHashes: Record<string, string>,\r\n): void {\r\n  const dir = stateDir(targetDir)\r\n  mkdirSync(dir, { recursive: true })\r\n  writeFileSync(\r\n    join(dir, STATE_LAST_SYNC),\r\n    JSON.stringify({ at: new Date().toISOString(), files: fileHashes }, null, 2),\r\n    'utf-8',\r\n  )\r\n}\r\n\r\nexport function recordDeletion(targetDir: string, relPath: string): void {\r\n  const dir = stateDir(targetDir)\r\n  mkdirSync(dir, { recursive: true })\r\n  const existing = existsSync(join(dir, STATE_DELETIONS))\r\n    ? readFileSync(join(dir, STATE_DELETIONS), 'utf-8')\r\n    : ''\r\n  const set = new Set(\r\n    existing\r\n      .split(/\\r?\\n/)\r\n      .map((l) => l.trim())\r\n      .filter((l) => l.length > 0 && !l.startsWith('#')),\r\n  )\r\n  set.add(relPath.replace(/\\\\/g, '/'))\r\n  writeFileSync(join(dir, STATE_DELETIONS), Array.from(set).sort().join('\\n') + '\\n', 'utf-8')\r\n}\r\n\r\nexport function isDeleted(state: ClientState, relPath: string): boolean {\r\n  return state.deletions.has(relPath.replace(/\\\\/g, '/'))\r\n}\r\n","/**\r\n * harness-toolkit update-check — compute update availability.\r\n *\r\n * Primary signal is LOCAL: toolkit's current VERSION vs the client's\r\n * .harness-toolkit-state/installed-version. Both are local, always computable.\r\n *\r\n * Optional remote query (resolveRemoteLatest) is OFF by default; pass\r\n * { checkRemote: true } or set HARNESS_TOOLKIT_CHECK_REMOTE=1 to enable.\r\n * Network failures degrade silently to local-only signal.\r\n */\r\n\r\nimport { readState } from '../client-state.js'\r\nimport { VERSION, compareVersions, resolveRemoteLatest } from '../version.js'\r\nimport { existsSync } from 'fs'\r\nimport { join } from 'path'\r\n\r\nexport type UpdateStatus =\r\n  | 'up-to-date'\r\n  | 'update-available'\r\n  | 'never-installed'\r\n  | 'unknown-client-version'\r\n\r\nexport interface UpdateAvailability {\r\n  status: UpdateStatus\r\n  toolkitVersion: string\r\n  clientInstalledVersion: string | null\r\n  remoteLatest: string | null\r\n  clientHasState: boolean\r\n  /** Human-readable one-liner, suitable for SessionStart hook injection. */\r\n  message: string\r\n}\r\n\r\nexport interface UpdateCheckOptions {\r\n  /** When true, also query the remote registry for the latest published version. */\r\n  checkRemote?: boolean\r\n  /** Override registry base URL. Falls back to HARNESS_TOOLKIT_REGISTRY env. */\r\n  registry?: string\r\n  /** Fetch impl injection (tests). */\r\n  fetch?: typeof fetch\r\n  /** Timeout for remote query. */\r\n  timeoutMs?: number\r\n}\r\n\r\nexport async function runUpdateCheck(\r\n  targetDir: string,\r\n  opts: UpdateCheckOptions = {},\r\n): Promise<UpdateAvailability> {\r\n  const state = readState(targetDir)\r\n  const clientHasState = existsSync(join(targetDir, '.harness-toolkit-state'))\r\n  const clientInstalledVersion = state.installedVersion\r\n\r\n  let remoteLatest: string | null = null\r\n  const wantRemote =\r\n    opts.checkRemote ?? process.env.HARNESS_TOOLKIT_CHECK_REMOTE === '1'\r\n  if (wantRemote) {\r\n    remoteLatest = await resolveRemoteLatest({\r\n      fetch: opts.fetch,\r\n      registry: opts.registry,\r\n      timeoutMs: opts.timeoutMs,\r\n    })\r\n  }\r\n\r\n  let status: UpdateStatus\r\n  let message: string\r\n\r\n  if (clientInstalledVersion === null) {\r\n    status = clientHasState ? 'unknown-client-version' : 'never-installed'\r\n    if (status === 'never-installed') {\r\n      message = `harness-toolkit ${VERSION} available — your project has never been initialised. Run \\`harness-toolkit init\\` first.`\r\n    } else {\r\n      message = `harness-toolkit ${VERSION} — your client state is missing \\`installed-version\\`. Run \\`harness-toolkit update\\` (guided) to reconcile.`\r\n    }\r\n  } else {\r\n    const cmp = compareVersions(VERSION, clientInstalledVersion)\r\n    if (cmp > 0) {\r\n      status = 'update-available'\r\n      message = `harness-toolkit update available: ${clientInstalledVersion} → ${VERSION}. Run \\`harness-toolkit update\\` to review changes.`\r\n    } else if (cmp === 0) {\r\n      status = 'up-to-date'\r\n      message = `harness-toolkit: your project is up-to-date at ${VERSION}.`\r\n    } else {\r\n      // Toolkit is OLDER than what client recorded. Rare (downgrade). Surface explicitly.\r\n      status = 'update-available'\r\n      message = `harness-toolkit ${VERSION} is older than your client's recorded ${clientInstalledVersion}. Consider upgrading the toolkit npm package.`\r\n    }\r\n  }\r\n\r\n  if (remoteLatest && compareVersions(remoteLatest, VERSION) > 0) {\r\n    message += ` (Remote latest: ${remoteLatest}.)`\r\n  }\r\n\r\n  return {\r\n    status,\r\n    toolkitVersion: VERSION,\r\n    clientInstalledVersion,\r\n    remoteLatest,\r\n    clientHasState,\r\n    message,\r\n  }\r\n}\r\n","import { reportEvent } from '../telemetry/client.js'\r\nimport { loadConfig } from '../telemetry/config.js'\r\nimport { resolveIdentifiers } from '../telemetry/identifiers.js'\r\nimport { userInfo } from 'os'\r\nimport type { TelemetryEvent } from '../telemetry/types.js'\r\n\r\nconst TOOLKIT_VERSION = '0.1.0'\r\n\r\nexport function handleSkillUsed(args: string[]): void {\r\n  const skillName = args.find(a => !a.startsWith('--'))\r\n  const hostArg = args.find(a => a.startsWith('--host='))\r\n  const host = hostArg ? hostArg.slice('--host='.length) : 'claude-code'\r\n\r\n  if (!skillName) {\r\n    console.error('Usage: harness-toolkit skill-used <skill-name> [--host=<host>]')\r\n    process.exit(2)\r\n  }\r\n\r\n  const config = loadConfig(args)\r\n  if (!config.enabled) return\r\n\r\n  try {\r\n    const ids = resolveIdentifiers()\r\n    const event: TelemetryEvent = {\r\n      id: cryptoRandomUUID(),\r\n      phase: 'end',\r\n      ts: new Date().toISOString(),\r\n      user_uuid: ids.user_uuid,\r\n      email_hash: ids.email_hash,\r\n      machine_hash: ids.machine_hash,\r\n      machine_id: ids.machine_id,\r\n      os_user: safeOsUser(),\r\n      client_ip: '',\r\n      command: 'skill',\r\n      subcommand: null,\r\n      skill_name: skillName,\r\n      host,\r\n      duration_ms: 0,\r\n      exit_code: 0,\r\n      toolkit_version: TOOLKIT_VERSION,\r\n    }\r\n    reportEvent(event, { endpoint: config.endpoint, authToken: config.authToken, timeoutMs: config.timeoutMs, debug: config.debug })\r\n  } catch {\r\n    // silent — telemetry must never affect CLI behavior\r\n  }\r\n}\r\n\r\nfunction cryptoRandomUUID(): string {\r\n  if (typeof globalThis.crypto?.randomUUID === 'function') {\r\n    return globalThis.crypto.randomUUID()\r\n  }\r\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n    const r = (Math.random() * 16) | 0\r\n    const v = c === 'x' ? r : (r & 0x3) | 0x8\r\n    return v.toString(16)\r\n  })\r\n}\r\n\r\nfunction safeOsUser(): string {\r\n  try {\r\n    return userInfo().username || ''\r\n  } catch {\r\n    return ''\r\n  }\r\n}\r\n","// CLI handler for `harness-toolkit loop <sub>`.\r\n// Subcommands:\r\n//   next-issue      — fetch + classify + filter seen, print JSON for next issue\r\n//   create-branch   — create + checkout the issue branch\r\n//   commit-and-push — (alias of mark-done) stage, commit, push, write summary\r\n//   mark-done       — write SUMMARY.md + DONE.json + update loop-state\r\n//   open-pr         — create a gitcode MR for the issue branch\r\n//   state           — print current loop-state.json\r\n\r\nimport { resolve } from 'path'\r\nimport { loadState } from '../loop/state.js'\r\nimport { finalize, nextIssue, setupBranch, buildSkillArgs, skillForType } from '../loop/runner.js'\r\nimport { buildPrBody, buildPrTitle, createPullRequest, GitcodePrError } from '../loop/pr.js'\r\nimport type { ClassifiedIssue } from '../loop/types.js'\r\n\r\nfunction parseFlag(args: string[], name: string): string | undefined {\r\n  const i = args.indexOf(name)\r\n  if (i === -1) return undefined\r\n  return args[i + 1]\r\n}\r\n\r\nfunction parseFlagBool(args: string[], name: string, def = false): boolean {\r\n  if (args.includes(name)) return true\r\n  return def\r\n}\r\n\r\nexport function handleLoop(args: string[]): void {\r\n  const subcommand = args[0]\r\n  const cwd = resolve(parseFlag(args, '--cwd') ?? process.cwd())\r\n  const docsRoot = resolve(parseFlag(args, '--docs-root') ?? cwd)\r\n  const repo = parseFlag(args, '--repo')\r\n  const token = parseFlag(args, '--token')\r\n  const strategyPath = parseFlag(args, '--strategy-path')\r\n\r\n  switch (subcommand) {\r\n    case 'next-issue': {\r\n      runNextIssue(args, cwd, repo, token)\r\n      break\r\n    }\r\n    case 'create-branch': {\r\n      const issueJson = parseFlag(args, '--issue-json')\r\n      if (!issueJson) throw new Error('--issue-json is required for create-branch')\r\n      const issue = JSON.parse(issueJson) as ClassifiedIssue\r\n      const r = setupBranch({ cwd, issue, strategyPath })\r\n      console.log(JSON.stringify({\r\n        ok: true,\r\n        branchName: r.branchName,\r\n        baseBranch: r.baseBranch,\r\n        created: r.created,\r\n        alreadyExisted: r.alreadyExisted,\r\n        skill: skillForType(issue.type),\r\n        skillArgs: buildSkillArgs(issue, r.branchName),\r\n      }, null, 2))\r\n      break\r\n    }\r\n    case 'commit-and-push':\r\n    case 'mark-done': {\r\n      runFinalize(args, cwd, docsRoot)\r\n      break\r\n    }\r\n    case 'open-pr': {\r\n      runOpenPr(args, cwd, repo, token)\r\n      break\r\n    }\r\n    case 'state': {\r\n      const state = loadState(cwd)\r\n      console.log(JSON.stringify(state, null, 2))\r\n      break\r\n    }\r\n    case 'help':\r\n    case undefined: {\r\n      console.log([\r\n        'harness-toolkit loop <sub>',\r\n        '',\r\n        'Subcommands:',\r\n        '  next-issue            Print JSON for next unprocessed open gitcode issue',\r\n        '  create-branch         Create + checkout the issue branch (--issue-json <json>)',\r\n        '  commit-and-push       Stage, commit (if needed), push (--issue-json <json>)',\r\n        '  mark-done             Write SUMMARY.md + DONE.json + update loop-state',\r\n        '  open-pr               Create a gitcode MR for the issue branch (--issue-json <json>)',\r\n        '  state                 Print current loop-state.json',\r\n        '',\r\n        'Common flags:',\r\n        '  --cwd <path>          Working directory (default: process.cwd())',\r\n        '  --docs-root <path>    docs/ root (default: cwd)',\r\n        '  --repo <owner/name>   GitCode repo (default: SETools/HarnessToolKit)',\r\n        '  --token <pat>         GitCode PAT (default: $HARNESSTOOLKIT_GITCODE_TOKEN)',\r\n      ].join('\\n'))\r\n      break\r\n    }\r\n    default:\r\n      throw new Error(`Unknown loop subcommand: ${subcommand}`)\r\n  }\r\n}\r\n\r\nfunction runNextIssue(args: string[], cwd: string, repo?: string, token?: string): void {\r\n  nextIssue({ cwd, repo, token })\r\n    .then((res) => {\r\n      if (res.done) {\r\n        console.log(JSON.stringify({ done: true, reason: res.reason, iterations: res.iterations, maxIterations: res.maxIterations }, null, 2))\r\n        return\r\n      }\r\n      console.log(JSON.stringify({\r\n        done: false,\r\n        issue: res.issue,\r\n        skill: skillForType(res.issue!.type),\r\n        skillArgs: buildSkillArgs(res.issue!, res.issue!.branchName),\r\n      }, null, 2))\r\n    })\r\n    .catch((err) => {\r\n      console.error(`loop next-issue failed: ${(err as Error).message}`)\r\n      process.exit(1)\r\n    })\r\n}\r\n\r\nfunction runOpenPr(args: string[], cwd: string, repo: string | undefined, token: string | undefined): void {\r\n  const issueJson = parseFlag(args, '--issue-json')\r\n  if (!issueJson) throw new Error('--issue-json is required for open-pr')\r\n  const issue = JSON.parse(issueJson) as ClassifiedIssue\r\n  const base = parseFlag(args, '--base') ?? 'main'\r\n  const skillExitNote = parseFlag(args, '--skill-exit-note') ?? ''\r\n  const commitsJson = parseFlag(args, '--commits-json')\r\n  let commits: string[] = []\r\n  if (commitsJson) {\r\n    try { commits = JSON.parse(commitsJson) as string[] } catch { commits = [] }\r\n  }\r\n  const filesTouchedJson = parseFlag(args, '--files-touched-json')\r\n  let filesTouched: string[] = []\r\n  if (filesTouchedJson) {\r\n    try { filesTouched = JSON.parse(filesTouchedJson) as string[] } catch { filesTouched = [] }\r\n  }\r\n\r\n  createPullRequest({\r\n    repo, token,\r\n    title: buildPrTitle(issue),\r\n    body: buildPrBody(issue, commits, filesTouched, skillExitNote),\r\n    head: issue.branchName,\r\n    base,\r\n  })\r\n    .then((r) => {\r\n      console.log(JSON.stringify({\r\n        ok: true,\r\n        iid: r.iid,\r\n        number: r.number,\r\n        url: r.web_url,\r\n        state: r.state,\r\n        source_branch: r.source_branch,\r\n        target_branch: r.target_branch,\r\n      }, null, 2))\r\n    })\r\n    .catch((err) => {\r\n      if (err instanceof GitcodePrError) {\r\n        console.error(`loop open-pr failed (${err.status}): ${err.message}`)\r\n      } else {\r\n        console.error(`loop open-pr failed: ${(err as Error).message}`)\r\n      }\r\n      process.exit(1)\r\n    })\r\n}\r\n\r\nfunction runFinalize(args: string[], cwd: string, docsRoot: string): void {\r\n  const issueJson = parseFlag(args, '--issue-json')\r\n  if (!issueJson) throw new Error('--issue-json is required for mark-done')\r\n  const issue = JSON.parse(issueJson) as ClassifiedIssue\r\n  const skillInvoked = (parseFlag(args, '--skill-invoked') as 'diagnose' | 'arch-driven') ?? (issue.type === 'bug' ? 'diagnose' : 'arch-driven')\r\n  const skillExitNote = parseFlag(args, '--skill-exit-note') ?? ''\r\n  const filesTouchedJson = parseFlag(args, '--files-touched-json')\r\n  let filesTouched: string[] = []\r\n  if (filesTouchedJson) {\r\n    try { filesTouched = JSON.parse(filesTouchedJson) as string[] } catch { filesTouched = [] }\r\n  }\r\n  const status = (parseFlag(args, '--status') as 'done' | 'failed' | 'ignored') ?? 'done'\r\n  const error = parseFlag(args, '--error')\r\n  const startedAt = parseFlag(args, '--started-at') ?? new Date().toISOString()\r\n  // ignored → never push (no branch was created); --no-push is redundant but honored.\r\n  const push = !args.includes('--no-push') && status !== 'ignored'\r\n\r\n  const r = finalize({\r\n    cwd,\r\n    docsRoot,\r\n    issue,\r\n    skillInvoked,\r\n    skillExitNote,\r\n    filesTouched,\r\n    status,\r\n    error,\r\n    startedAt,\r\n    push,\r\n  })\r\n  console.log(JSON.stringify({\r\n    ok: true,\r\n    branch: r.branch,\r\n    baseBranch: r.baseBranch,\r\n    commits: r.commits,\r\n    committed: r.committed,\r\n    pushed: r.pushed,\r\n    summaryPath: r.summaryPath,\r\n    doneMarkerPath: r.doneMarkerPath,\r\n    state: r.stateEntry,\r\n  }, null, 2))\r\n}\r\n","// Read/write .harness-toolkit/loop-state.json (per-project, gitignored).\r\n\r\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\r\nimport { dirname, join } from 'path'\r\nimport type { LoopState, LoopSeenEntry } from './types.js'\r\n\r\nconst DEFAULT_STATE: LoopState = {\r\n  seen: {},\r\n  lastRun: null,\r\n  lastError: null,\r\n  iterations: 0,\r\n}\r\n\r\nexport function statePath(dir: string): string {\r\n  return join(dir, '.harness-toolkit', 'loop-state.json')\r\n}\r\n\r\nexport function loadState(dir: string): LoopState {\r\n  const p = statePath(dir)\r\n  if (!existsSync(p)) {\r\n    return { seen: {}, lastRun: null, lastError: null, iterations: 0 }\r\n  }\r\n  try {\r\n    const raw = readFileSync(p, 'utf-8')\r\n    const parsed = JSON.parse(raw) as Partial<LoopState>\r\n    return {\r\n      seen: parsed.seen ?? {},\r\n      lastRun: parsed.lastRun ?? null,\r\n      lastError: parsed.lastError ?? null,\r\n      iterations: parsed.iterations ?? 0,\r\n    }\r\n  } catch (err) {\r\n    return { seen: {}, lastRun: null, lastError: `state load failed: ${(err as Error).message}`, iterations: 0 }\r\n  }\r\n}\r\n\r\nexport function saveState(dir: string, state: LoopState): void {\r\n  const p = statePath(dir)\r\n  mkdirSync(dirname(p), { recursive: true })\r\n  writeFileSync(p, JSON.stringify(state, null, 2), 'utf-8')\r\n}\r\n\r\nexport function markSeen(\r\n  dir: string,\r\n  iid: number,\r\n  entry: LoopSeenEntry,\r\n): LoopState {\r\n  const state = loadState(dir)\r\n  state.seen[iid] = entry\r\n  state.lastRun = new Date().toISOString()\r\n  state.iterations += 1\r\n  saveState(dir, state)\r\n  return state\r\n}\r\n\r\nexport function isSeen(dir: string, iid: number): boolean {\r\n  const state = loadState(dir)\r\n  return Boolean(state.seen[iid])\r\n}\r\n\r\nexport function filterUnseenIssues<T extends { iid: number }>(dir: string, issues: T[]): T[] {\r\n  const state = loadState(dir)\r\n  return issues.filter(i => !state.seen[i.iid])\r\n}\r\n","// Shared types for the loop module.\r\n\r\nexport interface GitcodeIssue {\r\n  iid: number\r\n  number: number\r\n  title: string\r\n  body: string\r\n  labels: string[]\r\n  state: 'open' | 'closed'\r\n  web_url: string\r\n  author?: { name?: string; username?: string }\r\n  created_at?: string\r\n}\r\n\r\nexport type IssueType = 'bug' | 'feature'\r\n\r\nexport interface ClassifiedIssue {\r\n  issue: GitcodeIssue\r\n  type: IssueType\r\n  reason: string\r\n  branchName: string\r\n  outputFolder: string\r\n}\r\n\r\nexport interface LoopSeenEntry {\r\n  status: 'done' | 'failed' | 'ignored'\r\n  at: string\r\n  branch?: string\r\n  error?: string\r\n}\r\n\r\nexport interface LoopState {\r\n  seen: Record<number, LoopSeenEntry>\r\n  lastRun: string | null\r\n  lastError: string | null\r\n  iterations: number\r\n}\r\n\r\nexport const GITCODE_API_BASE = 'https://api.gitcode.com/api/v5'\r\nexport const DEFAULT_REPO = 'SETools/HarnessToolKit'\r\nexport const DEFAULT_MAX_ITERATIONS = 10\r\n","// GitCode REST API client (GitLab-compatible /v5 endpoints).\r\n// Reads PAT from HARNESSTOOLKIT_GITCODE_TOKEN env var (same as branch-sync.ts).\r\n\r\nimport { GITCODE_API_BASE, DEFAULT_REPO, type GitcodeIssue } from './types.js'\r\n\r\nexport interface FetchIssuesOptions {\r\n  repo?: string\r\n  token?: string\r\n  state?: 'open' | 'closed' | 'all'\r\n  perPage?: number\r\n  maxPages?: number\r\n  fetchImpl?: typeof fetch\r\n}\r\n\r\nexport class GitcodeAPIError extends Error {\r\n  constructor(public status: number, message: string) {\r\n    super(message)\r\n    this.name = 'GitcodeAPIError'\r\n  }\r\n}\r\n\r\nfunction resolveToken(explicit?: string): string | undefined {\r\n  if (explicit) return explicit\r\n  return process.env.HARNESSTOOLKIT_GITCODE_TOKEN ?? undefined\r\n}\r\n\r\nexport async function fetchOpenIssues(opts: FetchIssuesOptions = {}): Promise<GitcodeIssue[]> {\r\n  const repo = opts.repo ?? DEFAULT_REPO\r\n  const token = resolveToken(opts.token)\r\n  const state = opts.state ?? 'open'\r\n  const perPage = Math.min(opts.perPage ?? 50, 100)\r\n  const maxPages = opts.maxPages ?? 2\r\n  const fetchImpl = opts.fetchImpl ?? fetch\r\n\r\n  const out: GitcodeIssue[] = []\r\n  for (let page = 1; page <= maxPages; page++) {\r\n    const url = `${GITCODE_API_BASE}/repos/${repo}/issues?state=${state}&page=${page}&per_page=${perPage}`\r\n    const headers: Record<string, string> = { Accept: 'application/json' }\r\n    if (token) {\r\n      headers.Authorization = `Bearer ${token}`\r\n      headers['PRIVATE-TOKEN'] = token\r\n    }\r\n    const res = await fetchImpl(url, { headers })\r\n    if (!res.ok) {\r\n      const body = await res.text().catch(() => '')\r\n      throw new GitcodeAPIError(res.status, `gitcode issues ${res.status}: ${body.slice(0, 200)}`)\r\n    }\r\n    const data = (await res.json()) as any[]\r\n    if (!Array.isArray(data)) {\r\n      // Some GitLab-compatible APIs return { issues: [...] } — handle both.\r\n      const arr = Array.isArray((data as any)?.issues) ? (data as any).issues : []\r\n      for (const raw of arr) out.push(normalizeIssue(raw))\r\n      if (arr.length < perPage) break\r\n      continue\r\n    }\r\n    if (data.length === 0) break\r\n    for (const raw of data) out.push(normalizeIssue(raw))\r\n    if (data.length < perPage) break\r\n  }\r\n  return out\r\n}\r\n\r\nfunction normalizeIssue(raw: any): GitcodeIssue {\r\n  return {\r\n    iid: Number(raw.iid ?? raw.number ?? 0),\r\n    number: Number(raw.number ?? raw.iid ?? 0),\r\n    title: String(raw.title ?? '').trim(),\r\n    body: String(raw.body ?? raw.description ?? '').trim(),\r\n    labels: Array.isArray(raw.labels)\r\n      ? raw.labels.map((l: any) => (typeof l === 'string' ? l : String(l?.name ?? '')))\r\n      : [],\r\n    state: (raw.state ?? 'open') as 'open' | 'closed',\r\n    web_url: String(raw.web_url ?? raw.html_url ?? ''),\r\n    author: raw.author ? { name: raw.author.name, username: raw.author.username } : undefined,\r\n    created_at: raw.created_at,\r\n  }\r\n}\r\n","// Slugify a string: lowercase, non-alphanumeric → '-', trim, cap length.\r\nexport function slugify(input: string, maxLen = 40): string {\r\n  const s = input\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(/[^\\p{L}\\p{N}]+/gu, '-')\r\n    .replace(/^-+|-+$/g, '')\r\n    .slice(0, maxLen)\r\n    .replace(/-+$/g, '')\r\n  return s || 'issue'\r\n}\r\n\r\n// Build branch name per git-strategy.yaml convention.\r\n//   bug      → fix/issue-<NN>-<slug>\r\n//   feature  → feat/issue-<NN>-<slug>\r\nexport function buildBranchName(type: 'bug' | 'feature', iid: number, title: string): string {\r\n  const prefix = type === 'bug' ? 'fix' : 'feat'\r\n  return `${prefix}/issue-${iid}-${slugify(title)}`\r\n}\r\n\r\n// Build output folder name under docs/loop_result/.\r\n//   issue-<NN>-<slug>\r\nexport function buildOutputFolder(iid: number, title: string): string {\r\n  return `issue-${iid}-${slugify(title)}`\r\n}\r\n","// Classify GitCode issues into bug | feature.\r\n// Strategy (G3-Q3): labels first, harness-router keyword fallback.\r\n\r\nimport type { ClassifiedIssue, GitcodeIssue, IssueType } from './types.js'\r\nimport { buildBranchName, buildOutputFolder } from './naming.js'\r\n\r\nconst BUG_LABELS = new Set(['bug', 'defect', 'regression', 'incident'])\r\nconst FEATURE_LABELS = new Set(['feature', 'enhancement', 'feat', 'proposal', 'request'])\r\n\r\n// Mirrors harness-router/SKILL.md keyword table (subset).\r\nconst BUG_KEYWORDS = [\r\n  'bug', 'broken', 'failing', 'fails', 'throwing', 'throws', 'error', 'crash',\r\n  'regression', 'hang', 'deadlock', 'exception', 'panic',\r\n  '报错', '出错', '错误', '失败', '挂了', '崩了', '崩溃', '卡死', '死锁',\r\n  '回归', '不工作', '跑不起来', '抛异常', '排查',\r\n]\r\nconst FEATURE_KEYWORDS = [\r\n  'add', 'implement', 'refactor', 'support', '新增', '实现', '重构',\r\n  '支持', '修改', '优化', '调整', '加一个', 'feature',\r\n]\r\n\r\nfunction hasKeyword(text: string, keywords: string[]): string | null {\r\n  const lower = text.toLowerCase()\r\n  for (const kw of keywords) {\r\n    if (lower.includes(kw.toLowerCase())) return kw\r\n  }\r\n  return null\r\n}\r\n\r\nexport interface ClassifyResult {\r\n  type: IssueType\r\n  reason: string\r\n}\r\n\r\nexport function classifyIssue(issue: GitcodeIssue): ClassifyResult {\r\n  const labels = issue.labels.map(l => l.toLowerCase())\r\n\r\n  // Labels first — authoritative when present.\r\n  for (const l of labels) {\r\n    if (BUG_LABELS.has(l)) return { type: 'bug', reason: `label:${l}` }\r\n  }\r\n  for (const l of labels) {\r\n    if (FEATURE_LABELS.has(l)) return { type: 'feature', reason: `label:${l}` }\r\n  }\r\n\r\n  // Keyword fallback — title takes precedence over body.\r\n  const titleKw = hasKeyword(issue.title, BUG_KEYWORDS)\r\n  if (titleKw) return { type: 'bug', reason: `title-kw:${titleKw}` }\r\n  const titleFeatKw = hasKeyword(issue.title, FEATURE_KEYWORDS)\r\n  if (titleFeatKw) return { type: 'feature', reason: `title-kw:${titleFeatKw}` }\r\n\r\n  const bodyKw = hasKeyword(issue.body, BUG_KEYWORDS)\r\n  if (bodyKw) return { type: 'bug', reason: `body-kw:${bodyKw}` }\r\n  const bodyFeatKw = hasKeyword(issue.body, FEATURE_KEYWORDS)\r\n  if (bodyFeatKw) return { type: 'feature', reason: `body-kw:${bodyFeatKw}` }\r\n\r\n  // Default: feature (safer to route to /arch-driven which has sign-off gates\r\n  // than to /diagnose which assumes a bug exists).\r\n  return { type: 'feature', reason: 'default-feature' }\r\n}\r\n\r\nexport function toClassified(issue: GitcodeIssue): ClassifiedIssue {\r\n  const { type, reason } = classifyIssue(issue)\r\n  return {\r\n    issue,\r\n    type,\r\n    reason,\r\n    branchName: buildBranchName(type, issue.iid, issue.title),\r\n    outputFolder: buildOutputFolder(issue.iid, issue.title),\r\n  }\r\n}\r\n","// Git helpers — create branch, commit, push. Wraps src/git-engine/branch.ts\r\n// for branch creation and adds commit + push (which git-engine doesn't expose).\r\n\r\nimport { execSync } from 'child_process'\r\nimport { createBranch, loadStrategy } from '../git-engine/index.js'\r\nimport type { BranchStrategy } from '../git-engine/types.js'\r\n\r\nexport interface BranchCreateResult {\r\n  branchName: string\r\n  baseBranch: string\r\n  created: boolean\r\n  alreadyExisted: boolean\r\n}\r\n\r\nexport function resolveStrategy(cwd: string, strategyPath?: string): BranchStrategy {\r\n  const path = strategyPath ?? `${cwd}/git-strategy.yaml`\r\n  return loadStrategy(path)\r\n}\r\n\r\nexport function createIssueBranch(\r\n  cwd: string,\r\n  type: 'bug' | 'feature',\r\n  iid: number,\r\n  title: string,\r\n  strategyPath?: string,\r\n): BranchCreateResult {\r\n  const strategy = resolveStrategy(cwd, strategyPath)\r\n  // git-engine uses `${prefix}${id}` — we want `${prefix}issue-${iid}-${slug}`.\r\n  // Pass the full branch name as the `id` so createBranch assembles `fix/<id>`.\r\n  // But createBranch prepends prefix itself; so pass id = `issue-${iid}-${slug}`.\r\n  const slugified = slugifyTitle(title)\r\n  const id = `issue-${iid}-${slugified}`\r\n  const typeConfig = strategy.types.find(t => t.name === type)\r\n  if (!typeConfig) {\r\n    throw new Error(`Branch type \"${type}\" not in git-strategy.yaml (have: ${strategy.types.map(t => t.name).join(', ')})`)\r\n  }\r\n  const result = createBranch(type, id, strategy, cwd)\r\n  // checkout the branch\r\n  execSync(`git checkout \"${result.branchName}\"`, { cwd, encoding: 'utf-8', stdio: 'pipe' })\r\n  return result\r\n}\r\n\r\nfunction slugifyTitle(s: string): string {\r\n  return s\r\n    .toLowerCase()\r\n    .trim()\r\n    .replace(/[^\\p{L}\\p{N}]+/gu, '-')\r\n    .replace(/^-+|-+$/g, '')\r\n    .slice(0, 40)\r\n    .replace(/-+$/g, '') || 'issue'\r\n}\r\n\r\nexport interface CommitAndPushResult {\r\n  branch: string\r\n  committed: boolean\r\n  pushed: boolean\r\n  commitHash: string | null\r\n  commitMessage: string\r\n  raw: string\r\n}\r\n\r\nexport function commitAndPush(\r\n  cwd: string,\r\n  branch: string,\r\n  commitMessage: string,\r\n  options: { push?: boolean; remote?: string } = {},\r\n): CommitAndPushResult {\r\n  const push = options.push ?? true\r\n  const remote = options.remote ?? 'origin'\r\n\r\n  // Ensure on the right branch.\r\n  const currentBranch = execSync('git rev-parse --abbrev-ref HEAD', { cwd, encoding: 'utf-8' }).trim()\r\n  if (currentBranch !== branch) {\r\n    execSync(`git checkout \"${branch}\"`, { cwd, encoding: 'utf-8', stdio: 'pipe' })\r\n  }\r\n\r\n  // Stage all changes.\r\n  execSync('git add -A', { cwd, encoding: 'utf-8', stdio: 'pipe' })\r\n\r\n  // Check whether there is anything to commit.\r\n  const staged = execSync('git diff --cached --name-only', { cwd, encoding: 'utf-8' }).trim()\r\n  let committed = false\r\n  let commitHash: string | null = null\r\n  if (staged.length > 0) {\r\n    execSync(`git commit -m \"${commitMessage.replace(/\"/g, '\\\\\"')}\"`, {\r\n      cwd,\r\n      encoding: 'utf-8',\r\n      stdio: 'pipe',\r\n    })\r\n    committed = true\r\n    commitHash = execSync('git rev-parse HEAD', { cwd, encoding: 'utf-8' }).trim()\r\n  }\r\n\r\n  let pushed = false\r\n  if (push && committed) {\r\n    execSync(`git push \"${remote}\" \"${branch}\"`, { cwd, encoding: 'utf-8', stdio: 'pipe' })\r\n    pushed = true\r\n  } else if (push && !committed) {\r\n    // Branch may already have commits pushed by the skill itself (skill runs git commit).\r\n    // Try push anyway — git push is a no-op if nothing to push.\r\n    try {\r\n      execSync(`git push \"${remote}\" \"${branch}\"`, { cwd, encoding: 'utf-8', stdio: 'pipe' })\r\n      pushed = true\r\n    } catch {\r\n      pushed = false\r\n    }\r\n  }\r\n\r\n  return {\r\n    branch,\r\n    committed,\r\n    pushed,\r\n    commitHash,\r\n    commitMessage,\r\n    raw: '',\r\n  }\r\n}\r\n\r\nexport function listBranchCommits(cwd: string, branch: string, baseBranch: string): string[] {\r\n  try {\r\n    const out = execSync(\r\n      `git log \"${baseBranch}..${branch}\" --pretty=format:\"%h %s\"`,\r\n      { cwd, encoding: 'utf-8', stdio: 'pipe' },\r\n    ).trim()\r\n    if (!out) return []\r\n    return out.split('\\n').filter(Boolean)\r\n  } catch {\r\n    return []\r\n  }\r\n}\r\n","import { readFileSync } from 'fs'\r\nimport { parse as parseYaml } from 'yaml'\r\nimport type { BranchStrategy } from './types.js'\r\n\r\nexport function loadStrategy(yamlPath: string): BranchStrategy {\r\n  const raw = readFileSync(yamlPath, 'utf-8')\r\n  const parsed = parseYaml(raw)\r\n  return parsed.git_strategy as BranchStrategy\r\n}\r\n","import { execSync } from 'child_process'\r\nimport type { BranchStrategy, BranchResult } from './types.js'\r\n\r\nexport function createBranch(type: string, id: string, strategy: BranchStrategy, cwd?: string): BranchResult {\r\n  const typeConfig = strategy.types.find(t => t.name === type)\r\n  if (!typeConfig) {\r\n    throw new Error(`Unknown branch type: ${type}`)\r\n  }\r\n\r\n  const branchName = `${typeConfig.prefix}${id}`\r\n  const baseBranch = strategy.defaults.main_branch\r\n\r\n  const existing = execSync(`git branch --list \"${branchName}\"`, { encoding: 'utf-8', cwd }).trim()\r\n  if (existing) {\r\n    return { branchName, baseBranch, created: false, alreadyExisted: true }\r\n  }\r\n\r\n  execSync(`git branch \"${branchName}\" \"${baseBranch}\"`, { encoding: 'utf-8', cwd })\r\n  return { branchName, baseBranch, created: true, alreadyExisted: false }\r\n}\r\n\r\nexport function getMergeTarget(type: string, strategy: BranchStrategy): string {\r\n  const typeConfig = strategy.types.find(t => t.name === type)\r\n  if (!typeConfig) {\r\n    throw new Error(`Unknown branch type: ${type}`)\r\n  }\r\n  return typeConfig.merge_to\r\n}\r\n","// Write docs/loop_result/<issue-NN>-<slug>/SUMMARY.md per issue.\r\n\r\nimport { existsSync, mkdirSync, writeFileSync } from 'fs'\r\nimport { join } from 'path'\r\nimport type { ClassifiedIssue } from './types.js'\r\n\r\nexport interface SummaryPayload {\r\n  issue: ClassifiedIssue\r\n  status: 'done' | 'failed' | 'ignored'\r\n  branch: string\r\n  commits: string[]        // commit hashes/messages pushed to the branch\r\n  filesTouched: string[]   // paths the skill edited (best-effort, may be empty)\r\n  skillInvoked: 'diagnose' | 'arch-driven'\r\n  skillExitNote: string    // free-form: what the skill reported on exit\r\n  error?: string\r\n  startedAt: string\r\n  finishedAt: string\r\n}\r\n\r\nexport function summaryPath(docsRoot: string, issue: ClassifiedIssue): string {\r\n  return join(docsRoot, 'loop_result', issue.outputFolder, 'SUMMARY.md')\r\n}\r\n\r\nexport function renderSummaryMarkdown(p: SummaryPayload): string {\r\n  const { issue, status, branch, commits, filesTouched, skillInvoked, skillExitNote, error, startedAt, finishedAt } = p\r\n  const lines: string[] = []\r\n  lines.push(`# Loop Result — ${issue.issue.title}`)\r\n  lines.push('')\r\n  lines.push('---')\r\n  lines.push(`issue_iid: ${issue.issue.iid}`)\r\n  lines.push(`issue_url: ${issue.issue.web_url}`)\r\n  lines.push(`type: ${issue.type}`)\r\n  lines.push(`classify_reason: ${issue.reason}`)\r\n  lines.push(`status: ${status}`)\r\n  lines.push(`branch: ${branch}`)\r\n  lines.push(`skill: ${skillInvoked}`)\r\n  lines.push(`started_at: ${startedAt}`)\r\n  lines.push(`finished_at: ${finishedAt}`)\r\n  if (error) lines.push(`error: ${error.replace(/\\n/g, ' ')}`)\r\n  lines.push('---')\r\n  lines.push('')\r\n  lines.push('## Issue body (excerpt)')\r\n  lines.push('')\r\n  const bodyExcerpt = issue.issue.body.slice(0, 1200) || '(empty)'\r\n  lines.push('```')\r\n  lines.push(bodyExcerpt)\r\n  lines.push('```')\r\n  lines.push('')\r\n  lines.push('## Commits pushed')\r\n  lines.push('')\r\n  if (commits.length === 0) {\r\n    lines.push(status === 'ignored' ? '_(ignored — no branch created, no commits)_' : '_(none — skill did not produce commits)_')\r\n  } else {\r\n    for (const c of commits) lines.push(`- ${c}`)\r\n  }\r\n  lines.push('')\r\n  lines.push('## Files touched (best-effort)')\r\n  lines.push('')\r\n  if (filesTouched.length === 0) {\r\n    lines.push('_(none reported — skill may have committed via git CLI without listing files)_')\r\n  } else {\r\n    for (const f of filesTouched) lines.push(`- ${f}`)\r\n  }\r\n  lines.push('')\r\n  lines.push('## Skill exit note')\r\n  lines.push('')\r\n  lines.push(skillExitNote || '_(empty)_')\r\n  lines.push('')\r\n  return lines.join('\\n')\r\n}\r\n\r\nexport function writeSummary(docsRoot: string, payload: SummaryPayload): string {\r\n  const path = summaryPath(docsRoot, payload.issue)\r\n  mkdirSync(join(path, '..'), { recursive: true })\r\n  writeFileSync(path, renderSummaryMarkdown(payload), 'utf-8')\r\n  return path\r\n}\r\n\r\n// Marker file the loop runner checks for the \"done\" signal (G3-Q5 dual signal).\r\nexport function writeDoneMarker(docsRoot: string, issue: ClassifiedIssue, status: 'done' | 'failed' | 'ignored'): string {\r\n  const dir = join(docsRoot, 'loop_result', issue.outputFolder)\r\n  mkdirSync(dir, { recursive: true })\r\n  const path = join(dir, 'DONE.json')\r\n  writeFileSync(path, JSON.stringify({ status, at: new Date().toISOString() }, null, 2), 'utf-8')\r\n  return path\r\n}\r\n\r\nexport function isDone(docsRoot: string, issue: ClassifiedIssue): boolean {\r\n  return existsSync(join(docsRoot, 'loop_result', issue.outputFolder, 'DONE.json'))\r\n}\r\n","// Pure-logic orchestrator for one loop iteration.\r\n// The /loop skill (claude session) calls these functions via Bash →\r\n// `harness-toolkit loop <sub>`. The runner does NOT invoke skills —\r\n// that's the skill's job (it has the Skill tool; the runner doesn't).\r\n\r\nimport { fetchOpenIssues } from './gitcode-issues.js'\r\nimport { toClassified } from './router.js'\r\nimport { filterUnseenIssues, markSeen, loadState } from './state.js'\r\nimport { createIssueBranch, commitAndPush, listBranchCommits, resolveStrategy } from './git-helpers.js'\r\nimport { writeSummary, writeDoneMarker } from './summarizer.js'\r\nimport { DEFAULT_MAX_ITERATIONS } from './types.js'\r\nimport type { ClassifiedIssue, GitcodeIssue, LoopSeenEntry } from './types.js'\r\n\r\nexport interface NextIssueOptions {\r\n  cwd: string\r\n  repo?: string\r\n  token?: string\r\n  fetchImpl?: typeof fetch\r\n}\r\n\r\nexport interface NextIssueResult {\r\n  done: boolean\r\n  issue?: ClassifiedIssue\r\n  reason: string\r\n  iterations: number\r\n  maxIterations: number\r\n}\r\n\r\n// Returns the next unprocessed open issue, classified + with branch name.\r\n// `done: true` means: either no more open issues, OR max-iterations hit.\r\nexport async function nextIssue(opts: NextIssueOptions): Promise<NextIssueResult> {\r\n  const state = loadState(opts.cwd)\r\n  const maxIterations = DEFAULT_MAX_ITERATIONS\r\n  if (state.iterations >= maxIterations) {\r\n    return { done: true, reason: `max-iterations cap (${maxIterations}) hit`, iterations: state.iterations, maxIterations }\r\n  }\r\n\r\n  let issues: GitcodeIssue[]\r\n  try {\r\n    issues = await fetchOpenIssues({ repo: opts.repo, token: opts.token, fetchImpl: opts.fetchImpl })\r\n  } catch (err) {\r\n    throw new Error(`fetch issues failed: ${(err as Error).message}`)\r\n  }\r\n\r\n  const unseen = filterUnseenIssues(opts.cwd, issues)\r\n  if (unseen.length === 0) {\r\n    return { done: true, reason: 'no open unprocessed issues', iterations: state.iterations, maxIterations }\r\n  }\r\n\r\n  // Pick lowest iid — deterministic order.\r\n  unseen.sort((a, b) => a.iid - b.iid)\r\n  const issue = toClassified(unseen[0])\r\n  return { done: false, issue, reason: `picked iid=${issue.issue.iid} (${issue.type}, ${issue.reason})`, iterations: state.iterations, maxIterations }\r\n}\r\n\r\nexport interface SetupBranchResult {\r\n  branchName: string\r\n  baseBranch: string\r\n  created: boolean\r\n  alreadyExisted: boolean\r\n}\r\n\r\nexport function setupBranch(opts: { cwd: string; issue: ClassifiedIssue; strategyPath?: string }): SetupBranchResult {\r\n  const r = createIssueBranch(opts.cwd, opts.issue.type, opts.issue.issue.iid, opts.issue.issue.title, opts.strategyPath)\r\n  return r\r\n}\r\n\r\nexport interface FinalizeResult {\r\n  branch: string\r\n  baseBranch: string\r\n  commits: string[]\r\n  committed: boolean\r\n  pushed: boolean\r\n  summaryPath: string\r\n  doneMarkerPath: string\r\n  stateEntry: LoopSeenEntry\r\n}\r\n\r\n// Called by the skill AFTER it has run /diagnose or /arch-driven.\r\n// `skillExitNote` and `filesTouched` are best-effort payloads from the skill.\r\n// `status: 'ignored'` short-circuits all git operations — used when the user\r\n// marks an issue as irrelevant to this repo (no branch, no commit, no push).\r\nexport function finalize(opts: {\r\n  cwd: string\r\n  docsRoot: string\r\n  issue: ClassifiedIssue\r\n  skillInvoked: 'diagnose' | 'arch-driven'\r\n  skillExitNote: string\r\n  filesTouched: string[]\r\n  status: 'done' | 'failed' | 'ignored'\r\n  error?: string\r\n  startedAt: string\r\n  push?: boolean\r\n}): FinalizeResult {\r\n  let baseBranch = 'main'\r\n  let commits: string[] = []\r\n  let committed = false\r\n  let pushed = false\r\n\r\n  if (opts.status !== 'ignored') {\r\n    const strategy = resolveStrategy(opts.cwd)\r\n    const typeConfig = strategy.types.find(t => t.name === opts.issue.type)\r\n    if (!typeConfig) {\r\n      throw new Error(`Branch type \"${opts.issue.type}\" not in git-strategy.yaml (have: ${strategy.types.map(t => t.name).join(', ')})`)\r\n    }\r\n    baseBranch = typeConfig.merge_to\r\n\r\n    const cpr = commitAndPush(opts.cwd, opts.issue.branchName, buildCommitMessage(opts.issue), { push: opts.push ?? true })\r\n    commits = listBranchCommits(opts.cwd, opts.issue.branchName, baseBranch)\r\n    committed = cpr.committed\r\n    pushed = cpr.pushed\r\n  }\r\n\r\n  const summaryPath = writeSummary(opts.docsRoot, {\r\n    issue: opts.issue,\r\n    status: opts.status,\r\n    branch: opts.issue.branchName,\r\n    commits,\r\n    filesTouched: opts.filesTouched,\r\n    skillInvoked: opts.skillInvoked,\r\n    skillExitNote: opts.skillExitNote,\r\n    error: opts.error,\r\n    startedAt: opts.startedAt,\r\n    finishedAt: new Date().toISOString(),\r\n  })\r\n  const doneMarkerPath = writeDoneMarker(opts.docsRoot, opts.issue, opts.status)\r\n\r\n  const stateEntry: LoopSeenEntry = {\r\n    status: opts.status,\r\n    at: new Date().toISOString(),\r\n    branch: opts.issue.branchName,\r\n    error: opts.error,\r\n  }\r\n  markSeen(opts.cwd, opts.issue.issue.iid, stateEntry)\r\n\r\n  return {\r\n    branch: opts.issue.branchName,\r\n    baseBranch,\r\n    commits,\r\n    committed,\r\n    pushed,\r\n    summaryPath,\r\n    doneMarkerPath,\r\n    stateEntry,\r\n  }\r\n}\r\n\r\nexport function buildCommitMessage(issue: ClassifiedIssue): string {\r\n  const tag = issue.type === 'bug' ? 'fix' : 'feat'\r\n  return `${tag}(loop): resolve issue #${issue.issue.iid} — ${issue.issue.title.slice(0, 60)}`\r\n}\r\n\r\n// Build the args string the skill passes to /diagnose or /arch-driven.\r\nexport function buildSkillArgs(issue: ClassifiedIssue, branch: string): string {\r\n  return [\r\n    `issue_iid=${issue.issue.iid}`,\r\n    `issue_title=${issue.issue.title}`,\r\n    `issue_body=${issue.issue.body.slice(0, 800)}`,\r\n    `issue_url=${issue.issue.web_url}`,\r\n    `branch=${branch}`,\r\n    `type=${issue.type}`,\r\n  ].join('\\n')\r\n}\r\n\r\n// Helper for the /loop skill: report which skill to invoke.\r\nexport function skillForType(type: 'bug' | 'feature'): 'diagnose' | 'arch-driven' {\r\n  return type === 'bug' ? 'diagnose' : 'arch-driven'\r\n}\r\n","// GitCode PR/MR creation client (GitLab-compatible /v5 endpoint).\r\n// Reads PAT from HARNESSTOOLKIT_GITCODE_TOKEN env var (same as gitcode-issues.ts).\r\n\r\nimport { GITCODE_API_BASE, DEFAULT_REPO, type ClassifiedIssue } from './types.js'\r\n\r\nexport interface CreatePrOptions {\r\n  repo?: string\r\n  token?: string\r\n  fetchImpl?: typeof fetch\r\n}\r\n\r\nexport interface CreatePrResult {\r\n  iid: number\r\n  number: number\r\n  web_url: string\r\n  state: string\r\n  source_branch: string\r\n  target_branch: string\r\n}\r\n\r\nexport class GitcodePrError extends Error {\r\n  constructor(public status: number, message: string) {\r\n    super(message)\r\n    this.name = 'GitcodePrError'\r\n  }\r\n}\r\n\r\nfunction resolveToken(explicit?: string): string | undefined {\r\n  if (explicit) return explicit\r\n  return process.env.HARNESSTOOLKIT_GITCODE_TOKEN ?? undefined\r\n}\r\n\r\nexport function buildPrTitle(issue: ClassifiedIssue): string {\r\n  const tag = issue.type === 'bug' ? 'fix' : 'feat'\r\n  return `${tag}(loop): resolve issue #${issue.issue.iid} — ${issue.issue.title.slice(0, 60)}`\r\n}\r\n\r\nexport function buildPrBody(issue: ClassifiedIssue, commits: string[], filesTouched: string[], skillExitNote: string): string {\r\n  const iid = issue.issue.iid\r\n  const lines: string[] = []\r\n  lines.push(`## Summary`)\r\n  lines.push('')\r\n  lines.push(`Resolves gitcode issue #${iid} via /issue-loop.`)\r\n  lines.push('')\r\n  lines.push(`- issue: ${issue.issue.web_url}`)\r\n  lines.push(`- type: ${issue.type} (classify reason: ${issue.reason})`)\r\n  lines.push(`- branch: ${issue.branchName}`)\r\n  lines.push(`- skill invoked: ${issue.type === 'bug' ? 'diagnose' : 'arch-driven'}`)\r\n  lines.push('')\r\n  lines.push(`## Issue (excerpt)`)\r\n  lines.push('')\r\n  lines.push('```')\r\n  lines.push(issue.issue.body.slice(0, 1200) || '(empty)')\r\n  lines.push('```')\r\n  lines.push('')\r\n  lines.push(`## Commits pushed`)\r\n  lines.push('')\r\n  if (commits.length === 0) {\r\n    lines.push('_(none)_')\r\n  } else {\r\n    for (const c of commits) lines.push(`- ${c}`)\r\n  }\r\n  lines.push('')\r\n  lines.push(`## Files touched (best-effort)`)\r\n  lines.push('')\r\n  if (filesTouched.length === 0) {\r\n    lines.push('_(none reported)_')\r\n  } else {\r\n    for (const f of filesTouched) lines.push(`- ${f}`)\r\n  }\r\n  lines.push('')\r\n  lines.push(`## Skill exit note`)\r\n  lines.push('')\r\n  lines.push(skillExitNote || '_(empty)_')\r\n  lines.push('')\r\n  lines.push('---')\r\n  lines.push('')\r\n  // Gitea/GitCode auto-close keyword — must be \"Resolves #<iid>\" (keyword + space + # + number)\r\n  // so GitCode links the PR to the issue and closes it on merge.\r\n  lines.push(`Resolves #${iid}`)\r\n  lines.push('')\r\n  lines.push('🤖 Generated with [Claude Code](https://claude.com/claude-code) via /issue-loop')\r\n  return lines.join('\\n')\r\n}\r\n\r\nexport async function createPullRequest(opts: CreatePrOptions & {\r\n  title: string\r\n  body: string\r\n  head: string\r\n  base: string\r\n}): Promise<CreatePrResult> {\r\n  const repo = opts.repo ?? DEFAULT_REPO\r\n  const token = resolveToken(opts.token)\r\n  const fetchImpl = opts.fetchImpl ?? fetch\r\n\r\n  if (!token) {\r\n    throw new GitcodePrError(401, 'HARNESSTOOLKIT_GITCODE_TOKEN not set (PR creation requires authentication)')\r\n  }\r\n\r\n  const url = `${GITCODE_API_BASE}/repos/${repo}/pulls`\r\n  const res = await fetchImpl(url, {\r\n    method: 'POST',\r\n    headers: {\r\n      'Content-Type': 'application/json',\r\n      Accept: 'application/json',\r\n      Authorization: `Bearer ${token}`,\r\n      'PRIVATE-TOKEN': token,\r\n    },\r\n    body: JSON.stringify({\r\n      title: opts.title,\r\n      body: opts.body,\r\n      head: opts.head,\r\n      base: opts.base,\r\n    }),\r\n  })\r\n\r\n  if (!res.ok) {\r\n    const text = await res.text().catch(() => '')\r\n    throw new GitcodePrError(res.status, `gitcode createPr ${res.status}: ${text.slice(0, 300)}`)\r\n  }\r\n\r\n  const data = (await res.json()) as any\r\n  return {\r\n    iid: Number(data.iid ?? data.number ?? 0),\r\n    number: Number(data.number ?? data.iid ?? 0),\r\n    web_url: String(data.web_url ?? ''),\r\n    state: String(data.state ?? 'opened'),\r\n    source_branch: String(data.source_branch ?? opts.head),\r\n    target_branch: String(data.target_branch ?? opts.base),\r\n  }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,aAAgF;AAChF,IAAAC,eAA8B;;;ACD9B,IAAAC,aAAyC;AACzC,IAAAC,eAA8B;AAC9B,IAAAC,eAAmC;;;ACFnC,IAAAC,aAAsD;AACtD,2BAAyB;AACzB,IAAAC,eAAmC;AACnC,kBAA6C;;;ACH7C,gBAAyC;AACzC,kBAAmC;AAkE5B,SAAS,aAAaC,OAAoC;AAC/D,MAAI,KAAC,sBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,4BAA4BA,KAAI,EAAE;AAAA,EACpD;AACA,QAAM,UAAM,wBAAaA,OAAM,OAAO;AACtC,QAAM,aAAS,YAAAC,OAAU,GAAG;AAE5B,MAAI,CAAC,OAAO,mBAAmB;AAC7B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AAEA,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,YAAY,OAAO,cAAc;AAAA,IACjC,aAAa,OAAO;AAAA,IACpB,mBAAmB;AAAA,MACjB,WAAW,OAAO,kBAAkB,YAAY,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QACnE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,QACnB,cAAc,EAAE,gBAAgB;AAAA,MAClC,EAAE;AAAA,MACF,YAAY,OAAO,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QACrE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,MACrB,EAAE;AAAA,MACF,YAAY,OAAO,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QACrE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,MACrB,EAAE;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,MACjB,qBAAqB,OAAO,mBAAmB,uBAAuB;AAAA,IACxE;AAAA,IACA,uBAAuB,OAAO;AAAA,IAC9B,iBAAiB,OAAO;AAAA,IACxB,iBAAiB,OAAO;AAAA,IACxB,8BAA8B,OAAO;AAAA,EACvC;AACF;AAEO,SAAS,iBAAiB,UAAoD;AACnF,QAAM,SAAmB,CAAC;AAC1B,QAAM,EAAE,UAAU,WAAW,UAAU,IAAI,SAAS;AAEpD,MAAI,SAAS,WAAW,KAAK,UAAU,WAAW,KAAK,UAAU,WAAW,GAAG;AAC7E,WAAO,KAAK,gFAA2E;AAAA,EACzF;AAEA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,KAAK,+FAA0F;AAAA,EACxG;AAEA,QAAM,qBAAqB,CAAC,GAAG,UAAU,GAAG,SAAS,EAAE,QAAQ,OAAK,EAAE,KAAK;AAC3E,QAAM,oBAAoB,UAAU,QAAQ,OAAK,EAAE,KAAK;AACxD,aAAW,MAAM,mBAAmB;AAClC,QAAI,mBAAmB,SAAS,EAAE,GAAG;AACnC,aAAO,KAAK,mBAAmB,EAAE,oDAAoD;AAAA,IACvF;AAAA,EACF;AAGA,QAAM,aAAa,SAAS;AAC5B,MAAI,YAAY;AACd,eAAW,QAAQ,CAAC,YAAY,mBAAmB,SAAS,GAAY;AACtE,YAAM,WAAW,WAAW,IAAwC;AACpE,UAAI,aAAa,UAAa,MAAM,QAAQ,QAAQ,KAAK,SAAS,WAAW,GAAG;AAG9E,eAAO,KAAK,yCAAyC,IAAI,8DAAyD;AAAA,MACpH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;AAEO,SAAS,gBAAgB,UAAkB,SAA0B;AAC1E,QAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,MAAI,QAAQ,SAAS,KAAK,GAAG;AAC3B,UAAM,SAAS,QAAQ,MAAM,GAAG,EAAE;AAClC,WAAO,eAAe,UAAU,WAAW,WAAW,SAAS,GAAG;AAAA,EACpE;AACA,MAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,UAAM,WAAW,QACd,QAAQ,qBAAqB,MAAM,EACnC,QAAQ,SAAS,IAAI,EACrB,QAAQ,OAAO,OAAO,EACtB,QAAQ,OAAO,MAAM;AACxB,WAAO,IAAI,OAAO,IAAI,QAAQ,GAAG,EAAE,KAAK,UAAU;AAAA,EACpD;AACA,SAAO,eAAe,WAAW,WAAW,WAAW,UAAU,GAAG;AACtE;AAEO,SAAS,WAAW,UAAgC,cAAqC;AAC9F,QAAM,UAAoB,CAAC;AAC3B,QAAM,aAAkE,CAAC;AAEzE,QAAM,mBAAmB,SAAS,kBAAkB,SAAS,QAAQ,OAAK,EAAE,MAAM,IAAI,QAAM,EAAE,SAAS,GAAG,cAAc,EAAE,gBAAgB,KAAoB,EAAE,CAAC;AACjK,QAAM,mBAAmB,SAAS,kBAAkB,UAAU,QAAQ,OAAK,EAAE,KAAK;AAClF,QAAM,qBAAqB,CAAC,GAAG,iBAAiB,IAAI,OAAK,EAAE,OAAO,GAAG,GAAG,gBAAgB;AAExF,aAAW,QAAQ,cAAc;AAC/B,UAAM,kBAAkB,iBAAiB,KAAK,OAAK,gBAAgB,MAAM,EAAE,OAAO,CAAC;AACnF,QAAI,iBAAiB;AACnB,UAAI,gBAAgB,iBAAiB,QAAQ,gBAAgB,iBAAiB,MAAM;AAClF,mBAAW,KAAK,EAAE,MAAM,cAAc,gBAAgB,aAAa,CAAC;AAAA,MACtE,OAAO;AACL,gBAAQ,KAAK,IAAI;AAAA,MACnB;AAAA,IACF,WAAW,iBAAiB,KAAK,OAAK,gBAAgB,MAAM,CAAC,CAAC,GAAG;AAC/D,iBAAW,KAAK,EAAE,KAAK,CAAC;AAAA,IAC1B,WAAW,mBAAmB,WAAW,KAAK,CAAC,mBAAmB,KAAK,OAAK,gBAAgB,MAAM,CAAC,CAAC,GAAG;AACrG,iBAAW,KAAK,EAAE,KAAK,CAAC;AAAA,IAC1B,OAAO;AACL,cAAQ,KAAK,IAAI;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,QAAQ,WAAW,WAAW,EAAE;AAChE;;;ADjLA,SAAS,cAAc,SAA2B,KAAqD;AACrG,QAAM,WAAW,EAAE,GAAG,IAAI;AAE1B,MAAI,CAAC,SAAS,cAAc;AAC1B,aAAS,eAAe,QAAQ,eAAe,QAAQ,IAAI;AAAA,EAC7D;AAGA,MAAI,SAAS,cAAc;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,YAAY,SAAS,cAAc,SAAS,UAAU,SAAS,QAAQ,KAAK,SAAS;AAC3F,MAAI,WAAW;AACb,UAAM,OAAO,QAAQ,eAAe,QAAQ,IAAI;AAChD,UAAM,gBAAgB;AAAA,UACpB,kBAAK,MAAM,YAAY,0BAA0B,WAAW,gCAAgC;AAAA,UAC5F,kBAAK,MAAM,YAAY,0BAA0B,WAAW,yBAAyB;AAAA,UACrF,kBAAK,MAAM,QAAQ,cAAc,0BAA0B,WAAW,yBAAyB;AAAA,IACjG;AAEA,eAAW,gBAAgB,eAAe;AACxC,UAAI,KAAC,uBAAW,YAAY,EAAG;AAC/B,UAAI;AACF,cAAM,OAAO,oBAAgB,yBAAa,cAAc,OAAO,CAAC;AAChE,cAAM,cAAc,aAAa,MAAM,oBAAoB;AAC3D,YAAI,OAAO,gBAAgB,YAAY,YAAY,KAAK,EAAE,SAAS,GAAG;AACpE,mBAAS,eAAe,YAAY,KAAK;AACzC;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAIA,MAAI,CAAC,SAAS,cAAc;AAC1B,aAAS,eAAe;AAAA,EAC1B;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,UAAkB,SAAyC;AAC9E,SAAO,SAAS,QAAQ,cAAc,CAAC,GAAG,QAAQ,QAAQ,GAAG,KAAK,IAAI,GAAG,GAAG;AAC9E;AAEA,SAAS,UAAU,UAAkB,UAAgC,aAA8B;AACjG,MAAI,CAAC,YAAY,SAAS,WAAW,EAAG,QAAO;AAE/C,QAAM,UAAM,sBAAS,aAAa,QAAQ,EAAE,MAAM,eAAG,EAAE,KAAK,GAAG;AAC/D,QAAM,iBAAiB,YAAY,MAAM,eAAG,EAAE,KAAK,GAAG;AACtD,QAAM,UAAU,SAAS,MAAM,eAAG,EAAE,KAAK,GAAG;AAC5C,aAAW,WAAW,UAAU;AAC9B,QAAI,UAAU,KAAK,OAAO,EAAG,QAAO;AAEpC,QAAI,UAAU,SAAS,OAAO,EAAG,QAAO;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAyB;AAC5C,SAAO,QACJ,QAAQ,qBAAqB,MAAM,EACnC,QAAQ,SAAS,gBAAgB,EACjC,QAAQ,OAAO,OAAO,EACtB,QAAQ,mBAAmB,IAAI,EAC/B,QAAQ,OAAO,MAAM;AAC1B;AAEA,SAAS,UAAU,KAAa,SAA0B;AAExD,MAAI,QAAQ,WAAW,KAAK,GAAG;AAC7B,UAAM,OAAO,YAAY,QAAQ,MAAM,CAAC,CAAC;AACzC,WAAO,IAAI,OAAO,YAAY,IAAI,GAAG,EAAE,KAAK,GAAG;AAAA,EACjD;AACA,SAAO,IAAI,OAAO,IAAI,YAAY,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG;AACzD;AAEA,SAAS,eAAe,MAAgB,SAA6C;AACnF,QAAM,WAAW,KAAK,OAAO,YAAY,KAAK,MAAM,OAAO,IAAI;AAC/D,MAAI,CAAC,YAAY,KAAC,uBAAW,QAAQ,GAAG;AACtC,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,mBAAmB,QAAQ,GAAG;AAAA,EAChL;AAEA,MAAI;AACF,UAAM,cAAU,yBAAa,UAAU,OAAO;AAC9C,UAAM,OAAO,gBAAgB,OAAO;AAEpC,eAAW,SAAU,KAAK,mBAAmB,CAAC,GAAI;AAChD,UAAI,CAAC,aAAa,MAAM,KAAK,GAAG;AAC9B,eAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,kBAAkB,KAAK,GAAG;AAAA,MAC5K;AAAA,IACF;AAEA,QAAI,KAAK,SAAS,KAAK,OAAO;AAC5B,YAAM,SAAS,aAAa,MAAM,KAAK,KAAK;AAC5C,UAAI,WAAW,KAAK,OAAO;AACzB,eAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,SAAS,KAAK,KAAK,eAAe,KAAK,KAAK,WAAW,MAAM,IAAI;AAAA,MACnN;AAAA,IACF;AAEA,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,EACvI,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;AAAA,EAC9J;AACF;AAEA,SAAS,aAAa,MAAgB,SAA6C;AACjF,QAAM,WAAW,KAAK,OAAO,YAAY,KAAK,MAAM,OAAO,IAAI;AAC/D,MAAI,CAAC,YAAY,KAAC,uBAAW,QAAQ,GAAG;AACtC,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,mBAAmB,QAAQ,GAAG;AAAA,EAChL;AAEA,MAAI;AACF,UAAM,cAAU,yBAAa,UAAU,OAAO;AAC9C,UAAM,gBAAgB,QAAQ,MAAM,cAAc,KAAK,CAAC,GAAG;AAE3D,QAAI,iBAAiB,KAAK,qBAAqB,IAAI;AACjD,aAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,IACvI;AACA,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,SAAS,YAAY,uBAAuB,KAAK,iBAAiB,GAAG;AAAA,EACvN,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;AAAA,EAC9J;AACF;AAEO,SAAS,oBAAoB,MAAgB,SAAiB,kBAAqD;AAGxH,QAAM,YAAY,KAAK,cAAc,qBAAqB,KAAK,OAAO,YAAY;AAClF,QAAM,UAAU,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS,GAAG,IAAI;AAC/D,QAAM,QAAQ,QAAQ,KAAK,OAAO;AAElC,MAAI,cAAc,UAAU;AAC1B,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,CAAC,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,QAAQ,sBAAsB,KAAK,OAAO,YAAY,OAAU;AAAA,EACnN,OAAO;AACL,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,CAAC,QAAQ,qBAAqB,KAAK,OAAO,gBAAgB,OAAU;AAAA,EACtN;AACF;AAOA,SAAS,eAAe,MAAmC;AACzD,MAAI,CAAC,KAAK,uBAAwB,QAAO;AACzC,MAAI,CAAC,KAAK,iBAAiB,KAAK,cAAc,KAAK,MAAM,IAAI;AAC3D,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,UAAU;AAAA,MACV,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,MACb,SAAS,SAAS,KAAK,EAAE;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,KAAK,SAAS,iBAAiB,KAAK,SAAS;AAC/C,UAAM,UAAU,IAAI,OAAO,KAAK,OAAO;AACvC,UAAM,YAAY,KAAK,eAAe,KAAK,OAAO,YAAY;AAG9D,UAAM,kBAAkB,QAAQ,KAAK,KAAK,aAAa;AACvD,QAAI,CAAC,iBAAiB;AACpB,aAAO;AAAA,QACL,QAAQ,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS,KAAK;AAAA,QACd,QAAQ,KAAK;AAAA,QACb,SAAS,SAAS,KAAK,EAAE,mDAA8C,KAAK,aAAa,6BAA6B,KAAK,OAAO,kBAAkB,SAAS;AAAA,MAC/J;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WAAW,MAAgB,SAA6C;AAC/E,QAAM,WAAW,KAAK,OAAO,YAAY,KAAK,MAAM,OAAO,IAAI;AAC/D,MAAI,CAAC,YAAY,KAAC,uBAAW,QAAQ,GAAG;AACtC,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,mBAAmB,QAAQ,GAAG;AAAA,EAChL;AAEA,MAAI;AACF,UAAM,cAAU,yBAAa,UAAU,OAAO;AAC9C,WAAO,oBAAoB,MAAM,OAAO;AAAA,EAC1C,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;AAAA,EAC9J;AACF;AAEA,SAAS,UAAU,MAAgB,SAA6C;AAC9E,QAAMC,WAAU,KAAK,UAAU,YAAY,KAAK,SAAS,OAAO,IAAI;AACpE,MAAI,CAACA,UAAS;AACZ,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,uBAAuB;AAAA,EACzK;AAEA,MAAI;AACF,uCAASA,UAAS,EAAE,SAAS,KAAO,OAAO,OAAO,CAAC;AACnD,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,EACvI,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ,SAAS,KAAK,IAAI,QAAQ;AAAA,EACxL;AACF;AAEA,SAAS,cAAc,MAAmC;AACxD,SAAO;AAAA,IACL,IAAI,KAAK,MAAM;AAAA,IACf,MAAM,KAAK,QAAQ;AAAA,IACnB,UAAU,KAAK,YAAY;AAAA,IAC3B,UAAU,KAAK,YAAY;AAAA,IAC3B,OAAO,KAAK,SAAS;AAAA,IACrB,QAAQ,KAAK,UAAU;AAAA,IACvB,SAAS,KAAK,WAAW;AAAA,IACzB,GAAG;AAAA,EACL;AACF;AAEA,IAAM,gBAAuF;AAAA,EAC3F,OAAO;AAAA,EACP,MAAM;AACR;AAEA,eAAsB,YAAY,iBAA+C;AAC/E,MAAI,KAAC,uBAAW,eAAe,GAAG;AAChC,UAAM,IAAI,MAAM,gCAAgC,eAAe,EAAE;AAAA,EACnE;AAEA,QAAM,UAAM,yBAAa,iBAAiB,OAAO;AAEjD,MAAI;AACF,UAAM,aAAS,aAAAC,OAAU,GAAG;AAC5B,WAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,OAAO,OAAO;AAAA,MACd,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO,eAAe,CAAC;AAAA,IACtC;AAAA,EACF,QAAQ;AACN,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,aAAO;AAAA,QACL,SAAS,OAAO;AAAA,QAChB,OAAO,OAAO;AAAA,QACd,SAAS,OAAO;AAAA,QAChB,aAAa,OAAO,eAAe,CAAC;AAAA,MACtC;AAAA,IACF,QAAQ;AACN,YAAM,IAAI,MAAM,sCAAsC,eAAe,EAAE;AAAA,IACzE;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,iBACA,WACqB;AACrB,QAAM,UAAU,MAAM,YAAY,eAAe;AACjD,QAAM,WAAuB,CAAC;AAE9B,aAAWC,YAAW,QAAQ,aAAa;AACzC,UAAM,cAAU,kBAAK,WAAWA,QAAO;AACvC,QAAI,KAAC,uBAAW,OAAO,GAAG;AACxB,YAAM,IAAI,MAAM,8BAA8B,OAAO,6BAA6B,eAAe,GAAG;AAAA,IACtG;AAEA,UAAM,UAAM,yBAAa,SAAS,OAAO;AACzC,QAAI;AAEJ,QAAI;AACF,YAAM,aAAS,aAAAD,OAAU,GAAG;AAC5B,cAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,IAC7D,QAAQ;AACN,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,gBAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,MAC7D,QAAQ;AACN,cAAM,IAAI,MAAM,oCAAoC,OAAO,EAAE;AAAA,MAC/D;AAAA,IACF;AACA,aAAS,KAAK,GAAG,KAAK;AAAA,EACxB;AAEA,SAAO;AACT;AAEA,SAAS,eAAe,MAAgB,SAA6C;AACnF,QAAM,eAAe,KAAK,gBAAgB,YAAY,KAAK,eAAe,OAAO,IAAI,QAAQ,YAAY;AACzG,MAAI,CAAC,gBAAgB,KAAC,uBAAW,YAAY,GAAG;AAC9C,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,4BAA4B,YAAY,GAAG;AAAA,EAC7L;AAEA,MAAI;AACF,UAAM,WAAW,aAAa,YAAY;AAC1C,UAAM,eAAe,mBAAmB,QAAQ,IAAI,CAAC;AACrD,UAAM,QAAQ,WAAW,UAAU,YAAY;AAE/C,QAAI,MAAM,QAAQ;AAChB,aAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,IACvI;AACA,UAAM,kBAAkB,MAAM,WAAW,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI;AACnE,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,2CAAsC,eAAe,GAAG;AAAA,EAC1M,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;AAAA,EAC9J;AACF;AAEA,SAAS,kBAAkB,MAAgB,SAA6C;AACtF,QAAM,cAAc,KAAK,eAAe,YAAY,KAAK,cAAc,OAAO,IAAI,QAAQ,gBAAgB;AAC1G,MAAI,CAAC,eAAe,KAAC,uBAAW,WAAW,GAAG;AAC5C,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,wDAAmD;AAAA,EACpM;AAEA,MAAI;AACF,UAAM,kBAA4B,CAAC;AACnC,eAAW,aAAS,wBAAY,WAAW,GAAG;AAC5C,UAAI,CAAC,MAAM,SAAS,OAAO,EAAG;AAC9B,YAAM,cAAU,6BAAa,kBAAK,aAAa,KAAK,GAAG,OAAO;AAC9D,YAAM,WAAW,KAAK,MAAM,OAAO;AACnC,UAAI,SAAS,mBAAmB,MAAM,QAAQ,SAAS,eAAe,GAAG;AACvE,mBAAW,MAAM,SAAS,iBAAiB;AACzC,0BAAgB,KAAK,GAAG,SAAS,UAAU,KAAK,KAAK,GAAG,IAAI,IAAI,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;AAAA,QACxF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,gBAAgB,WAAW,GAAG;AAChC,aAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,IACvI;AACA,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,8BAA8B,gBAAgB,KAAK,IAAI,CAAC,GAAG;AAAA,EAC7M,SAAS,KAAU;AACjB,WAAO,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,IAAI,QAAQ;AAAA,EAC9J;AACF;AAEA,SAAS,mBAAmB,aAA+B;AACzD,MAAI;AACF,UAAM,aAAS,+BAAS,6BAA6B;AAAA,MACnD,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC,EAAE,SAAS,EAAE,KAAK;AACnB,WAAO,SAAS,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,EACxD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,aACb,OACA,SACA,SACwE;AACxE,QAAM,UAAwB,CAAC;AAC/B,MAAI,UAAU;AACd,MAAI,WAAW;AACf,QAAM,gBAAgB,QAAQ,YAAY,cAAc,QAAQ,MAAM,YAAY;AAElF,aAAW,WAAW,OAAO;AAC3B,UAAM,OAAO,cAAc,OAAO;AAGlC,UAAM,kBAAkB,eAAe,IAAI;AAC3C,QAAI,iBAAiB;AACnB,cAAQ,KAAK,eAAe;AAC5B,gBAAU;AACV;AAAA,IACF;AAGA,SAAK,KAAK,SAAS,iBAAiB,KAAK,SAAS,sBAC7C,QAAQ,YAAY,cAAc,QAAQ,YAAY,cAAc;AACvE,cAAQ,KAAK,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,YAAY,KAAK,IAAI,sBAAsB,CAAC;AACjM;AAAA,IACF;AAGA,QAAI,iBAAiB,KAAK,UAAU,aAAa;AAC/C,cAAQ,KAAK,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,8CAA8C,CAAC;AACpM;AAAA,IACF;AAGA,QAAI,QAAQ,YAAY,cAAc,QAAQ,MAAM,YAAY,IAAI;AAClE,cAAQ,KAAK,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO,CAAC;AAC5I;AAAA,IACF;AAGA,SAAK,QAAQ,YAAY,cAAc,QAAQ,YAAY,gBAAgB,QAAQ,MAAM,UAAU;AACjG,UAAI,CAAC,UAAU,QAAQ,KAAK,UAAU,KAAK,UAAU,QAAQ,WAAW,GAAG;AACzE,gBAAQ,KAAK,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,sCAAsC,CAAC;AAC5L;AAAA,MACF;AACA,UAAI,KAAK,YAAY,KAAK,SAAS,SAAS,KAAK,UAAU,QAAQ,KAAK,UAAU,KAAK,UAAU,QAAQ,WAAW,GAAG;AACrH,gBAAQ,KAAK,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,iCAAiC,CAAC;AACvL;AAAA,MACF;AAAA,IACF;AAEA,QAAI;AAGJ,QAAI,iBAAiB,KAAK,SAAS,eAAe;AAChD,eAAS,oBAAoB,MAAM,QAAQ,KAAM,OAAQ;AAAA,IAC3D,WAAW,QAAQ,YAAY,eAAe,QAAQ,MAAM,YAAY,CAAC,QAAQ,KAAK,WAAW,KAAK,SAAS,eAAe;AAE5H,YAAM,WAAW,QAAQ,KAAK;AAC9B,cAAI,uBAAW,QAAQ,GAAG;AACxB,cAAM,cAAU,yBAAa,UAAU,OAAO;AAE9C,YAAI,KAAK,YAAY,CAAC,UAAU,UAAU,KAAK,UAAU,QAAQ,WAAW,GAAG;AAC7E,mBAAS,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,QACzI,WAAW,KAAK,YAAY,KAAK,SAAS,SAAS,KAAK,UAAU,UAAU,KAAK,UAAU,QAAQ,WAAW,GAAG;AAC/G,mBAAS,EAAE,QAAQ,KAAK,IAAI,QAAQ,MAAM,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,OAAO;AAAA,QACzI,OAAO;AACL,mBAAS,oBAAoB,MAAM,OAAO;AAAA,QAC5C;AAAA,MACF,OAAO;AACL,iBAAS,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,mBAAmB,QAAQ,GAAG;AAAA,MAClL;AAAA,IACF,WAAW,KAAK,SAAS,eAAe;AACtC,eAAS,eAAe,MAAM,OAAO;AAAA,IACvC,WAAW,KAAK,SAAS,kBAAkB;AACzC,eAAS,kBAAkB,MAAM,OAAO;AAAA,IAC1C,OAAO;AAEL,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK;AACH,mBAAS,eAAe,MAAM,OAAO;AACrC;AAAA,QACF,KAAK;AACH,mBAAS,aAAa,MAAM,OAAO;AACnC;AAAA,QACF,KAAK;AACH,mBAAS,WAAW,MAAM,OAAO;AACjC;AAAA,QACF,KAAK;AAAA,QACL,KAAK;AACH,mBAAS,UAAU,MAAM,OAAO;AAChC;AAAA,QACF;AACE,mBAAS,EAAE,QAAQ,KAAK,IAAI,QAAQ,OAAO,UAAU,KAAK,UAAU,UAAU,KAAK,UAAU,SAAS,KAAK,SAAS,QAAQ,KAAK,QAAQ,SAAS,sBAAsB,KAAK,IAAI,GAAG;AAAA,MACxL;AAAA,IACF;AAEA,YAAQ,KAAK,MAAM;AAEnB,QAAI,CAAC,OAAO,QAAQ;AAClB,UAAI,OAAO,UAAU;AACnB,kBAAU;AAAA,MACZ,OAAO;AACL;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,SAAS,SAAS;AACtC;AAGA,SAAS,oBACP,aACA,WACwB;AACxB,QAAM,MAA8B;AAAA,IAClC,cAAc;AAAA,EAChB;AAGA,MAAI,UAAW,KAAI,MAAM;AAGzB,QAAM,mBAAe,kBAAK,aAAa,YAAY,YAAY;AAC/D,UAAI,uBAAW,YAAY,EAAG,KAAI,aAAa;AAAA,OAC1C;AACH,UAAM,iBAAa,kBAAK,aAAa,YAAY,yBAAyB;AAC1E,YAAI,uBAAW,UAAU,EAAG,KAAI,aAAa;AAAA,EAC/C;AAGA,QAAM,qBAAiB,kBAAK,aAAa,YAAY,UAAU,4BAA4B;AAC3F,UAAI,uBAAW,cAAc,EAAG,KAAI,WAAW;AAAA,OAC1C;AACH,UAAM,kBAAc,kBAAK,aAAa,QAAQ,UAAU,+BAA+B;AACvF,YAAI,uBAAW,WAAW,EAAG,KAAI,WAAW;AAAA,EAC9C;AAGA,QAAM,oBAAgB,kBAAK,aAAa,cAAc;AACtD,UAAI,uBAAW,aAAa,EAAG,KAAI,YAAY;AAAA,OAC1C;AACH,UAAM,oBAAgB,kBAAK,aAAa,QAAQ,cAAc;AAC9D,YAAI,uBAAW,aAAa,EAAG,KAAI,YAAY;AAAA,EACjD;AAGA,QAAM,mBAAe,kBAAK,aAAa,QAAQ,kBAAkB;AACjE,UAAI,uBAAW,YAAY,EAAG,KAAI,gBAAgB;AAAA,WACzC,WAAW;AAClB,UAAM,sBAAkB,kBAAK,aAAa,QAAQ,cAAc,iBAAiB,GAAG,SAAS,KAAK;AAClG,YAAI,uBAAW,eAAe,EAAG,KAAI,gBAAgB;AAAA,EACvD;AAGA,QAAM,sBAAkB,kBAAK,aAAa,QAAQ,cAAc,WAAW;AAC3E,UAAI,uBAAW,eAAe,EAAG,KAAI,eAAe;AAAA,OAC/C;AACH,UAAM,yBAAqB,kBAAK,aAAa,YAAY,WAAW;AACpE,YAAI,uBAAW,kBAAkB,EAAG,KAAI,eAAe;AAAA,EACzD;AAEA,SAAO;AACT;AAEA,eAAsB,QACpB,oBACA,SACA,SACqB;AACrB,MAAI;AACJ,MAAI;AAEJ,MAAI,OAAO,uBAAuB,UAAU;AAE1C,UAAM,UAAU,SAAS,WAAW,cAAc,QAAQ,QAAQ,IAAI;AACtE,cAAU;AAAA,MACR;AAAA,MACA,WAAW;AAAA,MACX,aAAa,QAAQ,IAAI;AAAA,MACzB,SAAS,WAAW,CAAC;AAAA,MACrB,OAAO,SAAS;AAAA,IAClB;AACA,qBAAiB,SAAS;AAAA,EAC5B,OAAO;AACL,cAAU;AAAA,EACZ;AAGA,QAAM,aAAa,oBAAoB,QAAQ,aAAa,QAAQ,SAAS;AAC7E,QAAM,MAAM,cAAc,SAAS,EAAE,GAAG,YAAY,GAAI,QAAQ,WAAW,CAAC,GAAI,GAAI,WAAW,CAAC,EAAG,CAAC;AAEpG,MAAI;AAGJ,MAAI,QAAQ,eAAe,QAAQ,WAAW;AAC5C,YAAQ,MAAM,wBAAwB,QAAQ,aAAa,QAAQ,SAAS;AAAA,EAC9E,WAAW,QAAQ,WAAW;AAC5B,QAAI,KAAC,uBAAW,QAAQ,SAAS,GAAG;AAClC,YAAM,IAAI,MAAM,8BAA8B,QAAQ,SAAS,EAAE;AAAA,IACnE;AAEA,UAAM,UAAM,yBAAa,QAAQ,WAAW,OAAO;AAEnD,QAAI;AACF,YAAM,aAAS,aAAAA,OAAU,GAAG;AAC5B,cAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,IAC7D,QAAQ;AACN,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,gBAAQ,MAAM,QAAQ,MAAM,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,MAC7D,QAAQ;AACN,cAAM,IAAI,MAAM,oCAAoC,QAAQ,SAAS,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,IAAI,MAAM,2EAA2E;AAAA,EAC7F;AAEA,QAAM,EAAE,SAAS,SAAS,SAAS,IAAI,MAAM,aAAa,OAAO,KAAK,OAAO;AAE7E,QAAM,SAAqB;AAAA,IACzB,SAAS,QAAQ;AAAA,IACjB,OAAO,QAAQ;AAAA,IACf;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,WAAO,WAAW;AAAA,EACpB;AAEA,SAAO;AACT;AAGA,SAAS,gBAAgB,SAAsC;AAC7D,QAAM,SAA8B,CAAC;AACrC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,QAA6D,CAAC,EAAE,QAAQ,IAAI,KAAK,OAAO,CAAC;AAC/F,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,WAAW,GAAG,EAAG;AAEjD,UAAM,SAAS,KAAK,OAAO,IAAI;AAC/B,UAAM,UAAU,KAAK,KAAK;AAE1B,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,UAAU,QAAQ;AACnE,YAAM,IAAI;AAAA,IACZ;AAEA,UAAM,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE;AAEvC,QAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,YAAM,MAAM,QAAQ,MAAM,GAAG,EAAE,EAAE,KAAK;AACtC,UAAI,KAAK;AACP,eAAO,GAAG,IAAI,CAAC;AACf,cAAM,KAAK,EAAE,QAAQ,KAAK,OAAO,GAAG,EAAE,CAAC;AACvC,qBAAa;AAAA,MACf;AAAA,IACF,WAAW,QAAQ,SAAS,GAAG,GAAG;AAChC,YAAM,WAAW,QAAQ,QAAQ,GAAG;AACpC,YAAM,MAAM,QAAQ,UAAU,GAAG,QAAQ,EAAE,KAAK;AAChD,UAAI,QAAa,QAAQ,UAAU,WAAW,CAAC,EAAE,KAAK;AACtD,UAAK,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,KAAO,MAAM,WAAW,GAAG,KAAK,MAAM,SAAS,GAAG,GAAI;AACpG,gBAAQ,MAAM,MAAM,GAAG,EAAE;AAAA,MAC3B;AACA,UAAI,UAAU,GAAI,SAAQ,CAAC;AAC3B,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,aAAa,KAA0BE,OAAmB;AACjE,QAAM,QAAQA,MAAK,MAAM,GAAG;AAC5B,MAAI,UAAe;AACnB,aAAW,QAAQ,OAAO;AACxB,QAAI,WAAW,QAAQ,OAAO,YAAY,SAAU,QAAO;AAC3D,cAAU,QAAQ,IAAI;AAAA,EACxB;AACA,SAAO;AACT;;;AExoBA,IAAAC,eAAqB;AAGrB,IAAM,yBAAqB,mBAAK,QAAQ,IAAI,GAAG,WAAW,QAAQ;;;ACJlE,IAAAC,aAAwF;AACxF,IAAAC,eAAqB;;;ACDrB,IAAAC,aAA4G;AAC5G,IAAAC,eAAwB;AAEjB,SAAS,gBAAgB,UAAkB,MAAqB;AACrE,QAAM,UAAM,sBAAQ,QAAQ;AAC5B,MAAI,KAAC,uBAAW,GAAG,EAAG,2BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACxD,QAAM,UAAU,GAAG,QAAQ,QAAQ,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC;AAC5D,gCAAc,SAAS,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI,MAAM,OAAO;AACpE,6BAAW,SAAS,QAAQ;AAC9B;AAEO,SAAS,UAAU,SAAuB;AAC/C,MAAI,KAAC,uBAAW,OAAO,EAAG,2BAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AAClE;;;ADuBA,SAAS,cAAc,aAA6B;AAClD,aAAO,mBAAK,aAAa,YAAY,aAAa,YAAY;AAChE;AAEO,SAAS,UAAU,aAA2C;AACnE,QAAMC,QAAO,cAAc,WAAW;AACtC,MAAI,KAAC,uBAAWA,KAAI,EAAG,QAAO;AAE9B,MAAI;AACF,WAAO,KAAK,UAAM,yBAAaA,OAAM,OAAO,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,UAAU,OAAsB,aAA2B;AACzE,QAAM,UAAM,mBAAK,aAAa,YAAY,WAAW;AACrD,YAAU,GAAG;AACb,kBAAgB,cAAc,WAAW,GAAG,KAAK;AACnD;AAEO,SAAS,mBAAmB,OAAsB,cAAsB,sBAAsB,GAAkB;AACrH,QAAM,aAAa,OAAO,KAAK,MAAM,MAAM;AAC3C,QAAM,aAAa,WAAW,QAAQ,MAAM,YAAY;AAGxD,MAAI,MAAM,OAAO,MAAM,YAAY,EAAE,WAAW,aAAa;AAC3D,aAAS,IAAI,aAAa,GAAG,IAAI,WAAW,QAAQ,KAAK;AACvD,YAAMC,QAAO,WAAW,CAAC;AACzB,UAAI,MAAM,OAAOA,KAAI,EAAE,WAAW,WAAW;AAC3C,wBAAgB,WAAW;AAC3B,8BAAsB,WAAW;AACjC,eAAO;AAAA,UACL,GAAG;AAAA,UACH,cAAcA;AAAA,UACd,QAAQ;AAAA,YACN,GAAG,MAAM;AAAA,YACT,CAACA,KAAI,GAAG;AAAA,cACN,GAAG,MAAM,OAAOA,KAAI;AAAA,cACpB,QAAQ;AAAA,cACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,QAAM,OAAO,MAAM;AACnB,kBAAgB,WAAW;AAC3B,wBAAsB,WAAW;AACjC,SAAO;AAAA,IACL,GAAG;AAAA,IACH,QAAQ;AAAA,MACN,GAAG,MAAM;AAAA,MACT,CAAC,IAAI,GAAG;AAAA,QACN,GAAG,MAAM,OAAO,IAAI;AAAA,QACpB,QAAQ;AAAA,QACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,gBAAgB;AAAA,QAChB,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;AAsFA,SAAS,wBAAgC;AACvC,SAAO,QAAQ,IAAI,gBAAgB,QAAQ,IAAI;AACjD;AA4DO,SAAS,gBAAgB,aAA2B;AACzD,QAAM,UAAM,mBAAK,aAAa,YAAY,WAAW;AACrD,YAAU,GAAG;AACb,oCAAc,mBAAK,KAAK,eAAe,GAAG,IAAI,OAAO;AACvD;AA4BO,SAAS,sBAAsB,aAA2B;AAC/D,QAAMC,YAAO,mBAAK,aAAa,YAAY,aAAa,oBAAoB;AAC5E,UAAI,uBAAWA,KAAI,GAAG;AACpB,2BAAOA,KAAI;AAAA,EACb;AACF;;;AJpPO,SAAS,mBAAmBC,OAA8B;AAC/D,MAAI,KAAC,uBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,8BAA8BA,KAAI,EAAE;AAAA,EACtD;AACA,QAAM,UAAM,yBAAaA,OAAM,OAAO;AACtC,QAAM,aAAS,aAAAC,OAAU,GAAG;AAC5B,QAAM,WAAW,OAAO,YAAY;AACpC,QAAM,kBAAc,sBAAQD,KAAI;AAEhC,MAAI;AACJ,MAAI,SAAS,YAAY,OAAO,SAAS,aAAa,UAAU;AAC9D,eAAW,CAAC;AACZ,eAAW,CAAC,KAAKE,QAAO,KAAK,OAAO,QAAQ,SAAS,QAAkC,GAAG;AACxF,eAAS,GAAG,QAAI,mBAAK,aAAaA,QAAO;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM,SAAS,QAAQ;AAAA,IACvB,aAAa,SAAS;AAAA,IACtB,SAAS,SAAS;AAAA,IAClB;AAAA,IACA,SAAS,SAAS,UAAU,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,MAC/C,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,QAAQ;AAAA,MAChB,OAAO,EAAE,SAAS,EAAE;AAAA,MACpB,MAAM,EAAE;AAAA,MACR,YAAY,EAAE;AAAA,MACd,WAAW,EAAE;AAAA,MACb,aAAa,EAAE;AAAA,MACf,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,YAAY,EAAE;AAAA,MACd,UAAU,EAAE,YAAY;AAAA,IAC1B,EAAE;AAAA,IACF,cAAc,SAAS;AAAA,IACvB,iBAAiB,SAAS;AAAA,IAC1B,UAAU,SAAS,WAAW;AAAA,MAC5B,qBAAqB,SAAS,SAAS,uBAAuB;AAAA,IAChE,IAAI;AAAA,EACN;AACF;AAEO,SAAS,kBACd,QACA,WACA,UAAkC,CAAC,GACpB;AACf,QAAM,SAAkC,CAAC;AACzC,aAAW,SAAS,OAAO,QAAQ;AACjC,WAAO,MAAM,IAAI,IAAI;AAAA,MACnB,QAAQ;AAAA,MACR,MAAM,MAAM;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AAAA,IACL,cAAc,OAAO;AAAA,IACrB;AAAA,IACA,cAAc,OAAO,OAAO,CAAC,GAAG,QAAQ;AAAA,IACxC;AAAA,IACA;AAAA,EACF;AACF;;;AD7FA,IAAM,kBAA0C;AAAA,EAC9C,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASV,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeL,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBV,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAed;AAmBO,SAAS,cAAc,QAAwB,SAA2B;AAC/E,MAAI,CAAC,OAAO,SAAU,QAAO,CAAC;AAE9B,QAAM,UAAoB,CAAC;AAE3B,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,OAAO,QAAQ,GAAG;AAC5D,QAAI,QAAQ,iBAAkB;AAC9B,QAAI,CAAC,gBAAgB,GAAG,EAAG;AAE3B,YAAI,uBAAW,OAAO,EAAG;AAEzB,UAAM,UAAM,sBAAQ,OAAO;AAC3B,QAAI,KAAC,uBAAW,GAAG,GAAG;AACpB,gCAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAEA,kCAAc,SAAS,gBAAgB,GAAG,GAAG,OAAO;AACpD,YAAQ,KAAK,OAAO;AAAA,EACtB;AAEA,SAAO;AACT;AAsCO,SAAS,mBAAmB,SAA2B;AAC5D,QAAM,iBAAa,mBAAK,SAAS,sBAAsB,iBAAiB;AACxE,MAAI,KAAC,uBAAW,UAAU,EAAG,QAAO,CAAC;AAErC,MAAI;AACF,eAAO,wBAAY,UAAU,EAC1B,OAAO,OAAK,EAAE,SAAS,OAAO,CAAC,EAC/B,IAAI,OAAK;AACR,UAAI;AACF,cAAM,cAAU,6BAAa,mBAAK,YAAY,CAAC,GAAG,OAAO;AACzD,cAAM,SAAS,KAAK,MAAM,OAAO;AACjC,eAAO,GAAG,OAAO,KAAK,KAAK,OAAO,YAAY,KAAK,OAAO,SAAS;AAAA,MACrE,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACL,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,UAAU,SAAyB;AACjD,QAAM,QAAQ,UAAU,OAAO;AAC/B,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAkB;AAAA,IACtB,aAAa,MAAM,YAAY;AAAA,IAC/B,YAAY,MAAM,SAAS;AAAA,IAC3B,YAAY,MAAM,YAAY,KAAK,MAAM,OAAO,MAAM,YAAY,EAAE,MAAM;AAAA,IAC1E;AAAA,IACA;AAAA,EACF;AAEA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AACxD,UAAM,SAAS,MAAM,WAAW,cAAc,QAC/B,MAAM,WAAW,gBAAgB,QACjC,MAAM,WAAW,oBAAoB,QACrC,MAAM,WAAW,aAAa,QAC9B;AACf,UAAM,KAAK,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,MAAM,GAAG;AAAA,EACpD;AAEA,QAAM,UAAU,mBAAmB,OAAO;AAC1C,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kBAAkB;AAC7B,eAAW,UAAU,SAAS;AAC5B,YAAM,KAAK,OAAO,MAAM,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AOrNA,IAAAC,aAAgI;AAChI,IAAAC,eAAiD;AACjD,gBAAwB;;;ACFxB,qBAAe;AACf,uBAAiB;AAEV,IAAM,iBAAiB;AAAA,EAC5B,EAAE,IAAI,QAAQ,KAAK,eAAe;AAAA,EAClC,EAAE,IAAI,YAAY,KAAK,mBAAmB;AAC5C;AA6BA,SAAS,iBAAiB,aAA+B;AACvD,QAAM,SAAS,iBAAAC,QAAK,KAAK,aAAa,WAAW,QAAQ;AACzD,MAAI,CAAC,eAAAC,QAAG,WAAW,MAAM,GAAG;AAC1B,WAAO,CAAC;AAAA,EACV;AACA,SAAO,eAAAA,QACJ,YAAY,QAAQ,EAAE,eAAe,KAAK,CAAC,EAC3C,OAAO,CAAC,MAAM;AACb,WAAO,EAAE,YAAY;AAAA,EACvB,CAAC,EACA,IAAI,CAAC,MAAM;AACV,WAAO,EAAE;AAAA,EACX,CAAC;AACL;AAEA,SAAS,uBAAuB,YAAoB,WAAqD;AACvG,MAAI;AACJ,MAAI;AACF,aAAS,eAAAA,QAAG,aAAa,UAAU;AAAA,EACrC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,QAAM,YAAY,iBAAAD,QAAK,QAAQ,iBAAAA,QAAK,QAAQ,UAAU,GAAG,MAAM;AAC/D,QAAM,WAAW,iBAAAA,QAAK,QAAQ,SAAS;AACvC,MAAI,cAAc,YAAY,CAAC,UAAU,WAAW,WAAW,iBAAAA,QAAK,GAAG,GAAG;AACxE,WAAO;AAAA,EACT;AACA,MAAI;AACF,mBAAAC,QAAG,SAAS,SAAS;AACrB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,eAAe,YAAoB,WAAgC;AACjF,MAAI,CAAC,eAAAA,QAAG,WAAW,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,eAAAA,QAAG,UAAU,UAAU;AACrC,MAAI,MAAM,eAAe,GAAG;AAC1B,UAAM,UAAU,uBAAuB,YAAY,SAAS;AAC5D,QAAI,YAAY,UAAW,QAAO;AAClC,QAAI,YAAY,WAAY,QAAO;AACnC,WAAO;AAAA,EACT;AACA,MAAI,MAAM,YAAY,GAAG;AACvB,QAAI,aAAa;AACjB,QAAI;AACF,qBAAAA,QAAG,aAAa,UAAU;AAC1B,mBAAa;AAAA,IACf,QAAQ;AACN,mBAAa;AAAA,IACf;AACA,QAAI,YAAY;AACd,YAAM,UAAU,uBAAuB,YAAY,SAAS;AAC5D,UAAI,YAAY,UAAW,QAAO;AAClC,UAAI,YAAY,WAAY,QAAO;AACnC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,UAAmC;AAClE,QAAM,WAAW,iBAAAD,QAAK,QAAQ,QAAQ;AACtC,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,QAAkB,CAAC,QAAQ;AACjC,MAAI,QAAQ;AACZ,QAAM,YAAY;AAElB,SAAO,MAAM,SAAS,GAAG;AACvB,QAAI,UAAU,YAAY,KAAK;AAC7B,aAAO;AAAA,QACL,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,UAAU,MAAM,MAAM,SAAS,CAAC;AAAA,MAClC;AAAA,IACF;AACA,UAAM,UAAU,MAAM,IAAI;AAC1B,QAAI,QAAQ,IAAI,OAAO,GAAG;AACxB;AAAA,IACF;AACA,YAAQ,IAAI,OAAO;AAEnB,QAAI;AACJ,QAAI;AACF,gBAAU,eAAAC,QAAG,YAAY,SAAS,EAAE,eAAe,KAAK,CAAC;AAAA,IAC3D,QAAQ;AACN;AAAA,IACF;AACA,eAAW,SAAS,SAAS;AAC3B,YAAM,YAAY,iBAAAD,QAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,UAAI;AACJ,UAAI;AACF,gBAAQ,eAAAC,QAAG,UAAU,SAAS;AAAA,MAChC,QAAQ;AACN;AAAA,MACF;AACA,UAAI,MAAM,eAAe,GAAG;AAC1B,YAAI;AACJ,YAAI;AACF,mBAAS,eAAAA,QAAG,aAAa,SAAS;AAAA,QACpC,QAAQ;AACN,iBAAO,EAAE,IAAI,OAAO,QAAQ,uBAAuB,UAAU,UAAU;AAAA,QACzE;AACA,cAAM,YAAY,iBAAAD,QAAK,QAAQ,iBAAAA,QAAK,QAAQ,SAAS,GAAG,MAAM;AAC9D,YAAI,cAAc,YAAY,CAAC,UAAU,WAAW,WAAW,iBAAAA,QAAK,GAAG,GAAG;AACxE,iBAAO,EAAE,IAAI,OAAO,QAAQ,uBAAuB,UAAU,UAAU;AAAA,QACzE;AAAA,MACF,WAAW,MAAM,YAAY,GAAG;AAC9B,cAAM,KAAK,SAAS;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,KAAK;AACpB;AAEO,SAAS,mBAAmB,YAAoB,aAA6B;AAClF,QAAM,MAAM,iBAAAA,QAAK,SAAS,aAAa,UAAU;AACjD,SAAO;AAAA,IACL,KAAK,GAAG;AAAA,IACR;AAAA,IACA,gBAAgB,GAAG;AAAA,IACnB;AAAA,IACA;AAAA,EACF,EAAE,KAAK,WAAW;AACpB;AAEA,SAAS,UACP,aACA,OACA,QACA,OACyE;AACzE,QAAM,YAAY,iBAAAA,QAAK,KAAK,aAAa,WAAW,UAAU,KAAK;AACnE,QAAM,aAAa,iBAAAA,QAAK,KAAK,aAAa,OAAO,KAAK,KAAK;AAC3D,QAAM,YAAY,iBAAAA,QAAK,QAAQ,UAAU;AAEzC,iBAAAC,QAAG,UAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAE3C,QAAM,MAAM,iBAAAD,QAAK,SAAS,WAAW,SAAS;AAC9C,QAAM,QAAQ,eAAe,YAAY,SAAS;AAElD,MAAI,UAAU,mBAAmB;AAC/B,WAAO,EAAE,QAAQ,UAAU;AAAA,EAC7B;AACA,MAAI,UAAU,aAAa,UAAU,YAAY;AAC/C,QAAI;AACF,qBAAAC,QAAG,WAAW,UAAU;AAAA,IAC1B,QAAQ;AAAA,IAER;AACA,QAAI,QAAQ,aAAa,SAAS;AAChC,qBAAAA,QAAG,YAAY,KAAK,YAAY,UAAU;AAAA,IAC5C,OAAO;AACL,qBAAAA,QAAG,YAAY,KAAK,UAAU;AAAA,IAChC;AACA,WAAO,EAAE,QAAQ,UAAU;AAAA,EAC7B;AACA,MAAI,UAAU,iBAAiB;AAC7B,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,KAAK,UAAU;AAAA,MAC1B;AAAA,IACF;AACA,mBAAAA,QAAG,WAAW,UAAU;AACxB,QAAI,QAAQ,aAAa,SAAS;AAChC,qBAAAA,QAAG,YAAY,KAAK,YAAY,UAAU;AAAA,IAC5C,OAAO;AACL,qBAAAA,QAAG,YAAY,KAAK,UAAU;AAAA,IAChC;AACA,WAAO,EAAE,QAAQ,UAAU;AAAA,EAC7B;AACA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,mBAAmB,YAAY,WAAW;AAAA,EACrD;AACF;AAEO,SAAS,aACd,aACA,OAAmB,CAAC,GACG;AACvB,QAAM,SAAS,iBAAiB,WAAW;AAC3C,QAAM,SAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,WAAW,iBAAAD,QAAK,KAAK,aAAa,WAAW,UAAU,KAAK;AAClE,UAAM,QAAQ,iBAAiB,QAAQ;AACvC,QAAI,CAAC,MAAM,IAAI;AACb,aAAO,SAAS,KAAK;AAAA,QACnB;AAAA,QACA,QAAQ,MAAM,UAAU;AAAA,QACxB,UAAU,MAAM;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AAEA,eAAW,UAAU,gBAAgB;AACnC,YAAM,IAAI,UAAU,aAAa,OAAO,QAAQ,KAAK,SAAS,KAAK;AACnE,UAAI,EAAE,WAAW,WAAW;AAC1B,eAAO;AAAA,MACT,WAAW,EAAE,WAAW,WAAW;AACjC,eAAO;AAAA,MACT,WAAW,EAAE,WAAW,UAAU;AAChC,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ADxPA,IAAM,qBAAqB;AA4BpB,IAAM,oBAAoB;AAAA,EAC/B;AAAA,EAAW;AAAA,EAAY;AAAA,EAAe;AAAA,EAAmB;AAAA,EACzD;AAAA,EAAc;AAAA,EAAiC;AAAA,EAAa;AAAA,EAC5D;AAAA,EAAa;AAAA,EAAU;AAAA,EAAU;AAAA,EAAiB;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,cAAsB;AACpC,QAAM,aAAa;AAAA,QACjB,mBAAK,WAAW,UAAU;AAAA,QAC1B,sBAAQ,WAAW,IAAI;AAAA,QACvB,sBAAQ,WAAW,MAAM,IAAI;AAAA,EAC/B;AACA,aAAW,aAAa,YAAY;AAClC,YAAI,2BAAW,mBAAK,WAAW,eAAe,CAAC,EAAG,QAAO;AAAA,EAC3D;AACA,SAAO,WAAW,CAAC;AACrB;AAGO,SAAS,4BAA4BE,cAAqC;AAC/E,MAAIA,cAAa;AACf,UAAM,mBAAe,mBAAKA,cAAa,MAAM,WAAW,OAAO;AAC/D,YAAI,uBAAW,YAAY,EAAG,QAAO;AAAA,EACvC;AACA,QAAM,gBAAY,mBAAK,WAAW,MAAM,WAAW,OAAO;AAC1D,UAAI,uBAAW,SAAS,EAAG,QAAO;AAClC,QAAM,gBAAY,mBAAK,WAAW,MAAM,MAAM,WAAW,OAAO;AAChE,UAAI,uBAAW,SAAS,EAAG,QAAO;AAClC,SAAO;AACT;AAGO,SAAS,gBAAgB,WAAmBA,cAAgC;AACjF,QAAM,iBAAiB,4BAA4BA,YAAW;AAC9D,MAAI,CAAC,eAAgB,QAAO,CAAC;AAC7B,SAAO,iBAAiB,oBAAgB,mBAAK,WAAW,WAAW,OAAO,CAAC;AAC7E;AAEO,SAAS,iBAAiB,KAAa,MAAwB;AACpE,QAAM,cAAwB,CAAC;AAC/B,4BAAU,MAAM,EAAE,WAAW,KAAK,CAAC;AAEnC,aAAW,aAAS,wBAAY,GAAG,GAAG;AACpC,UAAM,cAAU,mBAAK,KAAK,KAAK;AAC/B,UAAM,eAAW,mBAAK,MAAM,KAAK;AAEjC,YAAI,qBAAS,OAAO,EAAE,YAAY,GAAG;AACnC,kBAAY,KAAK,GAAG,iBAAiB,SAAS,QAAQ,CAAC;AAAA,IACzD,OAAO;AACL,mCAAa,SAAS,QAAQ;AAC9B,kBAAY,KAAK,QAAQ;AAAA,IAC3B;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,uBACd,WACA,WACA,WACuB;AACvB,QAAM,qBAAiB,uBAAK,mBAAQ,GAAG,WAAW,UAAU,SAAS;AACrE,QAAM,cAAU,mBAAK,WAAW,WAAW,UAAU,SAAS;AAC9D,QAAM,uBAAmB,mBAAK,WAAW,WAAW,UAAU,SAAS;AAEvE,UAAI,uBAAW,cAAc,GAAG;AAC9B,QAAI;AACF,kCAAY,gBAAgB,SAAS,UAAU;AAC/C,aAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,QAAQ,eAAe;AAAA,IACvE,QAAQ;AAAA,IAER;AAEA,QAAI;AACF,uBAAiB,gBAAgB,OAAO;AACxC,aAAO,EAAE,OAAO,WAAW,QAAQ,QAAQ,QAAQ,gBAAgB,iBAAiB,KAAK;AAAA,IAC3F,QAAQ;AAAA,IAER;AAAA,EACF;AAGA,UAAI,uBAAW,gBAAgB,GAAG;AAChC,qBAAiB,kBAAkB,OAAO;AAC1C,WAAO,EAAE,OAAO,WAAW,QAAQ,QAAQ,QAAQ,WAAW;AAAA,EAChE;AAGA,SAAO,EAAE,OAAO,WAAW,QAAQ,QAAQ,QAAQ,WAAW;AAChE;AAEA,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,gBAAgB,WAAyB;AACvD,QAAM,oBAAgB,mBAAK,WAAW,YAAY;AAClD,MAAI,kBAAkB;AACtB,UAAI,uBAAW,aAAa,GAAG;AAC7B,0BAAkB,yBAAa,eAAe,OAAO;AAAA,EACvD;AAEA,QAAM,QAAQ,gBAAgB,MAAM,IAAI;AACxC,QAAM,eAAyB,CAAC;AAEhC,aAAW,SAAS,2BAA2B;AAC7C,UAAM,UAAU,MAAM,KAAK;AAC3B,QAAI,WAAW,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,KAAK,MAAM,OAAO,GAAG;AACvD,mBAAa,KAAK,OAAO;AAAA,IAC3B;AAAA,EACF;AAEA,MAAI,aAAa,SAAS,GAAG;AAC3B,UAAM,aAAa,kBACf,gBAAgB,QAAQ,QAAQ,IAAI,IAAI,aAAa,KAAK,IAAI,IAAI,OAClE,aAAa,KAAK,IAAI,IAAI;AAC9B,kCAAc,eAAe,YAAY,OAAO;AAAA,EAClD;AACF;AAEA,SAAS,oBAAoB,WAAkC;AAC7D,QAAM,aAAY,oBAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG;AAC/D,QAAM,gBAAY,mBAAK,WAAW,WAAW,wBAAwB,SAAS,EAAE;AAEhF,QAAM,aAAuB,CAAC;AAC9B,UAAI,2BAAW,mBAAK,WAAW,WAAW,qBAAqB,CAAC,GAAG;AACjE,eAAW,KAAK,6BAA6B;AAAA,EAC/C;AAEA,MAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,MAAI;AACF,8BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AACxC,eAAWC,YAAW,YAAY;AAChC,YAAM,UAAM,mBAAK,WAAWA,QAAO;AACnC,YAAM,UAAM,mBAAK,WAAWA,QAAO;AACnC,oCAAU,sBAAQ,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AAC3C,mCAAa,KAAK,GAAG;AAAA,IACvB;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,qBAAqB,OAAO,KAAM,IAAc,OAAO,EAAE;AAAA,EAC3E;AAEA,SAAO;AACT;AAEO,SAAS,QACd,WACA,QAAiB,OACjB,eAAwB,MACxB,uBAAgC,OACpB;AACZ,QAAM,YAAY,YAAY;AAC9B,QAAM,UAAsB,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE;AAElD,MAAI,KAAC,uBAAW,SAAS,GAAG;AAC1B,8BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,MAAI,OAAO;AACT,QAAI;AACF,cAAQ,YAAY,oBAAoB,SAAS;AAAA,IACnD,SAAS,KAAK;AACZ,YAAM,IAAI,MAAM,qCAAsC,IAAc,OAAO,EAAE;AAAA,IAC/E;AAAA,EACF;AAEA,aAAWA,YAAW,gBAAgB;AACpC,UAAM,UAAM,mBAAK,WAAWA,QAAO;AACnC,UAAM,WAAO,mBAAK,WAAWA,QAAO;AAEpC,QAAI,KAAC,uBAAW,GAAG,GAAG;AACpB,cAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,UAAU,CAAC;AACvD;AAAA,IACF;AAEA,UAAM,cAAU,sBAAQ,IAAI;AAC5B,QAAI,KAAC,uBAAW,OAAO,GAAG;AACxB,gCAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,cAAQ,KAAK,SAAK,sBAAQA,QAAO,CAAC;AAAA,IACpC;AAEA,UAAM,kBAAc,uBAAW,IAAI;AAMnC,QAAIA,aAAY,aAAa;AAC3B,UAAI,CAAC,aAAa;AAChB,qCAAa,KAAK,IAAI;AACtB,gBAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,UAAU,CAAC;AACvD;AAAA,MACF;AACA,YAAM,eAAW,yBAAa,MAAM,OAAO;AAC3C,UAAI,SAAS,SAAS,kBAAkB,GAAG;AACzC,gBAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,UAAU,CAAC;AACvD;AAAA,MACF;AACA,YAAM,eAAW,yBAAa,KAAK,OAAO;AAC1C,YAAM,YAAY,SAAS,SAAS,IAAI,IAAI,OAAO;AACnD,oCAAc,MAAM,WAAW,YAAY,UAAU,OAAO;AAC5D,cAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,WAAW,CAAC;AACxD;AAAA,IACF;AAEA,QAAI,eAAe,CAAC,OAAO;AACzB,cAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,UAAU,CAAC;AACvD;AAAA,IACF;AAEA,iCAAa,KAAK,IAAI;AACtB,YAAQ,MAAM,KAAK,EAAE,MAAMA,UAAS,QAAQ,cAAc,gBAAgB,UAAU,CAAC;AAAA,EACvF;AAEA,QAAM,kBAAc,mBAAK,WAAW,YAAY;AAChD,QAAM,qBAAiB,uBAAW,WAAW;AAC7C,MAAI,CAAC,kBAAkB,OAAO;AAC5B,kCAAc,aAAa,kBAAkB,OAAO;AACpD,YAAQ,MAAM,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,QAAQ,iBAAiB,gBAAgB;AAAA,IAC3C,CAAC;AAAA,EACH,OAAO;AACL,YAAQ,MAAM,KAAK,EAAE,MAAM,cAAc,QAAQ,UAAU,CAAC;AAAA,EAC9D;AAEA,QAAM,kBAAc,mBAAK,WAAW,YAAY,WAAW;AAC3D,MAAI,KAAC,uBAAW,WAAW,GAAG;AAC5B,8BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,YAAQ,KAAK,KAAK,oBAAoB;AAAA,EACxC;AACA,QAAM,cAAU,mBAAK,aAAa,UAAU;AAC5C,MAAI,KAAC,uBAAW,OAAO,GAAG;AACxB,kCAAc,SAAS,IAAI,OAAO;AAAA,EACpC;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,QAAQ,oBAAoB;AACrC,UAAM,cAAU,mBAAK,WAAW,GAAG,KAAK,MAAM,GAAG,CAAC;AAClD,QAAI,KAAC,uBAAW,OAAO,GAAG;AACxB,gCAAU,SAAS,EAAE,WAAW,KAAK,CAAC;AACtC,cAAQ,KAAK,KAAK,IAAI;AAAA,IACxB;AACA,UAAM,kBAAc,mBAAK,SAAS,UAAU;AAC5C,QAAI,KAAC,uBAAW,WAAW,GAAG;AAC5B,oCAAc,aAAa,IAAI,OAAO;AAAA,IACxC;AAAA,EACF;AAEA,kBAAgB,WAAW,SAAS;AAEpC,MAAI,cAAc;AAChB,YAAQ,iBAAiB,uBAAuB,WAAW,KAAK;AAAA,EAClE;AAGA,UAAQ,uBAAuB,6BAA6B,SAAS;AAGrE,MAAI,CAAC,sBAAsB;AACzB,YAAQ,mBAAmB,kBAAkB;AAAA,MAAI,UAC/C,uBAAuB,MAAM,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,OAAO;AACL,YAAQ,mBAAmB,CAAC;AAAA,EAC9B;AAGA,MAAI;AACF,UAAM,SAAS,aAAa,SAAS;AACrC,UAAM,WAAqB,CAAC;AAC5B,eAAW,KAAK,gBAAgB;AAC9B,YAAM,gBAAY,mBAAK,WAAW,EAAE,GAAG;AACvC,YAAM,eAAW,mBAAK,WAAW,WAAW,QAAQ;AACpD,cAAI,uBAAW,QAAQ,SAAK,uBAAW,SAAS,GAAG;AACjD,cAAM,cAAU,wBAAY,UAAU,EAAE,eAAe,KAAK,CAAC;AAC7D,mBAAW,KAAK,SAAS;AACvB,cAAI,CAAC,EAAE,YAAY,EAAG;AACtB,gBAAM,kBAAc,mBAAK,WAAW,EAAE,IAAI;AAC1C,kBAAI,uBAAW,WAAW,KAAK,KAAC,sBAAU,WAAW,EAAE,eAAe,SAAK,sBAAU,WAAW,EAAE,YAAY,GAAG;AAC/G,qBAAS,KAAK,mBAAmB,aAAa,SAAS,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,YAAQ,eAAe;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,QAAQ,OAAO;AAAA,MACf,UAAU,OAAO;AAAA,MACjB,YAAY,eAAe,IAAI,OAAK,EAAE,GAAG;AAAA,MACzC;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,eAAe;AAAA,MACrB,SAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,UAAU,CAAC;AAAA,MACX,YAAY,eAAe,IAAI,OAAK,EAAE,GAAG;AAAA,MACzC,UAAU,CAAC,2BAA4B,IAAc,OAAO;AAAA,IAC9D;AAAA,EACF;AAEA,kBAAgB,SAAS;AAEzB,SAAO;AACT;AAEO,SAAS,uBAAuB,WAAmB,QAAiB,OAAgB;AACzF,QAAM,kBAAc,mBAAK,WAAW,SAAS;AAG7C,QAAM,mBAAe,mBAAK,aAAa,eAAe;AAItD,QAAM,qBAAiB,mBAAK,WAAW,MAAM,WAAW,OAAO;AAC/D,QAAM,qBAAiB,mBAAK,WAAW,MAAM,MAAM,WAAW,OAAO;AACrE,QAAM,iBAAa,uBAAW,cAAc,IAAI,iBAAiB;AAEjE,QAAM,iBAAa,mBAAK,YAAY,0BAA0B;AAC9D,QAAM,kBAAc,mBAAK,YAAY,2BAA2B;AAChE,QAAM,oBAAgB,mBAAK,YAAY,0BAA0B;AACjE,QAAM,sBAAkB,mBAAK,YAAY,2BAA2B;AAEpE,MAAI,KAAC,uBAAW,UAAU,KAAK,KAAC,uBAAW,WAAW,GAAG;AACvD,WAAO;AAAA,EACT;AAOA,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,QAAM,gBAAgB;AACtB,QAAM,kBAAkB;AAGxB,QAAM,uBAAmB,sBAAQ,YAAY,0BAA0B,EAAE,QAAQ,OAAO,GAAG;AAG3F,MAAI,WAAgC,CAAC;AACrC,UAAI,uBAAW,YAAY,GAAG;AAC5B,QAAI;AACF,iBAAW,KAAK,UAAM,yBAAa,cAAc,OAAO,CAAC;AAAA,IAC3D,QAAQ;AACN,iBAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,MAAO,UAAS,QAAQ,CAAC;AACvC,MAAI,CAAC,SAAS,MAAM,WAAY,UAAS,MAAM,aAAa,CAAC;AAC7D,MAAI,CAAC,SAAS,MAAM,YAAa,UAAS,MAAM,cAAc,CAAC;AAG/D,QAAM,YAAY,SAAS,MAAM,WAAW;AAAA,IAC1C,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB,CAAC;AAAA,EACpG;AACA,QAAM,aAAa,SAAS,MAAM,YAAY;AAAA,IAC5C,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,uBAAuB,CAAC;AAAA,EACrG;AAGA,MAAI,OAAO;AACT,aAAS,MAAM,aAAa,SAAS,MAAM,WAAW;AAAA,MACpD,CAAC,MAAW,CAAC,EAAE,OAAO,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,MAAM,CAAC;AAAA,IACtE;AACA,aAAS,MAAM,cAAc,SAAS,MAAM,YAAY;AAAA,MACtD,CAAC,MAAW,CAAC,EAAE,OAAO,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,MAAM,CAAC;AAAA,IACtE;AAAA,EACF;AAGA,QAAM,sBAAsB,SAAS,MAAM,WAAW;AAAA,IACpD,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB,CAAC;AAAA,EACpG;AACA,QAAM,uBAAuB,SAAS,MAAM,YAAY;AAAA,IACtD,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KAAK,EAAE,MAAM,KAAK,CAAC,OAAY,GAAG,SAAS,SAAS,uBAAuB,CAAC;AAAA,EACrG;AAEA,MAAI,CAAC,qBAAqB;AACxB,aAAS,MAAM,WAAW,KAAK;AAAA,MAC7B,SAAS;AAAA,MACT,OAAO;AAAA,QACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,MAC5C;AAAA,IACF,CAAC;AAAA,EACH;AACA,MAAI,CAAC,sBAAsB;AACzB,aAAS,MAAM,YAAY,KAAK;AAAA,MAC9B,SAAS;AAAA,MACT,OAAO;AAAA,QACL,EAAE,MAAM,WAAW,SAAS,eAAe;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AAGA,UAAI,uBAAW,gBAAgB,GAAG;AAChC,QAAI,CAAC,SAAS,MAAM,mBAAmB;AACrC,eAAS,MAAM,oBAAoB,CAAC;AAAA,IACtC;AACA,QAAI,CAAC,SAAS,MAAM,MAAM;AACxB,eAAS,MAAM,OAAO,CAAC;AAAA,IACzB;AACA,QAAI,CAAC,SAAS,MAAM,aAAa;AAC/B,eAAS,MAAM,cAAc,CAAC;AAAA,IAChC;AAEA,UAAM,gBAAgB,SAAS,MAAM,kBAAkB;AAAA,MACrD,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KACrB,EAAE,MAAM;AAAA,QACN,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB;AAAA,MAC1D;AAAA,IACJ;AACA,UAAM,aAAa,SAAS,MAAM,KAAK;AAAA,MACrC,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KACrB,EAAE,MAAM;AAAA,QACN,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB;AAAA,MAC1D;AAAA,IACJ;AACA,UAAM,iBAAiB,SAAS,MAAM,YAAY;AAAA,MAChD,CAAC,MACC,MAAM,QAAQ,EAAE,KAAK,KACrB,EAAE,MAAM;AAAA,QACN,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB;AAAA,MAC1D;AAAA,IACJ;AAEA,QAAI,CAAC,eAAe;AAClB,eAAS,MAAM,kBAAkB,KAAK;AAAA,QACpC,SAAS;AAAA,QACT,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AACD,eAAS,MAAM,kBAAkB,KAAK;AAAA,QACpC,SACE;AAAA,QACF,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,iBAAiB,SAAS,MAAM,YAAY;AAAA,MAChD,CAAC,MACC,EAAE,YAAY,UACd,MAAM,QAAQ,EAAE,KAAK,KACrB,EAAE,MAAM;AAAA,QACN,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB;AAAA,MAC1D;AAAA,IACJ;AACA,QAAI,CAAC,gBAAgB;AACnB,eAAS,MAAM,YAAY,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AAMA,UAAM,kBAAkB,SAAS,MAAM,YAAY;AAAA,MACjD,CAAC,MACC,EAAE,YAAY,WACd,MAAM,QAAQ,EAAE,KAAK,KACrB,EAAE,MAAM;AAAA,QACN,CAAC,OAAY,GAAG,SAAS,SAAS,sBAAsB;AAAA,MAC1D;AAAA,IACJ;AACA,QAAI,CAAC,iBAAiB;AACpB,eAAS,MAAM,YAAY,KAAK;AAAA,QAC9B,SAAS;AAAA,QACT,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,YAAY;AACf,eAAS,MAAM,KAAK,KAAK;AAAA,QACvB,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,gBAAgB;AACnB,eAAS,MAAM,YAAY,KAAK;AAAA,QAC9B,OAAO;AAAA,UACL,EAAE,MAAM,WAAW,SAAS,cAAc;AAAA,QAC5C;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,4BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,gCAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACtE,SAAO;AACT;AAEA,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA,EAGA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,0BAA0B;AAAA;AAAA,EAE9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,2BAA2B;AAAA;AAAA,EAE/B;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,6BAA6B,WAA4B;AACvE,QAAM,kBAAc,mBAAK,WAAW,SAAS;AAC7C,QAAM,mBAAe,mBAAK,aAAa,qBAAqB;AAE5D,MAAI,WAAgC,CAAC;AACrC,UAAI,uBAAW,YAAY,GAAG;AAC5B,QAAI;AACF,iBAAW,KAAK,UAAM,yBAAa,cAAc,OAAO,CAAC;AAAA,IAC3D,QAAQ;AACN,iBAAW,CAAC;AAAA,IACd;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,YAAa,UAAS,cAAc,CAAC;AACnD,MAAI,CAAC,SAAS,YAAY,MAAO,UAAS,YAAY,QAAQ,CAAC;AAC/D,MAAI,CAAC,SAAS,YAAY,IAAK,UAAS,YAAY,MAAM,CAAC;AAC3D,MAAI,CAAC,SAAS,YAAY,KAAM,UAAS,YAAY,OAAO,CAAC;AAE7D,QAAM,WAAW,IAAI,IAAI,SAAS,YAAY,KAAK;AACnD,aAAW,KAAK,2BAA2B;AACzC,QAAI,CAAC,SAAS,IAAI,CAAC,GAAG;AACpB,eAAS,YAAY,MAAM,KAAK,CAAC;AAAA,IACnC;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,IAAI,SAAS,YAAY,GAAG;AAC/C,aAAW,KAAK,yBAAyB;AACvC,QAAI,CAAC,OAAO,IAAI,CAAC,GAAG;AAClB,eAAS,YAAY,IAAI,KAAK,CAAC;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,UAAU,IAAI,IAAI,SAAS,YAAY,IAAI;AACjD,aAAW,KAAK,0BAA0B;AACxC,QAAI,CAAC,QAAQ,IAAI,CAAC,GAAG;AACnB,eAAS,YAAY,KAAK,KAAK,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,4BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAC1C,gCAAc,cAAc,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,OAAO;AACtE,SAAO;AACT;AAEO,SAAS,aAAa,QAA4B;AACvD,QAAM,UAAU,OAAO,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS;AAC/D,QAAM,UAAU,OAAO,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS;AAC/D,QAAM,cAAc,OAAO,MAAM,OAAO,OAAK,EAAE,WAAW,aAAa;AACvE,QAAM,WAAW,OAAO,MAAM,OAAO,OAAK,EAAE,WAAW,UAAU;AAEjE,QAAM,QAAkB,CAAC,qCAAqC,EAAE;AAEhE,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,YAAY,QAAQ,MAAM,IAAI;AACzC,eAAW,KAAK,QAAS,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACrD;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,qEAAgE,SAAS,MAAM,IAAI;AAC9F,eAAW,KAAK,SAAU,OAAM,KAAK,YAAO,EAAE,IAAI,EAAE;AAAA,EACtD;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,kCAA6B,QAAQ,MAAM,IAAI;AAC1D,eAAW,KAAK,QAAS,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACrD;AACA,MAAI,YAAY,SAAS,GAAG;AAC1B,UAAM,KAAK,gBAAgB,YAAY,MAAM,IAAI;AACjD,eAAW,KAAK,YAAa,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACzD;AACA,MAAI,OAAO,KAAK,SAAS,GAAG;AAC1B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,wBAAwB,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,EAC7D;AAEA,MAAI,OAAO,WAAW;AACpB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,mBAAmB,OAAO,SAAS,EAAE;AAAA,EAClD;AAEA,MAAI,OAAO,gBAAgB;AACzB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,4DAA4D;AAAA,EACzE;AAEA,MAAI,OAAO,sBAAsB;AAC/B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,kEAAkE;AAAA,EAC/E;AAGA,MAAI,OAAO,cAAc;AACvB,UAAM,KAAK,EAAE;AACb,UAAM,IAAI,OAAO;AACjB,UAAM,eAAe,EAAE,WAAW;AAClC,UAAM,SAAS,EAAE,SAAS,SAAS,IAAI,aAAc,EAAE,SAAS,SAAS,IAAI,WAAW;AACxF,UAAM,KAAK,kBAAkB,MAAM,cAAc,YAAY,YAAY,EAAE,OAAO,YAAY,EAAE,OAAO,WAAW,EAAE,MAAM,aAAa,EAAE,SAAS,MAAM,EAAE;AAC1J,eAAW,OAAO,EAAE,YAAY;AAC9B,YAAM,KAAK,KAAK,GAAG,EAAE;AAAA,IACvB;AACA,eAAW,KAAK,EAAE,UAAU;AAC1B,YAAM,KAAK,cAAc,EAAE,KAAK,KAAK,EAAE,MAAM,GAAG,EAAE,WAAW,OAAO,EAAE,WAAW,MAAM,EAAE,EAAE;AAAA,IAC7F;AACA,eAAW,KAAK,EAAE,UAAU;AAC1B,YAAM,KAAK,OAAO,EAAE,MAAM,OAAO,aAAa,EAAE,CAAC,EAAE,KAAK,OAAO,aAAa,EAAE,IAAI,IAAI,CAAC;AAAA,IACzF;AAAA,EACF;AAEA,MAAI,OAAO,oBAAoB,OAAO,iBAAiB,SAAS,GAAG;AACjE,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sBAAsB,OAAO,iBAAiB,MAAM,IAAI;AACnE,eAAW,KAAK,OAAO,kBAAkB;AACvC,UAAI,EAAE,WAAW,WAAW;AAC1B,cAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,mBAAc,EAAE,MAAM,EAAE;AAAA,MAC5D,OAAO;AACL,cAAM,SAAS,EAAE,kBAAkB,gCAAgC;AACnE,cAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,IAAI,MAAM,EAAE;AAAA,MAClE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,EAAE;AACb,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,+DAA+D;AAAA,EAC5E;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;AEv9BA,oBAA2B;AAC3B,sBAAgC;AAChC,IAAAC,aAUO;AACP,IAAAC,eAAwC;AACxC,IAAAC,aAAwB;AA8CxB,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,YAAY;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,iBAAiB,IAAI,IAAI,iBAAiB;AAEhD,IAAM,oBAAoB;AAAA,EACxB;AACF;AAEA,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,SAAS,IAAI,EAAE,QAAQ,OAAO,IAAI;AACzD;AAEA,SAAS,YAAY,OAAuB;AAC1C,aAAO,0BAAW,QAAQ,EAAE,OAAO,aAAa,KAAK,CAAC,EAAE,OAAO,KAAK;AACtE;AAEA,SAAS,SAAS,SAAgC;AAChD,MAAI,KAAC,uBAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACJ,MAAI;AACF,kBAAU,yBAAa,SAAS,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,SAAO,YAAY,OAAO;AAC5B;AAEA,SAAS,UAAU,SAA0B;AAC3C,MAAI;AACF,eAAO,sBAAU,OAAO,EAAE,eAAe;AAAA,EAC3C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,aAAa,GAA0B;AAC9C,MAAI;AACF,eAAO,yBAAa,CAAC;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAA2B;AACrD,QAAM,MAAgB,CAAC;AACvB,MAAI,KAAC,uBAAW,OAAO,EAAG,QAAO;AACjC,aAAW,aAAS,wBAAY,OAAO,GAAG;AACxC,UAAM,UAAM,mBAAK,SAAS,KAAK;AAC/B,UAAM,SAAK,sBAAU,GAAG;AACxB,QAAI,GAAG,YAAY,GAAG;AACpB,UAAI,KAAK,GAAG,mBAAmB,GAAG,CAAC;AAAA,IACrC,WAAW,GAAG,OAAO,GAAG;AACtB,UAAI,KAAK,GAAG;AAAA,IACd;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,MAAM,IAAI,EAAE,KAAK,GAAG;AAC/B;AAEA,SAAS,YAAY,UAAoC;AACvD,SAAO,IAAI,QAAQ,CAAC,mBAAmB;AACrC,UAAM,SAAK,iCAAgB,EAAE,OAAO,QAAQ,OAAO,QAAQ,QAAQ,OAAO,CAAC;AAC3E,OAAG,SAAS,UAAU,CAAC,WAAW;AAChC,SAAG,MAAM;AACT,qBAAe,YAAY,KAAK,OAAO,KAAK,CAAC,CAAC;AAAA,IAChD,CAAC;AAAA,EACH,CAAC;AACH;AAyEA,SAAS,YACP,WACA,WACAC,UACA,kBACA,QACkB;AAClB,QAAM,aAAS,mBAAK,WAAWA,QAAO;AACtC,QAAM,cAAU,mBAAK,WAAWA,QAAO;AAEvC,MAAI,KAAC,uBAAW,MAAM,GAAG;AACvB,WAAO,EAAE,MAAMA,UAAS,QAAQ,yBAAyB;AAAA,EAC3D;AAEA,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO,EAAE,MAAMA,UAAS,QAAQ,kBAAkB;AAAA,EACpD;AAEA,QAAM,UAAU,SAAS,MAAM;AAC/B,QAAM,WAAW,SAAS,OAAO;AAEjC,MAAI,aAAa,MAAM;AACrB,QAAI,CAAC,QAAQ;AACX,oCAAU,sBAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,mCAAa,QAAQ,OAAO;AAAA,IAC9B;AACA,WAAO,EAAE,MAAMA,UAAS,QAAQ,UAAU;AAAA,EAC5C;AAEA,MAAI,YAAY,UAAU;AACxB,WAAO,EAAE,MAAMA,UAAS,QAAQ,qBAAqB;AAAA,EACvD;AAEA,mBAAiB,KAAK,EAAE,SAAAA,UAAS,QAAQ,QAAQ,CAAC;AAClD,SAAO,EAAE,MAAMA,UAAS,QAAQ,mBAAmB;AACrD;AAEA,SAAS,wBAAwB,MAAc,WAAkC;AAC/E,QAAM,qBAAiB,uBAAK,oBAAQ,GAAG,WAAW,UAAU,IAAI;AAChE,UAAI,uBAAW,cAAc,EAAG,QAAO;AACvC,QAAM,uBAAmB,mBAAK,WAAW,WAAW,UAAU,IAAI;AAClE,UAAI,uBAAW,gBAAgB,EAAG,QAAO;AACzC,SAAO;AACT;AAEA,SAAS,yBACP,WACA,WACA,kBACA,QACA,sBAC6E;AAC7E,QAAM,MAA0B,CAAC;AACjC,QAAM,oBAA6C,CAAC;AAEpD,MAAI,qBAAsB,QAAO,EAAE,SAAS,KAAK,kBAAkB;AAEnE,aAAW,QAAQ,mBAAmB;AACpC,UAAM,cAAU,mBAAK,WAAW,WAAW,UAAU,IAAI;AACzD,YAAI,uBAAW,OAAO,KAAK,UAAU,OAAO,GAAG;AAC7C,UAAI,KAAK,EAAE,MAAM,kBAAkB,IAAI,IAAI,QAAQ,kBAAkB,CAAC;AACtE,wBAAkB,KAAK,EAAE,OAAO,MAAM,QAAQ,WAAW,QAAQ,aAAa,OAAO,KAAK,GAAG,CAAC;AAC9F;AAAA,IACF;AACA,UAAM,cAAc,wBAAwB,MAAM,SAAS;AAC3D,QAAI,CAAC,aAAa;AAChB,UAAI,KAAK,EAAE,MAAM,kBAAkB,IAAI,IAAI,QAAQ,yBAAyB,CAAC;AAC7E;AAAA,IACF;AACA,UAAM,WAAW,oBAAgB,uBAAK,oBAAQ,GAAG,WAAW,UAAU,IAAI;AAC1E,sBAAkB,KAAK;AAAA,MACrB,OAAO;AAAA,MACP,QAAQ,WAAW,YAAY;AAAA,MAC/B,QAAQ,WAAW,cAAc;AAAA,IACnC,CAAC;AACD,UAAM,QAAQ,mBAAmB,WAAW;AAC5C,eAAW,OAAO,OAAO;AACvB,YAAM,UAAM,uBAAS,aAAa,GAAG;AACrC,YAAMA,WAAU,kBAAkB,IAAI,IAAI,UAAU,GAAG,CAAC;AACxD,UAAI,KAAK,mBAAmB,aAAa,WAAWA,UAAS,KAAK,kBAAkB,MAAM,CAAC;AAAA,IAC7F;AAAA,EACF;AACA,SAAO,EAAE,SAAS,KAAK,kBAAkB;AAC3C;AAEA,SAAS,oBACP,WACA,WACA,kBACA,QACoB;AACpB,QAAM,UAAU,4BAA4B,SAAS;AACrD,MAAI,CAAC,QAAS,QAAO,CAAC;AACtB,QAAM,MAA0B,CAAC;AACjC,aAAW,OAAO,mBAAmB,OAAO,GAAG;AAC7C,UAAM,UAAM,uBAAS,SAAS,GAAG;AACjC,UAAMA,WAAU,iBAAiB,UAAU,GAAG,CAAC;AAC/C,QAAI,KAAK,mBAAmB,SAAS,WAAWA,UAAS,KAAK,kBAAkB,MAAM,CAAC;AAAA,EACzF;AACA,SAAO;AACT;AAEA,SAAS,mBACP,aACA,WACAA,UACA,QACA,kBACA,QACkB;AAClB,QAAM,cAAU,mBAAK,WAAWA,QAAO;AACvC,MAAI,KAAC,uBAAW,MAAM,GAAG;AACvB,WAAO,EAAE,MAAMA,UAAS,QAAQ,yBAAyB;AAAA,EAC3D;AACA,MAAI,UAAU,OAAO,GAAG;AACtB,WAAO,EAAE,MAAMA,UAAS,QAAQ,kBAAkB;AAAA,EACpD;AACA,QAAM,UAAU,SAAS,MAAM;AAC/B,QAAM,WAAW,SAAS,OAAO;AACjC,MAAI,aAAa,MAAM;AACrB,QAAI,CAAC,QAAQ;AACX,oCAAU,sBAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,mCAAa,QAAQ,OAAO;AAAA,IAC9B;AACA,WAAO,EAAE,MAAMA,UAAS,QAAQ,UAAU;AAAA,EAC5C;AACA,MAAI,YAAY,UAAU;AACxB,WAAO,EAAE,MAAMA,UAAS,QAAQ,qBAAqB;AAAA,EACvD;AACA,mBAAiB,KAAK,EAAE,SAAAA,UAAS,QAAQ,QAAQ,CAAC;AAClD,SAAO,EAAE,MAAMA,UAAS,QAAQ,mBAAmB;AACrD;AAEA,SAAS,sBACP,WACA,WACA,kBACA,QACoB;AACpB,QAAM,MAA0B,CAAC;AACjC,QAAM,iBAAa,mBAAK,WAAW,WAAW,QAAQ;AACtD,MAAI,KAAC,uBAAW,UAAU,EAAG,QAAO;AAEpC,aAAW,aAAS,wBAAY,UAAU,GAAG;AAC3C,QAAI,eAAe,IAAI,KAAK,EAAG;AAC/B,UAAM,eAAW,mBAAK,YAAY,KAAK;AACvC,QAAI,KAAC,qBAAS,QAAQ,EAAE,YAAY,EAAG;AAEvC,UAAM,QAAQ,mBAAmB,QAAQ;AACzC,eAAW,OAAO,OAAO;AACvB,YAAM,UAAM,uBAAS,YAAY,GAAG;AACpC,YAAMA,WAAU,kBAAkB,UAAU,GAAG,CAAC;AAChD,UAAI,KAAK,YAAY,WAAW,WAAWA,UAAS,kBAAkB,MAAM,CAAC;AAAA,IAC/E;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YACP,WACA,WACA,QACA,kBACA,QACoB;AACpB,QAAM,MAA0B,CAAC;AACjC,QAAM,cAAU,mBAAK,WAAW,MAAM;AACtC,MAAI,KAAC,uBAAW,OAAO,EAAG,QAAO;AACjC,QAAM,QAAQ,mBAAmB,OAAO;AACxC,aAAW,OAAO,OAAO;AACvB,UAAM,UAAM,uBAAS,SAAS,GAAG;AACjC,UAAMA,WAAU,GAAG,MAAM,IAAI,UAAU,GAAG,CAAC;AAC3C,QAAI,kBAAkB,KAAK,CAAC,MAAMA,aAAY,KAAKA,SAAQ,WAAW,IAAI,GAAG,CAAC,EAAG;AACjF,QAAI,KAAK,YAAY,WAAW,WAAWA,UAAS,kBAAkB,MAAM,CAAC;AAAA,EAC/E;AACA,SAAO;AACT;AAEA,SAAS,YAAY,WAAmB,QAAmC;AACzE,QAAM,cAAU,mBAAK,WAAW,YAAY;AAC5C,MAAI,KAAC,uBAAW,OAAO,GAAG;AACxB,QAAI,CAAC,OAAQ,+BAAc,SAAS,kBAAkB,OAAO;AAC7D,WAAO,EAAE,MAAM,cAAc,QAAQ,UAAU;AAAA,EACjD;AACA,QAAM,eAAe,SAAS,OAAO;AACrC,QAAM,eAAe,YAAY,gBAAgB;AACjD,MAAI,iBAAiB,cAAc;AACjC,WAAO,EAAE,MAAM,cAAc,QAAQ,qBAAqB;AAAA,EAC5D;AACA,SAAO,EAAE,MAAM,cAAc,QAAQ,mBAAmB;AAC1D;AAEA,eAAe,8BACb,WACA,OACe;AACf,MAAI,UAAU,WAAW,EAAG;AAC5B,UAAQ,OAAO,MAAM;AAAA,EAAK,UAAU,MAAM;AAAA,CAAiC;AAC3E,aAAW,KAAK,WAAW;AACzB,UAAM,MAAM,MAAM,YAAY,cAAc,EAAE,OAAO,kDAAkD;AACvG,UAAM,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,kBAAkB;AAC1F,QAAI,KAAK;AACP,oCAAU,sBAAQ,EAAE,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD,mCAAa,EAAE,QAAQ,EAAE,OAAO;AAChC,UAAI,OAAO,EAAG,OAAM,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,QAAQ,UAAU;AAAA,IAClE,OAAO;AACL,UAAI,OAAO,EAAG,OAAM,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,QAAQ,mBAAmB;AAAA,IAC3E;AAAA,EACF;AACF;AAEA,SAAS,0BACP,WACA,OACM;AACN,aAAW,KAAK,WAAW;AACzB,kCAAU,sBAAQ,EAAE,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACjD,iCAAa,EAAE,QAAQ,EAAE,OAAO;AAChC,UAAM,MAAM,MAAM,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,kBAAkB;AAC1F,QAAI,OAAO,EAAG,OAAM,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,QAAQ,UAAU;AAAA,EAClE;AACF;AAEA,eAAsB,UACpB,WACA,UAAyB,CAAC,GACH;AACvB,QAAM,OAAgC;AAAA,IACpC,OAAO,QAAQ,SAAS;AAAA,IACxB,aAAa,QAAQ,eAAe;AAAA,IACpC,QAAQ,QAAQ,UAAU;AAAA,IAC1B,OAAO,QAAQ,SAAS;AAAA,IACxB,aAAa,QAAQ,eAAe;AAAA,IACpC,sBAAsB,QAAQ,wBAAwB;AAAA,EACxD;AAEA,QAAM,YAAY,YAAY;AAC9B,MAAI,KAAC,uBAAW,SAAS,GAAG;AAC1B,8BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C;AAEA,QAAM,QAA4B,CAAC;AACnC,QAAM,mBAAsC,CAAC;AAE7C,aAAW,YAAY,YAAY;AACjC,UAAM,KAAK,YAAY,WAAW,WAAW,UAAU,kBAAkB,KAAK,MAAM,CAAC;AAAA,EACvF;AAEA,QAAM,KAAK,GAAG,sBAAsB,WAAW,WAAW,kBAAkB,KAAK,MAAM,CAAC;AAExF,QAAM,EAAE,SAAS,iBAAiB,kBAAkB,IAAI;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,QAAM,KAAK,GAAG,eAAe;AAC7B,QAAM,KAAK,GAAG,oBAAoB,WAAW,WAAW,kBAAkB,KAAK,MAAM,CAAC;AAEtF,aAAW,UAAU,WAAW;AAC9B,QAAI,WAAW,iBAAkB;AACjC,UAAM,KAAK,GAAG,YAAY,WAAW,WAAW,QAAQ,kBAAkB,KAAK,MAAM,CAAC;AAAA,EACxF;AAEA,QAAM,UAAU,YAAY,WAAW,KAAK,MAAM;AAClD,MAAI,QAAQ,WAAW,oBAAoB;AACzC,qBAAiB,KAAK;AAAA,MACpB,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAS,mBAAK,WAAW,YAAY;AAAA,IACvC,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,KAAK,UAAU,iBAAiB,SAAS,GAAG;AAC/C,QAAI,KAAK,eAAe,QAAQ,MAAM,OAAO;AAC3C,YAAM,8BAA8B,kBAAkB,KAAK;AAAA,IAC7D,WAAW,KAAK,OAAO;AACrB,gCAA0B,kBAAkB,KAAK;AAAA,IACnD;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,KAAK,SAAS,CAAC,KAAK,QAAQ;AAC9B,mBAAe,uBAAuB,WAAW,KAAK,KAAK;AAAA,EAC7D;AAEA,MAAI;AACJ,MAAI,KAAK,eAAe,CAAC,KAAK,QAAQ;AACpC,yBAAqB,6BAA6B,SAAS;AAAA,EAC7D;AAEA,MAAI,mBAAmB;AACvB,MAAI,CAAC,KAAK,QAAQ;AAChB,UAAM,aAAS,2BAAW,mBAAK,WAAW,YAAY,CAAC,QACnD,6BAAa,mBAAK,WAAW,YAAY,GAAG,OAAO,IACnD;AACJ,oBAAgB,SAAS;AACzB,UAAM,YAAQ,2BAAW,mBAAK,WAAW,YAAY,CAAC,QAClD,6BAAa,mBAAK,WAAW,YAAY,GAAG,OAAO,IACnD;AACJ,uBAAmB,WAAW;AAAA,EAChC;AAEA,QAAM,qBAAqB,MACxB,OAAO,CAAC,MAAM,EAAE,WAAW,kBAAkB,EAC7C,IAAI,CAAC,MAAM,EAAE,IAAI;AAEpB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb;AACF;AAEO,SAAS,mBAAmB,QAA8B;AAC/D,QAAM,QAAkB;AAAA,IACtB,4CAAuC,OAAO,SAAS;AAAA,IACvD,WAAW,OAAO,SAAS;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,UAAU,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AACjE,QAAM,UAAU,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,SAAS;AACjE,QAAM,WAAW,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,oBAAoB;AAC7E,QAAM,YAAY,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,kBAAkB;AAC5E,QAAM,UAAU,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,wBAAwB;AAChF,QAAM,WAAW,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,WAAW,iBAAiB;AAE1E,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,YAAY,QAAQ,MAAM,IAAI;AACzC,eAAW,KAAK,QAAS,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACrD;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,YAAY,QAAQ,MAAM,IAAI;AACzC,eAAW,KAAK,QAAS,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACrD;AACA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,KAAK,6CAAwC,UAAU,MAAM,IAAI;AACvE,eAAW,KAAK,UAAW,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AACrD,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,0EAA0E;AAAA,EACvF;AACA,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,KAAK,sBAAsB,QAAQ,MAAM,IAAI;AACnD,eAAW,KAAK,QAAS,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACrD;AACA,MAAI,SAAS,SAAS,GAAG;AACvB,UAAM,KAAK,4BAA4B,SAAS,MAAM,IAAI;AAC1D,eAAW,KAAK,SAAU,OAAM,KAAK,OAAO,EAAE,IAAI,EAAE;AAAA,EACtD;AAEA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,eAAe,SAAS,MAAM,WAAW;AAEpD,MAAI,OAAO,QAAQ,WAAW,WAAW;AACvC,UAAM,KAAK,oCAAoC;AAAA,EACjD,WAAW,OAAO,QAAQ,WAAW,oBAAoB;AACvD,UAAM,KAAK,4CAA4C;AAAA,EACzD,OAAO;AACL,UAAM,KAAK,kCAAkC;AAAA,EAC/C;AAEA,MAAI,OAAO,cAAc;AACvB,UAAM,KAAK,6DAA6D;AAAA,EAC1E,WAAW,OAAO,iBAAiB,OAAO;AACxC,UAAM,KAAK,4DAA4D;AAAA,EACzE;AAEA,MAAI,OAAO,oBAAoB;AAC7B,UAAM,KAAK,mEAAmE;AAAA,EAChF;AAEA,MAAI,OAAO,kBAAkB;AAC3B,UAAM,KAAK,oCAAoC;AAAA,EACjD;AAEA,MAAI,OAAO,iBAAiB,SAAS,GAAG;AACtC,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,sBAAsB,OAAO,iBAAiB,MAAM,IAAI;AACnE,eAAW,KAAK,OAAO,kBAAkB;AACvC,UAAI,EAAE,WAAW,WAAW;AAC1B,cAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,mBAAc,EAAE,MAAM,EAAE;AAAA,MAC5D,OAAO;AACL,cAAM,SAAS,EAAE,kBAAkB,gCAAgC;AACnE,cAAM,KAAK,KAAK,EAAE,MAAM,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE;AAAA,MACzE;AAAA,IACF;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,SAAS,GAAG;AAC/B,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,GAAG,OAAO,UAAU,MAAM,wCAAwC;AAAA,EAC/E;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACxmBA,IAAAC,eAAwB;AACxB,IAAAC,aAAwD;AAQxD,IAAM,SAAS,IAAI,OAAO,CAAC,OAAO,aAAa,EAAE,GAAG,QAAQ,OAAO,aAAa,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,GAAG;AACxG,IAAM,QAAQ,OAAO,aAAa,EAAE;AACpC,IAAM,mBAAmB,IAAI,OAAO,YAAY,OAAO,aAAa,EAAE,IAAI,WAAW,OAAO,aAAa,EAAE,IAAI,OAAO,OAAO,aAAa,EAAE,IAAI,GAAG;AAEnJ,IAAM,gBAA6B;AAAA,EACjC;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,KAAK,CAAC,MAAc,EAAE,QAAQ,QAAQ,QAAQ;AAAA,EAChD;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,KAAK,CAAC,MAAc,EAAE,QAAQ,OAAO,IAAI;AAAA,EAC3C;AAAA,EACA;AAAA,IACE,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,KAAK,CAAC,MAAc,EACvB,MAAM,KAAK,EACX,OAAO,CAAC,SAAiB,CAAC,iBAAiB,KAAK,IAAI,CAAC,EACrD,KAAK,KAAK;AAAA,EACT;AACF;AAEA,eAAsB,cAAcC,OAA+B;AACjE,QAAM,WAAWA,MAAK,CAAC;AACvB,MAAI,CAAC,YAAY,KAAC,uBAAW,QAAQ,GAAG;AACtC,YAAQ,MAAM,2CAA2C;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,kBAAc,sBAAQ,aAAa,YAAY,SAAS,YAAY,eAAe;AACzF,QAAM,gBAAY,sBAAQ,aAAa,YAAY,OAAO;AAE1D,MAAI,KAAC,uBAAW,WAAW,GAAG;AAC5B,YAAQ,MAAM,gDAAgD;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,cAAU,yBAAa,UAAU,OAAO;AAC5C,QAAM,UAAU;AAAA,IACd,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM,EAAE,UAAU,QAAQ;AAAA,IAC1B,SAAS,CAAC;AAAA,EACZ;AAEA,QAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,QAAM,WAAW,OAAO,QAAQ,OAAO,CAAC,MAAW,CAAC,EAAE,MAAM;AAE5D,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,qCAAqC;AACjD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,WAAW,SAAS,SAAS,gBAAgB;AACzD,aAAW,KAAK,UAAU;AACxB,UAAM,UAAU,cAAc,KAAK,CAAC,OAAkB,GAAG,WAAW,EAAE,MAAM;AAC5E,UAAM,SAAS,UAAU,eAAe;AACxC,YAAQ,IAAI,OAAO,SAAS,MAAM,EAAE,WAAW,MAAM,EAAE,SAAS,OAAO,EAAE,OAAO;AAAA,EAClF;AAEA,MAAI,QAAQ;AACZ,MAAI,iBAAiB;AACrB,aAAW,WAAW,eAAe;AACnC,UAAM,UAAU,SAAS,KAAK,CAAC,MAAW,EAAE,WAAW,QAAQ,MAAM;AACrE,QAAI,SAAS;AACX,YAAM,aAAa,QAAQ,IAAI,cAAc;AAC7C,UAAI,eAAe,gBAAgB;AACjC,yBAAiB;AACjB;AACA,gBAAQ,IAAI,cAAc,QAAQ,WAAW;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,GAAG;AACb,kCAAc,UAAU,gBAAgB,OAAO;AAC/C,YAAQ,IAAI,aAAa,QAAQ,sBAAsB,QAAQ;AAC/D,YAAQ,IAAI,4CAA4C;AAAA,EAC1D,OAAO;AACL,YAAQ,IAAI,8DAA8D;AAAA,EAC5E;AAEA,UAAQ,KAAK,SAAS,SAAS,QAAQ,IAAI,CAAC;AAC9C;;;AChGA,IAAAC,cAAmE;AACnE,IAAAC,gBAAiC;AACjC,IAAAC,eAAmC;AAGnC,SAAS,eAAe,GAAmB;AACzC,SAAO,EAAE,QAAQ,YAAY,GAAG;AAClC;AAEA,SAAS,aAAa,KAAsB;AAC1C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAAS,SAASC,OAAgB,MAAkC;AAClE,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACtD,MAAI,QAAQ;AACV,WAAO,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAC5C;AACA,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAIA,MAAK,QAAQ;AACrC,WAAOA,MAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AA6CO,SAAS,mBAAmBC,OAA8B;AAC/D,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,mCAAmCA,KAAI,EAAE;AAAA,EAC3D;AACA,QAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,QAAM,aAAS,aAAAC,OAAU,GAAG,KAAK,CAAC;AAClC,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,+CAA+CD,KAAI,EAAE;AAAA,EACvE;AACA,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,IAAI,MAAM,0DAA0DA,KAAI,GAAG;AAAA,EACnF;AACA,SAAO;AACT;AAEO,SAAS,uBAAuBD,OAAsB;AAC3D,QAAM,iBAAiB,SAASA,OAAM,cAAc;AACpD,QAAM,eAAe,SAASA,OAAM,YAAY;AAChD,QAAM,UAAU,SAASA,OAAM,OAAO;AAEtC,MAAI,CAAC,kBAAkB,CAAC,SAAS;AAC/B,YAAQ,MAAM,gGAAgG;AAC9G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,yBAAqB,uBAAQ,cAAc;AACjD,QAAM,mBAAmB,mBAAe,uBAAQ,YAAY,IAAI;AAChE,QAAM,kBAAc,uBAAQ,OAAO;AAEnC,MAAI,KAAC,wBAAW,kBAAkB,GAAG;AACnC,YAAQ,MAAM,8BAA8B,eAAe,kBAAkB,CAAC,EAAE;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,oBAAoB,KAAC,wBAAW,gBAAgB,GAAG;AACrD,YAAQ,MAAM,4BAA4B,eAAe,gBAAgB,CAAC,EAAE;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,aAAa,mBAAmB,kBAAkB;AACxD,UAAM,WAAW,mBAAmB,aAAa,gBAAgB,IAAI;AAErE,UAAM,OAAO,qBAAqB;AAAA,MAChC;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX,YAAY;AAAA,QACZ,UAAU;AAAA,QACV,KAAK;AAAA,MACP;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,CAAC;AAED,UAAM,aAAS,uBAAQ,WAAW;AAClC,QAAI,KAAC,wBAAW,MAAM,EAAG,4BAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,mCAAc,aAAa,MAAM,OAAO;AAExC,YAAQ,IAAI,6BAA6B,eAAe,WAAW,CAAC,EAAE;AACtE,YAAQ,IAAI,iBAAiB,WAAW,UAAU,EAAE;AACpD,YAAQ,IAAI,eAAe,mBAAmB,aAAa,wBAAwB,EAAE;AACrF,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,8BAA8B,aAAa,GAAG,CAAC,EAAE;AAC/D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,SAAS,WAAW,GAAoB;AACtC,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,QAAM,MAAM,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAChD,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,IAAM,wBAAgD;AAAA,EACpD,eAAe;AAAA,EACf,kBAAkB;AACpB;AAEA,IAAM,uBAA+C;AAAA,EACnD,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AACb;AAEO,SAAS,qBAAqB,OAAgC;AACnE,QAAM,EAAE,YAAY,UAAU,aAAa,YAAY,IAAI;AAC3D,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,8CAK4B,WAAW,WAAW,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqCzE;AAGC,QAAM,YAAY,WAAW,cAAc;AAC3C,QAAM,eAAyB,CAAC;AAChC,eAAa,KAAK,mCAAmC,WAAW,SAAS,CAAC,SAAS;AACnF,MAAI,UAAU;AACZ,iBAAa,KAAK,4CAA4C,WAAW,SAAS,kBAAkB,mBAAmB,CAAC,SAAS;AAAA,EACnI;AACA,MAAI,WAAW,eAAe;AAC5B,iBAAa,KAAK,sCAAsC,WAAW,WAAW,aAAa,CAAC,SAAS;AAAA,EACvG;AAEA,QAAM,KAAK;AAAA;AAAA,wCAE2B,WAAW,WAAW,UAAU,CAAC;AAAA,wBACjD,aAAa,KAAK,QAAQ,CAAC;AAAA;AAAA,CAElD;AAGC,QAAM,KAAK;AAAA;AAAA;AAAA,IAGT,WAAW,gBACT,YAAY,WAAW,WAAW,aAAa,CAAC,gBAChD,2CAA4B;AAAA;AAAA,wBAEV,WAAW,gBAAgB,UAAU,CAAC;AAAA,IAC1D,WAAW,kBAAkB,WAAW,eAAe,SAAS,IAC9D,OAAO,WAAW,eAAe,IAAI,OAAK,aAAa,WAAW,CAAC,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,UAC5F,+BAA0B;AAAA,EAC9B,WAAW;AAAA;AAAA,IAET,qBAAqB,SAAS,iBAAiB,CAAC;AAAA,IAChD,EAAE;AAAA;AAAA,CAEL;AAGC,QAAM,YAAY,WAAW,cAAc,CAAC,GAAG,QAAQ,OAAK,EAAE,iBAAiB,CAAC,CAAC;AACjF,QAAM,KAAK;AAAA,iFACuB,SAAS,MAAM;AAAA,IAC/C,SAAS,SAAS,IAChB,6KAA6K,SAAS,IAAI,OAAK,iBAAiB,WAAW,EAAE,OAAO,CAAC,mBAAmB,EAAE,YAAY,sBAAsB,sBAAsB,EAAE,SAAS,KAAK,OAAO,KAAK,WAAW,EAAE,SAAS,CAAC,YAAY,mCAA8B,YAAY,EAAE,aAAa,SAAY,sCAAiC,EAAE,WAAW,WAAM,QAAG,YAAY,WAAW,EAAE,QAAQ,KAAK,mCAA8B,YAAY,WAAW,EAAE,KAAK,KAAK,mCAA8B,YAAY,WAAW,EAAE,MAAM,KAAK,mCAA8B,YAAY,WAAW,EAAE,OAAO,KAAK,mCAA8B,YAAY,EAAE,aAAa,SAAS,WAAW,EAAE,UAAU,CAAC,YAAY,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBACn3B,uDAA8B;AAAA;AAAA,CAEnC;AAGC,QAAM,aAAa,WAAW,cAAc,CAAC;AAC7C,QAAM,KAAK;AAAA,sFAC4B,WAAW,MAAM;AAAA,IACtD,WAAW,SAAS,IAClB,WAAW,IAAI,OAAK;AAClB,UAAM,QAAQ,EAAE,iBAAiB,CAAC;AAClC,UAAM,QAAQ,EAAE,iBAAiB;AACjC,WAAO,OAAO,WAAW,EAAE,MAAM,CAAC,uBAAuB,qBAAqB,KAAK,KAAK,OAAO,KAAK,WAAW,KAAK,KAAK,SAAS,8BAA2B,WAAW,EAAE,gBAAgB,QAAG,CAAC,6BAAW,MAAM,MAAM;AAAA,sCACvL,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,WAAW,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC;AAAA,UAC/E,MAAM,SAAS,IACb,+HAA+H,MAAM,IAAI,OAAK,iBAAiB,WAAW,EAAE,OAAO,CAAC,mBAAmB,WAAW,EAAE,SAAS,KAAK,mCAA8B,YAAY,EAAE,aAAa,SAAY,sCAAiC,EAAE,WAAW,WAAM,QAAG,YAAY,WAAW,EAAE,OAAO,KAAK,mCAA8B,YAAY,EAAE,aAAa,SAAS,WAAW,EAAE,UAAU,CAAC,YAAY,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBAC7hB,yEAAiC;AAAA,EACvC,CAAC,EAAE,KAAK,MAAM,IACd,uDAA8B;AAAA;AAAA,CAEnC;AAGC,QAAM,MAAM,WAAW,kBAAkB,CAAC;AAC1C,MAAI,IAAI,SAAS,GAAG;AAClB,UAAM,KAAK;AAAA,gCACiB,IAAI,MAAM;AAAA,IACtC,IAAI,IAAI,QAAM;AACd,UAAI,OAAO,OAAO,SAAU,QAAO,mBAAmB,WAAW,EAAE,CAAC;AACpE,UAAI,MAAM,OAAO,OAAO,UAAU;AAChC,cAAM,MAAM;AACZ,cAAM,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK;AACxC,cAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,UAAU,KAAK;AACjD,cAAM,OAAO,OAAO,QAAQ,GAAG,EAC5B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,SAAS,SAAS,UAAU,EAAE,SAAS,CAAC,CAAC,EACjE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,gBAAgB,WAAW,CAAC,CAAC,cAAc,WAAW,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,EAC5H,KAAK,EAAE;AACV,eAAO,mCAAmC,WAAW,OAAO,EAAE,CAAC,CAAC,cAAc,WAAW,OAAO,KAAK,CAAC,CAAC,SAAS,IAAI;AAAA,MACtH;AACA,aAAO,mBAAmB,WAAW,KAAK,UAAU,EAAE,CAAC,CAAC;AAAA,IAC1D,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,CAEZ;AAAA,EACC;AAGA,QAAM,YAAY,oBAAI,IAAI,CAAC,cAAc,cAAc,iBAAiB,kBAAkB,cAAc,gBAAgB,CAAC;AACzH,QAAM,SAAS,OAAO,QAAQ,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AAC3E,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK;AAAA;AAAA,kBAEG,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,iBAAiB,WAAW,CAAC,CAAC,mBAAmB,WAAW,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,CAExK;AAAA,EACC;AAGA,QAAM,KAAK;AAAA,uBACL,WAAW,WAAW,CAAC;AAAA;AAAA,kBAEb,WAAW,YAAY,UAAU,CAAC,GAAG,YAAY,WAAW,iBAAiB,WAAW,YAAY,QAAQ,CAAC,KAAK,EAAE,GAAG,YAAY,MAAM,YAAY,WAAW,YAAY,GAAG,CAAC,KAAK,EAAE;AAAA;AAAA;AAAA,CAGxM;AAEC,QAAM,KAAK;AAAA;AAAA;AAAA,CAGZ;AACC,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,qBACP,QAKQ;AACR,QAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,QAAM,WAAW,QAAQ,aAAa,CAAC;AACvC,QAAM,YAAY,QAAQ,aAAa,CAAC;AACxC,SAAO;AAAA,kBACS,SAAS,MAAM;AAAA,IAC7B,SAAS,SAAS,IAAI,2FAA2F,SAAS,IAAI,OAAK,iBAAiB,WAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0B,WAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,WAAW,EAAE,gBAAgB,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AAAA;AAAA,mBAEnZ,SAAS,MAAM;AAAA,IAC9B,SAAS,SAAS,IAAI,iFAAiF,SAAS,IAAI,OAAK,iBAAiB,WAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0B,WAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AAAA;AAAA,mBAE3V,UAAU,MAAM;AAAA,IAC/B,UAAU,SAAS,IAAI,wFAAwF,UAAU,IAAI,OAAK,iBAAiB,WAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0B,WAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AACvX;;;ACrVA,IAAAG,cAAmE;AACnE,IAAAC,gBAAiC;;;ACJjC,IAAAC,cAAmE;AACnE,IAAAC,gBAAwB;AACxB,IAAAC,eAA+D;AA+DxD,SAAS,aAAaC,OAAoC;AAC/D,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,4BAA4BA,KAAI,EAAE;AAAA,EACpD;AACA,QAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,QAAM,aAAS,aAAAC,OAAU,GAAG;AAC5B,SAAO,kBAAkB,MAAM;AACjC;AAEO,SAAS,cAAcD,OAAc,UAAsC;AAChF,QAAM,UAAM,uBAAQA,KAAI;AACxB,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,+BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,QAAM,WAAO,aAAAE,WAAc,UAAU,EAAE,gBAAgB,MAAM,CAAC;AAC9D,iCAAcF,OAAM,MAAM,OAAO;AACnC;AAEO,SAAS,UAAUA,OAAiC;AACzD,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,yBAAyBA,KAAI,EAAE;AAAA,EACjD;AACA,QAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,QAAM,aAAS,aAAAC,OAAU,GAAG;AAC5B,SAAO,eAAe,MAAM;AAC9B;AAWA,IAAM,gBAAwC,CAAC,QAAQ,aAAa,cAAc,mBAAmB;AAE9F,SAAS,iBAAiB,UAAoD;AACnF,QAAM,SAAmB,CAAC;AAC1B,QAAM,EAAE,UAAU,WAAW,UAAU,IAAI,SAAS;AAEpD,MAAI,SAAS,WAAW,KAAK,UAAU,WAAW,KAAK,UAAU,WAAW,GAAG;AAC7E,WAAO,KAAK,gFAA2E;AAAA,EACzF;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,KAAK,+FAA0F;AAAA,EACxG;AACA,MAAI,CAAC,SAAS,qBAAqB;AACjC,WAAO,KAAK,kFAA6E;AAAA,EAC3F,WAAW,CAAC,MAAM,QAAQ,SAAS,mBAAmB,GAAG;AACvD,WAAO,KAAK,sCAAsC;AAAA,EACpD;AACA,MAAI,CAAC,SAAS,eAAe;AAC3B,WAAO,KAAK,iGAA4F;AAAA,EAC1G;AACA,MAAI,CAAC,SAAS,SAAS;AACrB,WAAO,KAAK,qBAAqB;AAAA,EACnC;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;AAEO,SAAS,cAAc,OAA8C;AAC1E,QAAM,SAAmB,CAAC;AAE1B,MAAI,CAAC,MAAM,YAAY;AACrB,WAAO,KAAK,wBAAwB;AAAA,EACtC;AACA,MAAI,CAAC,MAAM,mBAAmB;AAC5B,WAAO,KAAK,wGAAmG;AAAA,EACjH;AACA,MAAI,OAAO,MAAM,iBAAO,YAAY,MAAM,aAAG,KAAK,MAAM,IAAI;AAC1D,WAAO,KAAK,mEAAoD;AAAA,EAClE;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,8BAAK,KAAK,MAAM,+BAAM,WAAW,GAAG;AAC3D,WAAO,KAAK,uIAAyG;AAAA,EACvH;AACA,MAAI,CAAC,MAAM,QAAQ,MAAM,iBAAO,GAAG;AACjC,WAAO,KAAK,mDAAyC;AAAA,EACvD;AACA,MAAI,CAAC,cAAc,SAAS,MAAM,wBAAI,GAAG;AACvC,WAAO,KAAK,4CAAwB,cAAc,KAAK,IAAI,CAAC,EAAE;AAAA,EAChE;AACA,MAAI,CAAC,MAAM,SAAS,OAAO,MAAM,UAAU,UAAU;AACnD,WAAO,KAAK,qEAAgE;AAAA,EAC9E;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,OAAO;AAC9C;AAEO,SAAS,mBAAmB,UAAgC,OAAgD;AACjH,QAAM,IAAI,MAAM;AAChB,QAAM,iBAAiB,EAAE,mBAAmB,WACxC,CAAC,GAAG,SAAS,kBAAkB,UAAU,GAAG,EAAE,kBAAkB,QAAQ,IACxE,SAAS,kBAAkB;AAC/B,QAAM,iBAAiB,EAAE,mBAAmB,YACxC,CAAC,GAAG,SAAS,kBAAkB,WAAW,GAAG,EAAE,kBAAkB,SAAS,IAC1E,SAAS,kBAAkB;AAC/B,QAAM,kBAAkB,EAAE,mBAAmB,YACzC,CAAC,GAAG,SAAS,kBAAkB,WAAW,GAAG,EAAE,kBAAkB,SAAS,IAC1E,SAAS,kBAAkB;AAE/B,QAAM,mBAAmB,EAAE,sBACvB,wBAAwB,SAAS,qBAAqB,EAAE,mBAAmB,IAC3E,SAAS;AAEb,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,WAAW,SAAS;AAAA,IACpB,eAAe,SAAS;AAAA,IACxB,eAAe,SAAS;AAAA,IACxB,aAAa,EAAE,eAAe,SAAS;AAAA,IACvC,mBAAmB;AAAA,MACjB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA,qBAAqB;AAAA,IACrB,mBAAmB,EAAE,qBAAqB,SAAS;AAAA,EACrD;AACF;AAEO,SAAS,eACd,UACA,OACsB;AACtB,QAAM,SAAS,QAAQ,mBAAmB,UAAU,KAAK,IAAI;AAC7D,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,YAAY,OAAO,cAAc,OAAO;AAAA,IACxC,aAAa,OAAO;AAAA,IACpB,mBAAmB,OAAO;AAAA,IAC1B,mBAAmB,OAAO;AAAA,EAC5B;AACF;AAEO,SAAS,yBACd,UACA,OACsB;AACtB,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,WAAW;AAAA,IACX,eAAe;AAAA,IACf,aAAa,SAAS;AAAA,IACtB,mBAAmB,SAAS;AAAA,IAC5B,qBAAqB,CAAC;AAAA,IACtB,mBAAmB,SAAS;AAAA,EAC9B;AACF;AAEO,SAAS,eACd,UACA,OACA,UACA,aACsB;AACtB,QAAM,SAAS,mBAAmB,UAAU,KAAK;AACjD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,WAAW;AAAA,IACX,eAAe,eAAe,OAAO;AAAA,IACrC,eAAe,MAAM;AAAA,EACvB;AACF;AAEA,SAAS,wBACP,UACA,WACqB;AACrB,QAAM,WAAW,oBAAI,IAA+B;AACpD,aAAW,KAAK,UAAU;AACxB,aAAS,IAAI,EAAE,QAAQ,EAAE,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;AAAA,EAC1D;AACA,aAAW,OAAO,WAAW;AAC3B,UAAM,MAAM,SAAS,IAAI,IAAI,MAAM;AACnC,QAAI,KAAK;AACP,YAAM,MAAM,oBAAI,IAAI,CAAC,GAAG,IAAI,SAAS,GAAG,IAAI,OAAO,CAAC;AACpD,UAAI,UAAU,CAAC,GAAG,GAAG;AACrB,UAAI,cAAc,IAAI,eAAe,IAAI;AAAA,IAC3C,OAAO;AACL,eAAS,IAAI,IAAI,QAAQ,EAAE,GAAG,KAAK,SAAS,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACA,SAAO,CAAC,GAAG,SAAS,OAAO,CAAC;AAC9B;AAEA,SAAS,kBAAkB,KAAgC;AACzD,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,MAAI,CAAC,IAAI,mBAAmB;AAC1B,UAAM,IAAI,MAAM,oDAAoD;AAAA,EACtE;AACA,QAAM,eAA4B;AAClC,SAAO;AAAA,IACL,SAAS,IAAI,WAAW;AAAA,IACxB,WAAW,IAAI,aAAa;AAAA,IAC5B,eAAe,OAAO,IAAI,kBAAkB,YAAY,IAAI,cAAc,KAAK,IAC3E,IAAI,cAAc,KAAK,IACvB;AAAA,IACJ,eAAe,IAAI,iBAAiB;AAAA,IACpC,aAAa,IAAI;AAAA,IACjB,mBAAmB;AAAA,MACjB,WAAW,IAAI,kBAAkB,YAAY,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QAChE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,QACnB,cAAe,EAAE,gBAAgB;AAAA,MACnC,EAAE;AAAA,MACF,YAAY,IAAI,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QAClE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,MACrB,EAAE;AAAA,MACF,YAAY,IAAI,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QAClE,QAAQ,EAAE;AAAA,QACV,OAAO,EAAE,SAAS,CAAC;AAAA,MACrB,EAAE;AAAA,IACJ;AAAA,IACA,sBAAsB,IAAI,uBAAuB,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,MACpE,QAAQ,EAAE;AAAA,MACV,aAAa,EAAE,eAAe;AAAA,MAC9B,SAAS,EAAE,WAAW,CAAC;AAAA,IACzB,EAAE;AAAA,IACF,mBAAmB;AAAA,MACjB,qBAAqB,IAAI,mBAAmB,uBAAuB;AAAA,IACrE;AAAA,EACF;AACF;AAEA,SAAS,eAAe,KAA6B;AACnD,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,QAAM,IAAI,IAAI,SAAS,CAAC;AACxB,SAAO;AAAA,IACL,YAAY,IAAI,cAAc;AAAA,IAC9B,mBAAmB,IAAI,qBAAqB;AAAA,IAC5C,OAAO;AAAA,MACL,aAAa,EAAE;AAAA,MACf,mBAAmB,EAAE,oBACjB;AAAA,QACE,WAAW,EAAE,kBAAkB,YAAY,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAC9D,QAAQ,EAAE;AAAA,UACV,OAAO,EAAE,SAAS,CAAC;AAAA,UACnB,cAAe,EAAE,gBAAgB;AAAA,QACnC,EAAE;AAAA,QACF,YAAY,EAAE,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAChE,QAAQ,EAAE;AAAA,UACV,OAAO,EAAE,SAAS,CAAC;AAAA,QACrB,EAAE;AAAA,QACF,YAAY,EAAE,kBAAkB,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,UAChE,QAAQ,EAAE;AAAA,UACV,OAAO,EAAE,SAAS,CAAC;AAAA,QACrB,EAAE;AAAA,MACJ,IACA;AAAA,MACJ,sBAAsB,EAAE,uBAAuB,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,QAClE,QAAQ,EAAE;AAAA,QACV,aAAa,EAAE,eAAe;AAAA,QAC9B,SAAS,EAAE,WAAW,CAAC;AAAA,MACzB,EAAE;AAAA,MACF,mBAAmB,EAAE;AAAA,IACvB;AAAA,IACA,cAAI,IAAI,cAAI,KAAK;AAAA,IACjB,gCAAO,IAAI,gCAAO,KAAK,CAAC;AAAA,IACxB,oBAAU,IAAI,mBAAS,KAAK,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,MAC/C,SAAS,EAAE,WAAW;AAAA,MACtB,QAAQ,EAAE,UAAU;AAAA,MACpB,QAAQ,EAAE,UAAU;AAAA,IACtB,EAAE;AAAA,IACF,0BAAO,IAAI,0BAAM,KAAK;AAAA,EACxB;AACF;;;ADvUA,IAAAE,wBAAyB;AACzB,IAAAC,eAA+D;AAE/D,SAASC,gBAAe,GAAmB;AACzC,SAAO,EAAE,QAAQ,YAAY,GAAG;AAClC;AAEA,SAASC,cAAa,KAAsB;AAC1C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEO,SAAS,uBAAuBC,OAAsB;AAC3D,QAAM,eAAeA,MAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AACvD,MAAI,CAAC,cAAc;AACjB,YAAQ,MAAM,0DAA0D;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,mBAAe,uBAAQ,YAAY;AACzC,MAAI,KAAC,wBAAW,YAAY,GAAG;AAC7B,YAAQ,MAAM,4BAA4BF,gBAAe,YAAY,CAAC,EAAE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,WAAW,aAAa,YAAY;AAC1C,UAAM,aAAa,iBAAiB,QAAQ;AAE5C,QAAI,WAAW,OAAO;AACpB,cAAQ,IAAI,mBAAmB,SAAS,UAAU,EAAE;AACpD,cAAQ,IAAI,uBAAuB,SAAS,kBAAkB,SAAS,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACtG,cAAQ,IAAI,wBAAwB,SAAS,kBAAkB,UAAU,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACxG,cAAQ,IAAI,wBAAwB,SAAS,kBAAkB,UAAU,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACxG,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,MAAM,mBAAmB;AACjC,iBAAW,OAAO,WAAW,QAAQ;AACnC,gBAAQ,MAAM,OAAO,GAAG,EAAE;AAAA,MAC5B;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,MAAM,6BAA6BC,cAAa,GAAG,CAAC,EAAE;AAC9D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,oBAAoBC,OAAsB;AACxD,QAAM,eAAeA,MAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AACvD,QAAM,cAAcA,MAAK,KAAK,OAAK,EAAE,WAAW,iBAAiB,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAC5EA,MAAKA,MAAK,QAAQ,gBAAgB,IAAI,CAAC,KACvC,QAAQ,IAAI;AAEjB,MAAI,CAAC,cAAc;AACjB,YAAQ,MAAM,8EAA8E;AAC5F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,mBAAe,uBAAQ,YAAY;AACzC,MAAI,KAAC,wBAAW,YAAY,GAAG;AAC7B,YAAQ,MAAM,4BAA4BF,gBAAe,YAAY,CAAC,EAAE;AACxE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,WAAW,aAAa,YAAY;AAC1C,UAAM,eAAe,gBAAgB,WAAW;AAChD,UAAM,QAAQ,WAAW,UAAU,YAAY;AAE/C,YAAQ,IAAI,mBAAmB,SAAS,UAAU,GAAG;AACrD,YAAQ,IAAI,0BAA0B,aAAa,MAAM,EAAE;AAC3D,YAAQ,IAAI,cAAc,MAAM,QAAQ,MAAM,EAAE;AAChD,eAAW,KAAK,MAAM,QAAS,SAAQ,IAAI,SAASA,gBAAe,CAAC,CAAC,EAAE;AACvE,YAAQ,IAAI,iBAAiB,MAAM,WAAW,MAAM,EAAE;AACtD,eAAW,KAAK,MAAM,WAAY,SAAQ,IAAI,SAASA,gBAAe,EAAE,IAAI,CAAC,GAAG,EAAE,eAAe,YAAY,EAAE,YAAY,MAAM,EAAE,EAAE;AACrI,YAAQ,IAAI,aAAa,MAAM,SAAS,WAAW,QAAQ,EAAE;AAE7D,YAAQ,KAAK,MAAM,SAAS,IAAI,CAAC;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,MAAM,uBAAuBC,cAAa,GAAG,CAAC,EAAE;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,gBAAgB,aAA+B;AACtD,MAAI;AACF,UAAM,aAAS,gCAAS,6BAA6B;AAAA,MACnD,SAAS;AAAA,MACT,OAAO;AAAA,MACP,KAAK;AAAA,IACP,CAAC,EAAE,SAAS,EAAE,KAAK;AACnB,WAAO,SAAS,OAAO,MAAM,IAAI,EAAE,OAAO,OAAO,IAAI,CAAC;AAAA,EACxD,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAASE,UAASD,OAAgB,MAAkC;AAClE,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACtD,MAAI,QAAQ;AACV,WAAO,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAC5C;AACA,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAIA,MAAK,QAAQ;AACrC,WAAOA,MAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,2BAA2BA,OAAsB;AAC/D,QAAM,YAAYC,UAASD,OAAM,SAAS;AAC1C,QAAM,eAAeC,UAASD,OAAM,YAAY;AAChD,QAAM,mBAAmBC,UAASD,OAAM,iBAAiB;AACzD,QAAM,UAAUC,UAASD,OAAM,OAAO;AAEtC,MAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS;AAC3C,YAAQ,MAAM,sHAAsH;AACpI,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,oBAAgB,uBAAQ,SAAS;AACvC,QAAM,uBAAmB,uBAAQ,YAAY;AAC7C,QAAM,uBAAuB,uBAAmB,uBAAQ,gBAAgB,IAAI;AAC5E,QAAM,kBAAc,uBAAQ,OAAO;AAEnC,MAAI,KAAC,wBAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,yBAAyBF,gBAAe,aAAa,CAAC,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,KAAC,wBAAW,gBAAgB,GAAG;AACjC,YAAQ,MAAM,4BAA4BA,gBAAe,gBAAgB,CAAC,EAAE;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,wBAAwB,KAAC,wBAAW,oBAAoB,GAAG;AAC7D,YAAQ,MAAM,iCAAiCA,gBAAe,oBAAoB,CAAC,EAAE;AACrF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,QAAQ,UAAU,aAAa;AACrC,UAAM,WAAW,aAAa,gBAAgB;AAC9C,UAAM,eAAe,2BACjB,aAAAI,WAAU,0BAAa,sBAAsB,OAAO,CAAC,KAAK,OAC1D;AAEJ,UAAM,OAAO,yBAAyB;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,QACX,OAAO;AAAA,QACP,UAAU;AAAA,QACV,cAAc;AAAA,MAChB;AAAA,MACA,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,CAAC;AAED,UAAM,aAAS,uBAAQ,WAAW;AAClC,QAAI,KAAC,wBAAW,MAAM,EAAG,4BAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,mCAAc,aAAa,MAAM,OAAO;AAExC,YAAQ,IAAI,6BAA6BJ,gBAAe,WAAW,CAAC,EAAE;AACtE,YAAQ,IAAI,iBAAiB,SAAS,UAAU,EAAE;AAClD,YAAQ,IAAI,uBAAuB,MAAM,UAAU,EAAE;AACrD,YAAQ,IAAI,oBAAoB,uBAAuB,aAAa,wBAAwB,EAAE;AAC9F,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,kCAAkCC,cAAa,GAAG,CAAC,EAAE;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,SAASI,YAAW,GAAoB;AACtC,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,QAAM,MAAM,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAChD,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,IAAM,sBAA8C;AAAA,EAClD,MAAM;AAAA,EACN,aAAa;AAAA,EACb,cAAc;AAAA,EACd,qBAAqB;AACvB;AAcO,SAAS,yBAAyB,OAA4B;AACnE,QAAM,EAAE,OAAO,UAAU,cAAc,aAAa,YAAY,IAAI;AACpE,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,uCAKqBA,YAAW,SAAS,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAqChE;AAGC,QAAM,KAAK;AAAA;AAAA,wCAE2BA,YAAW,SAAS,UAAU,CAAC,yCAAsCA,YAAW,MAAM,iBAAiB,CAAC;AAAA;AAAA,yBAEvH,oBAAoB,MAAM,wBAAI,KAAK,OAAO,+BAAWA,YAAW,MAAM,wBAAI,CAAC;AAAA,4CACxDA,YAAW,MAAM,UAAU,CAAC;AAAA,+CACzBA,YAAW,SAAS,kBAAkB,mBAAmB,CAAC;AAAA;AAAA;AAAA,CAGxG;AAGC,QAAM,KAAK;AAAA;AAAA;AAAA,OAGNA,YAAW,MAAM,YAAE,KAAK,iDAAkC;AAAA;AAAA,wCAElD,MAAM,+BAAM,MAAM;AAAA,IAC7B,MAAM,+BAAM,SAAS,IAAI,OAAO,MAAM,+BAAM,IAAI,OAAK,OAAOA,YAAW,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,UAAU,+BAA0B;AAAA;AAAA,2BAEjH,MAAM,kBAAQ,MAAM;AAAA,IACjC,MAAM,kBAAQ,SAAS,IAAI,uFAAuF,MAAM,kBAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,OAAO,CAAC,mBAAmBA,YAAW,EAAE,MAAM,CAAC,YAAYA,YAAW,EAAE,MAAM,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AAAA;AAAA;AAAA,IAG3TC,sBAAqB,MAAM,MAAM,mBAAmB,IAAI,CAAC;AAAA;AAAA,yCAE9B,MAAM,MAAM,qBAAqB,UAAU,CAAC;AAAA,IACvE,qBAAqB,MAAM,MAAM,uBAAuB,CAAC,CAAC,CAAC;AAAA;AAAA,CAE9D;AAGC,QAAM,KAAK;AAAA;AAAA,IAET,SAAS,cAAc;AAAA;AAAA,IAEvB,iBAAiB,SAAS,WAAW,CAAC;AAAA,MACpC,EAAE;AAAA;AAAA,IAEJA,sBAAqB,SAAS,mBAAmB,KAAK,CAAC;AAAA;AAAA,+CAEZD,YAAW,SAAS,kBAAkB,mBAAmB,CAAC;AAAA;AAAA,CAExG;AAGC,MAAI,cAAc;AAChB,UAAM,KAAK;AAAA;AAAA,IAEX,mBAAmB,YAAY,CAAC;AAAA;AAAA,CAEnC;AAAA,EACC;AAGA,QAAM,KAAK;AAAA,uBACLA,YAAW,WAAW,CAAC;AAAA;AAAA,aAElBA,YAAW,YAAY,KAAK,CAAC;AAAA,gBAC1BA,YAAW,YAAY,QAAQ,CAAC,GAAG,YAAY,eAAe,sBAAsBA,YAAW,YAAY,YAAY,CAAC,KAAK,EAAE;AAAA;AAAA;AAAA,CAG9I;AAEC,QAAM,KAAK;AAAA;AAAA;AAAA,CAGZ;AACC,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAASC,sBACP,QAKA,SACQ;AACR,QAAM,WAAW,QAAQ,YAAY,CAAC;AACtC,QAAM,WAAW,QAAQ,aAAa,CAAC;AACvC,QAAM,YAAY,QAAQ,aAAa,CAAC;AACxC,QAAM,SAAS,UAAU,iBAAO;AAChC,SAAO;AAAA,kBACS,MAAM,GAAG,SAAS,MAAM;AAAA,IACtC,SAAS,SAAS,IAAI,2FAA2F,SAAS,IAAI,OAAK,iBAAiBD,YAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0BA,YAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAYA,YAAW,EAAE,gBAAgB,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AAAA;AAAA,mBAEnZ,MAAM,GAAG,SAAS,MAAM;AAAA,IACvC,SAAS,SAAS,IAAI,iFAAiF,SAAS,IAAI,OAAK,iBAAiBA,YAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0BA,YAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AAAA;AAAA,mBAE3V,MAAM,GAAG,UAAU,MAAM;AAAA,IACxC,UAAU,SAAS,IAAI,wFAAwF,UAAU,IAAI,OAAK,iBAAiBA,YAAW,EAAE,MAAM,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG,IAAI,OAAK,0BAA0BA,YAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC,qBAAqB,+BAA0B;AACvX;AAEA,SAAS,qBACP,QACQ;AACR,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,SAAO,4FAA4F,OAAO,IAAI,OAAK,iBAAiBA,YAAW,EAAE,MAAM,CAAC,mBAAmBA,YAAW,EAAE,eAAe,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,GAAG,IAAI,OAAK,sBAAsBA,YAAW,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC;AACjW;AAEA,SAAS,iBAAiB,OAAgG;AACxH,QAAM,YAAY,MAAM,iBAAiB,CAAC,GAAG,IAAI,OAAK,iBAAiBA,YAAW,EAAE,KAAK,CAAC,mBAAmBA,YAAW,EAAE,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE;AAC3J,QAAM,YAAY,MAAM,QAAQ,CAAC,GAAG,IAAI,OAAK,iBAAiBA,YAAW,EAAE,KAAK,CAAC,mBAAmBA,YAAW,EAAE,WAAW,CAAC,YAAY,EAAE,KAAK,EAAE;AAClJ,SAAO;AAAA;AAAA,IAEL,WAAW,2EAA2E,QAAQ,qBAAqB,+BAA0B;AAAA;AAAA,IAE7I,WAAW,2EAA2E,QAAQ,qBAAqB,+BAA0B;AACjJ;AAEA,SAAS,mBAAmB,IAAqC;AAC/D,QAAM,QAAkB,CAAC;AAEzB,QAAM,QAAQ,GAAG,cAAc;AAC/B,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,KAAK,2BAAiB;AAC5B,UAAM,KAAK,QAAQA,YAAW,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ;AAAA,EACvE;AAEA,QAAM,aAAa,GAAG,YAAY;AAClC,MAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,UAAM,KAAK,mBAAmB,WAAW,MAAM,QAAQ;AACvD,UAAM,KAAK,OAAO,WAAW,IAAI,SAAO,OAAOA,YAAW,OAAO,QAAQ,WAAW,MAAM,KAAK,UAAU,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO;AAAA,EACxI;AAEA,QAAM,MAAM,GAAG,gBAAgB;AAC/B,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,KAAK,4BAA4B,IAAI,MAAM,QAAQ;AACzD,UAAM,KAAK,IAAI,IAAI,CAAC,OAAgB;AAClC,UAAI,OAAO,OAAO,SAAU,QAAO,mBAAmBA,YAAW,EAAE,CAAC;AACpE,UAAI,MAAM,OAAO,OAAO,UAAU;AAChC,cAAM,MAAM;AACZ,cAAM,KAAK,IAAI,IAAI,KAAK,IAAI,OAAO,KAAK;AACxC,cAAM,QAAQ,IAAI,OAAO,KAAK,IAAI,UAAU,KAAK;AACjD,cAAM,OAAO,OAAO,QAAQ,GAAG,EAC5B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,SAAS,SAAS,UAAU,EAAE,SAAS,CAAC,CAAC,EACjE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,gBAAgBA,YAAW,CAAC,CAAC,cAAcA,YAAW,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,EAC5H,KAAK,EAAE;AACV,eAAO,mCAAmCA,YAAW,OAAO,EAAE,CAAC,CAAC,cAAcA,YAAW,OAAO,KAAK,CAAC,CAAC,SAAS,IAAI;AAAA,MACtH;AACA,aAAO,mBAAmBA,YAAW,KAAK,UAAU,EAAE,CAAC,CAAC;AAAA,IAC1D,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA,EACb;AAEA,aAAW,OAAO,CAAC,kBAAkB,gBAAgB,GAAG;AACtD,UAAM,IAAI,GAAG,GAAG;AAChB,QAAI,MAAM,QAAQ,CAAC,GAAG;AACpB,YAAM,KAAK,OAAOA,YAAW,GAAG,CAAC,KAAK,EAAE,MAAM,QAAQ;AACtD,YAAM,KAAK,OAAO,EAAE,IAAI,UAAQ,OAAOA,YAAW,OAAO,SAAS,WAAW,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,OAAO;AAAA,IACnI;AAAA,EACF;AAGA,QAAM,YAAY,oBAAI,IAAI,CAAC,gBAAgB,cAAc,kBAAkB,kBAAkB,gBAAgB,CAAC;AAC9G,QAAM,SAAS,OAAO,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,CAAC;AACnE,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK,yCAAgB;AAC3B,UAAM,KAAK,iBAAiB,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,iBAAiBA,YAAW,CAAC,CAAC,mBAAmBA,YAAW,OAAO,MAAM,WAAW,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,kBAAkB;AAAA,EACvM;AAEA,SAAO,MAAM,KAAK,IAAI,KAAK;AAC7B;AAEO,SAAS,qBAAqBH,OAAsB;AACzD,QAAM,eAAeC,UAASD,OAAM,YAAY;AAChD,QAAM,YAAYC,UAASD,OAAM,SAAS;AAC1C,QAAM,UAAUC,UAASD,OAAM,OAAO;AAEtC,MAAI,CAAC,gBAAgB,CAAC,SAAS;AAC7B,YAAQ,MAAM,iGAAiG;AAC/G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,uBAAmB,uBAAQ,YAAY;AAC7C,QAAM,gBAAgB,gBAAY,uBAAQ,SAAS,IAAI;AACvD,QAAM,kBAAc,uBAAQ,OAAO;AAEnC,MAAI,KAAC,wBAAW,gBAAgB,GAAG;AACjC,YAAQ,MAAM,4BAA4BF,gBAAe,gBAAgB,CAAC,EAAE;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,iBAAiB,KAAC,wBAAW,aAAa,GAAG;AAC/C,YAAQ,MAAM,yBAAyBA,gBAAe,aAAa,CAAC,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,WAAW,aAAa,gBAAgB;AAC9C,UAAM,QAAQ,gBAAgB,UAAU,aAAa,IAAI;AACzD,UAAM,WAAW,eAA2B,UAAU,KAAK;AAE3D,UAAM,aAAS,uBAAQ,WAAW;AAClC,QAAI,KAAC,wBAAW,MAAM,EAAG,4BAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,mCAAc,iBAAa,aAAAO,WAAc,UAAU,EAAE,gBAAgB,MAAM,CAAC,GAAG,OAAO;AAEtF,YAAQ,IAAI,gCAAgCP,gBAAe,WAAW,CAAC,EAAE;AACzE,YAAQ,IAAI,iBAAiB,SAAS,UAAU,EAAE;AAClD,YAAQ,IAAI,uBAAuB,SAAS,kBAAkB,SAAS,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,QAAQ,EAAE;AAClH,YAAQ,IAAI,aAAa,QAAQ,qBAAqB,qCAAgC,EAAE;AACxF,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,2BAA2BC,cAAa,GAAG,CAAC,EAAE;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,gCAAgCC,OAAsB;AACpE,QAAM,eAAeC,UAASD,OAAM,YAAY;AAChD,QAAM,YAAYC,UAASD,OAAM,SAAS;AAC1C,QAAM,SAASC,UAASD,OAAM,WAAW;AACzC,QAAM,QAAQC,UAASD,OAAM,SAAS;AAEtC,MAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,QAAQ;AAC1C,YAAQ;AAAA,MACN;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,uBAAmB,uBAAQ,YAAY;AAC7C,QAAM,oBAAgB,uBAAQ,SAAS;AACvC,QAAM,qBAAiB,uBAAQ,MAAM;AAErC,MAAI,KAAC,wBAAW,gBAAgB,GAAG;AACjC,YAAQ,MAAM,4BAA4BF,gBAAe,gBAAgB,CAAC,EAAE;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,KAAC,wBAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,yBAAyBA,gBAAe,aAAa,CAAC,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,aAAuB,CAAC;AAC9B,MAAI,UAAU;AACZ,eAAW,SAAK,uBAAQ,UAAU,wBAAwB,WAAW,wBAAwB,CAAC;AAAA,EAChG;AACA,aAAW,SAAK,uBAAQ,QAAQ,IAAI,GAAG,WAAW,UAAU,wBAAwB,WAAW,wBAAwB,CAAC;AAExH,MAAI,aAAa;AACjB,aAAW,KAAK,YAAY;AAC1B,YAAI,wBAAW,CAAC,GAAG;AACjB,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,YAAY;AACf,YAAQ;AAAA,MACN;AAAA,IAAkD,WAAW,KAAK,MAAM,CAAC;AAAA;AAAA,IAE3E;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,QAAQ,QAAQ,IAAI,UAAU;AAEpC,QAAM,UAAU,CAAC,YAAY,cAAc,kBAAkB,WAAW,eAAe,aAAa,cAAc;AAClH,MAAI,OAAO;AACT,YAAQ,KAAK,WAAW,KAAK;AAAA,EAC/B;AAEA,MAAI;AACF,wCAAS,GAAG,KAAK,IAAI,QAAQ,IAAI,OAAK,IAAI,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,OAAO,UAAU,CAAC;AACjF,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,+BAA+BC,cAAa,GAAG,CAAC,EAAE;AAChE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;AErhBA,IAAAO,cAAmE;AACnE,IAAAC,gBAAiC;AACjC,IAAAC,eAAmC;AAEnC,SAASC,gBAAe,GAAmB;AACzC,SAAO,EAAE,QAAQ,YAAY,GAAG;AAClC;AAEA,SAASC,cAAa,KAAsB;AAC1C,SAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AACxD;AAEA,SAASC,UAASC,OAAgB,MAAkC;AAClE,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACtD,MAAI,QAAQ;AACV,WAAO,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AAAA,EAC5C;AACA,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAIA,MAAK,QAAQ;AACrC,WAAOA,MAAK,MAAM,CAAC;AAAA,EACrB;AACA,SAAO;AACT;AAkEO,SAAS,qBAAqBC,OAAgC;AACnE,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,UAAM,IAAI,MAAM,4BAA4BA,KAAI,EAAE;AAAA,EACpD;AACA,QAAM,WAAO,0BAAaA,OAAM,OAAO;AACvC,QAAM,aAAS,aAAAC,OAAU,IAAI;AAC7B,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,UAAM,IAAI,MAAM,0CAA0CD,KAAI,EAAE;AAAA,EAClE;AACA,MAAI,CAAE,OAA4B,QAAQ;AACxC,UAAM,IAAI,MAAM,+CAA+CA,KAAI,GAAG;AAAA,EACxE;AACA,SAAO;AACT;AAEO,SAAS,2BAA2BD,OAAsB;AAC/D,QAAM,SAASD,UAASC,OAAM,MAAM;AACpC,QAAM,UAAUD,UAASC,OAAM,OAAO;AAEtC,MAAI,CAAC,UAAU,CAAC,SAAS;AACvB,YAAQ,MAAM,yFAAyF;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,iBAAa,uBAAQ,MAAM;AACjC,QAAM,kBAAc,uBAAQ,OAAO;AAEnC,MAAI,KAAC,wBAAW,UAAU,GAAG;AAC3B,YAAQ,MAAM,4BAA4BH,gBAAe,UAAU,CAAC,EAAE;AACtE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,WAAW,qBAAqB,UAAU;AAChD,UAAM,OAAO,yBAAyB;AAAA,MACpC;AAAA,MACA,YAAY;AAAA,MACZ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACtC,CAAC;AAED,UAAM,aAAS,uBAAQ,WAAW;AAClC,QAAI,KAAC,wBAAW,MAAM,EAAG,4BAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAC9D,mCAAc,aAAa,MAAM,OAAO;AAExC,YAAQ,IAAI,6BAA6BA,gBAAe,WAAW,CAAC,EAAE;AACtE,YAAQ,IAAI,iBAAiB,SAAS,MAAM,EAAE;AAC9C,YAAQ,IAAI,WAAW,SAAS,QAAQ,eAAe,EAAE;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAK;AACZ,YAAQ,MAAM,mCAAmCC,cAAa,GAAG,CAAC,EAAE;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAIA,SAASK,YAAW,GAAoB;AACtC,MAAI,MAAM,QAAQ,MAAM,OAAW,QAAO;AAC1C,QAAM,MAAM,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAChD,SAAO,IACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;AAEA,IAAM,mBAA2C;AAAA,EAC/C,MAAM;AAAA,EACN,WAAW;AACb;AAEA,IAAM,uBAA+C;AAAA,EACnD,UAAU;AAAA,EACV,aAAa;AAAA,EACb,UAAU;AACZ;AAQO,SAAS,yBAAyB,OAAoC;AAC3E,QAAM,EAAE,UAAU,YAAY,YAAY,IAAI;AAC9C,QAAM,QAAkB,CAAC;AAEzB,QAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,wCAKsBA,YAAW,SAAS,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAoC7D;AAGC,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,KAAK;AAAA;AAAA,oCAEuBA,YAAW,SAAS,MAAM,CAAC,4BAAyBA,YAAW,IAAI,CAAC,UAAU,SAAS,eAAe,6BAA0BA,YAAW,SAAS,YAAY,CAAC,YAAY,EAAE;AAAA;AAAA,kCAEjLA,YAAW,SAAS,MAAM,CAAC;AAAA,gCAC7BA,YAAW,IAAI,CAAC;AAAA;AAAA;AAAA,CAG/C;AAGC,MAAI,SAAS,SAAS,wBAAmB;AACvC,UAAM,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,CAKd;AAAA,EACC;AAGA,QAAM,KAAK,cAAc,uDAAe,SAAS,cAAI,kBAAkB,CAAC;AACxE,QAAM,KAAK,cAAc,uDAAe,SAAS,cAAI,eAAe,CAAC;AACrE,QAAM,KAAK,cAAc,uDAAe,SAAS,cAAI,oBAAoB,CAAC;AAC1E,QAAM,KAAK,cAAc,uDAAe,SAAS,cAAI,gBAAgB,CAAC;AACtE,QAAM,KAAK,cAAc,uDAAe,SAAS,cAAI,gBAAgB,CAAC;AACtE,QAAM,KAAK,cAAc,oDAAsB,SAAS,cAAI,gBAAgB,CAAC;AAG7E,QAAM,KAAK;AAAA,qGACqDA,YAAW,WAAW,CAAC;AAAA,qCACpDA,YAAW,UAAU,CAAC;AAAA;AAAA,CAE1D;AAEC,QAAM,KAAK;AAAA;AAAA;AAAA,CAGZ;AACC,SAAO,MAAM,KAAK,EAAE;AACtB;AAEA,SAAS,cAAiB,OAAe,SAA0B,aAA+C;AAChH,QAAM,QAAQ,SAAS,UAAU;AACjC,SAAO;AAAA,QACDA,YAAW,KAAK,CAAC,KAAK,KAAK;AAAA,IAC/B,QAAQ,IAAI,YAAY,OAAQ,IAAI,+BAA0B;AAAA;AAAA;AAGlE;AAEA,SAAS,UAAU,MAAuB;AACxC,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,MAAM,iBAAiB,IAAI,KAAK;AACtC,SAAO,sBAAsB,GAAG,KAAKA,YAAW,IAAI,CAAC;AACvD;AAEA,SAAS,cAAc,UAA2B;AAChD,MAAI,CAAC,SAAU,QAAO;AACtB,QAAM,MAAM,qBAAqB,QAAQ,KAAK;AAC9C,SAAO,sBAAsB,GAAG,KAAKA,YAAW,QAAQ,CAAC;AAC3D;AAEA,SAAS,mBAAmB,UAA2B;AACrD,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAASA,YAAW,QAAQ,CAAC;AACtC;AAEA,SAAS,mBAAmB,SAAgC;AAC1D,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,IAAI,CAAC,mBAAmB,UAAU,EAAE,IAAI,CAAC,YAAY,mBAAmB,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,IAAI,KAAK,mCAA8B,YAAYA,YAAW,EAAE,mBAAmB,KAAK,iCAAiC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAE5S;AAEA,SAAS,gBAAgB,SAA6B;AACpD,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,IAAI,CAAC,yBAAyBA,YAAW,EAAE,EAAE,CAAC,mBAAmBA,YAAW,EAAE,SAAS,KAAK,mCAA8B,YAAY,UAAU,EAAE,IAAI,CAAC,YAAY,mBAAmB,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,sBAAsB,KAAK,oCAAoC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAEhW;AAEA,SAAS,qBAAqB,SAAkC;AAC9D,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK;AACjB,UAAM,WAAW,MAAM,QAAQ,EAAE,QAAQ,IAAI,EAAE,SAAS,IAAI,OAAK,sBAAsBA,YAAW,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,IAAIA,YAAW,OAAO,EAAE,YAAY,EAAE,CAAC;AAC7J,WAAO,iBAAiBA,YAAW,EAAE,SAAS,CAAC,yBAAyBA,YAAW,EAAE,QAAQ,CAAC,mBAAmB,YAAY,mCAA8B,YAAY,UAAU,EAAE,IAAI,CAAC,YAAY,mBAAmB,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,aAAa,KAAK,iCAAiC;AAAA,EAChT,CAAC,EAAE,KAAK,EAAE,CAAC;AAAA;AAEX;AAEA,SAAS,iBAAiB,SAA+B;AACvD,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,MAAM,CAAC,yBAAyBA,YAAW,EAAE,YAAY,CAAC,mBAAmBA,YAAW,EAAE,WAAW,KAAK,mCAA8B,YAAY,UAAU,EAAE,IAAI,CAAC,YAAY,mBAAmB,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,mBAAmB,KAAK,iCAAiC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAExW;AAEA,SAAS,iBAAiB,SAA8B;AACtD,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,MAAM,CAAC,mBAAmB,UAAU,EAAE,IAAI,CAAC,YAAYA,YAAW,EAAE,SAAS,KAAK,mCAA8B,YAAY,mBAAmB,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,kBAAkB,KAAK,mCAA8B,YAAYA,YAAW,EAAE,GAAG,KAAK,mCAA8B,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAE9W;AAEA,SAAS,iBAAiB,SAA+B;AACvD,SAAO;AAAA,EACP,QAAQ,IAAI,OAAK,iBAAiBA,YAAW,EAAE,SAAS,CAAC,mBAAmBA,YAAW,EAAE,aAAa,KAAK,0CAA0C,YAAYA,YAAW,EAAE,SAAS,KAAK,mCAA8B,YAAY,cAAc,EAAE,QAAQ,CAAC,YAAYA,YAAW,EAAE,cAAc,KAAK,iCAAiC,YAAY,EAAE,KAAK,EAAE,CAAC;AAAA;AAEpW;;;ACtUA,IAAAC,cAAyC;AACzC,IAAAC,gBAA8B;;;ACwEvB,SAAS,iBACd,QACA,YACA,gBACiB;AACjB,QAAM,OAAO,OAAO,gBAAgB,CAAC;AACrC,QAAM,iBAAiB,oBAAI,IAAY;AACvC,QAAM,kBAAkB,oBAAI,IAAY;AAGxC,WAAS,OAAO,MAAc;AAC5B,QAAI,eAAe,IAAI,IAAI,EAAG;AAC9B,mBAAe,IAAI,IAAI;AACvB,UAAM,WAAW,KAAK,IAAI,KAAK,CAAC;AAChC,eAAW,OAAO,UAAU;AAC1B,aAAO,GAAG;AAAA,IACZ;AAAA,EACF;AAGA,WAAS,eAAe,MAAwB;AAC9C,UAAM,SAAmB,CAAC;AAC1B,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,IAAI,GAAG;AACzC,UAAI,EAAE,SAAS,IAAI,GAAG;AACpB,eAAO,KAAK,CAAC;AACb,eAAO,KAAK,GAAG,eAAe,CAAC,CAAC;AAAA,MAClC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAGA,SAAO,UAAU;AAGjB,MAAI,eAAe,IAAI,UAAU,GAAG;AAClC,mBAAe,IAAI,UAAU;AAC7B,UAAM,aAAa,eAAe,UAAU;AAC5C,eAAW,KAAK,YAAY;AAC1B,sBAAgB,IAAI,CAAC;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AAAA,IACL,gBAAgB,CAAC,GAAG,cAAc;AAAA,IAClC,iBAAiB,CAAC,GAAG,eAAe;AAAA,EACtC;AACF;;;ADlHO,SAAS,WAAWC,OAAsB;AAC/C,QAAM,UAAUA,MAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AAClD,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,4EAA4E;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,eAAeA,MAAK,KAAK,OAAK,EAAE,WAAW,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KACzEA,MAAKA,MAAK,QAAQ,YAAY,IAAI,CAAC,KACnC,iBAAiB;AACtB,QAAM,cAAcA,MAAK,KAAK,OAAK,EAAE,WAAW,iBAAiB,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAC5EA,MAAKA,MAAK,QAAQ,gBAAgB,IAAI,CAAC,KACvC,QAAQ,IAAI;AAEjB,MAAI,KAAC,4BAAW,uBAAQ,YAAY,CAAC,GAAG;AACtC,YAAQ,MAAM,4BAA4B,YAAY,EAAE;AACxD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,SAAS,uBAAmB,uBAAQ,YAAY,CAAC;AACvD,UAAM,WAAW,aAAa,QAAQ,OAAO;AAE7C,QAAI,CAAC,UAAU;AACb,cAAQ,MAAM,QAAQ,OAAO,0BAA0B,OAAO,IAAI,EAAE;AACpE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAMC,gBAAW,oBAAK,aAAa,YAAY,WAAW;AAC1D,UAAMC,iBAAY,oBAAKD,WAAU,YAAY;AAC7C,QAAI,YAAQ,wBAAWC,UAAS,IAC5B,UAAUD,SAAQ,IAClB,kBAAkB,QAAQ,YAAY,KAAK,IAAI,CAAC,IAAI,EAAE,cAAU,uBAAQ,YAAY,EAAE,CAAC;AAE3F,QAAI,CAAC,MAAM,OAAO,QAAQ,GAAG;AAC3B,cAAQ,MAAM,QAAQ,QAAQ,8BAA8B;AAC5D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,iBAAiB,IAAI;AAAA,MACzB,OAAO,QAAQ,MAAM,MAAM,EACxB,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,WAAW,EAC1C,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AAAA,IACzB;AAEA,QAAI,CAAC,eAAe,IAAI,QAAQ,GAAG;AACjC,YAAM,YAAY,iBAAiB,QAAQ,UAAU,cAAc;AACnE,UAAI,UAAU,eAAe,SAAS,KAAM,UAAU,eAAe,WAAW,KAAK,UAAU,eAAe,CAAC,MAAM,UAAW;AAC9H,gBAAQ,IAAI,uBAAuB,UAAU,eAAe,OAAO,OAAK,MAAM,QAAQ,EAAE,KAAK,IAAI,CAAC,qBAAqB;AACvH,mBAAW,QAAQ,UAAU,gBAAgB;AAC3C,cAAI,SAAS,UAAU;AACrB,oBAAQ,IAAI,QAAQ,IAAI,wBAAwB;AAAA,UAClD;AAAA,QACF;AAAA,MACF;AAEA,UAAI,UAAU,gBAAgB,SAAS,GAAG;AACxC,gBAAQ,IAAI,8BAA8B,UAAU,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,MAClF;AAAA,IACF;AAEA,YAAQ,IAAI,oBAAoB,QAAQ,EAAE;AAC1C,YAAQ,mBAAmB,OAAOA,SAAQ;AAC1C,cAAU,OAAOA,SAAQ;AACzB,YAAQ,IAAI,QAAQ,QAAQ,YAAY,MAAM,OAAO,QAAQ,GAAG,UAAU,SAAS,EAAE;AAAA,EACvF,SAAS,KAAU;AACjB,YAAQ,MAAM,wBAAwB,IAAI,OAAO,EAAE;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,SAAS,qBAAqBD,OAAsB;AACzD,QAAM,cAAcA,MAAK,KAAK,OAAK,EAAE,WAAW,iBAAiB,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAC5EA,MAAKA,MAAK,QAAQ,gBAAgB,IAAI,CAAC,KACvC,QAAQ,IAAI;AACjB,QAAM,eAAeA,MAAK,KAAK,OAAK,EAAE,WAAW,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KACzEA,MAAKA,MAAK,QAAQ,YAAY,IAAI,CAAC,KACnC,iBAAiB;AAEtB,UAAI,4BAAW,uBAAQ,YAAY,CAAC,GAAG;AACrC,QAAI;AACF,YAAM,SAAS,uBAAmB,uBAAQ,YAAY,CAAC;AACvD,cAAQ,IAAI,aAAa,OAAO,IAAI,EAAE;AACtC,UAAI,OAAO,gBAAiB,SAAQ,IAAI,oBAAoB,OAAO,eAAe,EAAE;AACpF,UAAI,OAAO,cAAc;AACvB,gBAAQ,IAAI,eAAe;AAC3B,mBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,OAAO,YAAY,GAAG;AAC9D,kBAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,IAAI,CAAC,EAAE;AAAA,QAC/C;AAAA,MACF;AACA,cAAQ,IAAI,WAAW,OAAO,OAAO,MAAM,IAAI;AAC/C,iBAAW,SAAS,OAAO,QAAQ;AACjC,cAAM,WAAW,MAAM,WAAW,gBAAgB;AAClD,cAAM,aAAa,MAAM,aAAa,KAAK,MAAM,WAAW,EAAE,MAAM;AACpE,gBAAQ,IAAI,KAAK,MAAM,IAAI,KAAK,MAAM,IAAI,IAAI,QAAQ,GAAG,UAAU,EAAE;AAAA,MACvE;AAAA,IACF,SAAS,KAAU;AACjB,cAAQ,MAAM,4BAA4B,IAAI,OAAO,EAAE;AAAA,IACzD;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,wBAAwB;AAAA,EACtC;AAEA,QAAMC,gBAAW,oBAAK,aAAa,YAAY,WAAW;AAC1D,QAAMC,iBAAY,oBAAKD,WAAU,YAAY;AAC7C,UAAI,wBAAWC,UAAS,GAAG;AACzB,QAAI;AACF,YAAM,QAAQ,UAAUD,SAAQ;AAChC,cAAQ,IAAI;AAAA,iBAAoB,MAAM,YAAY,EAAE;AACpD,cAAQ,IAAI,eAAe,MAAM,SAAS,EAAE;AAC5C,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,MAAM,MAAM,GAAG;AACxD,cAAM,OAAO,MAAM,WAAW,cAAc,WAAM,MAAM,WAAW,gBAAgB,WAAM,MAAM,WAAW,aAAa,WAAM;AAC7H,gBAAQ,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,MAAM,EAAE;AAAA,MAClD;AAAA,IACF,SAAS,KAAU;AACjB,cAAQ,MAAM,kCAAkC,IAAI,OAAO,EAAE;AAAA,IAC/D;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,2BAA2B;AAAA,EACzC;AACF;AAEA,SAAS,aAAa,QAAa,SAAqC;AACtE,QAAM,MAAM,SAAS,SAAS,EAAE,IAAI;AACpC,MAAI,CAAC,MAAM,GAAG,KAAK,OAAO,KAAK,MAAM,OAAO,OAAO,QAAQ;AACzD,WAAO,OAAO,OAAO,GAAG,EAAE;AAAA,EAC5B;AACA,SAAO,OAAO,OAAO,KAAK,CAAC,MAAW,EAAE,SAAS,OAAO,GAAG;AAC7D;AAEA,SAAS,mBAA2B;AAClC,QAAM,MAAM,QAAQ,IAAI;AACxB,aAAW,QAAQ,CAAC,iBAAiB,sBAAsB,6BAA6B,2BAA2B,GAAG;AACpH,YAAI,4BAAW,oBAAK,KAAK,IAAI,CAAC,EAAG,YAAO,oBAAK,KAAK,IAAI;AAAA,EACxD;AACA,SAAO;AACT;;;AE9IA,IAAAE,cAAqD;AACrD,IAAAC,gBAAuC;;;ACJvC,IAAAC,wBAAyB;AACzB,IAAAC,cAAyC;AACzC,IAAAC,gBAAqB;;;ACFrB,IAAAC,cAAgE;AAChE,IAAAC,gBAA8C;;;ACD9C,IAAAC,wBAAyB;AACzB,IAAAC,cAA6B;AAC7B,IAAAC,gBAAoB;AAoBpB,eAAsB,aAAa,QAAgB,WAA4C;AAC7F,QAAM,EAAE,QAAQ,IAAI,MAAM,OAAO,UAAU;AAC3C,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B,iBAAiB;AAAA,MACf,SAAS;AAAA,MACT,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,IACA,uBAAuB;AAAA,EACzB,CAAC;AAGD,QAAM,UAAU;AAChB,QAAM,aAAa,QAAQ,iBAAiB,SAAS,QAAQ,EAAE,WAAW,KAAK,CAAC;AAE9E,QAAM,UAA0B,CAAC;AACnC,aAAW,OAAO,WAAW,iBAAiB,GAAyG;AACrJ,YAAQ,KAAK;AAAA,MACX,MAAM,IAAI,QAAQ;AAAA,MAClB,MAAM,mBAAmB,GAAG;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAWA,eAAsB,4BACpB,aACA,KACA,OACsC;AACtC,QAAM,SAAS,oBAAI,IAA4B;AAE/C,aAAW,QAAQ,OAAO;AACxB,QAAI;AACJ,QAAI;AACF,oBAAU,gCAAS,YAAY,GAAG,IAAI,IAAI,IAAI;AAAA,QAC5C,KAAK;AAAA,QACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,SAAS;AAAA,QACT,WAAW,IAAI,OAAO;AAAA,MACxB,CAAC,EAAE,SAAS,OAAO;AAAA,IACrB,QAAQ;AAEN;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,KAAK,EAAG;AACrB,UAAM,MAAM,cAAc,IAAI;AAC9B,UAAM,UAAU,MAAM,aAAa,SAAS,GAAG;AAC/C,WAAO,IAAI,KAAK,OAAO;AAAA,EACzB;AAEA,SAAO;AACT;AAKA,eAAsB,4BACpB,aACA,OACsC;AACtC,QAAM,SAAS,oBAAI,IAA4B;AAE/C,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,cAAc,IAAI;AAC9B,QAAI;AACJ,QAAI;AACF,oBAAU,0BAAa,GAAG,WAAW,GAAG,iBAAG,GAAG,GAAG,IAAI,OAAO;AAAA,IAC9D,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,KAAK,EAAG;AACrB,UAAM,UAAU,MAAM,aAAa,SAAS,GAAG;AAC/C,WAAO,IAAI,KAAK,OAAO;AAAA,EACzB;AAEA,SAAO;AACT;AAUO,SAAS,mBACd,aACA,aACA,UACoG;AACpG,MAAI,eAAe,mBAAmB,KAAK,WAAW,GAAG;AACvD,WAAO,EAAE,KAAK,aAAa,QAAQ,iBAAiB;AAAA,EACtD;AAEA,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI;AACF,UAAM,UAAM,gCAAS,4BAA4B,QAAQ,qBAAqB;AAAA,MAC5E,KAAK;AAAA,MACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,MAChC,SAAS;AAAA,IACX,CAAC,EAAE,SAAS,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAK,iBAAiB,KAAK,CAAC,CAAC,EAAE,CAAC;AAE/E,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,QACL,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,SAAS,yBAAyB,QAAQ;AAAA,MAC5C;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,MACA,QAAQ;AAAA,MACR,SAAS,kEAA6D,IAAI,MAAM,GAAG,CAAC,CAAC;AAAA,IACvF;AAAA,EACF,SAAS,KAAU;AACjB,WAAO;AAAA,MACL,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,wBAAwB,IAAI,SAAS,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,OAAO;AAAA,IAC7E;AAAA,EACF;AACF;AAMO,SAAS,oBACd,QACA,OAMC;AACD,QAAM,WAAW,oBAAI,IAAY,CAAC,GAAG,OAAO,KAAK,GAAG,GAAG,MAAM,KAAK,CAAC,CAAC;AACpE,QAAM,SAA2G,CAAC;AAElH,aAAW,QAAQ,UAAU;AAC3B,UAAM,aAAa,OAAO,IAAI,IAAI,KAAK,CAAC;AACxC,UAAM,YAAY,MAAM,IAAI,IAAI,KAAK,CAAC;AACtC,UAAM,YAAY,IAAI,IAAI,WAAW,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC1D,UAAM,WAAW,IAAI,IAAI,UAAU,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,UAAM,QAAQ,UAAU,OAAO,OAAK,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC;AAC1D,UAAM,UAAU,WAAW,OAAO,OAAK,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC;AAC5D,UAAM,UAAU,UAAU,OAAO,OAAK;AACpC,YAAM,MAAM,UAAU,IAAI,EAAE,IAAI;AAChC,aAAO,OAAO,IAAI,SAAS,EAAE;AAAA,IAC/B,CAAC;AAED,QAAI,MAAM,UAAU,QAAQ,UAAU,QAAQ,QAAQ;AACpD,aAAO,KAAK,EAAE,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,IAC/C;AAAA,EACF;AAEA,SAAO,OAAO,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC3D;AAEA,SAAS,cAAc,GAAmB;AACxC,SAAO,EAAE,QAAQ,OAAO,GAAG;AAC7B;AAEA,SAAS,mBAAmB,KAAuF;AACjH,MAAI;AACF,UAAM,QAAQ,IAAI,gBAAgB;AAClC,QAAI,CAAC,SAAS,MAAM,WAAW,EAAG,QAAO;AACzC,UAAM,MAAM,MAAM,CAAC,EAAE,YAAY;AACjC,UAAM,WAAW,OAAO,QAAQ,aAAc,IAAqB,IAAI;AACvE,UAAM,QAAQ,SAAS,YAAY;AACnC,QAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,QAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AACpC,QAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,QAAI,MAAM,SAAS,WAAW,KAAK,MAAM,SAAS,MAAM,EAAG,QAAO;AAClE,QAAI,MAAM,SAAS,MAAM,EAAG,QAAO;AACnC,QAAI,MAAM,SAAS,UAAU,KAAK,MAAM,SAAS,OAAO,EAAG,QAAO;AAClE,WAAO,YAAY;AAAA,EACrB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AD3MA,eAAsB,kBAAkB,aAAmD;AACzF,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,2BAA2B,WAAW,EAAE;AAAA,EAC1D;AAGA,QAAM,eAAW,oBAAK,aAAa,KAAK;AACxC,UAAI,wBAAW,QAAQ,GAAG;AACxB,UAAM,UAAU,eAAe,QAAQ;AACvC,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,MAAM,aAAa,aAAa,OAAO;AAAA,IAChD;AAAA,EACF;AAGA,QAAM,cAAU,oBAAK,aAAa,SAAS;AAC3C,UAAI,wBAAW,OAAO,GAAG;AACvB,UAAM,YAAY,MAAM,oBAAoB,aAAa,OAAO;AAChE,QAAI,UAAU,SAAS,EAAG,QAAO;AAAA,EACnC;AAGA,QAAM,YAAY,0BAA0B,WAAW;AACvD,MAAI,UAAU,SAAS,GAAG;AACxB,WAAO,MAAM,wBAAwB,aAAa,SAAS;AAAA,EAC7D;AAEA,SAAO,CAAC;AACV;AAIA,eAAe,aACb,aACA,OAC8B;AAC9B,QAAM,WAAW,oBAAI,IAA+B;AAEpD,aAAW,WAAW,OAAO;AAC3B,UAAM,UAAM,wBAAS,aAAa,OAAO,EAAE,QAAQ,OAAO,GAAG;AAC7D,QAAI,CAAC,IAAI,WAAW,MAAM,EAAG;AAE7B,QAAI;AACJ,QAAI;AACF,oBAAU,0BAAa,SAAS,OAAO;AAAA,IACzC,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,KAAK,EAAG;AAErB,UAAM,UAAU,MAAM,aAAa,SAAS,GAAG;AAC/C,UAAM,aAAa,iBAAiB,GAAG;AAEvC,UAAM,WAAW,SAAS,IAAI,UAAU;AACxC,UAAM,QAAQ,QAAQ,IAAI,OAAK,EAAE,IAAI;AACrC,QAAI,UAAU;AACZ,eAAS,QAAQ,KAAK,GAAG,KAAK;AAAA,IAChC,OAAO;AACL,eAAS,IAAI,YAAY;AAAA,QACvB,QAAQ;AAAA,QACR,aAAa,OAAO,UAAU;AAAA,QAC9B,SAAS,CAAC,GAAG,KAAK;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,SAAS,SAAS,OAAO,GAAG;AACrC,UAAM,UAAU,CAAC,GAAG,IAAI,IAAI,MAAM,OAAO,CAAC,EAAE,KAAK;AAAA,EACnD;AAEA,SAAO,CAAC,GAAG,SAAS,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAC/E;AAEA,SAAS,eAAe,QAA0B;AAChD,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,CAAC,QAAgB;AAC5B,QAAI;AACJ,QAAI;AACF,oBAAU,yBAAY,GAAG;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,SAAS;AAC1B,UAAI,SAAS,eAAgB;AAC7B,YAAM,WAAO,oBAAK,KAAK,IAAI;AAC3B,UAAI;AACJ,UAAI;AACF,iBAAK,sBAAS,IAAI;AAAA,MACpB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,GAAG,YAAY,GAAG;AACpB,aAAK,IAAI;AAAA,MACX,WAAW,GAAG,OAAO,KAAK,KAAK,SAAS,KAAK,KAAK,CAAC,KAAK,SAAS,OAAO,GAAG;AACzE,YAAI,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,OAAK,MAAM;AACX,SAAO;AACT;AAQA,SAAS,kBAAkB,SAA2B;AACpD,MAAI;AACJ,MAAI;AACF,kBAAU,0BAAa,SAAS,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAoB,CAAC;AAE3B,QAAM,KAAK;AACX,MAAI;AACJ,UAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAC1C,YAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,EACvB;AACA,SAAO;AACT;AAUA,eAAe,oBACb,aACA,SAC8B;AAC9B,QAAM,UAAU,kBAAkB,OAAO;AACzC,QAAM,aAAS,oBAAK,SAAS,IAAI;AAEjC,MAAI,QAAQ,WAAW,EAAG,QAAO,CAAC;AAElC,QAAM,UAA+B,CAAC;AAEtC,aAAW,OAAO,SAAS;AACzB,UAAM,aAAS,oBAAK,QAAQ,GAAG;AAC/B,UAAM,iBAAa,oBAAK,QAAQ,OAAO,QAAQ,MAAM;AACrD,QAAI,KAAC,wBAAW,UAAU,EAAG;AAE7B,UAAM,YAAY,iBAAiB,UAAU;AAC7C,QAAI,UAAU,WAAW,EAAG;AAE5B,UAAMC,WAAU,4BAA4B,SAAS;AACrD,QAAIA,SAAQ,WAAW,EAAG;AAE1B,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,aAAa,GAAG,GAAG;AAAA,MACnB,SAAS,CAAC,GAAG,IAAI,IAAIA,QAAO,CAAC,EAAE,KAAK;AAAA,IACtC,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAChE;AAMA,SAAS,iBAAiB,QAA0B;AAClD,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,CAAC,QAAgB;AAC5B,QAAI;AACJ,QAAI;AACF,oBAAU,yBAAY,GAAG;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,SAAS;AAC1B,YAAM,WAAO,oBAAK,KAAK,IAAI;AAC3B,UAAI;AACJ,UAAI;AACF,iBAAK,sBAAS,IAAI;AAAA,MACpB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,GAAG,YAAY,GAAG;AACpB,aAAK,IAAI;AAAA,MACX,WAAW,GAAG,OAAO,KAAK,KAAK,SAAS,OAAO,GAAG;AAChD,YAAI,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,OAAK,MAAM;AACX,SAAO;AACT;AAKA,SAAS,0BAA0B,aAA+B;AAChE,QAAM,MAAgB,CAAC;AACvB,QAAM,OAAO,CAAC,QAAgB;AAC5B,QAAI;AACJ,QAAI;AACF,oBAAU,yBAAY,GAAG;AAAA,IAC3B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,SAAS;AAC1B,UAAI,SAAS,kBAAkB,SAAS,UAAU,SAAS,SAAU;AACrE,YAAM,WAAO,oBAAK,KAAK,IAAI;AAC3B,UAAI;AACJ,UAAI;AACF,iBAAK,sBAAS,IAAI;AAAA,MACpB,QAAQ;AACN;AAAA,MACF;AACA,UAAI,GAAG,YAAY,GAAG;AACpB,aAAK,IAAI;AAAA,MACX,WAAW,GAAG,OAAO,KAAK,KAAK,SAAS,OAAO,GAAG;AAChD,YAAI,KAAK,IAAI;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,OAAK,WAAW;AAChB,SAAO;AACT;AAgBA,SAAS,4BAA4B,WAA+B;AAClE,QAAM,UAAU,oBAAI,IAAY;AAEhC,aAAW,YAAY,WAAW;AAChC,QAAI;AACJ,QAAI;AACF,oBAAU,0BAAa,UAAU,OAAO;AAAA,IAC1C,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,KAAK,EAAG;AAIrB,UAAM,KAAK;AACX,QAAI;AACJ,YAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAG1C,cAAQ,IAAI,MAAM,CAAC,CAAC;AAAA,IACtB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,OAAO,EAAE,KAAK;AAC3B;AAMA,eAAe,wBACb,aACA,WAC8B;AAC9B,QAAM,WAAW,oBAAI,IAA0D;AAE/E,aAAW,WAAW,WAAW;AAC/B,UAAM,UAAM,wBAAS,aAAa,OAAO,EAAE,QAAQ,OAAO,GAAG;AAC7D,UAAM,aAAa,qBAAqB,GAAG;AAC3C,UAAM,SAAS,SAAS,IAAI,UAAU;AAEtC,QAAI;AACJ,QAAI;AACF,oBAAU,0BAAa,SAAS,OAAO;AAAA,IACzC,QAAQ;AACN;AAAA,IACF;AACA,QAAI,CAAC,QAAQ,KAAK,EAAG;AAErB,UAAM,KAAK;AACX,QAAI;AACJ,UAAM,QAAkB,CAAC;AACzB,YAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAC1C,YAAM,KAAK,MAAM,CAAC,CAAC;AAAA,IACrB;AAEA,QAAI,QAAQ;AACV,iBAAW,KAAK,MAAO,QAAO,QAAQ,IAAI,CAAC;AAAA,IAC7C,OAAO;AACL,eAAS,IAAI,YAAY;AAAA,QACvB,SAAS,IAAI,IAAI,KAAK;AAAA,QACtB,YAAY,qBAAqB,GAAG;AAAA,MACtC,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAA+B,CAAC;AACtC,aAAW,CAAC,KAAK,GAAG,KAAK,UAAU;AACjC,QAAI,IAAI,QAAQ,SAAS,EAAG;AAC5B,YAAQ,KAAK;AAAA,MACX,QAAQ;AAAA,MACR,aAAa,IAAI;AAAA,MACjB,SAAS,CAAC,GAAG,IAAI,OAAO,EAAE,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,OAAO,cAAc,EAAE,MAAM,CAAC;AAChE;AAOA,SAAS,qBAAqBC,UAAyB;AACrD,QAAM,QAAQA,SAAQ,MAAM,GAAG;AAE/B,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,MAAI,WAAW,KAAK,MAAM,UAAU,CAAC,MAAM,OAAO;AAEhD,WAAO,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,GAAG;AAAA,EAC7C;AAEA,QAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,MAAI,UAAU,KAAK,SAAS,MAAM,SAAS,GAAG;AAC5C,WAAO,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,GAAG,KAAK;AAAA,EAC7C;AACA,SAAO;AACT;AAEA,SAAS,qBAAqBA,UAAyB;AACrD,QAAM,QAAQA,SAAQ,MAAM,GAAG;AAC/B,QAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,MAAI,WAAW,KAAK,MAAM,UAAU,CAAC,MAAM,OAAO;AAChD,UAAM,UAAU,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,GAAG;AACpD,WAAO,GAAG,OAAO;AAAA,EACnB;AACA,SAAO;AACT;AAIA,SAAS,iBAAiBA,UAAyB;AACjD,QAAM,QAAQA,SAAQ,MAAM,GAAG;AAC/B,MAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,OAAO;AAC3C,WAAO,MAAM,CAAC;AAAA,EAChB;AACA,SAAO;AACT;;;AE1XO,SAAS,eACd,UACA,UACiB;AACjB,QAAM,mBAAmB,oBAAI,IAA+B;AAC5D,aAAW,KAAK,UAAU;AACxB,qBAAiB,IAAI,EAAE,QAAQ,CAAC;AAAA,EAClC;AAEA,QAAM,QAAyB,CAAC;AAChC,QAAM,cAAc,oBAAI,IAAY;AAEpC,aAAW,cAAc,UAAU;AACjC,gBAAY,IAAI,WAAW,MAAM;AACjC,UAAM,aAAa,iBAAiB,IAAI,WAAW,MAAM;AACzD,UAAM,kBAAkB,IAAI,IAAI,WAAW,OAAO;AAClD,UAAM,kBAAkB,IAAI,IAAI,YAAY,WAAW,CAAC,CAAC;AAEzD,UAAM,eAAe,CAAC,GAAG,eAAe,EAAE,OAAO,OAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAC7E,UAAM,iBAAiB,CAAC,GAAG,eAAe,EAAE,OAAO,OAAK,CAAC,gBAAgB,IAAI,CAAC,CAAC;AAE/E,QAAI,aAAa,SAAS,KAAK,eAAe,SAAS,GAAG;AACxD,YAAM,KAAK;AAAA,QACT,QAAQ,WAAW;AAAA,QACnB;AAAA,QACA;AAAA,QACA,mBAAmB,CAAC;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,cAAc,UAAU;AACjC,QAAI,YAAY,IAAI,WAAW,MAAM,EAAG;AACxC,QAAI,WAAW,QAAQ,SAAS,GAAG;AACjC,YAAM,KAAK;AAAA,QACT,QAAQ,WAAW;AAAA,QACnB,cAAc,CAAC,GAAG,WAAW,OAAO;AAAA,QACpC,gBAAgB,CAAC;AAAA,QACjB,mBAAmB,CAAC;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AChDA,IAAAC,cAAsD;AACtD,IAAAC,gBAAqB;AACrB,IAAAC,eAAmC;AAGnC,IAAM,uBAAuB;AAWtB,SAAS,kBAAkB,aAAqB,WAAwE;AAC7H,MAAI,CAAC,UAAW,QAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,EAAE;AACrD,QAAM,UAAM,oBAAK,aAAa,sBAAsB,SAAS;AAC7D,MAAI,KAAC,wBAAW,GAAG,EAAG,QAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,EAAE;AAE3D,MAAI;AACJ,MAAI;AACF,kBAAU,yBAAY,GAAG,EAAE,OAAO,OAAK,EAAE,WAAW,SAAS,KAAK,EAAE,SAAS,OAAO,CAAC,EAAE,KAAK;AAAA,EAC9F,QAAQ;AACN,WAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,EAAE;AAAA,EACvC;AACA,MAAI,QAAQ,WAAW,EAAG,QAAO,EAAE,WAAW,CAAC,GAAG,UAAU,CAAC,EAAE;AAE/D,QAAM,WAAqB,CAAC;AAC5B,MAAI,SAA0B,EAAE,UAAU;AAC1C,aAAW,QAAQ,SAAS;AAC1B,QAAI;AACF,YAAM,UAAM,8BAAa,oBAAK,KAAK,IAAI,GAAG,OAAO;AACjD,YAAM,aAAS,aAAAC,OAAU,GAAG;AAC5B,UAAI,UAAU,QAAQ,OAAO,WAAW,UAAU;AAChD,iBAAS,KAAK,mBAAmB,IAAI,sCAAiC;AACtE;AAAA,MACF;AACA,eAAS,cAAc,QAAQ,MAAM;AAAA,IACvC,SAAS,KAAU;AACjB,eAAS,KAAK,mBAAmB,IAAI,qBAAqB,IAAI,SAAS,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,OAAO,EAAE;AAAA,IACxG;AAAA,EACF;AACA,SAAO,EAAE,WAAW,QAAQ,SAAS;AACvC;AAEO,SAAS,sBAAsB,aAAqB,eAA4C;AACrG,MAAI,CAAC,cAAe,QAAO;AAC3B,QAAM,WAAO,oBAAK,aAAa,aAAa;AAC5C,MAAI,KAAC,wBAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,cAAU,0BAAa,MAAM,OAAO,EAAE,KAAK;AACjD,WAAO,WAAW;AAAA,EACpB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,QAAyB,QAA8B;AAC5E,QAAM,MAAuB,EAAE,GAAG,OAAO;AAEzC,MAAI,QAAQ,kBAAkB;AAC5B,QAAI,YAAY;AAAA,MACd,UAAU,OAAO,OAAO,gBAAgB;AAAA,MACxC,SAAS,MAAM,QAAQ,OAAO,OAAO,IAAI,OAAO,QAAQ,IAAI,MAAM,IAAI,CAAC;AAAA,IACzE;AAAA,EACF;AACA,MAAI,MAAM,QAAQ,QAAQ,uBAAuB,GAAG;AAClD,QAAI,eAAe,OAAO,wBAAwB,IAAI,CAAC,OAAY;AAAA,MACjE,IAAI,OAAO,GAAG,MAAM,EAAE;AAAA,MACtB,SAAS,OAAO,GAAG,OAAO;AAAA,MAC1B,YAAY,OAAO,GAAG,UAAU;AAAA,MAChC,KAAK,OAAO,GAAG,GAAG;AAAA,MAClB,MAAM,OAAO,GAAG,IAAI;AAAA,MACpB,cAAc,OAAO,GAAG,YAAY;AAAA,IACtC,EAAE;AAAA,EACJ;AACA,MAAI,QAAQ,sCAAsC;AAChD,UAAM,MAAM,OAAO;AACnB,UAAM,MAAM,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG;AAC3C,QAAI,0BAA0B,IAAI,IAAI,CAAC,OAAY;AAAA,MACjD,MAAM,OAAO,GAAG,QAAQ,EAAE;AAAA,MAC1B,WAAW,OAAO,GAAG,SAAS;AAAA,MAC9B,QAAQ,MAAM,QAAQ,GAAG,MAAM,IAAI,EAAE,OAAO,IAAI,MAAM,IAAI;AAAA,MAC1D,gBAAgB,OAAO,GAAG,cAAc;AAAA,MACxC,YAAY,OAAO,GAAG,WAAW;AAAA,IACnC,EAAE;AAAA,EACJ;AACA,MAAI,QAAQ,sBAAsB;AAChC,UAAM,KAAK,OAAO;AAClB,QAAI,sBAAsB;AAAA,MACxB,UAAU,IAAI,IAAI,SAAS;AAAA,MAC3B,eAAe,IAAI,IAAI,eAAe;AAAA,MACtC,mBAAmB,OAAO,IAAI,mBAAmB;AAAA,MACjD,WAAW,KAAK,IAAI,UAAU;AAAA,MAC9B,KAAK;AAAA,IACP;AAAA,EACF;AACA,MAAI,QAAQ,gBAAgB;AAC1B,QAAI,gBAAgB;AAAA,MAClB,kBAAkB,OAAO,OAAO,eAAe,iBAAiB;AAAA,MAChE,KAAK,OAAO;AAAA,IACd;AAAA,EACF;AACA,MAAI,QAAQ,yBAAyB;AACnC,QAAI,iBAAiB;AAAA,MACnB,OAAO,IAAI,OAAO,wBAAwB,KAAK;AAAA,MAC/C,UAAU,IAAI,OAAO,wBAAwB,QAAQ;AAAA,MACrD,KAAK,OAAO;AAAA,IACd;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,OAAO,GAAgC;AAC9C,SAAO,KAAK,OAAO,SAAY,OAAO,CAAC;AACzC;AACA,SAAS,IAAI,GAAgC;AAC3C,SAAO,OAAO,MAAM,WAAW,IAAI,OAAO,MAAM,YAAY,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI;AAC5F;AACA,SAAS,KAAK,GAAiC;AAC7C,SAAO,OAAO,MAAM,YAAY,IAAI;AACtC;;;AJ/EA,SAAS,cAAc,SAA2C;AAChE,MAAI,CAAC,QAAQ,gBAAgB,KAAC,wBAAW,QAAQ,YAAY,GAAG;AAC9D,QAAI,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,GAAG;AAC5D,YAAM,MAAM,aAAa,QAAQ,YAAY;AAC7C,YAAMC,YAAiC;AAAA,QACrC,SAAS,IAAI;AAAA,QACb,WAAW;AAAA,QACX,eAAe,IAAI;AAAA,QACnB,aAAa,IAAI;AAAA,QACjB,mBAAmB,IAAI;AAAA,QACvB,qBAAqB,CAAC;AAAA,QACtB,mBAAmB,IAAI;AAAA,MACzB;AACA,aAAO,EAAE,UAAAA,WAAU,OAAO,MAAM,UAAU,IAAI;AAAA,IAChD;AACA,UAAM,IAAI;AAAA,MACR,iGACsB,QAAQ,gBAAgB,aAAa;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,WAAW,aAAa,QAAQ,YAAY;AAClD,QAAM,QAAQ,QAAQ,iBAAa,wBAAW,QAAQ,SAAS,IAAI,UAAU,QAAQ,SAAS,IAAI;AAElG,MAAI;AACJ,MAAI,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,GAAG;AAC5D,eAAW,aAAa,QAAQ,YAAY;AAAA,EAC9C,OAAO;AACL,eAAW,eAA2B,UAAU,SAAS,MAAS;AAAA,EACpE;AAEA,SAAO,EAAE,UAAU,OAAO,SAAS;AACrC;AAaA,IAAM,iCAAiC;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAMA,SAAS,mBAAmB,UAA2B;AACrD,aAAW,WAAW,gCAAgC;AACpD,QAAI,gBAAgB,UAAU,OAAO,EAAG,QAAO;AAAA,EACjD;AACA,SAAO;AACT;AAEA,eAAsB,UAAU,SAA2D;AACzF,QAAM,EAAE,UAAU,SAAS,IAAI,cAAc,OAAO;AAEpD,MAAI,cAAc;AAClB,MAAI,aAA6D,CAAC;AAElE,QAAM,iBAAiB,sBAAsB,OAAO;AACpD,MAAI,gBAAgB;AAClB,UAAM,WAAW,UAAU,iBAAiB;AAC5C,UAAM,kBAAkBC,iBAAgB,QAAQ,aAAa,QAAQ;AAErE,UAAM,eAAe,gBAAgB,OAAO,OAAK,CAAC,mBAAmB,CAAC,CAAC;AACvE,UAAM,QAAQ,WAAW,gBAAgB,YAAY;AACrD,kBAAc,MAAM;AACpB,iBAAa,MAAM;AAAA,EACrB;AAEA,MAAI,iBAAiB;AACrB,QAAM,kBAA4B,CAAC;AAEnC,MAAI,QAAQ,mBAAe,wBAAW,QAAQ,WAAW,GAAG;AAC1D,UAAM,EAAE,aAAAC,eAAa,cAAAC,eAAa,IAAI,MAAM,OAAO,IAAI;AACvD,UAAM,EAAE,MAAAC,OAAK,IAAI,MAAM,OAAO,MAAM;AACpC,eAAW,SAASF,cAAY,QAAQ,WAAW,GAAG;AACpD,UAAI,CAAC,MAAM,SAAS,OAAO,EAAG;AAC9B,YAAM,UAAUC,eAAaC,OAAK,QAAQ,aAAa,KAAK,GAAG,OAAO;AACtE,YAAM,WAAW,KAAK,MAAM,OAAO;AACnC,UAAI,SAAS,mBAAmB,MAAM,QAAQ,SAAS,eAAe,GAAG;AACvE,mBAAW,MAAM,SAAS,iBAAiB;AACzC,0BAAgB,KAAK,GAAG,SAAS,UAAU,KAAK,KAAK,GAAG,IAAI,IAAI,GAAG,QAAQ,EAAE,GAAG,KAAK,CAAC;AAAA,QACxF;AAAA,MACF;AAAA,IACF;AACA,qBAAiB,gBAAgB,WAAW;AAAA,EAC9C;AAEA,QAAM,kBAAkB,eAAe;AAEvC,SAAO;AAAA,IACL,QAAQ,eAAe,kBAAkB;AAAA,IACzC,SAAS,CAAC,eAAe,CAAC;AAAA,IAC1B,YAAY,EAAE,QAAQ,aAAa,WAAW;AAAA,IAC9C,eAAe,EAAE,QAAQ,gBAAgB,gBAAgB;AAAA,IACzD,WAAW,EAAE,QAAQ,iBAAiB,UAAU,EAAE;AAAA,EACpD;AACF;AAEA,eAAsB,UACpB,SACA,SACgC;AAChC,QAAM,EAAE,SAAS,IAAI,cAAc,OAAO;AAE1C,QAAM,eAAe,WACjB,mBAAmB,QAAQ,aAAa,SAAS,eAAe,SAAS,SAAS,IAClF,EAAE,KAAK,MAAM,QAAQ,QAAiB,SAAS,kDAA6C;AAEhG,QAAM,kBAAkBH,iBAAgB,QAAQ,aAAa,aAAa,GAAG;AAE7E,QAAM,eAAe,gBAAgB,OAAO,OAAK,CAAC,mBAAmB,CAAC,CAAC;AAGvE,QAAM,EAAE,aAAa,WAAW,IAAI,mBAAmB,YAAY;AAGnE,QAAM,qBAAqB,aAAa,MACpC,MAAM,0BAA0B,QAAQ,aAAa,aAAa,KAAK,YAAY,IACnF,CAAC;AAGL,QAAM,iBAAiB,MAAM,sBAAsB,OAAO;AAE1D,QAAM,kBAAkB,uBAAuB,SAAS,YAAY;AAEpE,QAAM,EAAE,WAAW,iBAAiB,IAAI,kBAAkB,OAAO;AAEjE,QAAM,cAAwB,CAAC;AAC/B,MAAI,aAAa,QAAS,aAAY,KAAK,aAAa,OAAO;AAC/D,cAAY,KAAK,GAAG,gBAAgB;AAGpC,MAAI;AACJ,MAAI,aAAa,WAAW,KAAK,CAAC,aAAa,KAAK;AAClD,iBAAa;AAAA,EACf,WAAW,aAAa,WAAW,GAAG;AACpC,iBAAa;AAAA,EACf;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,UAAU,SAAqD;AACnF,QAAM,SAAS,MAAM,UAAU,OAAO;AAEtC,MAAI,OAAO,SAAS;AAClB,WAAO,EAAE,OAAO;AAAA,EAClB;AAEA,QAAM,SAAS,MAAM,UAAU,SAAS,MAAM;AAC9C,QAAM,aAAa,mBAAmB,SAAS,QAAQ,MAAM;AAE7D,SAAO,EAAE,QAAQ,QAAQ,WAAW;AACtC;AAMA,SAASA,iBAAgB,aAAqB,UAAmC;AAC/E,QAAM,MAAM,oBAAI,IAAY;AAC5B,QAAM,UAAU,CAAC,QAAgB;AAC/B,QAAI;AACF,YAAM,UAAM,gCAAS,KAAK,EAAE,SAAS,KAAO,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,KAAK,YAAY,CAAC,EAC9F,SAAS,EAAE,KAAK;AACnB,UAAI,IAAK,YAAW,KAAK,IAAI,MAAM,IAAI,EAAE,OAAO,OAAO,EAAG,KAAI,IAAI,EAAE,QAAQ,OAAO,GAAG,CAAC;AAAA,IACzF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,YAAQ,wBAAwB,QAAQ,OAAO;AAC/C,YAAQ,2BAA2B;AACnC,YAAQ,0CAA0C;AAAA,EACpD,OAAO;AACL,YAAQ,2BAA2B;AAAA,EACrC;AAEA,SAAO,CAAC,GAAG,GAAG,EAAE,KAAK;AACvB;AAEA,SAAS,sBAAsB,SAA6D;AAC1F,MAAI,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,GAAG;AAC5D,WAAO,aAAa,QAAQ,YAAY;AAAA,EAC1C;AACA,MAAI,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,GAAG;AAC5D,UAAM,WAAW,aAAa,QAAQ,YAAY;AAClD,UAAM,QAAQ,QAAQ,iBAAa,wBAAW,QAAQ,SAAS,IAC3D,UAAU,QAAQ,SAAS,IAC3B;AACJ,WAAO,eAA2B,UAAU,KAAK;AAAA,EACnD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,cAA6E;AACvG,QAAM,UAAU,oBAAI,IAAyD;AAC7E,QAAM,aAAuB,CAAC;AAE9B,aAAW,QAAQ,cAAc;AAC/B,QAAI,KAAK,WAAW,MAAM,GAAG;AAC3B,YAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,YAAM,aAAa,MAAM,UAAU,IAAI,MAAM,CAAC,IAAI;AAClD,UAAI,CAAC,QAAQ,IAAI,UAAU,GAAG;AAC5B,gBAAQ,IAAI,YAAY,EAAE,QAAQ,oBAAI,IAAI,GAAG,OAAO,oBAAI,IAAI,EAAE,CAAC;AAAA,MACjE;AACA,cAAQ,IAAI,UAAU,EAAG,MAAM,IAAI,IAAI;AAAA,IACzC,OAAO;AACL,iBAAW,KAAK,IAAI;AAAA,IACtB;AAAA,EACF;AAEA,QAAM,cAA4B,CAAC;AACnC,aAAW,CAAC,MAAM,IAAI,KAAK,SAAS;AAClC,gBAAY,KAAK;AAAA,MACf,YAAY;AAAA,MACZ,QAAQ,CAAC,GAAG,KAAK,MAAM;AAAA,MACvB,OAAO,CAAC,GAAG,KAAK,KAAK;AAAA,MACrB,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,OAAO,OAAK,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC;AAAA,MACtD,SAAS,CAAC,GAAG,KAAK,MAAM,EAAE,OAAO,OAAK,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,IAC1D,CAAC;AAAA,EACH;AACA,cAAY,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,cAAc,EAAE,UAAU,CAAC;AACnE,aAAW,KAAK;AAEhB,SAAO,EAAE,aAAa,WAAW;AACnC;AAEA,eAAe,0BACb,aACA,KACA,cAC8B;AAE9B,QAAM,UAAU,aAAa,OAAO,OAAK,EAAE,WAAW,MAAM,KAAK,EAAE,SAAS,KAAK,KAAK,CAAC,EAAE,SAAS,OAAO,CAAC;AAE1G,QAAM,YAAY,aAAa,OAAO,OAAK,EAAE,SAAS,OAAO,KAAK,CAAC,EAAE,SAAS,OAAO,CAAC;AAEtF,MAAI,QAAQ,WAAW,KAAK,UAAU,WAAW,EAAG,QAAO,CAAC;AAE5D,QAAM,UAA+B,CAAC;AAGtC,MAAI,QAAQ,SAAS,GAAG;AACtB,UAAM,CAAC,QAAQ,KAAK,IAAI,MAAM,QAAQ,IAAI;AAAA,MACxC,4BAA4B,aAAa,KAAK,OAAO;AAAA,MACrD,4BAA4B,aAAa,OAAO;AAAA,IAClD,CAAC;AACD,YAAQ,KAAK,GAAG,oBAAoB,QAAQ,KAAK,CAAC;AAAA,EACpD;AAGA,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,YAAY,MAAM,qBAAqB,aAAa,KAAK,SAAS;AACxE,YAAQ,KAAK,GAAG,SAAS;AAAA,EAC3B;AAEA,SAAO,QAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAC5D;AAOA,eAAe,qBACb,aACA,KACA,WAC8B;AAC9B,QAAM,UAA+B,CAAC;AAEtC,aAAW,QAAQ,WAAW;AAC5B,UAAM,iBAAiB,KAAK,QAAQ,OAAO,GAAG;AAG9C,UAAM,gBAAuD,CAAC;AAC9D,QAAI;AACF,YAAM,oBAAgB,gCAAS,YAAY,GAAG,IAAI,cAAc,IAAI;AAAA,QAClE,KAAK;AAAA,QACL,OAAO,CAAC,UAAU,QAAQ,MAAM;AAAA,QAChC,SAAS;AAAA,QACT,WAAW,IAAI,OAAO;AAAA,MACxB,CAAC,EAAE,SAAS,OAAO;AACnB,oBAAc,KAAK,GAAG,mBAAmB,aAAa,CAAC;AAAA,IACzD,QAAQ;AAAA,IAER;AAGA,UAAM,eAAsD,CAAC;AAC7D,QAAI;AACF,YAAM,mBAAe,8BAAa,oBAAK,aAAa,cAAc,GAAG,OAAO;AAC5E,mBAAa,KAAK,GAAG,mBAAmB,YAAY,CAAC;AAAA,IACvD,QAAQ;AAEN;AAAA,IACF;AAEA,UAAM,YAAY,IAAI,IAAI,cAAc,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAC7D,UAAM,WAAW,IAAI,IAAI,aAAa,IAAI,OAAK,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3D,UAAM,QAAQ,aAAa,OAAO,OAAK,CAAC,UAAU,IAAI,EAAE,IAAI,CAAC;AAC7D,UAAM,UAAU,cAAc,OAAO,OAAK,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC;AAC/D,UAAM,UAAU,aAAa,OAAO,OAAK;AACvC,YAAM,MAAM,UAAU,IAAI,EAAE,IAAI;AAChC,aAAO,OAAO,IAAI,SAAS,EAAE;AAAA,IAC/B,CAAC;AAED,QAAI,MAAM,SAAS,KAAK,QAAQ,SAAS,KAAK,QAAQ,SAAS,GAAG;AAChE,cAAQ,KAAK,EAAE,MAAM,gBAAgB,OAAO,SAAS,QAAQ,CAAC;AAAA,IAChE;AAAA,EACF;AAEA,SAAO;AACT;AAMA,SAAS,mBAAmB,SAAwD;AAClF,MAAI,CAAC,QAAQ,KAAK,EAAG,QAAO,CAAC;AAC7B,QAAM,UAAiD,CAAC;AACxD,QAAM,KAAK;AACX,MAAI;AACJ,UAAQ,QAAQ,GAAG,KAAK,OAAO,OAAO,MAAM;AAC1C,YAAQ,KAAK,EAAE,MAAM,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EACjD;AACA,SAAO;AACT;AAEA,eAAe,sBAAsB,SAAqD;AACxF,QAAM,WAAW,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,IACpE,aAAa,QAAQ,YAAY,EAAE,sBACnC,CAAC;AAEL,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,CAAC;AAAA,EACV;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,kBAAkB,QAAQ,WAAW;AAC5D,WAAO,eAAe,UAAU,QAAQ;AAAA,EAC1C,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAMA,SAAS,uBAAuB,SAA2B,cAAyC;AAClG,QAAM,UAAuD,CAAC;AAC9D,QAAM,aAAgF,CAAC;AACvF,QAAM,aAA4D,CAAC;AAEnE,QAAM,WAAW,QAAQ,oBAAgB,wBAAW,QAAQ,YAAY,IACpE,aAAa,QAAQ,YAAY,IACjC;AACJ,QAAM,QAAQ,YAAY,QAAQ,iBAAa,wBAAW,QAAQ,SAAS,IACvE,UAAU,QAAQ,SAAS,IAC3B;AAEJ,QAAM,wBAAwB,UAAU,kBAAkB,SAAS,QAAQ,OAAK,EAAE,KAAK,KAAK,CAAC;AAC7F,QAAM,qBAAqB,OAAO,MAAM,mBAAmB,UAAU,QAAQ,OAAK,EAAE,KAAK,KAAK,CAAC;AAE/F,aAAW,KAAK,cAAc;AAC5B,UAAM,UAAU,mBAAmB,KAAK,OAAK,gBAAgB,GAAG,CAAC,CAAC;AAClE,UAAM,aAAa,sBAAsB,KAAK,OAAK,gBAAgB,GAAG,CAAC,CAAC;AAExE,QAAI,SAAS;AACX,cAAQ,KAAK,EAAE,MAAM,GAAG,QAAQ,WAAW,CAAC;AAAA,IAC9C,WAAW,YAAY;AACrB,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,WAAW,CAAC;AAAA,IACjD,OAAO;AACL,iBAAW,KAAK,EAAE,MAAM,GAAG,QAAQ,aAAa,CAAC;AAAA,IACnD;AAAA,EACF;AAEA,SAAO,EAAE,SAAS,YAAY,WAAW;AAC3C;AAEA,SAAS,kBAAkB,SAAuF;AAChH,QAAM,EAAE,WAAW,cAAc,SAAS,IAAI,kBAAkB,QAAQ,aAAa,QAAQ,SAAS;AACtG,QAAM,oBAAoB,sBAAsB,QAAQ,aAAa,QAAQ,aAAa;AAE1F,MAAI,mBAAmB;AACrB,WAAO,EAAE,WAAW,EAAE,GAAG,cAAc,kBAAkB,GAAG,kBAAkB,SAAS;AAAA,EACzF;AACA,SAAO,EAAE,WAAW,cAAc,kBAAkB,SAAS;AAC/D;AAEA,SAAS,mBACP,SACA,QACA,QACQ;AACR,SAAO,gBAAgB,SAAS,QAAQ,MAAM;AAChD;AAMA,SAAS,gBACP,SACA,QACA,QACQ;AACR,QAAM,EAAE,WAAW,aAAa,YAAY,oBAAoB,iBAAiB,YAAY,IAAI;AACjG,QAAM,QAAQ,UAAU,aAAa,QAAQ,aAAa;AAE1D,QAAM,aAAa,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC5E,QAAM,eAAe,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAChF,QAAM,eAAe,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAEhF,QAAM,UAAU,UAAU,WAAW,aAAa,OAAO,SAAS,WAAW;AAC7E,QAAM,eAAe,OAAO,SAAS,iBAAiB;AAEtD,QAAM,gBAAgB,UAAU,qBAAqB;AACrD,QAAM,gBAAgB,kBAAkB,SAAY,WAAM,gBAAgB,WAAM;AAEhF,QAAM,QAAkB,CAAC;AAGzB,QAAM,KAAK,WAAW,WAAW,mDAAc,YAAY,MAAM,KAAK,kBAAkB,aAAa,UAAU,CAAC,CAAC;AAGjH,QAAM,KAAK,WAAW,cAAc,qCAAoB,UAAU,OAAO,YAAY,OAAO,YAAY,KAAK,qBAAqB,kBAAkB,CAAC,CAAC;AAGtJ,QAAM,KAAK,WAAW,SAAS,8CAAc,gBAAgB,QAAQ,MAAM,MAAM,gBAAgB,WAAW,MAAM,WAAM,gBAAgB,WAAW,MAAM,KAAK,gBAAgB,eAAe,CAAC,CAAC;AAE/L,MAAI,UAAU,cAAc,QAAQ;AAClC,UAAM,KAAK,WAAW,WAAW,4BAAqB,UAAU,aAAa,MAAM,KAAK,kBAAkB,UAAU,YAAY,CAAC,CAAC;AAAA,EACpI;AACA,MAAI,UAAU,yBAAyB,QAAQ;AAC7C,UAAM,KAAK,WAAW,QAAQ,uCAAgC,UAAU,wBAAwB,MAAM,KAAK,eAAe,UAAU,uBAAuB,CAAC,CAAC;AAAA,EAC/J;AACA,MAAI,UAAU,qBAAqB;AACjC,UAAM,KAAK,WAAW,QAAQ,+BAA0B,eAAe,UAAU,mBAAmB,CAAC,CAAC;AAAA,EACxG;AACA,MAAI,UAAU,WAAW,SAAS,QAAQ;AACxC,UAAM,KAAK,WAAW,WAAW,qBAAgB,kBAAkB,UAAU,UAAU,OAAO,CAAC,CAAC;AAAA,EAClG;AAEA,SAAO;AAAA;AAAA;AAAA;AAAA,iCAImBI,YAAW,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gEA8DmBA,YAAW,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA,6DAIpB,YAAY,KAAKA,YAAW,OAAO,CAAC;AAAA,gEACjCA,aAAW,oBAAI,KAAK,GAAE,YAAY,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,oDAIhD,YAAY,MAAM;AAAA,0DACZ,WAAW,MAAM;AAAA,2DAChB,UAAU;AAAA,yDACZ,YAAY;AAAA,4DACT,YAAY;AAAA,mDACrB,gBAAgB,WAAW,SAAS,QAAQ,OAAO,KAAK,gBAAgB,WAAW,MAAM;AAAA,mDACzF,UAAU,cAAc,SAAS,QAAQ,OAAO,KAAK,UAAU,cAAc,UAAU,CAAC;AAAA,mDACxF,kBAAkB,WAAM,UAAU,kBAAkB,WAAM,QAAQ,OAAO,KAAK,aAAa;AAAA;AAAA;AAAA,IAG1I,UAAU,oBACR,yFAA8DA,YAAW,UAAU,iBAAiB,CAAC,iBACrG,EAAE;AAAA;AAAA;AAAA,EAGN,YAAY,IAAI,OAAK,wBAAwBA,YAAW,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;AAAA;AAAA,EAE5E,MAAM,KAAK,IAAI,CAAC;AAAA;AAAA;AAAA,gCAGc,OAAO,WAAW,SAAS,WAAW,QAAQ,mCAAgC,OAAO,cAAc,SAAS,WAAW,QAAQ,+BAA4B,OAAO,UAAU,SAAS,WAAW,QAAQ;AAAA,yBAC/MA,YAAW,QAAQ,gBAAgB,iBAAiB,CAAC,UAAU,QAAQ,YAAY,sBAAmBA,YAAW,QAAQ,SAAS,CAAC,YAAY,EAAE;AAAA;AAAA;AAAA;AAAA;AAK1K;AAEA,SAAS,WAAW,IAAY,OAAe,MAAsB;AACnE,SAAO,6BAA6B,EAAE,cAAc,KAAK,oCAAoC,IAAI;AACnG;AAEA,SAAS,kBAAkB,SAAuB,YAA8B;AAC9E,MAAI,QAAQ,WAAW,KAAK,WAAW,WAAW,GAAG;AACnD,WAAO;AAAA,EACT;AACA,MAAI,OAAO;AACX,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ;AACR,eAAW,KAAK,SAAS;AACvB,cAAQ,iBAAiBA,YAAW,EAAE,UAAU,CAAC,mBAAmB,EAAE,MAAM,MAAM,YAAY,EAAE,QAAQ,MAAM;AAAA,IAChH;AACA,YAAQ;AAAA,EACV;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,YAAQ,+EAA+E,WAAW,MAAM;AACxG,YAAQ;AACR,eAAW,KAAK,YAAY;AAC1B,cAAQ,aAAaA,YAAW,CAAC,CAAC;AAAA,IACpC;AACA,YAAQ;AAAA,EACV;AACA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AACA,SAAO,MAAM,IAAI,OAAK;AACpB,UAAM,OAAiB,CAAC;AACxB,eAAW,KAAK,EAAE,OAAO;AACvB,WAAK,KAAK,iEAAiEA,YAAW,EAAE,IAAI,CAAC,wBAAwBA,YAAW,EAAE,IAAI,CAAC,gBAAgB;AAAA,IACzJ;AACA,eAAW,KAAK,EAAE,SAAS;AACzB,WAAK,KAAK,gEAAgEA,YAAW,EAAE,IAAI,CAAC,wBAAwBA,YAAW,EAAE,IAAI,CAAC,gBAAgB;AAAA,IACxJ;AACA,eAAW,KAAK,EAAE,SAAS;AACzB,WAAK,KAAK,iEAAiEA,YAAW,EAAE,IAAI,CAAC,wBAAwBA,YAAW,EAAE,IAAI,CAAC,gBAAgB;AAAA,IACzJ;AACA,WAAO,kDAAkDA,YAAW,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;AAAA,EACnG,CAAC,EAAE,KAAK,EAAE;AACZ;AAEA,SAAS,gBAAgB,OAAgC;AACvD,QAAM,SAAS,CAAC,OAAe,OAAgD,QAAgB;AAC7F,QAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,WAAO,kEAAkEA,YAAW,KAAK,CAAC,KAAK,MAAM,MAAM;AAAA,YACnG,MAAM,IAAI,OAAK,aAAaA,YAAW,EAAE,IAAI,CAAC,8BAA8BA,YAAW,EAAE,MAAM,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;AAAA,EAClI;AACA,SACE,OAAO,0CAAqC,MAAM,SAAS,OAAO,IAClE,OAAO,+CAA0C,MAAM,YAAY,QAAQ,IAC3E,OAAO,kDAA6C,MAAM,YAAY,KAAK;AAE/E;AAEA,SAAS,kBAAkB,SAA+D;AACxF,SAAO,QAAQ,IAAI,OAAK;AAAA;AAAA,+BAEKA,YAAW,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,eAAYA,YAAW,EAAE,IAAI,CAAC,YAAY,EAAE;AAAA,QAC/F,EAAE,UAAU,kCAAkCA,YAAW,EAAE,OAAO,CAAC,WAAW,EAAE;AAAA,QAChF,EAAE,aAAa,qCAAqCA,YAAW,EAAE,UAAU,CAAC,WAAW,EAAE;AAAA,QACzF,EAAE,MAAM,8BAA8BA,YAAW,EAAE,GAAG,CAAC,WAAW,EAAE;AAAA,QACpE,EAAE,eAAe,uCAAuCA,YAAW,EAAE,YAAY,CAAC,WAAW,EAAE;AAAA;AAAA,GAEpG,EAAE,KAAK,EAAE;AACZ;AAEA,SAAS,eAAe,MAAuE;AAC7F,SAAO,KAAK,IAAI,OAAK;AAAA;AAAA,+BAEQA,YAAW,EAAE,IAAI,CAAC;AAAA,QACzC,EAAE,YAAY,oCAAoCA,YAAW,EAAE,SAAS,CAAC,WAAW,EAAE;AAAA,QACtF,EAAE,QAAQ,SAAS,oCAAoC,EAAE,OAAO,IAAI,OAAK,OAAOA,YAAW,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,gBAAgB,EAAE;AAAA,QAChI,EAAE,aAAa,sCAAsCA,YAAW,EAAE,UAAU,CAAC,WAAW,EAAE;AAAA;AAAA,GAE/F,EAAE,KAAK,EAAE;AACZ;AAEA,SAAS,eAAe,MAAmE;AACzF,QAAM,OAAiB,CAAC;AACxB,MAAI,KAAK,aAAa,OAAW,MAAK,KAAK,+BAA+B,KAAK,QAAQ,cAAc;AACrG,MAAI,KAAK,kBAAkB,OAAW,MAAK,KAAK,gCAAgC,KAAK,aAAa,cAAc;AAChH,MAAI,KAAK,kBAAmB,MAAK,KAAK,oCAAoCA,YAAW,KAAK,iBAAiB,CAAC,YAAY;AACxH,MAAI,KAAK,cAAc,OAAW,MAAK,KAAK,8BAA8B,KAAK,YAAY,eAAU,WAAM,YAAY;AACvH,SAAO,KAAK,SAAS,iBAAiB,KAAK,KAAK,EAAE,CAAC,qBAAqB;AAC1E;AAEA,SAAS,kBAAkB,SAA2B;AACpD,SAAO,OAAO,QAAQ,IAAI,OAAK,OAAOA,YAAW,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;AACtE;AAEA,SAASA,YAAW,GAAmB;AACrC,SAAO,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;ADrtBA,IAAAC,eAA2C;AAE3C,SAASC,UAASC,OAAgB,MAAkC;AAClE,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACtD,MAAI,OAAQ,QAAO,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AACtD,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAIA,MAAK,OAAQ,QAAOA,MAAK,MAAM,CAAC;AAC1D,SAAO;AACT;AAEA,eAAsB,gBAAgBA,OAA+B;AACnE,QAAM,cAAcD,UAASC,OAAM,gBAAgB,KAAK,QAAQ,IAAI;AACpE,QAAM,cAAcD,UAASC,OAAM,gBAAgB;AACnD,QAAM,aAAaD,UAASC,OAAM,eAAe;AACjD,QAAM,eAAeD,UAASC,OAAM,YAAY;AAChD,QAAM,YAAYD,UAASC,OAAM,SAAS;AAC1C,QAAM,YAAYD,UAASC,OAAM,cAAc;AAC/C,QAAM,gBAAgBD,UAASC,OAAM,aAAa;AAClD,QAAM,aAAaD,UAASC,OAAM,eAAe;AACjD,QAAM,eAAeA,MAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AAEvD,QAAM,gBAAgB,gBAAgB;AACtC,MAAI,CAAC,gBAAgB,CAAC,eAAe;AACnC,YAAQ,MAAM,yFAAyF;AACvG,YAAQ,MAAM,qFAAqF;AACnG,YAAQ,MAAM,6GAA6G;AAC3H,YAAQ,MAAM,qEAAqE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,gBAAgB,CAAC,eAAe;AAClC,UAAM,mBAAe,uBAAQ,YAAY;AACzC,QAAI,KAAC,wBAAW,YAAY,GAAG;AAC7B,cAAQ,MAAM,4BAA4B,YAAY,EAAE;AACxD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACA,MAAI,gBAAgB,KAAC,4BAAW,uBAAQ,YAAY,CAAC,GAAG;AACtD,YAAQ,MAAM,gCAA4B,uBAAQ,YAAY,CAAC,EAAE;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,aAAa,KAAC,4BAAW,uBAAQ,SAAS,CAAC,GAAG;AAChD,YAAQ,MAAM,6BAAyB,uBAAQ,SAAS,CAAC,EAAE;AAC3D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,UAAU;AAAA,MACd,cAAc,gBAAgB,CAAC,oBAAgB,uBAAQ,YAAY,IAAI;AAAA,MACvE,cAAc,mBAAe,uBAAQ,YAAY,IAAI;AAAA,MACrD,WAAW,gBAAY,uBAAQ,SAAS,IAAI;AAAA,MAC5C;AAAA,MACA,aAAa,kBAAc,uBAAQ,WAAW,IAAI;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAEA,UAAM,SAAS,MAAM,UAAU,OAAO;AAEtC,oBAAgB,SAAS,MAAM;AAG/B,QAAI,YAAY;AACd,YAAM,OAAO,mBAAmB,QAAQ,OAAO;AAC/C,YAAM,eAAW,uBAAQ,UAAU;AACnC,qCAAU,uBAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,qCAAc,cAAU,aAAAC,WAAc,IAAI,GAAG,OAAO;AACpD,cAAQ,IAAI;AAAA,eAAkB,QAAQ,EAAE;AAAA,IAC1C;AAEA,QAAI,OAAO,cAAc,YAAY;AACnC,yCAAc,uBAAQ,UAAU,GAAG,OAAO,YAAY,OAAO;AAC7D,cAAQ,IAAI;AAAA,mBAAkB,uBAAQ,UAAU,CAAC,EAAE;AAAA,IACrD;AAEA,YAAQ,KAAK,OAAO,OAAO,SAAS,IAAI,CAAC;AAAA,EAC3C,SAAS,KAAU;AACjB,YAAQ,MAAM,qBAAqB,IAAI,OAAO,EAAE;AAChD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,mBACP,QACA,SACyB;AACzB,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,QAAQ,QAAQ,UAAU,aAAa,QAAQ,aAAa;AAClE,QAAM,YAAY,QAAQ,aAAa,CAAC;AAExC,QAAM,OAAgC;AAAA,IACpC,YAAY;AAAA,IACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,QAAQ;AAAA,MACN,QAAQ,OAAO;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,aAAa,OAAO,WAAW;AAAA,MAC/B,gBAAgB,OAAO,cAAc;AAAA,MACrC,YAAY,OAAO,UAAU;AAAA,MAC7B,YAAY,OAAO,WAAW;AAAA,MAC9B,kBAAkB,OAAO,cAAc;AAAA,IACzC;AAAA,EACF;AAEA,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnF,UAAM,eAAe,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AACvF,UAAM,eAAe,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAEvF,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO,YAAY;AAAA,MAC5B,aAAa,OAAO,WAAW;AAAA,MAC/B,YAAY,EAAE,OAAO,YAAY,SAAS,cAAc,SAAS,aAAa;AAAA,MAC9E,kBAAkB;AAAA,QAChB,UAAU,OAAO,gBAAgB,QAAQ,IAAI,OAAK,EAAE,IAAI;AAAA,QACxD,aAAa,OAAO,gBAAgB,WAAW,IAAI,OAAK,EAAE,IAAI;AAAA,QAC9D,YAAY,OAAO,gBAAgB,WAAW,IAAI,OAAK,EAAE,IAAI;AAAA,MAC/D;AAAA,MACA,cAAc,OAAO;AAAA,MACrB,aAAa,OAAO,cAAc;AAAA,MAClC,SAAS,UAAU,WAAW,aAAa,OAAO,SAAS,WAAW;AAAA,MACtE,SAAS,UAAU,WAAW,WAAW,CAAC;AAAA,MAC1C,UAAU,UAAU,gBAAgB,CAAC,GAAG,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,SAAS,EAAE,SAAS,MAAM,EAAE,KAAK,EAAE;AAAA,MACjG,mBAAmB,UAAU,2BAA2B,CAAC,GAAG,IAAI,QAAM,EAAE,MAAM,EAAE,MAAM,WAAW,EAAE,UAAU,EAAE;AAAA,IACjH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,SAAyD,QAA+B;AAC/G,QAAM,EAAE,QAAQ,OAAO,IAAI;AAC3B,QAAM,QAAQ,QAAQ,UAAU,aAAa,QAAQ,aAAa;AAClE,QAAM,YAAY,QAAQ,aAAa,CAAC;AAExC,QAAM,aAAa,QAAQ;AAC3B,QAAM,UAAU,aACZ,kBAAa,UAAU,KACtB,UAAU,WAAW,aAAa,OAAO,SAAS,WAAW;AAElE,UAAQ,IAAI,iCAAkB,KAAK,qBAAM;AACzC,UAAQ,IAAI,YAAY,OAAO,EAAE;AACjC,UAAQ,IAAI,EAAE;AAEd,MAAI,QAAQ;AACV,UAAM,aAAa,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnF,UAAM,eAAe,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AACvF,UAAM,eAAe,OAAO,mBAAmB,OAAO,CAAC,GAAG,MAAM,IAAI,EAAE,QAAQ,QAAQ,CAAC;AAEvF,YAAQ,IAAI,YAAY;AACxB,YAAQ,IAAI,cAAc,OAAO,YAAY,MAAM,wBAAqB,OAAO,WAAW,MAAM,wBAAqB,UAAU,KAAK,YAAY,KAAK,YAAY,EAAE;AACnK,UAAM,QAAQ,OAAO;AACrB,YAAQ,IAAI,mBAAc,MAAM,QAAQ,MAAM,MAAM,MAAM,WAAW,MAAM,WAAM,MAAM,WAAW,MAAM,oBAAiB,UAAU,cAAc,UAAU,CAAC,6BAA0B,UAAU,yBAAyB,UAAU,CAAC,EAAE;AAEtO,QAAI,OAAO,YAAY,SAAS,GAAG;AACjC,cAAQ,IAAI,EAAE;AACd,iBAAW,KAAK,OAAO,YAAa,SAAQ,IAAI,YAAO,CAAC,EAAE;AAAA,IAC5D;AAEA,QAAI,UAAU,mBAAmB;AAC/B,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,gCAAgC;AAC5C,iBAAW,QAAQ,UAAU,kBAAkB,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG;AACtE,YAAI,KAAK,KAAK,EAAG,SAAQ,IAAI,KAAK,KAAK,KAAK,CAAC,EAAE;AAAA,MACjD;AAAA,IACF,WAAW,UAAU,yBAAyB,QAAQ;AACpD,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,6CAA6C;AACzD,iBAAW,KAAK,UAAU,wBAAwB,MAAM,GAAG,CAAC,GAAG;AAC7D,gBAAQ,IAAI,OAAO,EAAE,IAAI,EAAE;AAAA,MAC7B;AAAA,IACF;AAEA,QAAI,UAAU,cAAc,QAAQ;AAClC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,wBAAwB,KAAK,IAAI,GAAG,UAAU,aAAa,MAAM,CAAC,OAAO,UAAU,aAAa,MAAM,IAAI;AACtH,iBAAW,KAAK,UAAU,aAAa,MAAM,GAAG,CAAC,GAAG;AAClD,cAAM,OAAO,EAAE,OAAO,KAAK,EAAE,IAAI,KAAK;AACtC,gBAAQ,IAAI,KAAK,EAAE,GAAG,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE;AAAA,MAC3C;AAAA,IACF;AAEA,QAAI,UAAU,WAAW,SAAS,QAAQ;AACxC,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,aAAa;AACzB,iBAAW,KAAK,UAAU,UAAU,QAAS,SAAQ,IAAI,OAAO,CAAC,EAAE;AAAA,IACrE;AAAA,EACF,OAAO;AACL,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,IAAI,oBAAoB,OAAO,WAAW,SAAS,WAAW,QAAQ,EAAE;AAChF,eAAW,KAAK,OAAO,WAAW,WAAY,SAAQ,IAAI,SAAS,EAAE,IAAI,EAAE;AAC3E,YAAQ,IAAI,qBAAqB,OAAO,cAAc,SAAS,WAAW,QAAQ,EAAE;AACpF,eAAW,MAAM,OAAO,cAAc,gBAAiB,SAAQ,IAAI,SAAS,EAAE,EAAE;AAChF,YAAQ,IAAI,oBAAoB,OAAO,UAAU,SAAS,WAAW,QAAQ,EAAE;AAC/E,YAAQ,IAAI,oBAAoB,OAAO,SAAS,WAAW,gCAA2B,EAAE;AAAA,EAC1F;AACF;;;AMxMA,IAAAC,cAAyF;AACzF,IAAAC,gBAAiD;AAajD,IAAAC,wBAAyB;AACzB,IAAAC,gBAAmC;AAE5B,SAAS,eAAeC,OAAsB;AACnD,QAAM,aAAaA,MAAK,CAAC;AACzB,QAAM,UAAUA,MAAK,MAAM,CAAC;AAE5B,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,yBAAmB,OAAO;AAC1B;AAAA,IACF,KAAK;AACH,6BAAuB,OAAO;AAC9B;AAAA,IACF,KAAK;AACH,0BAAoB,OAAO;AAC3B;AAAA,IACF,KAAK;AACH,WAAK,qBAAqB,OAAO;AACjC;AAAA,IACF,KAAK;AACH,yBAAmB,OAAO;AAC1B;AAAA,IACF,KAAK;AACH,WAAK,uBAAuB,OAAO;AACnC;AAAA,IACF,KAAK;AACH,gCAA0B,OAAO;AACjC;AAAA,IACF;AACE,cAAQ,MAAM,0FAA0F;AACxG,cAAQ,KAAK,CAAC;AAAA,EAClB;AACF;AAEA,SAASC,UAASD,OAAgB,MAAkC;AAClE,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,GAAG,IAAI,GAAG,CAAC;AACtD,MAAI,OAAQ,QAAO,OAAO,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG;AACtD,QAAM,MAAMA,MAAK,QAAQ,IAAI;AAC7B,MAAI,OAAO,KAAK,MAAM,IAAIA,MAAK,OAAQ,QAAOA,MAAK,MAAM,CAAC;AAC1D,SAAO;AACT;AAEA,SAAS,mBAAmBA,OAAsB;AAChD,QAAME,QAAOD,UAASD,OAAM,QAAQ;AACpC,MAAI,CAACE,OAAM;AACT,YAAQ,MAAM,6DAA6D;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,eAAW,uBAAQA,KAAI;AAC7B,MAAI,KAAC,wBAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,4BAA4B,QAAQ,EAAE;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACF,UAAM,WAAW,aAAa,QAAQ;AACtC,YAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAU;AACjB,YAAQ,MAAM,4BAA4B,IAAI,OAAO,EAAE;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,uBAAuBF,OAAsB;AACpD,QAAME,QAAOD,UAASD,OAAM,QAAQ;AACpC,MAAI,CAACE,OAAM;AACT,YAAQ,MAAM,iEAAiE;AAC/E,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,eAAW,uBAAQA,KAAI;AAC7B,MAAI,KAAC,wBAAW,QAAQ,GAAG;AACzB,YAAQ,MAAM,4BAA4B,QAAQ,EAAE;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACF,UAAM,WAAW,aAAa,QAAQ;AACtC,UAAM,aAAa,iBAAiB,QAAQ;AAC5C,QAAI,WAAW,OAAO;AACpB,cAAQ,IAAI,2BAA2B,SAAS,OAAO,kBAAkB,SAAS,aAAa,EAAE;AACjG,cAAQ,IAAI,uBAAuB,SAAS,kBAAkB,SAAS,IAAI,OAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE;AACtG,cAAQ,IAAI,0BAA0B,SAAS,oBAAoB,MAAM,EAAE;AAC3E,cAAQ,KAAK,CAAC;AAAA,IAChB,OAAO;AACL,cAAQ,MAAM,mBAAmB;AACjC,iBAAW,KAAK,WAAW,OAAQ,SAAQ,MAAM,OAAO,CAAC,EAAE;AAC3D,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,SAAS,KAAU;AACjB,YAAQ,MAAM,4BAA4B,IAAI,OAAO,EAAE;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,oBAAoBF,OAAsB;AACjD,QAAM,eAAeC,UAASD,OAAM,YAAY;AAChD,QAAM,YAAYC,UAASD,OAAM,SAAS;AAC1C,QAAM,UAAUC,UAASD,OAAM,OAAO;AACtC,MAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,SAAS;AAC3C,YAAQ,MAAM,qFAAqF;AACnG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,uBAAmB,uBAAQ,YAAY;AAC7C,QAAM,oBAAgB,uBAAQ,SAAS;AACvC,QAAM,kBAAc,uBAAQ,OAAO;AACnC,MAAI,KAAC,wBAAW,gBAAgB,GAAG;AACjC,YAAQ,MAAM,4BAA4B,gBAAgB,EAAE;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,KAAC,wBAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,yBAAyB,aAAa,EAAE;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACF,UAAM,WAAW,aAAa,gBAAgB;AAC9C,UAAM,QAAQ,UAAU,aAAa;AACrC,UAAM,SAAS,eAAe,UAAU,OAAO,SAAS,SAAS;AACjE,kBAAc,aAAa,MAAM;AACjC,YAAQ,IAAI,+BAA+B,WAAW,EAAE;AACxD,YAAQ,IAAI,uBAAuB,OAAO,kBAAkB,SAAS,MAAM,EAAE;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAU;AACjB,YAAQ,MAAM,iBAAiB,IAAI,OAAO,EAAE;AAC5C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,qBAAqBA,OAA+B;AACjE,QAAM,eAAeC,UAASD,OAAM,YAAY;AAChD,QAAM,YAAYC,UAASD,OAAM,SAAS;AAC1C,QAAM,QAAQC,UAASD,OAAM,OAAO;AACpC,MAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,OAAO;AACzC,YAAQ,MAAM,wFAAwF;AACtG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,uBAAmB,uBAAQ,YAAY;AAC7C,QAAM,oBAAgB,uBAAQ,SAAS;AACvC,MAAI,KAAC,wBAAW,gBAAgB,GAAG;AACjC,YAAQ,MAAM,4BAA4B,gBAAgB,EAAE;AAC5D,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI,KAAC,wBAAW,aAAa,GAAG;AAC9B,YAAQ,MAAM,yBAAyB,aAAa,EAAE;AACtD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACF,UAAM,WAAW,aAAa,gBAAgB;AAC9C,UAAM,QAAQ,UAAU,aAAa;AACrC,UAAM,kBAAkB,cAAc,KAAK;AAC3C,QAAI,CAAC,gBAAgB,OAAO;AAC1B,cAAQ,MAAM,wCAAmC;AACjD,iBAAW,KAAK,gBAAgB,OAAQ,SAAQ,MAAM,OAAO,CAAC,EAAE;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,MAAM,6BAAS,qBAAqB;AACtC,cAAQ,MAAM,0HAAiG;AAC/G,cAAQ,MAAM,+FAA+F;AAC7G,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,MAAM,eAAe,OAAO;AAC9B,cAAQ,MAAM,mBAAmB,KAAK,yBAAyB,MAAM,UAAU,EAAE;AACjF,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,UAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AAExC,QAAI;AACJ,QAAI;AACF,wBAAc,gCAAS,sBAAsB,EAAE,SAAS,KAAM,OAAO,CAAC,UAAU,QAAQ,MAAM,GAAG,SAAK,uBAAQ,gBAAgB,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK;AACnJ,UAAI,CAAC,YAAa,eAAc;AAAA,IAClC,QAAQ;AAAA,IAER;AAGA,UAAM,kBAAc,uBAAQ,gBAAgB;AAC5C,QAAI,oBAAuF,CAAC;AAC5F,QAAI;AACF,0BAAoB,MAAM,kBAAkB,WAAW;AAAA,IACzD,QAAQ;AAAA,IAER;AAEA,UAAM,OAAO,eAAe,UAAU,OAAO,UAAU,WAAW;AAElE,QAAI,kBAAkB,SAAS,GAAG;AAChC,YAAM,kBAAkB,IAAI,IAAI,KAAK,oBAAoB,IAAI,OAAK,EAAE,MAAM,CAAC;AAC3E,iBAAW,MAAM,mBAAmB;AAClC,YAAI,CAAC,gBAAgB,IAAI,GAAG,MAAM,GAAG;AACnC,eAAK,oBAAoB,KAAK;AAAA,YAC5B,QAAQ,GAAG;AAAA,YACX,aAAa,GAAG;AAAA,YAChB,SAAS,CAAC,GAAG,IAAI,IAAI,GAAG,OAAO,CAAC,EAAE,KAAK;AAAA,UACzC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AACA,kBAAc,kBAAkB,IAAI;AACpC,YAAQ,IAAI,sBAAsB,QAAQ,OAAO,KAAK,EAAE;AACxD,QAAI,YAAa,SAAQ,IAAI,UAAU,WAAW,EAAE;AACpD,YAAQ,IAAI,2BAA2B,KAAK,kBAAkB,SAAS,MAAM,EAAE;AAC/E,YAAQ,IAAI,0BAA0B,KAAK,oBAAoB,MAAM,GAAG,kBAAkB,SAAS,IAAI,KAAK,kBAAkB,MAAM,2BAA2B,EAAE,EAAE;AACnK,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAU;AACjB,YAAQ,MAAM,kBAAkB,IAAI,OAAO,EAAE;AAC7C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,SAAS,mBAAmBA,OAAsB;AAChD,QAAM,eAAeC,UAASD,OAAM,iBAAiB;AACrD,QAAM,UAAUC,UAASD,OAAM,OAAO;AACtC,QAAM,QAAQC,UAASD,OAAM,OAAO;AACpC,MAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,OAAO;AACvC,YAAQ,MAAM,yFAAyF;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,kBAAc,uBAAQ,YAAY;AACxC,QAAM,kBAAc,uBAAQ,OAAO;AACnC,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,YAAQ,MAAM,4BAA4B,WAAW,EAAE;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,MAAI;AACF,UAAM,WAAW,aAAa,WAAW;AACzC,UAAM,WAAiC,yBAAyB,UAAU,KAAK;AAC/E,kBAAc,aAAa,QAAQ;AACnC,YAAQ,IAAI,iDAAiD,WAAW,EAAE;AAC1E,YAAQ,IAAI,4GAA4G;AACxH,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAU;AACjB,YAAQ,MAAM,gBAAgB,IAAI,OAAO,EAAE;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAe,uBAAuBA,OAA+B;AACnE,QAAM,cAAcC,UAASD,OAAM,gBAAgB,KAAK,QAAQ,IAAI;AACpE,QAAM,mBAAe,uBAAQ,WAAW;AACxC,MAAI,KAAC,wBAAW,YAAY,GAAG;AAC7B,YAAQ,MAAM,2BAA2B,YAAY,EAAE;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAASA,MAAK,SAAS,QAAQ;AACrC,MAAI;AACF,UAAM,QAAQ,MAAM,kBAAkB,YAAY;AAClD,QAAI,MAAM,WAAW,GAAG;AACtB,cAAQ,IAAI,yBAAyB;AACrC,cAAQ,IAAI,gHAAgH;AAC5H,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,QAAI,QAAQ;AACV,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA,IAC5C,OAAO;AACL,iBAAW,KAAK,OAAO;AACrB,gBAAQ,IAAI,WAAW,EAAE,MAAM,EAAE;AACjC,gBAAQ,IAAI,kBAAkB,EAAE,WAAW,EAAE;AAC7C,gBAAQ,IAAI,eAAe,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,MACpD;AACA,cAAQ,IAAI;AAAA,EAAK,MAAM,MAAM,mBAAmB;AAAA,IAClD;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,SAAS,KAAU;AACjB,YAAQ,MAAM,oBAAoB,IAAI,OAAO,EAAE;AAC/C,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAsCA,IAAM,kBAAkB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,qBAAqB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,oBAAoB,oBAAI,IAAI;AAAA,EAChC;AAAA,EAAgB;AAAA,EAAQ;AAAA,EAAQ;AAAA,EAAS;AAAA,EAAS;AAAA,EAAY;AAChE,CAAC;AAED,SAAS,0BAA0BA,OAAsB;AACvD,QAAM,cAAcC,UAASD,OAAM,gBAAgB,KAAK,QAAQ,IAAI;AACpE,QAAM,eAAeA,MAAK,SAAS,iBAAiB;AACpD,QAAM,SAASA,MAAK,SAAS,QAAQ;AAErC,QAAM,mBAAe,uBAAQ,WAAW;AACxC,MAAI,KAAC,wBAAW,YAAY,GAAG;AAC7B,YAAQ,MAAM,2BAA2B,YAAY,EAAE;AACvD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAA4B;AAAA,IAChC,aAAa;AAAA,IACb,QAAQ,CAAC;AAAA,IACT,YAAY;AAAA,EACd;AAEA,mBAAiB,cAAc,MAAM;AAGrC,MAAI;AAAE,WAAO,cAAc,QAAQ,YAAY;AAAA,EAAE,SAAS,KAAU;AAClE,cAAU,QAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AAAA,EACjD;AACA,MAAI;AAAE,WAAO,cAAc,MAAM;AAAA,EAAE,SAAS,KAAU;AACpD,cAAU,QAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AAAA,EACjD;AACA,MAAI;AAAE,WAAO,cAAc,MAAM;AAAA,EAAE,SAAS,KAAU;AACpD,cAAU,QAAQ,MAAM,UAAU,IAAI,OAAO,EAAE;AAAA,EACjD;AAGA,MAAI,QAAQ;AACV,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC7C,OAAO;AACL,qBAAiB,MAAM;AAAA,EACzB;AAGA,QAAM,aAAa,OAAO,OAAO;AAAA,IAC/B,CAAC,MAAM,EAAE,UAAU,QAAQ,EAAE,WAAW;AAAA,EAC1C;AACA,UAAQ,KAAK,aAAa,IAAI,CAAC;AACjC;AAEA,SAAS,UAAU,QAA2B,OAAgB,QAAsB;AAClF,QAAM,WAAW,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AAC5D,MAAI,UAAU;AACZ,aAAS,SAAS;AAClB,aAAS,SAAS;AAAA,EACpB,OAAO;AACL,WAAO,OAAO,KAAK,EAAE,OAAO,QAAQ,UAAU,OAAO,CAAC,GAAG,OAAO,CAAC;AAAA,EACnE;AACF;AAYA,SAAS,iBAAiB,aAAqB,QAAiC;AAC9E,QAAM,QAAmB,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC,GAAG,UAAU,CAAC,EAAE;AACpE,cAAY,aAAa,IAAI,OAAO,CAAC;AAGrC,QAAM,eAAyB,CAAC;AAChC,eAAa;AAAA,IACX,GAAG,MAAM,UACN,OAAO,CAAC,MAAM,EAAE,WAAW,cAAc,KAAK,MAAM,2BAA2B,EAC/E,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC;AAAA,EAC/C;AACA,eAAa;AAAA,IACX,GAAG,MAAM,UACN,OAAO,CAAC,MAAM,wBAAwB,KAAK,CAAC,CAAC,EAC7C,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,CAAC;AAAA,EAC/C;AACA,eAAa;AAAA,IACX,GAAG,MAAM,UACN,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,KAAK,CAAC,EAAE,SAAS,gBAAgB,KAAK,MAAM,eAAe;AAAA,EACzG;AAEA,QAAM,SAAS,cAAc,aAAa,YAAY;AACtD,MAAI,QAAQ;AACV,UAAM,aAAa,kBAAkB,aAAa,MAAM;AACxD,WAAO,OAAO,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,CAAC,MAAM;AAAA,MACd,QAAQ,WAAW,UAAU;AAAA,IAC/B,CAAC;AACD,WAAO,aAAa;AAAA,EACtB,OAAO;AACL,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,WAAW,OAAO,CAAC,EAAE,CAAC;AAAA,EAClE;AAGA,QAAM,eAAyB,CAAC;AAChC,eAAa,KAAK,GAAG,MAAM,UAAU,OAAO,CAAC,MAAM,MAAM,2BAA2B,CAAC;AACrF,eAAa,KAAK,GAAG,MAAM,UAAU,OAAO,CAAC,MAAM,MAAM,kCAAkC,CAAC;AAC5F,eAAa,KAAK,GAAG,MAAM,UAAU,OAAO,CAAC,MAAM,EAAE,SAAS,gBAAgB,KAAK,CAAC,EAAE,SAAS,gBAAgB,CAAC,CAAC;AAEjH,QAAM,SAAS,cAAc,aAAa,YAAY;AACtD,MAAI,QAAQ;AACV,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC;AAAA,EACvE,OAAO;AACL,WAAO,OAAO,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAGA,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,iBAAiB;AAClC,UAAM,OAAO,eAAe,IAAI;AAChC,QAAI,MAAM,QAAQ,SAAS,IAAI,GAAG;AAAE,cAAQ,KAAK,IAAI;AAAG;AAAA,IAAS;AACjE,UAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,MAAM,4BAA4B,SAAK,uBAAQ,CAAC,CAAC,SAAK,wBAAS,CAAC,MAAM,IAAI;AAC3G,QAAI,MAAM;AAAE,cAAQ,KAAK,IAAI;AAAG;AAAA,IAAS;AACzC,UAAM,OAAO,MAAM,QAAQ,KAAK,CAAC,MAAM;AACrC,cAAI,wBAAS,CAAC,MAAM,KAAM,QAAO;AACjC,YAAM,aAAS,uBAAQ,CAAC;AACxB,aAAO,sBAAsB,KAAK,MAAM;AAAA,IAC1C,CAAC;AACD,QAAI,MAAM;AAAE,cAAQ,KAAK,IAAI;AAAG;AAAA,IAAS;AAAA,EAC3C;AAEA,MAAI,QAAQ,WAAW,gBAAgB,QAAQ;AAC7C,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,UAAU,OAAO,QAAQ,CAAC;AAAA,EACtE,WAAW,QAAQ,SAAS,GAAG;AAC7B,WAAO,OAAO,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,QAAQ,QAAQ,MAAM,IAAI,gBAAgB,MAAM;AAAA,IAC1D,CAAC;AAAA,EACH,OAAO;AACL,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,WAAW,OAAO,CAAC,EAAE,CAAC;AAAA,EAClE;AAGA,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,oBAAoB;AACrC,UAAM,OAAO,wBAAwB,IAAI;AACzC,QAAI,MAAM,SAAS,SAAS,IAAI,GAAG;AAAE,cAAQ,KAAK,IAAI;AAAG;AAAA,IAAS;AAClE,UAAM,WAAW,MAAM,SAAS,KAAK,CAAC,UAAM,wBAAS,CAAC,MAAM,IAAI;AAChE,QAAI,UAAU;AAAE,cAAQ,KAAK,QAAQ;AAAG;AAAA,IAAS;AAAA,EACnD;AAEA,MAAI,QAAQ,WAAW,mBAAmB,QAAQ;AAChD,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,UAAU,OAAO,QAAQ,CAAC;AAAA,EACtE,WAAW,QAAQ,SAAS,GAAG;AAC7B,WAAO,OAAO,KAAK;AAAA,MACjB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,QAAQ,QAAQ,MAAM,IAAI,mBAAmB,MAAM;AAAA,IAC7D,CAAC;AAAA,EACH,OAAO;AACL,WAAO,OAAO,KAAK,EAAE,OAAO,MAAM,QAAQ,WAAW,OAAO,CAAC,EAAE,CAAC;AAAA,EAClE;AACF;AAEA,SAAS,YACP,MACA,QACA,OACA,OACM;AACN,MAAI,QAAQ,GAAI;AAChB,QAAM,SAAS,aAAS,oBAAK,MAAM,MAAM,IAAI;AAC7C,MAAI;AACJ,MAAI;AACF,kBAAU,yBAAY,MAAM;AAAA,EAC9B,QAAQ;AACN;AAAA,EACF;AACA,aAAW,QAAQ,SAAS;AAC1B,QAAI,kBAAkB,IAAI,IAAI,EAAG;AACjC,QAAI,OAAO,WAAW,iBAAiB,KAAK,OAAO,SAAS,WAAW,EAAG;AAC1E,UAAMG,WAAU,SAAS,GAAG,MAAM,IAAI,IAAI,KAAK;AAC/C,QAAI;AACJ,QAAI;AACF,eAAK,0BAAS,oBAAK,QAAQ,IAAI,CAAC;AAAA,IAClC,QAAQ;AACN;AAAA,IACF;AACA,QAAI,GAAG,YAAY,GAAG;AACpB,kBAAY,MAAMA,UAAS,OAAO,QAAQ,CAAC;AAAA,IAC7C,WAAW,GAAG,OAAO,GAAG;AACtB,UAAI,KAAK,SAAS,OAAO,KAAK,KAAK,SAAS,MAAM,EAAG,OAAM,UAAU,KAAKA,QAAO;AAAA,eACxE,KAAK,SAAS,KAAK,EAAG,OAAM,QAAQ,KAAKA,QAAO;AAAA,eAChD,KAAK,SAAS,MAAM,EAAG,OAAM,SAAS,KAAKA,QAAO;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,SAAS,cAAc,aAAqB,UAAwC;AAClF,aAAW,KAAK,UAAU;AACxB,YAAI,4BAAW,oBAAK,aAAa,CAAC,CAAC,EAAG,QAAO;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,SAAS,kBACP,aACAA,UAC6C;AAC7C,QAAM,UAAM,oBAAK,aAAaA,QAAO;AACrC,QAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,QAAM,aAAa,aAAa,CAAC,8BAA8B,WAAW,gBAAgB,CAAC;AAC3F,MAAI,CAAC,WAAY,QAAO;AACxB,MAAI;AACF,wCAAS,IAAI,KAAK,MAAM,UAAU,YAAY,GAAG,KAAK;AAAA,MACpD,OAAO;AAAA,MACP,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,SAAS,YAAY,IAAI;AAAA,IACpE,CAAC;AAAA,EACH,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,cAAU,0BAAa,KAAK,OAAO;AACzC,UAAM,UAAM,cAAAC,OAAU,OAAO;AAC7B,QAAI,KAAK,WAAW,WAAY,QAAO;AACvC,QAAI,KAAK,WAAW,QAAS,QAAO;AACpC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,OACP,aACA,QACA,cACM;AACN,QAAM,KAAK,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AACrD,MAAI,CAAC,GAAI;AAET,MAAI,GAAG,WAAW,UAAU;AAC1B,QAAI,OAAO,eAAe,YAAa;AACvC,QAAI,CAAC,cAAc;AACjB,SAAG,SAAS;AACZ,SAAG,SAAS;AACZ;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,CAAC,8BAA8B,WAAW,kBAAkB,CAAC;AAC7F,MAAI,CAAC,YAAY;AACf,OAAG,SAAS;AACZ,OAAG,SAAS;AACZ;AAAA,EACF;AACA,QAAM,SAAS;AACf,QAAM,UAAU,GAAG,MAAM;AACzB,QAAM,gBAAY,oBAAK,aAAa,MAAM;AAC1C,MAAI,KAAC,wBAAW,SAAS,EAAG,4BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEpE,QAAM,kBAAc,4BAAW,oBAAK,aAAa,KAAK,CAAC,QACnD,oBAAK,aAAa,KAAK,IACvB;AACJ,QAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,MAAI;AACF;AAAA,MACE,IAAI,KAAK,MAAM,UAAU,WAAW,WAAW,gBAAY,oBAAK,aAAa,OAAO,CAAC;AAAA,MACrF,EAAE,OAAO,WAAW,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,SAAS,YAAY,IAAI,EAAE;AAAA,IAC1F;AACA,OAAG,SAAS;AACZ,OAAG,QAAQ,CAAC,OAAO;AACnB,OAAG,SAAS;AACZ,WAAO,aAAa;AAAA,EACtB,SAAS,KAAU;AACjB,OAAG,SAAS;AACZ,OAAG,SAAS,iCAAiC,IAAI,OAAO;AAAA,EAC1D;AACF;AAEA,SAAS,OAAO,aAAqB,QAAiC;AACpE,QAAM,KAAK,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AACrD,MAAI,CAAC,MAAM,GAAG,WAAW,SAAU;AAEnC,QAAM,eAAe;AAAA,IACnB,CAAC,8BAA8B,aAAa,kBAAkB;AAAA,EAChE;AACA,MAAI,CAAC,cAAc;AACjB,OAAG,SAAS;AACZ,OAAG,SAAS;AACZ;AAAA,EACF;AAEA,QAAM,SAAS;AACf,QAAM,gBAAY,oBAAK,aAAa,MAAM;AAC1C,MAAI,KAAC,wBAAW,SAAS,EAAG,4BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEpE,QAAM,eAAyB,CAAC;AAChC,QAAM,gBAAgB,IAAI,KAAK,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,UAAM,wBAAS,CAAC,CAAC,CAAC;AACtE,aAAW,QAAQ,iBAAiB;AAClC,QAAI,cAAc,IAAI,IAAI,EAAG;AAC7B,UAAM,aAAS,oBAAK,WAAW,IAAI;AACnC,QAAI;AACF,oCAAa,cAAc,MAAM;AACjC,mBAAa,KAAK,GAAG,MAAM,IAAI,IAAI,EAAE;AAAA,IACvC,SAAS,KAAU;AACjB,SAAG,SAAS;AACZ,SAAG,SAAS,kBAAkB,IAAI,KAAK,IAAI,OAAO;AAClD;AAAA,IACF;AAAA,EACF;AACA,KAAG,SAAS;AACZ,KAAG,QAAQ,CAAC,GAAI,GAAG,SAAS,CAAC,GAAI,GAAG,YAAY;AAChD,KAAG,SAAS,WAAW,aAAa,MAAM;AAC5C;AAEA,SAAS,OAAO,aAAqB,QAAiC;AACpE,QAAM,KAAK,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AACrD,MAAI,CAAC,MAAM,GAAG,WAAW,SAAU;AAEnC,QAAM,KAAK,OAAO,OAAO,KAAK,CAAC,MAAM,EAAE,UAAU,IAAI;AACrD,MAAI,CAAC,MAAO,GAAG,WAAW,YAAY,GAAG,WAAW,WAAY;AAC9D,OAAG,SAAS;AACZ,OAAG,SAAS;AACZ;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,CAAC,wBAAwB,WAAW,2BAA2B,CAAC;AAChG,MAAI,CAAC,YAAY;AACf,OAAG,SAAS;AACZ,OAAG,SAAS;AACZ;AAAA,EACF;AAEA,QAAM,YAAY,GAAG,MAAM,CAAC;AAC5B,QAAM,kBAAc,oBAAK,aAAa,SAAS;AAC/C,QAAM,SAAS;AACf,QAAM,gBAAY,oBAAK,aAAa,MAAM;AAC1C,MAAI,KAAC,wBAAW,SAAS,EAAG,4BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAEpE,QAAM,QAAQ,QAAQ,IAAI,UAAU;AACpC,MAAI;AACF;AAAA,MACE,IAAI,KAAK,MAAM,UAAU,iBAAiB,WAAW,gBAAgB,SAAS;AAAA,MAC9E,EAAE,OAAO,WAAW,KAAK,EAAE,GAAG,QAAQ,KAAK,kBAAkB,SAAS,YAAY,IAAI,EAAE;AAAA,IAC1F;AACA,UAAM,UAAoB,CAAC;AAC3B,eAAW,QAAQ,oBAAoB;AACrC,YAAMD,WAAU,GAAG,MAAM,IAAI,IAAI;AACjC,cAAI,4BAAW,oBAAK,aAAaA,QAAO,CAAC,EAAG,SAAQ,KAAKA,QAAO;AAAA,IAClE;AACA,QAAI,QAAQ,WAAW,mBAAmB,QAAQ;AAChD,SAAG,SAAS;AACZ,SAAG,QAAQ;AACX,SAAG,SAAS,YAAY,QAAQ,MAAM;AAAA,IACxC,OAAO;AACL,SAAG,SAAS;AACZ,SAAG,SAAS,QAAQ,QAAQ,MAAM,IAAI,mBAAmB,MAAM;AAC/D,SAAG,QAAQ;AAAA,IACb;AAAA,EACF,SAAS,KAAU;AACjB,OAAG,SAAS;AACZ,OAAG,SAAS,qCAAqC,IAAI,OAAO;AAAA,EAC9D;AACF;AAMA,SAAS,iBAAiB,QAAiC;AACzD,UAAQ,IAAI,mDAA8C,OAAO,WAAW,EAAE;AAC9E,UAAQ,IAAI,EAAE;AACd,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,OACJ,MAAM,WAAW,WAAW,WAC5B,MAAM,WAAW,YAAY,MAC7B,MAAM,WAAW,WAAW,WAC5B,MAAM,WAAW,YAAY,MAAM;AACrC,UAAM,cACJ,MAAM,WAAW,aAAa,MAAM,UAAU,OAAO,SACrD,MAAM,OAAO,YAAY;AAC3B,YAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,KAAK,KAAK,WAAW,GAAG;AACvD,eAAW,KAAK,MAAM,OAAO;AAC3B,cAAQ,IAAI,SAAS,CAAC,EAAE;AAAA,IAC1B;AACA,QAAI,MAAM,QAAQ;AAChB,cAAQ,IAAI,iBAAiB,MAAM,MAAM,EAAE;AAAA,IAC7C;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AACd,MAAI,OAAO,eAAe,QAAQ;AAChC,YAAQ,IAAI,mBAAmB,OAAO,UAAU,EAAE;AAClD,QAAI,OAAO,eAAe,SAAS;AACjC,cAAQ,IAAI,+FAA0F;AAAA,IACxG,WAAW,OAAO,eAAe,YAAY;AAC3C,cAAQ,IAAI,yFAAoF;AAAA,IAClG;AAAA,EACF;AACF;AAEA,SAAS,aAAa,UAAwC;AAC5D,QAAM,WAAW,QAAQ,IAAI;AAC7B,QAAM,aAAuB,CAAC;AAC9B,MAAI,UAAU;AACZ,eAAW,SAAK,uBAAQ,UAAU,GAAG,QAAQ,CAAC;AAAA,EAChD;AACA,aAAW,SAAK,uBAAQ,QAAQ,IAAI,GAAG,WAAW,UAAU,GAAG,QAAQ,CAAC;AACxE,aAAW,KAAK,YAAY;AAC1B,YAAI,wBAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;;;ACrvBA,IAAAE,cAA2E;AAC3E,IAAAC,gBAAqB;;;ACDrB,IAAAC,cAAmF;AACnF,IAAAC,gBAAqB;;;ACuBd,SAAS,aAA2B;AACzC,SAAO,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAE;AAChC;AAEO,SAAS,QAAQ,MAAoB,OAAe,WAA0B,MAAoB;AACvG,MAAI,aAAa,MAAM;AACrB,QAAI,CAAC,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,QAAQ,GAAG;AAC5C,YAAM,IAAI,MAAM,0BAA0B,QAAQ,EAAE;AAAA,IACtD;AAAA,EACF;AAEA,QAAM,OAAqB;AAAA,IACzB,IAAI,KAAK;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF;AACA,OAAK,MAAM,KAAK,IAAI;AACpB,OAAK;AACL,SAAO;AACT;AAEO,SAAS,cAAc,MAAoB,QAAsB;AACtE,QAAM,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACjD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AACA,OAAK,SAAS;AAChB;AAMO,SAAS,qBAAqB,MAAoB,QAAgB,aAA2B;AAClG,QAAM,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACjD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AACA,MAAI,aAAa;AACf,SAAK,oBAAoB;AAAA,EAC3B,OAAO;AACL,WAAO,KAAK;AAAA,EACd;AACF;AAKO,SAAS,UAAU,MAAoB,QAAgB,QAAsB;AAClF,QAAM,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACjD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AACA,OAAK,SAAS;AACd,OAAK,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC3C;AAEO,SAAS,YAAY,MAAyC;AACnE,QAAM,QAAQ,KAAK,MAAM,OAAO,OAAK,EAAE,aAAa,IAAI;AACxD,aAAW,QAAQ,OAAO;AACxB,UAAM,SAAS,eAAe,MAAM,IAAI;AACxC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,MAAoB,MAAyC;AACnF,MAAI,KAAK,WAAW,WAAW;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,WAAW,KAAK,MAAM,OAAO,OAAK,EAAE,aAAa,KAAK,EAAE;AAC9D,aAAW,SAAS,UAAU;AAC5B,UAAM,SAAS,eAAe,MAAM,KAAK;AACzC,QAAI,QAAQ;AACV,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;ADtEA,SAAS,QAAQ,QAAoC;AACnD,aAAO,oBAAK,OAAO,aAAa,YAAY,aAAa,qBAAqB;AAChF;AAEA,SAAS,QAAQ,QAA4B,MAAc,SAAkC,CAAC,GAAS;AACrG,QAAM,UAAM,oBAAK,OAAO,aAAa,YAAY,WAAW;AAC5D,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,+BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,QAAM,QAAQ;AAAA,IACZ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,WAAW,OAAO;AAAA,IAClB;AAAA,IACA,GAAG;AAAA,EACL;AACA,QAAM,OAAO,KAAK,UAAU,KAAK,IAAI;AACrC,kCAAe,QAAQ,MAAM,GAAG,MAAM,OAAO;AAG7C,UAAQ,MAAM,mBAAmB,IAAI,IAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS,EAAE;AACvF;AAEO,SAAS,aAAa,QAA0C;AACrE,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,aAAa,OAAO;AAAA,IACpB,SAAS,OAAO;AAAA,IAChB,MAAM,WAAW;AAAA,IACjB,SAAS;AAAA,IACT,eAAe;AAAA,EACjB;AACF;AAEO,SAAS,MAAM,QAAwC;AAC5D,SAAO,UAAU;AACjB,UAAQ,QAAQ,SAAS,EAAE,WAAW,OAAO,UAAU,CAAC;AAExD,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,MACP,WAAW,OAAO;AAAA,MAClB,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,QAA4B,YAAkC;AAC9F,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AAEA,aAAW,OAAO,YAAY;AAC5B,YAAQ,OAAO,MAAM,GAAG;AAAA,EAC1B;AACA,SAAO,gBAAgB,OAAO,KAAK,MAAM,CAAC,GAAG,MAAM;AAEnD,UAAQ,QAAQ,sBAAsB;AAAA,IACpC;AAAA,IACA,OAAO,WAAW;AAAA,IAClB,aAAa,OAAO,KAAK,MAAM,CAAC,GAAG;AAAA,EACrC,CAAC;AAED,QAAM,eAAe,YAAY,OAAO,IAAI;AAC5C,SAAO;AAAA,IACL,YAAY,eAAe,iBAAiB;AAAA,IAC5C,SAAS;AAAA,MACP,aAAa;AAAA,MACb,YAAY,OAAO,KAAK,MAAM;AAAA,IAChC;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,QAAwC;AACvE,QAAM,UAAU,OAAO,gBACnB,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,aAAa,IACzD,YAAY,OAAO,IAAI;AAE3B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,EAAE,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,gBAAgB,QAAQ;AAE/B,UAAQ,QAAQ,qBAAqB,EAAE,QAAQ,QAAQ,IAAI,OAAO,QAAQ,MAAM,CAAC;AAEjF,QAAM,UAAmC;AAAA,IACvC,gBAAgB,QAAQ;AAAA,IACxB,aAAa,EAAE,IAAI,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAAA,EACtD;AAGA,MAAI,QAAQ,mBAAmB;AAC7B,YAAQ,oBAAoB,QAAQ;AAAA,EACtC;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAMO,SAAS,gBACd,QACA,QACA,aACY;AACZ,QAAM,OAAO,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,MAAM;AACxD,MAAI,CAAC,MAAM;AACT,UAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,EAC7C;AACA,uBAAqB,OAAO,MAAM,QAAQ,WAAW;AACrD,UAAQ,QAAQ,oBAAoB,EAAE,QAAQ,oBAAoB,YAAY,MAAM,GAAG,GAAG,EAAE,CAAC;AAC7F,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS;AAAA,MACP;AAAA,MACA,mBAAmB;AAAA,MACnB,aAAa,EAAE,IAAI,KAAK,IAAI,OAAO,KAAK,MAAM;AAAA,IAChD;AAAA,EACF;AACF;AAEO,SAAS,cACd,QACA,QACA,aACY;AACZ,QAAM,gBAAgB,OAAO;AAC7B,MAAI,kBAAkB,MAAM;AAC1B,UAAM,IAAI,MAAM,wCAAwC;AAAA,EAC1D;AAGA,gBAAc,OAAO,MAAM,aAAa;AAGxC,YAAU,OAAO,MAAM,eAAe,MAAM;AAG5C,aAAW,UAAU,aAAa;AAChC,YAAQ,OAAO,MAAM,QAAQ,aAAa;AAAA,EAC5C;AAEA,UAAQ,QAAQ,kBAAkB;AAAA,IAChC,QAAQ;AAAA,IACR,eAAe,OAAO,MAAM,GAAG,GAAG;AAAA,IAClC;AAAA,EACF,CAAC;AAGD,QAAM,UAAU,YAAY,OAAO,IAAI;AACvC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,EAAE,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,gBAAgB,QAAQ;AAC/B,QAAM,UAAmC;AAAA,IACvC,aAAa,EAAE,IAAI,QAAQ,IAAI,OAAO,QAAQ,MAAM;AAAA,EACtD;AACA,MAAI,QAAQ,mBAAmB;AAC7B,YAAQ,oBAAoB,QAAQ;AAAA,EACtC;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,QAAwC;AACvE,QAAM,UAAU,YAAY,OAAO,IAAI;AACvC,QAAM,YAAY,YAAY;AAE9B,UAAQ,QAAQ,qBAAqB;AAAA,IACnC;AAAA,IACA,YAAY,OAAO,KAAK,MAAM;AAAA,IAC9B,gBAAgB,OAAO,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,IACxE,cAAc,OAAO,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,EACtE,CAAC;AAED,MAAI,WAAW;AACb,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,SAAS,EAAE,WAAW,KAAK;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,gBAAgB,QAAS;AAChC,QAAM,UAAmC;AAAA,IACvC,WAAW;AAAA,IACX,aAAa,EAAE,IAAI,QAAS,IAAI,OAAO,QAAS,MAAM;AAAA,EACxD;AACA,MAAI,QAAS,mBAAmB;AAC9B,YAAQ,oBAAoB,QAAS;AAAA,EACvC;AACA,SAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAA0C;AACxE,SAAO,OAAO;AAChB;;;AEtPA,IAAAC,cAAgF;AAChF,IAAAC,gBAAqB;AAuBrB,IAAM,qBAAqB;AAC3B,IAAM,aAAa;AAEnB,SAAS,iBAAiB,aAA6B;AACrD,aAAO,oBAAK,aAAa,YAAY,aAAa,kBAAkB;AACtE;AAEA,SAAS,SAAS,aAA6B;AAC7C,aAAO,oBAAK,aAAa,YAAY,aAAa,UAAU;AAC9D;AAEA,SAAS,cAAc,aAAqB,QAAwB;AAClE,aAAO,oBAAK,SAAS,WAAW,GAAG,UAAU,OAAO,MAAM,EAAE,SAAS,GAAG,GAAG,IAAI,OAAO;AACxF;AAEO,SAAS,iBAAiB,aAA0C;AACzE,QAAMC,QAAO,iBAAiB,WAAW;AACzC,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,OAAqB,aAA2B;AAC/E,MAAI,CAAC,aAAa;AAChB;AAAA,EACF;AAEA,QAAM,UAAM,oBAAK,aAAa,YAAY,WAAW;AACrD,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,+BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,iCAAc,iBAAiB,WAAW,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AACtF;AAEO,SAAS,cAAc,aAAqB,QAAgB,OAAe,UAAmB,QAAuB;AAC1H,QAAM,MAAM,SAAS,WAAW;AAChC,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,+BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AAEA,QAAM,KAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AAEA,iCAAc,cAAc,aAAa,MAAM,GAAG,KAAK,UAAU,IAAI,MAAM,CAAC,GAAG,OAAO;AACxF;AAeO,SAAS,iBAAiB,aAAkC;AACjE,QAAM,MAAM,SAAS,WAAW;AAChC,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAQ,yBAAY,GAAG,EAAE,OAAO,OAAK,EAAE,WAAW,OAAO,KAAK,EAAE,SAAS,OAAO,CAAC;AACvF,QAAM,YAAyB,CAAC;AAEhC,aAAW,QAAQ,OAAO;AACxB,QAAI;AACF,YAAM,UAAM,8BAAa,oBAAK,KAAK,IAAI,GAAG,OAAO;AACjD,gBAAU,KAAK,KAAK,MAAM,GAAG,CAAc;AAAA,IAC7C,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO,UAAU,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;AACrD;AAEO,SAAS,kBAAkB,WAA+D;AAC/F,SAAO,UAAU,IAAI,OAAK;AACxB,UAAM,IAAI,EAAE,WAAW,EAAE,SAAS,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,MAAM,GAAG,EAAE;AACpE,UAAM,IAAI,EAAE,SAAS,SAAS,EAAE,OAAO,MAAM,GAAG,EAAE,IAAI;AACtD,WAAO;AAAA,MACL,QAAQ,EAAE;AAAA,MACV,SAAS,IAAI;AAAA,IACf;AAAA,EACF,CAAC;AACH;AAEO,SAAS,uBAAuB,aAA6B;AAClE,QAAM,YAAY,iBAAiB,WAAW;AAC9C,QAAM,aAAa,UAAU,OAAO,CAAC,KAAK,MAAM;AAC9C,WAAO,MAAM,KAAK,UAAU,CAAC,EAAE;AAAA,EACjC,GAAG,CAAC;AACJ,SAAO;AACT;;;AH/GA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAOzB,SAAS,eAAe,KAAqB;AAC3C,aAAO,oBAAK,KAAK,sBAAsB,gBAAgB;AACzD;AAEA,SAAS,eAAe,KAAyB;AAC/C,QAAMC,QAAO,eAAe,GAAG;AAC/B,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,WAAO,EAAE,MAAM,GAAG,SAAS,EAAE;AAAA,EAC/B;AACA,MAAI;AACF,UAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QACE,OAAO,QAAQ,SAAS,YACxB,OAAO,QAAQ,YAAY,UAC3B;AACA,aAAO,EAAE,MAAM,OAAO,MAAM,SAAS,OAAO,QAAQ;AAAA,IACtD;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO,EAAE,MAAM,GAAG,SAAS,EAAE;AAC/B;AAEA,SAAS,eAAe,KAAa,SAA2B;AAC9D,QAAM,kBAAc,oBAAK,KAAK,oBAAoB;AAClD,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,+BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACA,iCAAc,eAAe,GAAG,GAAG,KAAK,UAAU,OAAO,GAAG,OAAO;AACrE;AAMA,SAAS,sBAAsB,KAAqB;AAClD,QAAM,eAAc,oBAAI,KAAK,GAAE,YAAY;AAC3C,QAAM,UAAU,eAAe,GAAG;AAClC,QAAM,UACJ,QAAQ,SAAS,cAAc,QAAQ,UAAU,IAAI;AACvD,QAAM,KAAK,OAAO,WAAW,IAAI,OAAO,OAAO,EAAE,SAAS,GAAG,GAAG,CAAC;AACjE,iBAAe,KAAK,EAAE,MAAM,aAAa,SAAS,QAAQ,CAAC;AAC3D,SAAO;AACT;AAOA,SAAS,QAAQ,GAAmB;AAClC,SAAO,EAAE,QAAQ,gBAAgB,EAAE;AACrC;AAEA,SAASC,UAASC,OAAgB,MAAc,WAAW,IAAY;AACrE,QAAM,QAAQA,MAAK,KAAK,OAAK,EAAE,WAAW,IAAI,CAAC;AAC/C,MAAI,CAAC,MAAO,QAAO;AAGnB,SAAO,QAAQ,MAAM,MAAM,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,CAAC;AACpD;AAEA,SAAS,gBAAgB,KAAqB;AAC5C,aAAO,oBAAK,KAAK,sBAAsB,iBAAiB;AAC1D;AAEA,SAAS,WAAW,KAAwC;AAC1D,QAAMF,QAAO,gBAAgB,GAAG;AAChC,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,UAAM,0BAAaA,OAAM,OAAO;AACtC,UAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,WAAO;AAAA,MACL,WAAW,MAAM;AAAA,MACjB,aAAa,MAAM;AAAA,MACnB,SAAS,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,SAAS,MAAM;AAAA,MACf,eAAe,MAAM;AAAA,IACvB;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,WAAW,QAAkC;AACpD,QAAM,UAAM,oBAAK,OAAO,aAAa,oBAAoB;AACzD,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,+BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACpC;AACA,iCAAc,gBAAgB,OAAO,WAAW,GAAG,KAAK,UAAU,MAAM,GAAG,OAAO;AACpF;AAEA,SAAS,mBAAmB,QAA4B,aAAqB,eAA6B;AACxG,QAAM,OAAO,OAAO;AACpB,QAAM,QAAsB;AAAA,IAC1B,WAAW,OAAO;AAAA,IAClB,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,eAAe,OAAO;AAAA,IACtB,gBAAgB,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,IACjE,YAAY,KAAK,MAAM;AAAA,IACvB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,EACtC;AACA,mBAAiB,OAAO,OAAO,WAAW;AAC5C;AAEO,SAAS,eAAeE,OAAsB;AACnD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAClD,QAAM,WAAWD,UAASC,OAAM,eAAe;AAC/C,QAAM,YAAY,YAAY,sBAAsB,GAAG;AAEvD,QAAM,SAAS,aAAa;AAAA,IAC1B;AAAA,IACA,aAAa;AAAA,IACb,SAAS,EAAE,KAAK,WAAW,cAAc,IAAI;AAAA,EAC/C,CAAC;AACD,QAAM,SAAS,MAAM,MAAM;AAC3B,aAAW,MAAM;AACjB,qBAAmB,QAAQ,GAAG,OAAO;AAErC,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,2BAA2BA,OAAsB;AAC/D,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAClD,QAAM,UAAUD,UAASC,OAAM,eAAe;AAC9C,QAAM,aAAa,QAAQ,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAEvE,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,2CAA2C,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,kBAAkB,QAAQ,UAAU;AACnD,aAAW,MAAM;AACjB,qBAAmB,QAAQ,GAAG,oBAAoB;AAElD,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,sBAAsBA,OAAsB;AAC1D,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAElD,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,2CAA2C,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,iBAAiB,MAAM;AACtC,aAAW,MAAM;AAGjB,MAAI,OAAO,QAAQ,aAAa;AAC9B,UAAM,OAAO,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,QAAQ,YAAY,EAAE;AAC/E,QAAI,MAAM;AACR,oBAAc,KAAK,KAAK,IAAI,KAAK,OAAO,KAAK,YAAY,KAAK,KAAK;AAAA,IACrE;AAAA,EACF;AAEA,qBAAmB,QAAQ,GAAG,cAAc;AAE5C,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,gBAAgBA,OAAsB;AACpD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAClD,QAAM,SAASD,UAASC,OAAM,WAAW;AACzC,QAAM,cAAcD,UAASC,OAAM,iBAAiB;AACpD,QAAM,cAAc,YAAY,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAE5E,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,2CAA2C,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,QAAM,cAAc,OAAO,gBACvB,OAAO,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,OAAO,aAAa,IACzD;AAEJ,QAAM,SAAS,cAAc,QAAQ,QAAQ,WAAW;AACxD,aAAW,MAAM;AAMjB,MAAI,aAAa;AACf,UAAM,gBAAgB,WAAW,GAAG,GAAG,KAAK,MAAM,KAAK,OAAK,EAAE,OAAO,YAAY,EAAE,KAAK;AACxF,UAAM,eAAe,eAAe,QAAQ,UAAU;AACtD,QAAI,iBAAiB,OAAO,QAAQ;AAClC,cAAQ,MAAM,KAAK,UAAU;AAAA,QAC3B,OAAO;AAAA,QACP,QAAQ,YAAY;AAAA,QACpB,iBAAiB,OAAO;AAAA,QACxB,iBAAiB;AAAA,MACnB,CAAC,CAAC;AACF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAGA,MAAI,aAAa;AACf,kBAAc,KAAK,YAAY,IAAI,YAAY,OAAO,YAAY,YAAY,YAAY,OAAO,MAAM;AAAA,EACzG;AAEA,qBAAmB,QAAQ,GAAG,gBAAgB;AAE9C,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,gBAAgBA,OAAsB;AACpD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAElD,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,QAAQ;AACV,UAAM,OAAO,gBAAgB,MAAM;AACnC,UAAMC,gBAAe,iBAAiB,GAAG;AACzC,UAAMC,eAAc,iBAAiB,GAAG;AACxC,UAAM,eAAe,kBAAkBA,YAAW;AAClD,UAAMC,UAAS,uBAAuB,GAAG;AAEzC,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,QAAQ;AAAA,MACR,WAAW,OAAO;AAAA,MAClB,YAAY,KAAK,MAAM;AAAA,MACvB,cAAc,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,SAAS,EAAE;AAAA,MAC7D,gBAAgB,KAAK,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW,EAAE;AAAA,MACjE,eAAe,OAAO;AAAA,MACtB,cAAAF;AAAA,MACA,gBAAgBC,aAAY;AAAA,MAC5B,iBAAiB,KAAK,MAAMC,UAAS,IAAI;AAAA,IAC3C,CAAC,CAAC;AACF;AAAA,EACF;AAIA,QAAM,eAAe,iBAAiB,GAAG;AACzC,MAAI,CAAC,gBAAgB,aAAa,aAAa,iBAAiB;AAC9D,YAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,cAAc,CAAC,CAAC;AACrD;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB,GAAG;AACxC,QAAM,SAAS,uBAAuB,GAAG;AACzC,QAAM,eAAe,KAAK,IAAI,aAAa,aAAa,aAAa,gBAAgB,CAAC;AAEtF,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,QAAQ;AAAA,IACR,WAAW,aAAa;AAAA,IACxB,YAAY,aAAa;AAAA,IACzB;AAAA,IACA,gBAAgB,aAAa;AAAA,IAC7B,eAAe,aAAa;AAAA,IAC5B;AAAA,IACA,gBAAgB,YAAY;AAAA,IAC5B,iBAAiB,KAAK,MAAM,SAAS,IAAI;AAAA,IACzC,WAAW;AAAA,EACb,CAAC,CAAC;AACJ;AAEO,SAAS,kBAAkBH,OAAsB;AACtD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAElD,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,2CAA2C,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,iBAAiB,MAAM;AACtC,aAAW,MAAM;AACjB,qBAAmB,QAAQ,GAAG,mBAAmB;AAEjD,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,mBAAmBA,OAAsB;AACvD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAClD,QAAM,YAAYD,UAASC,OAAM,SAAS;AAC1C,QAAM,cAAcD,UAASC,OAAM,gBAAgB;AAEnD,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,wCAAwC,CAAC,CAAC;AAChF,YAAQ,KAAK,CAAC;AAAA,EAChB;AACA,QAAM,SAAS,OAAO,SAAS,WAAW,EAAE;AAC5C,MAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAC5B,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,yBAAyB,SAAS,GAAG,CAAC,CAAC;AAC7E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAW,GAAG;AAC7B,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,2CAA2C,CAAC,CAAC;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,gBAAgB,QAAQ,QAAQ,WAAW;AAC1D,aAAW,MAAM;AACjB,qBAAmB,QAAQ,GAAG,kBAAkB;AAEhD,UAAQ,IAAI,KAAK,UAAU,MAAM,CAAC;AACpC;AAEO,SAAS,eAAeA,OAAsB;AACnD,QAAM,MAAMD,UAASC,OAAM,UAAU,QAAQ,IAAI,CAAC;AAClD,QAAM,MAAMA,MAAK,SAAS,OAAO;AAEjC,QAAM,kBAAc,oBAAK,KAAK,oBAAoB;AAClD,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,YAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,cAAc,IAAI,CAAC,CAAC;AACzD;AAAA,EACF;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IACA;AAAA,EACF;AACA,QAAM,iBAAa,oBAAK,aAAa,2BAA2B;AAChE,QAAM,kBAAc,oBAAK,aAAa,oBAAoB;AAC1D,QAAMI,gBAAW,oBAAK,aAAa,QAAQ;AAE3C,MAAI,KAAC,wBAAW,UAAU,KAAK,KAAC,wBAAW,WAAW,KAAK,KAAC,wBAAWA,SAAQ,GAAG;AAChF,YAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,oBAAoB,IAAI,CAAC,CAAC;AAC/D;AAAA,EACF;AAEA,MAAI,CAAC,KAAK;AACR,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY;AAAA,QACV,YAAQ,wBAAW,UAAU,IAAI,aAAa;AAAA,QAC9C,aAAS,wBAAW,WAAW,IAAI,cAAc;AAAA,QACjD,WAAO,wBAAWA,SAAQ,IAAIA,YAAW;AAAA,MAC3C;AAAA,IACF,CAAC,CAAC;AACF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAoB,CAAC;AAC3B,aAAW,KAAK,SAAS;AACvB,UAAM,SAAK,oBAAK,aAAa,CAAC;AAC9B,YAAI,wBAAW,EAAE,GAAG;AAClB,8BAAO,EAAE;AACT,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACA,UAAI,wBAAWA,SAAQ,GAAG;AACxB,4BAAOA,WAAU,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACjD,YAAQ,KAAK,SAAS;AAAA,EACxB;AAEA,UAAQ,IAAI,KAAK,UAAU,EAAE,QAAQ,WAAW,KAAK,QAAQ,CAAC,CAAC;AACjE;;;AI7YA,IAAAC,cAAmE;AACnE,IAAAC,gBAAqB;AAarB,SAAS,aAAa,KAAqB;AACzC,aAAO,oBAAK,KAAK,YAAY,aAAa,gBAAgB;AAC5D;AAEA,SAAS,aAAa,KAAuB;AAC3C,QAAMC,QAAO,aAAa,GAAG;AAC7B,MAAI,KAAC,wBAAWA,KAAI,GAAG;AACrB,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AACA,MAAI;AACF,WAAO,KAAK,UAAM,0BAAaA,OAAM,OAAO,CAAC;AAAA,EAC/C,QAAQ;AACN,WAAO,EAAE,OAAO,CAAC,EAAE;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,KAAa,OAAuB;AACxD,QAAM,kBAAc,oBAAK,KAAK,YAAY,WAAW;AACrD,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,+BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACA,iCAAc,aAAa,GAAG,GAAG,KAAK,UAAU,KAAK,GAAG,OAAO;AACjE;AAEO,SAAS,eAAeC,OAAsB;AACnD,QAAM,MAAMA,MAAK,KAAK,OAAK,EAAE,WAAW,QAAQ,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,IAAI;AACjF,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAEzE,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,qBAAqB,CAAC,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,MAAM,MAAM,IAAI;AAAA,IACpB;AAAA,IACA,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC;AACA,eAAa,KAAK,KAAK;AAEvB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY;AAAA,IACZ,SAAS,EAAE,QAAQ,QAAQ,cAAc;AAAA,EAC3C,CAAC,CAAC;AAEF,UAAQ,MAAM,6BAA6B,MAAM,UAAU;AAC7D;AAEO,SAAS,kBAAkBA,OAAsB;AACtD,QAAM,MAAMA,MAAK,KAAK,OAAK,EAAE,WAAW,QAAQ,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,IAAI;AACjF,QAAM,SAASA,MAAK,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK;AAEzE,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,qBAAqB,CAAC,CAAC;AAC7D,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,QAAQ,aAAa,GAAG;AAC9B,MAAI,CAAC,MAAM,MAAM,MAAM,GAAG;AACxB,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,QAAQ,MAAM,aAAa,CAAC,CAAC;AACnE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,MAAM,MAAM,EAAE,SAAS;AAC7B,QAAM,MAAM,MAAM,EAAE,eAAc,oBAAI,KAAK,GAAE,YAAY;AACzD,eAAa,KAAK,KAAK;AAEvB,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY;AAAA,IACZ,SAAS,EAAE,QAAQ,QAAQ,YAAY;AAAA,EACzC,CAAC,CAAC;AAEF,UAAQ,MAAM,gCAAgC,MAAM,YAAY;AAClE;AAEO,SAAS,gBAAgBA,OAAsB;AACpD,QAAM,MAAMA,MAAK,KAAK,OAAK,EAAE,WAAW,QAAQ,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,IAAI;AAEjF,QAAM,QAAQ,aAAa,GAAG;AAC9B,QAAM,QAAQ,OAAO,OAAO,MAAM,KAAK;AACvC,QAAM,aAAa,MAAM,OAAO,OAAK,EAAE,WAAW,aAAa;AAC/D,QAAM,YAAY,MAAM,OAAO,OAAK,EAAE,WAAW,WAAW;AAE5D,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,YAAY,MAAM;AAAA,IAClB,YAAY,WAAW;AAAA,IACvB,WAAW,UAAU;AAAA,IACrB,OAAO,MAAM,IAAI,QAAM,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,OAAO,EAAE;AAAA,EAChE,CAAC,CAAC;AACJ;;;ACxGA,IAAAC,iBAA0B;AAgBnB,SAAS,oBAAoB,SAA+C;AACjF,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,WAAW,SAAS,YAAY;AACtC,QAAM,cAAc,SAAS,eAAe;AAE5C,QAAM,YAAY,oBAAI,IAAY;AAElC,WAAS,WAAmB;AAC1B,aAAS,IAAI,GAAG,IAAI,aAAa,KAAK;AACpC,YAAM,WAAO,0BAAU,UAAU,WAAW,CAAC;AAC7C,UAAI,CAAC,UAAU,IAAI,IAAI,GAAG;AACxB,kBAAU,IAAI,IAAI;AAClB,eAAO;AAAA,MACT;AAAA,IACF;AACA,UAAM,IAAI,MAAM,iCAAiC,WAAW,sBAAsB,QAAQ,IAAI,QAAQ,EAAE;AAAA,EAC1G;AAEA,WAAS,QAAQ,MAAoB;AACnC,cAAU,OAAO,IAAI;AAAA,EACvB;AAEA,WAAS,aAAmB;AAC1B,cAAU,MAAM;AAAA,EAClB;AAEA,WAAS,YAAY,MAAuB;AAC1C,WAAO,UAAU,IAAI,IAAI;AAAA,EAC3B;AAEA,WAAS,iBAAyB;AAChC,WAAO,UAAU;AAAA,EACnB;AAEA,SAAO,EAAE,UAAU,SAAS,YAAY,aAAa,eAAe;AACtE;;;ACnDA,IAAAC,cAAwD;AACxD,IAAAC,gBAAqB;AAWrB,IAAM,aAAa;AAEZ,SAAS,mBAAmB,SAA+B;AAChE,QAAMC,iBAAY,oBAAK,SAAS,UAAU;AAC1C,QAAM,WAAW,oBAAI,IAAwB;AAE7C,eAAa;AAEb,WAAS,eAAqB;AAC5B,QAAI,KAAC,wBAAWA,UAAS,GAAG;AAC1B;AAAA,IACF;AACA,QAAI;AACF,YAAM,UAAM,0BAAaA,YAAW,OAAO;AAC3C,YAAM,OAAO,KAAK,MAAM,GAAG;AAC3B,iBAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,IAAI,GAAG;AAChD,iBAAS,IAAI,IAAI,OAAO;AAAA,MAC1B;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,WAAS,UAAgB;AACvB,UAAM,MAAkC,CAAC;AACzC,eAAW,CAAC,IAAI,OAAO,KAAK,UAAU;AACpC,UAAI,EAAE,IAAI;AAAA,IACZ;AACA,mCAAcA,YAAW,KAAK,UAAU,KAAK,MAAM,CAAC,GAAG,OAAO;AAAA,EAChE;AAEA,WAAS,OAAO,SAA2B;AACzC,aAAS,IAAI,QAAQ,WAAW,EAAE,GAAG,QAAQ,CAAC;AAC9C,YAAQ;AAAA,EACV;AAEA,WAAS,IAAI,WAA2C;AACtD,UAAM,IAAI,SAAS,IAAI,SAAS;AAChC,QAAI,GAAG;AACL,aAAO,EAAE,GAAG,EAAE;AAAA,IAChB;AACA,WAAO;AAAA,EACT;AAEA,WAAS,OAAO,WAAmB,OAAkC;AACnE,UAAM,WAAW,SAAS,IAAI,SAAS;AACvC,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,YAAY,SAAS,aAAa;AAAA,IACpD;AACA,aAAS,IAAI,WAAW,EAAE,GAAG,UAAU,GAAG,MAAM,CAAC;AACjD,YAAQ;AAAA,EACV;AAEA,WAAS,OAAO,WAAyB;AACvC,aAAS,OAAO,SAAS;AACzB,YAAQ;AAAA,EACV;AAEA,WAAS,KAAK,QAAkD;AAC9D,QAAI,SAAS,CAAC,GAAG,SAAS,OAAO,CAAC;AAClC,QAAI,QAAQ,cAAc;AACxB,eAAS,OAAO,OAAO,CAAC,MAAM;AAC5B,eAAO,EAAE,iBAAiB,OAAO;AAAA,MACnC,CAAC;AAAA,IACH;AACA,WAAO,OAAO,IAAI,CAAC,MAAM;AACvB,aAAO,EAAE,GAAG,EAAE;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,QAAQ,KAAK,QAAQ,QAAQ,KAAK;AAC7C;;;ACnFA,IAAAC,cAAsD;AACtD,IAAAC,gBAAqB;AASrB,IAAM,kBAAkB;AAEjB,SAAS,qBAAqB,aAAqC;AACxE,MAAI,QAAmC;AAEvC,WAAS,gBAAoC;AAC3C,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAEA,UAAM,YAAQ,oBAAK,aAAa,cAAc;AAC9C,QAAI,KAAC,wBAAW,KAAK,GAAG;AACtB,cAAQ,CAAC;AACT,aAAO;AAAA,IACT;AAEA,UAAM,YAAgC,CAAC;AAEvC,QAAI;AACF,YAAM,cAAU,yBAAY,OAAO,EAAE,eAAe,KAAK,CAAC;AAC1D,iBAAW,SAAS,SAAS;AAC3B,cAAM,OAAO,MAAM;AACnB,YAAI,CAAC,KAAK,WAAW,eAAe,GAAG;AACrC;AAAA,QACF;AAEA,cAAM,kBAAc,oBAAK,OAAO,MAAM,cAAc;AACpD,YAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B;AAAA,QACF;AAEA,YAAI;AACF,gBAAM,UAAU,KAAK,UAAM,0BAAa,aAAa,OAAO,CAAC;AAC7D,gBAAM,iBAAiB,QAAQ;AAC/B,cAAI,kBAAkB,eAAe,MAAM;AACzC,sBAAU,KAAK;AAAA,cACb,MAAM,eAAe;AAAA,cACrB,aAAa;AAAA,cACb,cAAc,eAAe,gBAAgB;AAAA,cAC7C,UAAU,eAAe,YAAY;AAAA,YACvC,CAAC;AAAA,UACH;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,YAAQ;AACR,WAAO;AAAA,EACT;AAEA,WAAS,gBAAgC;AACvC,WAAO,cAAc,EAAE,IAAI,CAAC,MAAM;AAChC,aAAO,EAAE,MAAM,EAAE,MAAM,aAAa,EAAE,aAAa,WAAW,KAAK;AAAA,IACrE,CAAC;AAAA,EACH;AAEA,WAAS,YAAY,cAAoD;AACvE,WAAO,cAAc,EAAE,KAAK,CAAC,MAAM;AACjC,aAAO,EAAE,SAAS;AAAA,IACpB,CAAC;AAAA,EACH;AAEA,WAAS,eAAe,cAA8B;AACpD,WAAO,aAAa,YAAY,qCAAqC,eAAe,GAAG,YAAY;AAAA,EACrG;AAEA,SAAO,EAAE,eAAe,aAAa,eAAe;AACtD;;;ACjFA,IAAAC,wBAAyC;AACzC,iBAA8C;AAC9C,IAAAC,iBAA2B;AAG3B,IAAM,YAAY;AAgBlB,IAAM,mBAAmB;AACzB,IAAM,iBAAiB;AAEvB,SAAS,aAAa,MAAgC;AACpD,SAAO,IAAI,QAAQ,CAACC,cAAY;AAC9B,UAAM,UAAU,WAAW,MAAM;AAC/B,WAAK,QAAQ;AACb,MAAAA,UAAQ,KAAK;AAAA,IACf,GAAG,gBAAgB;AAEnB,QAAI,SAAS;AACb,UAAM,WAAO,6BAAiB,EAAE,MAAM,WAAW,KAAK,GAAG,MAAM;AAAA,IAE/D,CAAC;AAED,SAAK,GAAG,QAAQ,CAAC,SAAiB;AAChC,gBAAU,KAAK,SAAS;AACxB,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI;AACnB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,QACF;AACA,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,cAAI,IAAI,WAAW,kBAAkB;AACnC,yBAAa,OAAO;AACpB,iBAAK,QAAQ;AACb,YAAAA,UAAQ,IAAI;AACZ;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,GAAG,SAAS,MAAM;AAAA,IAEvB,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,QAAQ,MAAc,QAAgB,QAAoC;AACjF,SAAO,IAAI,QAAQ,CAACA,WAAS,WAAW;AACtC,UAAM,UAAU,WAAW,MAAM;AAC/B,WAAK,QAAQ;AACb,aAAO,IAAI,MAAM,mBAAmB,MAAM,EAAE,CAAC;AAAA,IAC/C,GAAG,cAAc;AAEjB,UAAM,KAAK,KAAK,IAAI;AACpB,UAAM,UAAU,EAAE,SAAS,OAAO,QAAQ,IAAI,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG;AAE5E,QAAI,SAAS;AACb,UAAM,WAAe,6BAAiB,EAAE,MAAM,WAAW,KAAK,GAAG,MAAM;AACrE,WAAK,MAAM,KAAK,UAAU,OAAO,IAAI,IAAI;AAAA,IAC3C,CAAC;AAED,SAAK,GAAG,QAAQ,CAAC,SAAiB;AAChC,gBAAU,KAAK,SAAS;AACxB,YAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,eAAS,MAAM,IAAI;AACnB,iBAAW,QAAQ,OAAO;AACxB,YAAI,CAAC,KAAK,KAAK,GAAG;AAChB;AAAA,QACF;AACA,YAAI;AACF,gBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,cAAI,IAAI,OAAO,IAAI;AACjB,yBAAa,OAAO;AACpB,iBAAK,QAAQ;AACb,gBAAI,IAAI,OAAO;AACb,qBAAO,IAAI,MAAM,IAAI,MAAM,WAAW,WAAW,CAAC;AAAA,YACpD,OAAO;AACL,cAAAA,UAAQ,IAAI,MAAM;AAAA,YACpB;AACA;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAC;AAED,SAAK,GAAG,SAAS,CAAC,QAAQ;AACxB,mBAAa,OAAO;AACpB,aAAO,GAAG;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,uBAAuC;AACrD,QAAM,YAAY,oBAAI,IAA0B;AAEhD,iBAAe,cAAc,UAA4B,MAAc,SAAuC;AAC5G,UAAM,gBAAY,2BAAW;AAC7B,UAAM,YAAQ,6BAAM,QAAQ,UAAU,CAAC,SAAS,cAAc,UAAU,IAAI,EAAE,GAAG;AAAA,MAC/E,KAAK;AAAA,MACL,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,UAAU;AAAA,IACZ,CAAC;AAED,cAAU,IAAI,WAAW,KAAK;AAE9B,UAAM,QAAQ,MAAM,aAAa,IAAI;AAErC,WAAO;AAAA,MACL;AAAA,MACA,KAAK,MAAM;AAAA,MACX;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,kBAAkB,YAAoB,MAA+C;AAClG,UAAM,SAAS,MAAM,QAAQ,MAAM,4BAA4B;AAC/D,WAAO;AAAA,EACT;AAEA,iBAAe,iBAAiB,WAAmB,MAA6B;AAC9E,QAAI;AACF,YAAM,QAAQ,MAAM,mBAAmB;AAAA,IACzC,QAAQ;AAAA,IAER,UAAE;AACA,YAAM,QAAQ,UAAU,IAAI,SAAS;AACrC,UAAI,OAAO;AACT,YAAI;AACF,gBAAM,KAAK,SAAS;AAAA,QACtB,QAAQ;AAAA,QAER;AACA,kBAAU,OAAO,SAAS;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,iBAAe,KAAK,MAAgC;AAClD,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,MAAM,MAAM;AACzC,aAAO,WAAW;AAAA,IACpB,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO,EAAE,eAAe,mBAAmB,kBAAkB,KAAK;AACpE;;;AC5JA,IAAM,eAAe;AAEd,SAAS,sBACd,cACA,QACA,eACiB;AACjB,QAAM,UAAU,oBAAI,IAA0B;AAE9C,WAAS,MAAM,WAAmB,OAAqB,UAA4B,SAAuB;AACxG,YAAQ,IAAI,WAAW,KAAK;AAE5B,UAAM,GAAG,QAAQ,OAAO,MAAM,WAAW;AACvC,cAAQ,OAAO,SAAS;AAExB,YAAM,UAAU,aAAa,IAAI,SAAS;AAC1C,UAAI,CAAC,WAAW,QAAQ,WAAW,cAAc,QAAQ,WAAW,WAAW;AAC7E;AAAA,MACF;AAEA,YAAM,uBAAuB,QAAQ,gBAAgB,KAAK;AAE1D,UAAI,sBAAsB,cAAc;AACtC,qBAAa,OAAO,WAAW;AAAA,UAC7B,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,cAAc;AAAA,QAChB,CAAC;AACD;AAAA,MACF;AAEA,mBAAa,OAAO,WAAW;AAAA,QAC7B,QAAQ;AAAA,QACR,KAAK;AAAA,QACL,cAAc;AAAA,MAChB,CAAC;AAGD,UAAI;AACF,cAAM,UAAU,cAAc,SAAS;AACvC,cAAM,SAAS,MAAM,OAAO,cAAc,UAAU,SAAS,OAAO;AAEpE,qBAAa,OAAO,WAAW;AAAA,UAC7B,QAAQ;AAAA,UACR,KAAK,OAAO;AAAA,UACZ,MAAM;AAAA,QACR,CAAC;AAGD,cAAM,WAAW,gBAAgB,OAAO,SAAS;AACjD,YAAI,UAAU;AACZ,gBAAM,WAAW,UAAU,UAAU,OAAO;AAAA,QAC9C;AAAA,MACF,QAAQ;AACN,qBAAa,OAAO,WAAW;AAAA,UAC7B,QAAQ;AAAA,UACR,cAAc;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,gBAAgB,WAA6C;AACpE,WAAO,QAAQ,IAAI,SAAS;AAAA,EAC9B;AAEA,WAAS,QAAQ,WAAyB;AACxC,YAAQ,OAAO,SAAS;AAAA,EAC1B;AAEA,iBAAe,cAA6B;AAC1C,UAAM,UAAU,CAAC,GAAG,QAAQ,QAAQ,CAAC;AACrC,YAAQ,MAAM;AAEd,eAAW,CAAC,WAAW,KAAK,KAAK,SAAS;AACxC,UAAI;AACF,cAAM,KAAK,SAAS;AAAA,MACtB,QAAQ;AAAA,MAER;AAEA,YAAM,UAAU,aAAa,IAAI,SAAS;AAC1C,UAAI,SAAS;AACX,sBAAc,QAAQ,QAAQ,IAAI;AAClC,qBAAa,OAAO,WAAW,EAAE,QAAQ,WAAW,KAAK,KAAK,CAAC;AAAA,MACjE;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,SAAS,YAAY;AACvC;;;ACjGA,IAAAC,iBAA2B;AAE3B,SAAS,OAAOC,OAAwB;AACtC,SAAOA,MAAK,KAAK,CAAC,MAAM;AAAE,WAAO,EAAE,WAAW,QAAQ;AAAA,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KAAK,QAAQ,IAAI;AAC3F;AAEA,SAAS,gBAAgB,KAAa;AACpC,QAAM,gBAAgB,oBAAoB;AAC1C,QAAM,eAAe,mBAAmB,GAAG;AAC3C,QAAM,iBAAiB,qBAAqB,GAAG;AAC/C,QAAM,SAAS,qBAAqB;AACpC,QAAM,WAAW,sBAAsB,cAAc,QAAQ,aAAa;AAE1E,UAAQ,GAAG,QAAQ,MAAM;AACvB,aAAS,YAAY;AACrB,kBAAc,WAAW;AAAA,EAC3B,CAAC;AAED,SAAO,EAAE,eAAe,cAAc,gBAAgB,QAAQ,SAAS;AACzE;AAEA,eAAsB,eAAeA,OAA+B;AAClE,QAAM,MAAM,OAAOA,KAAI;AACvB,QAAM,OAAOA,MAAK,KAAK,CAAC,MAAM;AAAE,WAAO,EAAE,WAAW,SAAS;AAAA,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAE/E,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,kEAAkE,CAAC,CAAC;AAC1G,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,eAAe,cAAc,gBAAgB,QAAQ,SAAS,IAAI,gBAAgB,GAAG;AAE7F,QAAM,WAAW,eAAe,YAAY,IAAI;AAChD,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,eAAe,eAAe,IAAI,EAAE,CAAC,CAAC;AAC5E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,cAAc,SAAS;AACpC,QAAM,gBAAY,2BAAW;AAE7B,eAAa,OAAO;AAAA,IAClB;AAAA,IACA,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,KAAK;AAAA,IACL;AAAA,IACA,gBAAgB,CAAC;AAAA,IACjB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC,cAAc;AAAA,IACd,SAAS;AAAA,EACX,CAAC;AAED,MAAI;AACF,UAAM,SAAS,MAAM,OAAO,cAAc,UAAU,MAAM,GAAG;AAE7D,QAAI,CAAC,OAAO,OAAO;AACjB,mBAAa,OAAO,WAAW,EAAE,QAAQ,UAAU,CAAC;AACpD,oBAAc,QAAQ,IAAI;AAC1B,cAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,aAAa,IAAI,+BAA+B,CAAC,CAAC;AACxF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,WAAW,MAAM,OAAO,kBAAkB,OAAO,WAAW,IAAI;AAEtE,iBAAa,OAAO,WAAW;AAAA,MAC7B,QAAQ;AAAA,MACR,KAAK,OAAO;AAAA,MACZ,gBAAgB;AAAA,IAClB,CAAC;AAGD,aAAS,MAAM,WAAW,QAAQ,KAAa,UAAU,GAAG;AAE5D,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB;AAAA,MACA,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,gBAAgB;AAAA,IAClB,CAAC,CAAC;AAAA,EACJ,SAAS,KAAU;AACjB,iBAAa,OAAO,WAAW,EAAE,QAAQ,UAAU,CAAC;AACpD,kBAAc,QAAQ,IAAI;AAC1B,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,IAAI,QAAQ,CAAC,CAAC;AACpD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEA,eAAsB,cAAcA,OAA+B;AACjE,QAAM,MAAM,OAAOA,KAAI;AACvB,QAAM,YAAYA,MAAK,KAAK,CAAC,MAAM;AAAE,WAAO,EAAE,WAAW,YAAY;AAAA,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAEvF,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,6DAA6D,CAAC,CAAC;AACrG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,cAAc,QAAQ,eAAe,SAAS,IAAI,gBAAgB,GAAG;AAE7E,QAAM,UAAU,aAAa,IAAI,SAAS;AAC1C,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,YAAY,SAAS,cAAc,CAAC,CAAC;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,eAAa,OAAO,WAAW,EAAE,QAAQ,WAAW,CAAC;AACrD,WAAS,QAAQ,SAAS;AAE1B,MAAI;AACF,UAAM,OAAO,iBAAiB,WAAW,QAAQ,IAAI;AAAA,EACvD,QAAQ;AAAA,EAER;AAEA,gBAAc,QAAQ,QAAQ,IAAI;AAClC,eAAa,OAAO,WAAW,EAAE,QAAQ,WAAW,KAAK,KAAK,CAAC;AAE/D,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB;AAAA,IACA,QAAQ;AAAA,IACR,MAAM,QAAQ;AAAA,EAChB,CAAC,CAAC;AACJ;AAEO,SAAS,cAAcA,OAAsB;AAClD,QAAM,MAAM,OAAOA,KAAI;AACvB,QAAM,OAAOA,MAAK,KAAK,CAAC,MAAM;AAAE,WAAO,EAAE,WAAW,SAAS;AAAA,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAE/E,QAAM,EAAE,aAAa,IAAI,gBAAgB,GAAG;AAC5C,QAAM,SAAS,OAAO,EAAE,cAAc,KAAK,IAAI;AAC/C,QAAM,WAAW,aAAa,KAAK,MAAM;AAEzC,UAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1C;AAEO,SAAS,gBAAgBA,OAAsB;AACpD,QAAM,MAAM,OAAOA,KAAI;AACvB,QAAM,YAAYA,MAAK,KAAK,CAAC,MAAM;AAAE,WAAO,EAAE,WAAW,YAAY;AAAA,EAAE,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC;AAEvF,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,+DAA+D,CAAC,CAAC;AACvG,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,EAAE,aAAa,IAAI,gBAAgB,GAAG;AAC5C,QAAM,UAAU,aAAa,IAAI,SAAS;AAE1C,MAAI,CAAC,SAAS;AACZ,YAAQ,MAAM,KAAK,UAAU,EAAE,OAAO,YAAY,SAAS,cAAc,CAAC,CAAC;AAC3E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,KAAK,UAAU,OAAO,CAAC;AACrC;AAEO,SAAS,mBAAmB,OAAuB;AACxD,QAAM,MAAM,OAAO,CAAC,CAAC;AACrB,QAAM,EAAE,eAAe,IAAI,gBAAgB,GAAG;AAC9C,QAAM,YAAY,eAAe,cAAc;AAE/C,UAAQ,IAAI,KAAK,UAAU,EAAE,UAAU,CAAC,CAAC;AAC3C;;;ACzKA,IAAAC,gBAAwB;AACxB,IAAAC,cAAgE;AAChE,IAAAC,wBAA6B;;;ACF7B,IAAAC,cAAyC;AACzC,IAAAC,gBAAwB;AASjB,SAAS,QAAQ,WAAmB,aAA+B;AACxE,QAAM,WAAO,uBAAQ,QAAQ;AAC7B,MAAI,KAAC,wBAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,QAAM,cAAU,0BAAa,MAAM,OAAO;AAC1C,QAAM,MAA0B,CAAC;AACjC,aAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,GAAG;AACvC;AAAA,IACF;AACA,UAAM,KAAK,QAAQ,QAAQ,GAAG;AAC9B,QAAI,KAAK,GAAG;AACV;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,UAAU,GAAG,EAAE,EAAE,KAAK;AAC1C,UAAM,QAAQ,QAAQ,UAAU,KAAK,CAAC,EAAE,KAAK;AAC7C,QAAI,QAAQ,YAAY;AACtB,UAAI,WAAW;AAAA,IACjB,WAAW,QAAQ,cAAc;AAC/B,UAAI,aAAa;AAAA,IACnB,WAAW,QAAQ,eAAe;AAChC,UAAI,cAAc;AAAA,IACpB,WAAW,QAAQ,YAAY;AAC7B,UAAI,WAAW,UAAU;AAAA,IAC3B;AAAA,EACF;AACA,MAAI,CAAC,IAAI,UAAU;AACjB,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AC1CA,IAAAC,cAAyC;AACzC,IAAAC,gBAA8B;AAQvB,SAAS,eAAe,UAAoC;AACjE,QAAM,OAAO,eAAW,uBAAQ,QAAQ,QAAI,2BAAQ,oBAAK,QAAQ,IAAI,GAAG,mBAAmB,CAAC;AAE5F,MAAI,KAAC,wBAAW,IAAI,GAAG;AACrB,UAAM,IAAI;AAAA,MACR,2CAA4B,OAAO;AAAA,IACrC;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,cAAU,0BAAa,MAAM,OAAO;AAC1C,UAAM,KAAK,MAAM,OAAO;AAAA,EAC1B,SAAS,KAAU;AACjB,UAAM,IAAI,MAAM,iDAA6B,OAAO,QAAQ,IAAI,OAAO;AAAA,EACzE;AAEA,QAAM,WACJ,OAAO,OAAO,QAAQ,YAAY,cAAc,OAAO,OAAQ,IAAY,aAAa,WACnF,IAAY,WACZ;AAEP,SAAO,EAAE,MAAM,KAAK,SAAS;AAC/B;;;AChCA,IAAAC,cAAyC;AACzC,IAAAC,gBAAwB;AACxB,IAAAC,gBAAmC;AA4B5B,SAAS,YAAY,UAA+B;AACzD,QAAM,WAAO,uBAAQ,QAAQ;AAC7B,MAAI,KAAC,wBAAW,IAAI,GAAG;AACrB,UAAM,IAAI,MAAM,6CAAoB,IAAI;AAAA,EAC1C;AAEA,MAAI;AACJ,MAAI;AACF,UAAM,cAAU,0BAAa,MAAM,OAAO;AAC1C,cAAM,cAAAC,OAAU,OAAO;AAAA,EACzB,SAAS,KAAU;AACjB,UAAM,IAAI,MAAM,uCAAmB,OAAO,QAAQ,IAAI,OAAO;AAAA,EAC/D;AAEA,QAAM,aAAa,OAAO,IAAI,YAAY;AAC1C,QAAM,aAAa,OAAO,OAAO,IAAI,YAAY,YAAY,IAAI,QAAQ,WAAW,IAAI;AACxF,MAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,UAAM,IAAI,MAAM,uGAAqD,IAAI;AAAA,EAC3E;AAEA,QAAM,aAAiC,CAAC;AACxC,aAAW,CAACC,OAAM,QAAQ,KAAK,OAAO,QAAQ,IAAI,SAAS,CAAC,CAAC,GAAG;AAC9D,QAAI,CAAC,YAAY,OAAO,aAAa,UAAU;AAC7C;AAAA,IACF;AACA,eAAW,UAAU,CAAC,OAAO,QAAQ,OAAO,SAAS,UAAU,QAAQ,SAAS,GAAG;AACjF,YAAM,KAAM,SAAiB,MAAM;AACnC,UAAI,CAAC,MAAM,OAAO,OAAO,UAAU;AACjC;AAAA,MACF;AACA,iBAAW,KAAK,mBAAmB,IAAI,QAAQA,OAAM,UAAU,CAAC;AAAA,IAClE;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,aAAa,gBAAgB,eAAe,WAAW;AAC1E;AAEA,SAAS,mBAAmB,IAAS,QAAgBA,OAAc,YAAuC;AACxG,QAAM,aAAiC,CAAC;AACxC,aAAW,KAAK,GAAG,cAAc,CAAC,GAAG;AACnC,QAAI,YAAY;AACd,iBAAW,KAAK;AAAA,QACd,MAAM,EAAE;AAAA,QACR,IAAI,EAAE;AAAA,QACN,UAAU,EAAE;AAAA,QACZ,QAAQ,EAAE,OACN;AAAA,UACE,MAAM,EAAE;AAAA,UACR,GAAI,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,UACjC,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,UACxD,GAAI,EAAE,YAAY,SAAY,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,UACxD,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;AAAA,UAC9D,GAAI,EAAE,cAAc,SAAY,EAAE,WAAW,EAAE,UAAU,IAAI,CAAC;AAAA,UAC9D,GAAI,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC;AAAA,QAC5C,IACA;AAAA,MACN,CAAC;AAAA,IACH,OAAO;AACL,iBAAW,KAAK,EAAE,MAAM,EAAE,MAAM,IAAI,EAAE,IAAI,UAAU,EAAE,UAAU,QAAQ,EAAE,OAAO,CAAC;AAAA,IACpF;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,YAAY;AACd,UAAM,aAAa,GAAG,cAAc,CAAC,GAAG,KAAK,CAAC,MAAW,EAAE,OAAO,MAAM;AACxE,QAAI,WAAW;AACb,oBAAc,EAAE,UAAU,UAAU,UAAU,QAAQ,UAAU,UAAU,CAAC,EAAE;AAAA,IAC/E;AAAA,EACF,WAAW,GAAG,eAAe,GAAG,YAAY,WAAW,GAAG,YAAY,QAAQ,kBAAkB,GAAG;AACjG,kBAAc;AAAA,MACZ,UAAU,GAAG,YAAY;AAAA,MACzB,QAAQ,GAAG,YAAY,QAAQ,kBAAkB,EAAE;AAAA,IACrD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,aAAa,GAAG;AAAA,IAChB;AAAA,IACA,MAAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,GAAG,aAAa,CAAC;AAAA,EAC9B;AACF;;;ACjHA,IAAAC,iBAA2B;;;ACA3B,IAAM,WAAW;AACjB,IAAM,WAAW;AACjB,IAAM,aAAa;AACnB,IAAM,WAAW;AACjB,IAAM,uBAAuB,CAAC,iBAAiB,kBAAkB,aAAa;AAevE,SAAS,OAAO,MAAc,UAAyC,CAAC,GAAoB;AACjG,QAAM,MAAwB;AAAA,IAC5B,eAAe;AAAA,IACf,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,uBAAuB;AAAA,EACzB;AACA,MAAI,MAAM;AAEV,QAAM,IAAI,QAAQ,UAAU,MAAM;AAChC,QAAI;AACJ,WAAO;AAAA,EACT,CAAC;AACD,QAAM,IAAI,QAAQ,UAAU,MAAM;AAChC,QAAI;AACJ,WAAO;AAAA,EACT,CAAC;AACD,QAAM,IAAI,QAAQ,YAAY,MAAM;AAClC,QAAI;AACJ,WAAO;AAAA,EACT,CAAC;AACD,MAAI,QAAQ,oBAAoB,OAAO;AACrC,UAAM,IAAI,QAAQ,UAAU,CAAC,QAAQ,OAAO;AAC1C,UAAI;AACJ,aAAO,GAAG,UAAU,GAAG,CAAC,IAAI;AAAA,IAC9B,CAAC;AAAA,EACH;AACA,aAAW,QAAQ,sBAAsB;AACvC,UAAM,KAAK,IAAI,OAAO,SAAU,OAAO,MAAM,IAAI;AACjD,UAAM,IAAI,QAAQ,IAAI,MAAM;AAC1B,UAAI;AACJ,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,KAAK,SAAS,IAAI;AACnC;;;ADtDA,IAAAC,cAAyC;AACzC,IAAAC,gBAAwB;AAgBjB,SAAS,YAAY,QAAmC;AAC7D,QAAM,WAAqB,CAAC,OAAO,iBAAiB;AAEpD,WAAS,KAAK,4BAA4B;AAC1C,WAAS,KAAK,KAAK,UAAU,OAAO,gBAAgB,MAAM,CAAC,CAAC;AAE5D,WAAS,KAAK,gBAAgB;AAC9B,WAAS,KAAK,KAAK,UAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAEzD,MAAI,OAAO,aAAa;AACtB,aAAS,KAAK,kCAAkC;AAChD,aAAS,KAAK,OAAO,WAAW;AAAA,EAClC;AAEA,MAAI,OAAO,eAAe;AACxB,aAAS,KAAK,kBAAkB;AAChC,aAAS,KAAK,KAAK,UAAU,OAAO,eAAe,MAAM,CAAC,CAAC;AAAA,EAC7D;AAEA,WAAS,KAAK,QAAQ;AACtB,WAAS,KAAK,2PAA2P;AAEzQ,QAAM,MAAM,SAAS,KAAK,MAAM;AAChC,QAAM,SAAS,OAAO,GAAG;AACzB,QAAM,WAAO,2BAAW,QAAQ,EAAE,OAAO,OAAO,IAAI,EAAE,OAAO,KAAK;AAElE,SAAO,EAAE,QAAQ,OAAO,MAAM,MAAM,UAAU,OAAO,QAAQ;AAC/D;AAEO,SAAS,gBAAgBC,OAAkC;AAChE,QAAM,WAAO,uBAAQA,KAAI;AACzB,MAAI,KAAC,wBAAW,IAAI,GAAG;AACrB,WAAO;AAAA,EACT;AACA,aAAO,0BAAa,MAAM,OAAO;AACnC;;;AEtDA,IAAAC,wBAA0B;;;ACAnB,IAAM,eAAN,MAAsB;AAAA,EACnB,QAAQ,oBAAI,IAAe;AAAA,EAEnC,IAAI,KAA4B;AAC9B,WAAO,KAAK,MAAM,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,IAAI,KAAa,OAAgB;AAC/B,SAAK,MAAM,IAAI,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEA,IAAI,KAAsB;AACxB,WAAO,KAAK,MAAM,IAAI,GAAG;AAAA,EAC3B;AAAA,EAEA,QAAc;AACZ,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,IAAI,OAAe;AACjB,WAAO,KAAK,MAAM;AAAA,EACpB;AACF;;;ADEO,IAAM,eAAN,MAAmB;AAAA,EAGxB,YAAoB,UAAsE,EAAE,WAAW,IAAM,GAAG;AAA5F;AAAA,EAA6F;AAAA,EAA7F;AAAA,EAFZ,QAAmC,IAAI,aAAa;AAAA,EAI5D,MAAM,OAAO,QAAgB,YAA0C;AACrE,QAAI,CAAC,KAAK,QAAQ,WAAW,KAAK,MAAM,IAAI,UAAU,GAAG;AACvD,aAAO,KAAK,MAAM,IAAI,UAAU;AAAA,IAClC;AACA,UAAM,MAAM,KAAK,QAAQ,WAAW;AACpC,UAAM,aAAS,iCAAU,KAAK,CAAC,WAAW,mBAAmB,MAAM,GAAG;AAAA,MACpE,OAAO;AAAA,MACP,SAAS,KAAK,QAAQ;AAAA,MACtB,UAAU;AAAA,IACZ,CAAC;AACD,QAAI,OAAO,OAAO;AAChB,YAAM,IAAI,MAAM,mCAAe,OAAO,MAAM,OAAO;AAAA,IACrD;AACA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,WAAW,OAAO,UAAU,IAAI,UAAU,GAAG,GAAG;AACtD,YAAM,IAAI,MAAM,mCAAe,OAAO,SAAS,6CAAoB,OAAO;AAAA,IAC5E;AACA,UAAM,WAAW,OAAO,UAAU,IAAI,KAAK;AAC3C,UAAM,QAAQ,KAAK,eAAe,OAAO;AACzC,UAAM,WAAwB,EAAE,SAAS,MAAM;AAC/C,QAAI,CAAC,KAAK,QAAQ,SAAS;AACzB,WAAK,MAAM,IAAI,YAAY,QAAQ;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAAe,KAAyB;AACtC,UAAM,UAAU,KAAK,gBAAgB,GAAG;AACxC,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;AAAA,IAC7B,SAAS,KAAU;AACjB,YAAM,IAAI,MAAM,oDAAsB,IAAI,UAAU,iCAAkB,QAAQ,UAAU,GAAG,GAAG,CAAC;AAAA,IACjG;AACA,QAAI,CAAC,MAAM,QAAQ,MAAM,GAAG;AAC1B,YAAM,IAAI,MAAM,2DAAmB,QAAQ,UAAU,GAAG,GAAG,CAAC;AAAA,IAC9D;AACA,UAAM,MAAkB,CAAC;AACzB,eAAW,KAAK,QAAQ;AACtB,UAAI,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,mBAAmB,UAAa,CAAC,EAAE,WAAW;AAC1E,cAAM,IAAI,MAAM,qDAAuB,KAAK,UAAU,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC;AAAA,MAC5E;AACA,UAAI,KAAK;AAAA,QACP,QAAQ,OAAO,EAAE,MAAM;AAAA,QACvB,MAAM,OAAO,EAAE,IAAI;AAAA,QACnB,OAAO,EAAE;AAAA,QACT,OAAO,EAAE;AAAA,QACT,YAAY,EAAE,cAAc,OAAO,EAAE,eAAe,WAAY,EAAE,aAAwC;AAAA,QAC1G,gBAAgB,EAAE;AAAA,QAClB,WAAW,OAAO,EAAE,SAAS;AAAA,MAC/B,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,MAAsB;AAC5C,WAAO,KACJ,QAAQ,qBAAqB,EAAE,EAC/B,QAAQ,WAAW,EAAE,EACrB,KAAK;AAAA,EACV;AACF;;;AE5DO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,YAAoB,SAAgC;AAAhC;AAAA,EAAiC;AAAA,EAAjC;AAAA,EAEpB,MAAM,IAAI,OAA4C;AACpD,UAAM,UAAgC,CAAC;AACvC,eAAW,KAAK,OAAO;AACrB,YAAM,IAAI,MAAM,KAAK,WAAW,CAAC;AACjC,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,MAAM,EAAE;AAAA,MACzD,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,MAAM,EAAE;AAAA,MACzD,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,aAAa,EAAE;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,GAA0C;AACjE,UAAM,aAAc,EAAyD;AAC7E,QAAI,eAAe,EAAE;AACrB,QAAI,YAAY;AACd,qBAAe,aAAa,QAAQ,cAAc,CAAC,IAAI,SAAiB;AACtE,cAAM,IAAI,WAAW,IAAI;AACzB,YAAI,MAAM,QAAW;AACnB,iBAAO,MAAM,OAAO;AAAA,QACtB;AACA,eAAO,mBAAmB,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH;AACA,UAAM,MAAM,KAAK,QAAQ,QAAQ,QAAQ,OAAO,EAAE,KAAK,aAAa,WAAW,GAAG,IAAI,eAAe,MAAM;AAC3G,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,KAAK,QAAQ,WAAY,SAAQ,KAAK,QAAQ,WAAW,IAAI,IAAI,KAAK,QAAQ,WAAW;AAC7F,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,QAAQ,SAAS;AACzE,UAAMC,SAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAAA,QAC3B,QAAQ,EAAE;AAAA,QACV;AAAA,QACA,MAAM,EAAE,UAAU,SAAY,KAAK,UAAU,EAAE,KAAK,IAAI;AAAA,QACxD,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,YAAM,YAAY,KAAK,IAAI,IAAIA;AAC/B,YAAM,WAAW,MAAM,QAAQ,EAAE,cAAc,IAAI,EAAE,iBAAiB,CAAC,EAAE,cAAc;AACvF,YAAM,iBACJ,IAAI,UAAU,MAAM,gBAAgB,SAAS,SAAS,IAAI,MAAM,IAAI,SAAS;AAC/E,aAAO,EAAE,GAAG,GAAG,cAAc,IAAI,QAAQ,gBAAgB,UAAU;AAAA,IACrE,SAAS,KAAU;AACjB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,cAAc;AAAA,QACd,gBAAgB;AAAA,QAChB,WAAW,EAAE;AAAA,QACb,WAAW,KAAK,IAAI,IAAIA;AAAA,MAC1B;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;;;ACzEO,SAAS,uBACd,IACA,SACmB;AACnB,QAAMC,QAAO,qBAAqB,GAAG,MAAM,QAAQ,cAAc,CAAC,CAAC;AACnE,QAAM,QAAQ,EAAE,GAAG,qBAAqB,EAAE,GAAG,GAAI,QAAQ,eAAe,CAAC,EAAG;AAC5E,QAAM,MAAM,SAAS,QAAQ,SAASA,OAAM,KAAK;AAEjD,MAAI;AACJ,MAAI,GAAG,eAAe,GAAG,YAAY,QAAQ;AAC3C,UAAM,SAA8B,GAAG,YAAY;AACnD,QAAI,OAAO,YAAY,QAAW;AAChC,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,aAAO,wBAAwB,MAAM;AAAA,IACvC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ,GAAG,OAAO,YAAY;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,EAChD;AACF;AAEA,SAAS,qBAAqBA,OAAc,QAAwC;AAClF,SAAOA,MAAK,QAAQ,cAAc,CAAC,GAAG,SAAS;AAC7C,UAAM,IAAI,OAAO,IAAI;AACrB,QAAI,MAAM,QAAW;AACnB,YAAM,IAAI,MAAM,0CAAiB,IAAI;AAAA,IACvC;AACA,WAAO,mBAAmB,CAAC;AAAA,EAC7B,CAAC;AACH;AAEA,SAAS,qBAAqB,IAAiE;AAC7F,QAAM,WAAsD,CAAC;AAC7D,aAAW,KAAK,GAAG,YAAY;AAC7B,QAAI,EAAE,OAAO,SAAS;AACpB;AAAA,IACF;AACA,UAAM,IAAI,EAAE;AACZ,QAAI,CAAC,GAAG;AACN;AAAA,IACF;AACA,QAAI,EAAE,YAAY,QAAW;AAC3B,eAAS,EAAE,IAAI,IAAI,EAAE;AAAA,IACvB,WAAW,EAAE,SAAS,aAAa,EAAE,SAAS,UAAU;AACtD,eAAS,EAAE,IAAI,IAAI;AAAA,IACrB,WAAW,EAAE,SAAS,UAAU;AAC9B,eAAS,EAAE,IAAI,IAAI;AAAA,IACrB,WAAW,EAAE,SAAS,WAAW;AAC/B,eAAS,EAAE,IAAI,IAAI;AAAA,IACrB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,SAAS,MAAcA,OAAc,OAA0D;AACtG,QAAM,YAAY,KAAK,QAAQ,OAAO,EAAE;AACxC,QAAM,YAAYA,MAAK,WAAW,GAAG,IAAIA,QAAO,MAAMA;AACtD,QAAM,KAAK,OAAO,QAAQ,KAAK,EAC5B,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,mBAAmB,CAAC,IAAI,MAAM,mBAAmB,OAAO,CAAC,CAAC,CAAC,EAC3E,KAAK,GAAG;AACX,SAAO,KAAK,YAAY,YAAY,MAAM,KAAK,YAAY;AAC7D;AAEA,SAAS,wBAAwB,QAAsC;AACrE,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,SAAS,YAAY,OAAO,YAAY;AACjD,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,GAAG,GAAG,KAAK,OAAO,QAAQ,OAAO,cAAc,CAAC,CAAC,GAAsC;AACjG,UAAI,CAAC,IAAI,iBAAiB,GAAG;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AACA,SAAO,iBAAiB,MAAM;AAChC;AAEA,SAAS,iBAAiB,QAAsC;AAC9D,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,YAAY,QAAW;AAChC,WAAO,OAAO;AAAA,EAChB;AACA,MAAI,OAAO,QAAQ,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;AACvE,WAAO,OAAO,KAAK,CAAC;AAAA,EACtB;AACA,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,CAAC;AAAA,IACV,KAAK;AACH,aAAO,CAAC;AAAA,IACV;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,iBAAiB,QAAgC;AAC/D,MAAI,UAAU,OAAO,SAAS,KAAK;AACjC,WAAO;AAAA,EACT;AACA,MAAI,UAAU,KAAK;AACjB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAwBO,IAAM,mBAAN,MAAuB;AAAA,EAC5B,YAAoB,SAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAEpB,MAAM,IAAI,KAAoD;AAC5D,UAAM,UAAuC,CAAC;AAC9C,UAAM,QAAQ,CAAC,GAAG,GAAG;AACrB,UAAM,UAA2B,CAAC;AAClC,UAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,WAAW;AAElD,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,cAAQ,KAAK,KAAK,OAAO,OAAO,OAAO,CAAC;AAAA,IAC1C;AACA,UAAM,QAAQ,IAAI,OAAO;AAEzB,UAAM,SAA2B;AAAA,MAC/B,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,MAAM,EAAE;AAAA,MACzD,MAAM,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,MAAM,EAAE;AAAA,MACzD,aAAa,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,aAAa,EAAE;AAAA,MACvE;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,OACZ,OACA,SACe;AACf,WAAO,MAAM,SAAS,GAAG;AACvB,YAAM,KAAK,MAAM,MAAM;AACvB,UAAI,CAAC,IAAI;AACP;AAAA,MACF;AACA,YAAM,SAAS,MAAM,KAAK,WAAW,EAAE;AACvC,cAAQ,KAAK,MAAM;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAc,WAAW,IAAoE;AAC3F,UAAM,MAAM,uBAAuB,IAAI,EAAE,SAAS,KAAK,QAAQ,QAAQ,CAAC;AACxE,UAAM,UAAkC,EAAE,GAAI,IAAI,WAAW,CAAC,EAAG;AACjE,QAAI,KAAK,QAAQ,YAAY;AAC3B,cAAQ,KAAK,QAAQ,WAAW,IAAI,IAAI,KAAK,QAAQ,WAAW;AAAA,IAClE;AACA,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,KAAK,QAAQ,SAAS;AACzE,UAAMC,SAAQ,KAAK,IAAI;AACvB,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,IAAI,KAAK;AAAA,QAC/B,QAAQ,IAAI;AAAA,QACZ;AAAA,QACA,MAAM,IAAI,SAAS,SAAY,KAAK,UAAU,IAAI,IAAI,IAAI;AAAA,QAC1D,QAAQ,WAAW;AAAA,MACrB,CAAC;AACD,YAAM,YAAY,KAAK,IAAI,IAAIA;AAC/B,aAAO;AAAA,QACL,aAAa,GAAG;AAAA,QAChB,QAAQ,GAAG;AAAA,QACX,MAAM,GAAG;AAAA,QACT,QAAQ,IAAI;AAAA,QACZ,gBAAgB,iBAAiB,IAAI,MAAM;AAAA,QAC3C;AAAA,MACF;AAAA,IACF,SAAS,KAAU;AACjB,YAAM,YAAY,KAAK,IAAI,IAAIA;AAC/B,aAAO;AAAA,QACL,aAAa,GAAG;AAAA,QAChB,QAAQ,GAAG;AAAA,QACX,MAAM,GAAG;AAAA,QACT,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB;AAAA,MACF;AAAA,IACF,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AACF;;;AC/NA,eAAsB,YAAY,MAA4D;AAC5F,QAAM,UAAU,eAAe,KAAK,cAAc,oBAAoB;AACtE,QAAM,SAA6B,CAAC;AACpC,aAAW,YAAY,OAAO,OAAO,QAAQ,QAAQ,GAAG;AACtD,UAAM,MAAM,QAAQ,MAAW,EAAE,QAAQ,KAAK,aAAa,QAAQ;AACnE,UAAM,OAAO,YAAY,GAAG;AAC5B,WAAO,KAAK,GAAG,KAAK,UAAU;AAAA,EAChC;AACA,QAAM,SAAS,IAAI,iBAAiB,EAAE,SAAS,KAAK,SAAS,aAAa,KAAK,aAAa,WAAW,KAAK,UAAU,CAAC;AACvH,SAAO,OAAO,IAAI,MAAM;AAC1B;;;AClBA,IAAM,OAAuD;AAAA,EAC3D,OAAO,EAAE,MAAM,YAAY,OAAO,UAAU;AAAA,EAC5C,KAAK,EAAE,MAAM,YAAY,OAAO,UAAU;AAAA,EAC1C,QAAQ,EAAE,MAAM,YAAY,OAAO,UAAU;AAAA,EAC7C,MAAM,EAAE,MAAM,YAAY,OAAO,UAAU;AAC7C;AAEO,SAAS,SAAS,MAAc,OAAc,UAA2B;AAC9E,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AACA,QAAM,IAAI,KAAK,KAAK;AACpB,SAAO,EAAE,OAAO,OAAO,EAAE;AAC3B;AAQO,SAAS,qBAAqB,QAAwB,SAAkC;AAC7F,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,iBAAiB;AAC5B,QAAM,KAAK,YAAY,OAAO,KAAK;AACnC,QAAM,KAAK,SAAS,WAAW,OAAO,MAAM,SAAS,QAAQ,QAAQ,CAAC;AACtE,QAAM,KAAK,SAAS,WAAW,OAAO,MAAM,OAAO,QAAQ,QAAQ,CAAC;AACpE,QAAM,KAAK,SAAS,WAAW,OAAO,aAAa,UAAU,QAAQ,QAAQ,CAAC;AAC9E,QAAM,KAAK,gBAAgB,QAAQ,eAAe,mBAAmB,QAAQ,aAAa;AAE1F,QAAM,SAAS,OAAO,QAAQ,OAAO,CAAC,MAAM,EAAE,mBAAmB,MAAM;AACvE,MAAI,OAAO,SAAS,GAAG;AACrB,UAAM,KAAK,kBAAkB;AAC7B,eAAW,KAAK,QAAQ;AACtB,YAAM,MAAM,EAAE,mBAAmB,gBAAgB,UAAU;AAC3D,YAAM,QAAe,EAAE,mBAAmB,gBAAgB,WAAW;AACrE,YAAM,YAAY,EAAE,QAAQ,OAAO,EAAE,QAAQ,QAAQ,KAAK,UAAU,EAAE,KAAK,IAAI,MAAM;AACrF,YAAM;AAAA,QACJ,SAAS,KAAK,OAAO,QAAQ,QAAQ,IACnC,MACA,EAAE,SACF,MACA,EAAE,OACF,YACA,aACA,EAAE,eACF,gBACA,KAAK,UAAU,EAAE,cAAc,IAC/B,OACA,EAAE;AAAA,MACN;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,IAAI,IAAI;AAC5B;;;AC1DA,IAAAC,cAAsD;AACtD,IAAAC,gBAA8B;AAC9B,IAAAC,gBAAmC;AAkB5B,SAAS,YAAY,SAAiC;AAC3D,QAAM,UAAM,uBAAQ,OAAO;AAC3B,MAAI,KAAC,wBAAW,GAAG,GAAG;AACpB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,UAA0B,CAAC;AACjC,aAAW,YAAQ,yBAAY,GAAG,GAAG;AACnC,QAAI,CAAC,KAAK,SAAS,OAAO,KAAK,CAAC,KAAK,SAAS,MAAM,GAAG;AACrD;AAAA,IACF;AACA,UAAM,UAAM,cAAAC,WAAU,8BAAa,oBAAK,KAAK,IAAI,GAAG,OAAO,CAAC;AAC5D,QAAI,OAAO,IAAI,YAAY,IAAI,UAAU,MAAM,QAAQ,IAAI,aAAa,GAAG;AACzE,cAAQ,KAAK,GAAmB;AAAA,IAClC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,UAAsB,MAA+C;AACtG,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO,EAAE,kBAAkB,GAAG,eAAe,GAAG,cAAc,GAAG,kBAAkB,CAAC,GAAG,eAAe,CAAC,GAAG,QAAQ,cAAc;AAAA,EAClI;AACA,QAAM,gBAAgB,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE,OAAO,YAAY,IAAI,MAAM,EAAE,QAAQ,CAAC;AACxF,QAAM,eAAe,IAAI,IAAI,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO,YAAY,IAAI,MAAM,EAAE,IAAI,CAAC;AACvF,QAAM,mBAAmB,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,MAAM,aAAa,IAAI,CAAC,CAAC;AAC7E,QAAM,mBAAmB,iBAAiB,SAAS,cAAc;AAEjE,MAAI,kBAAkB;AACtB,MAAI,gBAAgB;AACpB,QAAM,gBAA4D,CAAC;AACnE,aAAW,KAAK,MAAM;AACpB,UAAM,MAAM,EAAE,OAAO,YAAY,IAAI,MAAM,EAAE;AAC7C,UAAM,cAAc,SAAS,OAAO,CAAC,MAAM,EAAE,OAAO,YAAY,IAAI,MAAM,EAAE,SAAS,GAAG;AACxF,eAAW,MAAM,EAAE,eAAe;AAChC,UAAI,GAAG,OAAO;AACZ;AACA,YAAI,YAAY,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,KAAK,GAAG;AACjD;AAAA,QACF,OAAO;AACL,wBAAc,KAAK,EAAE,UAAU,KAAK,OAAO,GAAG,MAAM,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,QAAM,gBAAgB,kBAAkB,IAAI,gBAAgB,kBAAkB;AAC9E,QAAM,gBAAgB,mBAAmB,iBAAiB;AAC1D,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,kBAAkB,CAAC,GAAG,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC;AAAA,IACvE;AAAA,IACA,QAAQ,eAAe,mBAAmB,KAAK,QAAQ,CAAC,IAAI,eAAe,gBAAgB,KAAK,QAAQ,CAAC,IAAI;AAAA,EAC/G;AACF;;;AC1EA,IAAAC,cAAyC;AACzC,IAAAC,gBAAqB;AAWd,SAAS,oBAAoB,aAA4C;AAC9E,QAAM,UAAiC,CAAC;AACxC,UAAI,4BAAW,oBAAK,aAAa,SAAS,CAAC,SAAK,4BAAW,oBAAK,aAAa,cAAc,CAAC,SAAK,4BAAW,oBAAK,aAAa,kBAAkB,CAAC,GAAG;AAClJ,YAAQ,KAAK,EAAE,MAAM,8BAA8B,UAAU,QAAQ,WAAW,eAAe,aAAa,6BAA6B,CAAC;AAAA,EAC5I;AACA,QAAM,UAAM,oBAAK,aAAa,cAAc;AAC5C,UAAI,wBAAW,GAAG,GAAG;AACnB,QAAI;AACF,YAAM,WAAW,KAAK,UAAM,0BAAa,KAAK,OAAO,CAAC;AACtD,YAAM,OAAO,EAAE,GAAI,SAAS,gBAAgB,CAAC,GAAI,GAAI,SAAS,mBAAmB,CAAC,EAAG;AACrF,UAAI;AACJ,UAAI,KAAK,cAAc,EAAG,aAAY;AAAA,eAC7B,KAAK,SAAS,EAAG,aAAY;AACtC,YAAM,WAA2B,KAAK,YAAY,KAAK,SAAS,iBAAiB,aAAa,eAAe;AAC7G,cAAQ,KAAK,EAAE,MAAM,8BAA8B,UAAU,WAAW,aAAa,6BAA6B,CAAC;AAAA,IACrH,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;;;ACvBA,IAAM,kBAAqC;AAAA,EACzC,sBAAsB;AAAA,EACtB,cAAc;AAAA,EACd,0BAA0B;AAC5B;AAaO,SAAS,gBACd,KACA,UAAsC,CAAC,GACrB;AAClB,QAAM,OAAO,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAC9C,QAAM,QAAoB,CAAC;AAC3B,QAAM,iBAA0E,CAAC;AACjF,QAAM,cAAsC,CAAC;AAE7C,QAAM,OAAO,CAAC,MAAoB;AAChC,gBAAY,CAAC,KAAK,YAAY,CAAC,KAAK,KAAK;AAAA,EAC3C;AAEA,aAAW,MAAM,KAAK;AACpB,UAAM,SAAS,GAAG,OAAO,YAAY;AACrC,UAAM,iBAAiB,kBAAkB,GAAG,IAAI;AAChD,UAAM,UAAsB,CAAC;AAC7B,UAAM,aAAuB,CAAC;AAE9B,QAAI,eAAe,SAAS,GAAG;AAC7B,YAAM,KAAK,qBAAqB,QAAQ,GAAG,MAAM,gBAAgB,IAAI;AACrE,cAAQ,KAAK,GAAG,EAAE;AAClB,iBAAW,KAAK,IAAI;AAClB,aAAK,YAAY;AAAA,MACnB;AAAA,IACF;AAEA,UAAM,cAAc,GAAG,WAAW,OAAO,CAAC,MAAO,EAAE,OAAkB,WAAY,EAAE,OAAkB,QAAQ;AAC7G,eAAW,SAAS,aAAa;AAC/B,YAAM,IAAI,MAAM;AAChB,UAAI,CAAC,GAAG;AACN;AAAA,MACF;AACA,YAAM,KAAK,iBAAiB,QAAQ,GAAG,MAAM,MAAM,MAAM,GAAG,IAAI;AAChE,cAAQ,KAAK,GAAG,EAAE;AAClB,iBAAW,KAAK,IAAI;AAClB,aAAK,cAAc;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,YAAY,GAAG,WAAW,KAAK,CAAC,MAAO,EAAE,OAAkB,MAAM;AACvE,QAAI,WAAW,QAAQ;AACrB,YAAM,SAAS,QAAQ;AACvB,eAAS,QAAQ,GAAG,MAAM,UAAU,QAAQ,IAAI,GAAG,KAAK,cAAc,SAAS,MAAM,UAAU;AAC/F,UAAI,QAAQ,WAAW,QAAQ;AAC7B,mBAAW,KAAK,mCAAmC;AAAA,MACrD;AAAA,IACF;AACA,QAAI,GAAG,aAAa,QAAQ;AAC1B,YAAM,SAAS,QAAQ;AACvB,eAAS,QAAQ,GAAG,MAAM,GAAG,YAAY,QAAQ,IAAI,GAAG,KAAK,cAAc,SAAS,MAAM,UAAU;AACpG,UAAI,QAAQ,WAAW,QAAQ;AAC7B,mBAAW,KAAK,0CAA0C;AAAA,MAC5D;AAAA,IACF;AAEA,QAAI,QAAQ,WAAW,GAAG;AACxB,qBAAe,KAAK;AAAA,QAClB;AAAA,QACA,MAAM,GAAG;AAAA,QACT,QAAQ,WAAW,SAAS,IAAI,WAAW,KAAK,IAAI,IAAI;AAAA,MAC1D,CAAC;AAAA,IACH,OAAO;AACL,YAAM,KAAK,GAAG,QAAQ,MAAM,GAAG,KAAK,oBAAoB,CAAC;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,UAAU,IAAI;AAAA,MACd,cAAc,IAAI,SAAS,eAAe;AAAA,MAC1C,aAAa,eAAe;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,kBAAkBC,OAAwB;AACjD,QAAM,UAAUA,MAAK,MAAM,YAAY,KAAK,CAAC;AAC7C,SAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC;AAC1C;AAEA,SAAS,qBACP,QACAA,OACA,YACA,MACY;AACZ,QAAM,QAAoB,CAAC;AAC3B,aAAW,QAAQ,YAAY;AAC7B,QAAI,KAAK,0BAA0B;AACjC,YAAM,KAAK;AAAA,QACT;AAAA,QACA,MAAAA;AAAA,QACA,OAAO;AAAA,QACP,OAAO;AAAA,QACP,YAAY,EAAE,CAAC,IAAI,GAAG,GAAG;AAAA,QACzB,gBAAgB;AAAA,QAChB,WAAW,gBAAgB,OAAO;AAAA,MACpC,CAAC;AAAA,IACH;AACA,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA,OAAO;AAAA,MACP,OAAO,IAAI,OAAO,EAAE;AAAA,MACpB,YAAY,EAAE,CAAC,IAAI,GAAG,IAAI,OAAO,EAAE,EAAE;AAAA,MACrC,gBAAgB;AAAA,MAChB,WAAW,gBAAgB,OAAO;AAAA,IACpC,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,iBACP,QACAA,OACA,OACA,QACA,qBACY;AACZ,QAAM,QAAoB,CAAC;AAC3B,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,OAAO,cAAc,YAAY,OAAO,YAAY,GAAG;AAChE,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO,IAAI,OAAO,KAAK,IAAI,GAAG,OAAO,YAAY,CAAC,CAAC;AAAA,MACnD,gBAAgB;AAAA,MAChB,WAAW,QAAQ,sBAAsB,OAAO;AAAA,IAClD,CAAC;AAAA,EACH;AACA,MAAI,OAAO,OAAO,cAAc,UAAU;AACxC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO,IAAI,OAAO,OAAO,YAAY,CAAC;AAAA,MACtC,gBAAgB;AAAA,MAChB,WAAW,QAAQ,wBAAwB,OAAO;AAAA,IACpD,CAAC;AAAA,EACH;AACA,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,UAAU;AAAA,MACxB,gBAAgB;AAAA,MAChB,WAAW,QAAQ,oBAAoB,OAAO;AAAA,IAChD,CAAC;AAAA,EACH;AACA,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO,OAAO,UAAU;AAAA,MACxB,gBAAgB;AAAA,MAChB,WAAW,QAAQ,sBAAsB,OAAO;AAAA,IAClD,CAAC;AAAA,EACH;AACA,MAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG;AACxD,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,WAAW,QAAQ,mBAAmB,OAAO,KAAK,KAAK,IAAI,IAAI;AAAA,IACjE,CAAC;AAAA,EACH;AACA,MAAI,OAAO,OAAO,YAAY,UAAU;AACtC,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,WAAW,QAAQ,oBAAoB,OAAO;AAAA,IAChD,CAAC;AAAA,EACH;AACA,MAAI,wBAAwB,OAAO,SAAS,aAAa,OAAO,SAAS,WAAW;AAClF,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,WAAW,QAAQ,6BAA6B,OAAO,OAAO;AAAA,IAChE,CAAC;AAAA,EACH;AACA,MAAI,OAAO,SAAS,aAAa,qBAAqB;AACpD,UAAM,KAAK;AAAA,MACT;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,SACP,QACAA,OACA,QACA,QACA,OACA,UACA,KACA,MACA,YACM;AACN,MAAI,QAAQ,UAAU;AACpB,eAAW,KAAK,wBAAwB,QAAQ;AAChD;AAAA,EACF;AACA,MAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC;AAAA,EACF;AAEA,MAAI,OAAO,cAAc,OAAO,OAAO,eAAe,UAAU;AAC9D,QAAI,aAAa;AACjB,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,OAAO,UAAU,GAAG;AAC3D,YAAM,YAAY,SAAS,SAAS,MAAM,OAAO;AACjD,YAAM,YAAY;AAClB,UAAI,CAAC,aAAa,OAAO,cAAc,UAAU;AAC/C;AAAA,MACF;AACA,UAAI,UAAU,SAAS,YAAY,UAAU,YAAY;AACvD,iBAAS,QAAQA,OAAM,WAAW,WAAW,QAAQ,GAAG,UAAU,KAAK,MAAM,UAAU;AACvF,qBAAa;AACb;AAAA,MACF;AACA,UAAI,UAAU,SAAS,SAAS;AAC9B,mBAAW,KAAK,gCAAgC;AAChD;AAAA,MACF;AACA,YAAM,UAAU,iBAAiB,QAAQA,OAAM,WAAW,WAAW,KAAK;AAC1E,UAAI,QAAQ,SAAS,GAAG;AACtB,qBAAa;AACb,mBAAW,KAAK,SAAS;AACvB,eAAK,YAAY;AAAA,QACnB;AACA,YAAI,KAAK,GAAG,OAAO;AAAA,MACrB;AAAA,IACF;AACA,QAAI,CAAC,YAAY;AACf,iBAAW,KAAK,mCAAmC;AAAA,IACrD;AACA;AAAA,EACF;AAEA,MAAI,MAAM,QAAQ,OAAO,KAAK,GAAG;AAC/B,eAAW,QAAQ,OAAO,OAAO;AAC/B,eAAS,QAAQA,OAAM,MAAM,QAAQ,QAAQ,GAAG,UAAU,KAAK,MAAM,UAAU;AAAA,IACjF;AACA;AAAA,EACF;AAEA,aAAW,KAAK,+BAA+B;AACjD;;;AdxRA,IAAM,aAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,MAAM;AAAA,EACN,cAAc;AAAA,EACd,aAAa;AACf;AAEO,SAAS,YAAY,QAA4B;AACtD,SAAO,WAAW,MAAM;AAC1B;AAgCA,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgClB,IAAM,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiB3B,eAAsB,iBAAiBC,OAAoC;AACzE,MAAIA,MAAK,SAAS,QAAQ,KAAKA,MAAK,SAAS,IAAI,GAAG;AAClD,WAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,GAAG,QAAQ,WAAW,UAAU,EAAE;AAAA,EACpE;AAEA,QAAM,SAAS,gBAAgBA,KAAI;AACnC,MAAI,OAAO,SAAS,QAAQ;AAC1B,WAAO,EAAE,QAAQ,QAAQ,WAAW,UAAU,EAAE;AAAA,EAClD;AAEA,QAAM,OAAO,aAAa,OAAO,MAAMA,KAAI;AAC3C,QAAM,cAAc,QAAQ,IAAI;AAChC,QAAM,MAAgB,CAAC;AACvB,MAAI,eAAe;AACnB,MAAI,gBAAgB;AACpB,MAAI,iBAAwC;AAC5C,MAAI,kBAAkB;AAEtB,MAAI,KAAK,4CAA4C,OAAO,OAAO,cAAc,KAAK,QAAQ,GAAG;AACjG,QAAM,oBAAoB,qBAAqB,KAAK,aAAa,IAAI;AACrE,MAAI,CAAC,mBAAmB;AACtB,WAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,KAAK,UAAU,aAAa,IAAI,EAAE;AAAA,EAC9F;AACA,QAAM,UAAU,YAAY,KAAK,aAAa,iBAAiB;AAC/D,MAAI,KAAK,6BAA6B;AACtC,QAAM,MAAM,UAAU,WAAW,KAAK,SAAS,WAAW,IAAI,CAAC;AAE/D,QAAM,MAAM,QAAQ,KAAK,OAAO;AAChC,MAAI,CAAC,KAAK;AACR,QAAI,KAAK,2DAAuD,uBAAQ,aAAa,KAAK,OAAO,CAAC;AAClG,WAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,EAC9D;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,EAC9D;AACA,MAAI,IAAI,WAAW,GAAG;AACpB,QAAI,KAAK,8CAA8C;AACvD,WAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,EAC9D;AAEA,QAAM,UAAU,oBAAoB,WAAW;AAC/C,QAAM,SAAS,QAAQ,CAAC;AACxB,QAAM,cAAc,KAAK,cAAc,oBAAgB,uBAAQ,aAAa,KAAK,WAAW,CAAC,IAAI;AAEjG,MAAI,OAAO,SAAS,SAAS,OAAO,SAAS,YAAY;AACvD,QAAI,KAAK,4CAA4C;AACrD,QAAI;AACF,YAAM,SAAS,MAAM,YAAY;AAAA,QAC/B;AAAA,QACA,SAAS,IAAI;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,wBAAkB,sBAAsB,MAAM;AAAA,IAChD,SAAS,KAAU;AACjB,UAAI,KAAK,uBAAuB,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,EAAE;AAC/E,aAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,MAAI,OAAO,SAAS,SAAS,OAAO,SAAS,YAAY;AACvD,QAAI,QAAoB,CAAC;AACzB,UAAM,aACH,KAAK,SAAS,UAAU,KAAK,SAAS,WACnC,gBAAgB,KAAK,EAAE,sBAAsB,GAAG,cAAc,GAAG,0BAA0B,KAAK,CAAC,IACjG;AACN,QAAI,YAAY;AACd,YAAM,KAAK,GAAG,WAAW,KAAK;AAC9B,UAAI,KAAK,wBAAwB,WAAW,MAAM,SAAS,0CAA0C,KAAK,OAAO,GAAG;AACpH,UAAI,KAAK,YAAY,WAAW,MAAM,eAAe,MAAM,WAAW,MAAM,WAAW,uBAAuB;AAC9G,UAAI,WAAW,eAAe,SAAS,GAAG;AACxC,cAAM,SAAS,WAAW,eAAe,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI;AAClG,YAAI,KAAK,YAAY,WAAW,eAAe,SAAS,yCAAyC,UAAU,WAAW,eAAe,SAAS,IAAI,UAAU,GAAG;AAAA,MACjK;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,SAAS,SAAU,KAAK,SAAS,YAAY,eAAe,QAAQ,WAAW,eAAe,SAAS;AAC5H,QAAI,SAAS;AACX,YAAM,YAAY,KAAK,SAAS,QAC5B,MACA,IAAI,OAAO,CAAC,OAAO,WAAY,eAAe,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,YAAY,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;AACzH,UAAI,KAAK,2BAA2B,UAAU,SAAS,8BAA8B;AACrF,YAAM,QAAQ,YAAY;AAAA,QACxB,mBAAmB;AAAA,QACnB,gBAAgB,QAAQ;AAAA,QACxB,aAAa,eAAe,SAAS;AAAA,QACrC;AAAA,QACA,eAAe,SAAS,EAAE,MAAM,OAAO,MAAM,UAAU,OAAO,UAAU,WAAW,OAAO,UAAU,IAAI;AAAA,MAC1G,CAAC;AAED,UAAI,KAAK,SAAS;AAChB,YAAI,KAAK,0BAA0B,KAAK,UAAU,MAAM,QAAQ,CAAC;AACjE,YAAI,KAAK,4BAA4B,MAAM,IAAI;AAAA,MACjD;AAEA,YAAM,WAAW,IAAI,aAAa,EAAE,WAAW,KAAQ,SAAS,KAAK,QAAQ,CAAC;AAC9E,UAAI,WAAuB,CAAC;AAC5B,UAAI,UAAU;AACd,UAAI;AACF,cAAM,mBAAmB,UAAU,QAAQ;AAC3C,cAAM,OAAO,MAAM,SAAS,OAAO,MAAM,QAAQ,MAAM,IAAI;AAC3D,mBAAW,KAAK;AAChB,kBAAU,KAAK;AACf,cAAM,kBAAkB,UAAU,QAAQ;AAC1C,YAAI,KAAK,SAAS;AAChB,yBAAe;AACf,0BAAgB;AAAA,QAClB,OAAO;AACL,yBAAe,kBAAkB,mBAAmB,IAAI;AACxD,0BAAgB,oBAAoB,oBAAoB,SAAS,SAAS,IAAI,IAAI;AAAA,QACpF;AAAA,MACF,SAAS,KAAU;AACjB,YAAI,KAAK,kBAAkB,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,EAAE;AAC1E,YAAI,SAAS;AACX,cAAI,KAAK,iDAAiD,QAAQ,UAAU,GAAG,GAAG,CAAC;AAAA,QACrF;AACA,eAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,MAC9D;AACA,YAAM,KAAK,GAAG,QAAQ;AACtB,UAAI,KAAK,SAAS;AAChB,YAAI,KAAK,uCAAuC,SAAS,SAAS,QAAQ;AAAA,MAC5E;AAAA,IACF;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,UAAI,KAAK,gDAAgD,KAAK,OAAO,GAAG;AACxE,aAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,IAC9D;AAEA,UAAM,OAAO,gBAAY,uBAAQ,aAAa,KAAK,UAAU,CAAC;AAC9D,UAAM,iBAA0C,mBAAmB,OAAO,IAAI;AAC9E,QAAI,KAAK,SAAS,GAAG;AACnB,UAAI,KAAK,gBAAgB,eAAe,MAAM;AAAA,IAChD;AACA,QAAI,KAAK,iBAAiB,KAAK,SAAS,KAAK,eAAe,eAAe,KAAK;AAC9E,UAAI,KAAK,4CAA4C,eAAe,aAAa,QAAQ,CAAC,IAAI,QAAQ;AACtG,aAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,UAAU,EAAE;AAAA,IAC9D;AAEA,QAAI,KAAK,qBAAqB,MAAM,SAAS,iBAAiB;AAC9D,UAAM,aAAa,IAAI,eAAe,IAAI,aACtC,EAAE,MAAM,IAAI,aAAa,OAAO,IAAI,WAAW,IAC/C;AACJ,UAAM,SAAS,IAAI,eAAe;AAAA,MAChC,SAAS,IAAI;AAAA,MACb,WAAW,KAAK;AAAA,MAChB;AAAA,IACF,CAAC;AACD,qBAAiB,MAAM,OAAO,IAAI,KAAK;AAEvC,UAAM,eAAgC;AAAA,MACpC,UAAU,KAAK;AAAA,MACf;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,qBAAqB,gBAAgB,YAAY,CAAC;AAAA,EAC7D;AAEA,MAAI,iBAAiB;AACnB,QAAI,KAAK,eAAe;AAAA,EAC1B;AAEA,QAAM,WAAW,iBACb,YAAY,SAAS,cAAc,CAAC,IACpC;AAEJ,SAAO,EAAE,QAAQ,QAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,SAAS;AAC3D;AAEA,SAAS,gBAAgBA,OAA4B;AACnD,MAAIA,MAAK,WAAW,GAAG;AACrB,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AACA,QAAM,MAAMA,MAAK,CAAC;AAClB,MAAI,QAAQ,YAAY;AACtB,WAAO,EAAE,MAAM,WAAW;AAAA,EAC5B;AACA,MAAI,QAAQ,YAAY;AACtB,WAAO,EAAE,MAAM,WAAW;AAAA,EAC5B;AACA,MAAI,OAAO,IAAI,WAAW,IAAI,GAAG;AAC/B,WAAO,EAAE,MAAM,MAAM;AAAA,EACvB;AACA,QAAM,IAAI,MAAM,wBAAwB,KAAK,UAAUA,KAAI,CAAC;AAC9D;AAEA,SAAS,aAAa,MAA0BA,OAAsC;AACpF,QAAM,OAAQ,SAAS,cAAc,SAAS,aAAcA,MAAK,MAAM,CAAC,IAAIA;AAC5E,QAAM,MAAM,CAAC,SAAqC;AAChD,UAAM,IAAI,KAAK,QAAQ,IAAI;AAC3B,QAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ;AACjC,aAAO,KAAK,IAAI,CAAC;AAAA,IACnB;AACA,UAAM,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO,GAAG,CAAC;AACpD,QAAI,IAAI;AACN,aAAO,GAAG,UAAU,KAAK,SAAS,CAAC;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AACA,QAAM,MAAM,CAAC,SAA0B,KAAK,SAAS,IAAI;AACzD,QAAMC,OAAM,CAAC,GAAuB,aAA6B;AAC/D,QAAI,CAAC,GAAG;AACN,aAAO;AAAA,IACT;AACA,UAAM,IAAI,SAAS,GAAG,EAAE;AACxB,WAAO,OAAO,SAAS,CAAC,IAAI,IAAI;AAAA,EAClC;AACA,QAAM,UAAU,IAAI,QAAQ,KAAK;AACjC,QAAM,OAAmC,YAAY,UAAU,YAAY,SAAS,YAAY,WAAY,UAAU;AACtH,QAAM,WAAW,IAAI,SAAS,KAAK;AACnC,QAAM,QAAgB,aAAa,aAAa,aAAa,cAAc,aAAa,QAAS,WAAW;AAC5G,SAAO;AAAA,IACL,aAAa,IAAI,WAAW,KAAK;AAAA,IACjC,SAAS,IAAI,YAAY,KAAK;AAAA,IAC9B,aAAa,IAAI,gBAAgB;AAAA,IACjC,YAAY,IAAI,gBAAgB,KAAK;AAAA,IACrC,WAAWA,KAAI,IAAI,WAAW,GAAG,GAAI;AAAA,IACrC,aAAaA,KAAI,IAAI,eAAe,GAAG,CAAC;AAAA,IACxC,SAAS,IAAI,YAAY;AAAA,IACzB,SAAS,IAAI,WAAW;AAAA,IACxB,eAAe,IAAI,mBAAmB;AAAA,IACtC,UAAU,CAAC,IAAI,YAAY;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,aAAa,IAAI,gBAAgB,KAAK;AAAA,EACxC;AACF;AAEA,SAAS,YAAY,KAAe,aAAqB,aAA6C;AACpG,QAAM,WAAO,uBAAQ,aAAa,WAAW;AAC7C,MAAI,KAAC,wBAAW,IAAI,GAAG;AACrB,QAAI,KAAK,2CAA2C,IAAI;AACxD,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,eAAe,IAAI;AAAA,EAC5B,SAAS,KAAU;AACjB,QAAI,KAAK,eAAe,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,EAAE;AACvE,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,KAAe,aAAqB,MAA2C;AAC3G,MAAI,KAAK,UAAU,WAAW;AAC5B,WAAO,KAAK;AAAA,EACd;AAEA,QAAM,kBAAc,uBAAQ,aAAa,KAAK,WAAW;AACzD,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,QAAI,KAAK,qCAAqC,cAAc,0BAA0B;AACtF,WAAO;AAAA,EACT;AAEA,QAAM,iBAAa,uBAAQ,aAAa,4DAA4D;AACpG,MAAI,KAAC,wBAAW,UAAU,GAAG;AAC3B,QAAI,KAAK,6CAA6C,UAAU;AAChE,WAAO;AAAA,EACT;AAEA,QAAM,eAAW,uBAAQ,aAAa,iBAAiB;AACvD,MAAI,KAAC,wBAAW,QAAQ,GAAG;AACzB,+BAAU,UAAU,EAAE,WAAW,KAAK,CAAC;AAAA,EACzC;AACA,QAAM,iBAAa,uBAAQ,UAAU,oBAAoB;AACzD,UAAI,wBAAW,UAAU,GAAG;AAC1B,QAAI;AACF,kCAAW,UAAU;AAAA,IACvB,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,aACJ,KAAK,UAAU,QACX,KAAK,YAAY,QAAQ,QAAQ,EAAE,IAAI,yCACvC,KAAK,YAAY,QAAQ,QAAQ,EAAE;AAEzC,MAAI;AACF;AAAA,MACE,QAAQ;AAAA,MACR,CAAC,YAAY,aAAa,WAAW,YAAY,WAAW,GAAG,SAAS;AAAA,MACxE;AAAA,QACE,KAAK;AAAA,QACL,KAAK,OAAO,OAAO,CAAC,GAAG,QAAQ,KAAK,EAAE,4BAA4B,WAAW,CAAC;AAAA,QAC9E,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,KAAU;AACjB,UAAM,SAAS,OAAO,IAAI,SAAS,IAAI,OAAO,SAAS,IAAI;AAC3D,UAAM,SAAS,OAAO,IAAI,SAAS,IAAI,OAAO,SAAS,IAAI;AAC3D,QAAI,KAAK,2CAA2C,UAAU,UAAW,OAAO,IAAI,WAAY,OAAO,GAAG,EAAE;AAC5G,WAAO;AAAA,EACT;AAEA,MAAI,KAAC,wBAAW,UAAU,GAAG;AAC3B,QAAI,KAAK,+CAA+C,aAAa,UAAU;AAC/E,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,YAAY,KAAK,UAAM,0BAAa,YAAY,OAAO,CAAC;AAC9D,UAAM,QAAQ,aAAa,UAAU,WAAW,OAAO,KAAK,UAAU,QAAQ,EAAE,SAAS;AACzF,QAAI,KAAK,aAAa,KAAK,QAAQ,8BAA8B,QAAQ,uBAAuB,UAAU;AAC1G,QAAI,UAAU,GAAG;AACf,UAAI,KAAK,qDAAqD;AAC9D,UAAI;AACF,oCAAW,UAAU;AAAA,MACvB,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT;AAAA,EACF,SAAS,KAAU;AACjB,QAAI,KAAK,4CAA4C,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,EAAE;AACpG,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,KAAa,aAA6B;AAC5D,QAAM,MAAM,IAAI,WAAW,WAAW,IAAI,IAAI,UAAU,YAAY,MAAM,EAAE,QAAQ,WAAW,EAAE,IAAI;AACrG,SAAO,IAAI,MAAM,OAAO,EAAE,KAAK,GAAG;AACpC;AAEA,SAAS,WAAW,KAAe,SAA0B,aAAyC;AACpG,QAAM,MAA0B,CAAC;AACjC,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,QAAQ,QAAQ,GAAG;AAClE,QAAI,OAAO,YAAY,UAAU;AAC/B,UAAI,KAAK,4CAA4C,WAAW,gBAAgB,OAAO,UAAU,GAAG;AACpG;AAAA,IACF;AACA,QAAI,KAAK,IAAI,OAAO,GAAG;AACrB;AAAA,IACF;AACA,SAAK,IAAI,OAAO;AAChB,UAAM,UAAM,uBAAQ,aAAa,OAAO;AACxC,QAAI;AACF,YAAM,OAAO,YAAY,GAAG;AAC5B,UAAI,KAAK,GAAG,KAAK,UAAU;AAAA,IAC7B,SAAS,KAAU;AACjB,UAAI,KAAK,YAAY,UAAU,QAAQ,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,EAAE;AAAA,IACxF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAkC;AACxD,QAAM,QAA6B,CAAC;AACpC,aAAW,MAAM,KAAK;AACpB,QAAI,CAAC,MAAM,GAAG,IAAI,GAAG;AACnB,YAAM,GAAG,IAAI,IAAI,CAAC;AAAA,IACpB;AACA,UAAM,GAAG,IAAI,EAAE,GAAG,MAAM,IAAI;AAAA,MAC1B,aAAa,GAAG;AAAA,MAChB,YAAY,GAAG;AAAA,MACf,aAAa,GAAG;AAAA,MAChB,WAAW,GAAG;AAAA,IAChB;AAAA,EACF;AACA,SAAO,EAAE,MAAM;AACjB;AAEA,SAAS,sBAAsB,QAMpB;AACT,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,YAAY,OAAO,KAAK;AACnC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,KAAK,YAAY,OAAO,IAAI;AAClC,QAAM,KAAK,YAAY,OAAO,WAAW;AACzC,aAAW,KAAK,OAAO,SAAS;AAC9B,UAAM,MAAM,EAAE,mBAAmB,SAAS,WAAW,EAAE,mBAAmB,gBAAgB,WAAW;AACrG,UAAM,KAAK,MAAM,MAAM,OAAO,EAAE,MAAM,EAAE,YAAY,IAAI,MAAM,EAAE,OAAO,SAAS,EAAE,MAAM;AAAA,EAC1F;AACA,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,SAAS,SAAS,QAAoC;AACpD,MAAI,OAAO,cAAc,OAAO,QAAQ,GAAG;AACzC,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,GAAG;AACnB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,UAAU,UAAgC;AACjD,QAAM,QAAS,SAA4D;AAC3E,MAAI,SAAS,OAAO,MAAM,SAAS,YAAY;AAC7C,WAAO,MAAM,KAAK;AAAA,EACpB;AACA,SAAO;AACT;;;AexdA,IAAAC,gBAAwB;;;AClCxB,IAAI,eAAsC;AAK1C,IAAI,yBAA0E;AAC9E,SAAS,qBAA+D;AACtE,MAAI,uBAAwB,QAAO;AACnC,QAAM,WAAW,QAAQ,IAAI,eAAe,QAAQ,IAAI,eAAe,QAAQ,IAAI,cAAc,QAAQ,IAAI;AAC7G,MAAI,CAAC,UAAU;AACb,6BAAyB,QAAQ,QAAQ,CAAC,CAAC;AAC3C,WAAO;AAAA,EACT;AACA,4BAA0B,YAAY;AACpC,QAAI;AACF,YAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,aAAO,EAAE,YAAY,IAAI,OAAO,WAAW,QAAQ,EAAE;AAAA,IACvD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG;AACH,SAAO;AACT;AAEO,SAAS,YAAY,OAAuB,QAAiG;AAClJ,iBAAe;AACf,MAAI,OAAO,OAAO;AAChB,YAAQ,OAAO,MAAM,qBAAqB,KAAK,UAAU,KAAK,CAAC;AAAA,CAAI;AAAA,EACrE;AAEA,OAAK,UAAU,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,EAE1C,CAAC;AACH;AAEA,eAAe,UAAU,OAAuB,QAA0G;AACxJ,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO,SAAS;AACnE,MAAI;AACF,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,OAAO,UAAW,SAAQ,eAAe,IAAI,UAAU,OAAO,SAAS;AAC3E,UAAM,QAAQ,MAAM,mBAAmB;AACvC,UAAM,MAAM,MAAM,MAAM,OAAO,UAAU;AAAA,MACvC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1B,QAAQ,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,GAAI,OAAO,aAAa,EAAE,YAAY,MAAM,WAAoB,IAAI,CAAC;AAAA,IACvE,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AAAA,IAEb;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;AAIO,SAAS,eAAe,WAAmB,OAAe,QAAiG;AAChK,MAAI,OAAO,OAAO;AAChB,YAAQ,OAAO,MAAM,8BAA8B,SAAS;AAAA,CAAI;AAAA,EAClE;AACA,OAAK,aAAa,WAAW,OAAO,MAAM,EAAE,MAAM,MAAM;AAAA,EAExD,CAAC;AACH;AAEA,eAAe,aAAa,WAAmB,OAAe,QAA0G;AACtK,QAAM,cAAc,OAAO,SAAS,QAAQ,iBAAiB,cAAc;AAC3E,MAAI,gBAAgB,OAAO,SAAU;AACrC,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO,SAAS;AACnE,MAAI;AACF,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,OAAO,UAAW,SAAQ,eAAe,IAAI,UAAU,OAAO,SAAS;AAC3E,UAAM,QAAQ,MAAM,mBAAmB;AACvC,UAAM,MAAM,MAAM,MAAM,aAAa;AAAA,MACnC,QAAQ;AAAA,MACR;AAAA,MACA,MAAM,KAAK,UAAU,EAAE,YAAY,WAAW,MAAM,CAAC;AAAA,MACrD,QAAQ,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,GAAI,OAAO,aAAa,EAAE,YAAY,MAAM,WAAoB,IAAI,CAAC;AAAA,IACvE,CAAC;AACD,QAAI,CAAC,IAAI,IAAI;AAAA,IAEb;AAAA,EACF,UAAE;AACA,iBAAa,KAAK;AAAA,EACpB;AACF;;;AC9FA,IAAAC,cAAmE;AACnE,IAAAC,aAAwB;AACxB,IAAAC,gBAAqB;AAErB,IAAM,kBAAc,wBAAK,oBAAQ,GAAG,kBAAkB;AACtD,IAAM,mBAAe,oBAAK,aAAa,mBAAmB;AAC1D,IAAM,uBAAmB,oBAAK,aAAa,aAAa;AAgBxD,SAAS,iBAA6B;AACpC,MAAI;AACF,QAAI,KAAC,wBAAW,gBAAgB,EAAG,QAAO,CAAC;AAC3C,UAAM,UAAM,0BAAa,kBAAkB,OAAO;AAClD,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,EAAG,QAAO,CAAC;AAC5E,UAAM,MAAkB,CAAC;AACzB,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAiC,GAAG;AACtE,UAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,OAAO,MAAM,WAAW;AAC5E,YAAI,CAAC,IAAI,OAAO,CAAC;AAAA,MACnB;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,OAAO,KAAa,MAAsC;AACjE,SAAO,QAAQ,IAAI,GAAG,KAAK,KAAK,GAAG;AACrC;AAEO,SAAS,qBAA8B;AAC5C,MAAI,QAAQ,IAAI,+BAA+B,IAAK,QAAO;AAC3D,MAAI,QAAQ,IAAI,iBAAiB,IAAK,QAAO;AAC7C,SAAO;AACT;AAEO,SAAS,0BAA0BC,OAAyB;AACjE,SAAOA,MAAK,SAAS,gBAAgB;AACvC;AAEO,SAAS,WAAWA,OAAiC;AAC1D,QAAM,OAAO,eAAe;AAC5B,QAAM,UAAU,mBAAmB,KAAK,CAAC,0BAA0BA,KAAI;AACvE,QAAM,WAAW,OAAO,8BAA8B,IAAI,KAAK;AAC/D,QAAM,YAAY,OAAO,gCAAgC,IAAI,KAAK;AAClE,QAAM,YAAY,OAAO,SAAS,OAAO,gCAAgC,IAAI,KAAK,QAAQ,EAAE;AAC5F,QAAM,QAAQ,OAAO,2BAA2B,IAAI,MAAM;AAC1D,QAAM,oBAAoB,OAAO,8BAA8B,IAAI,MAAM;AAGzE,QAAM,eAAe,OAAO,gCAAgC,IAAI,KAAK;AACrE,SAAO,EAAE,SAAS,UAAU,WAAW,WAAW,OAAO,mBAAmB,aAAa;AAC3F;AAiBO,SAAS,6BAAmC;AACjD,MAAI,KAAC,wBAAW,WAAW,GAAG;AAC5B,+BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACF;;;ACvFA,IAAAC,cAAmE;AACnE,IAAAC,aAAqD;AACrD,IAAAC,gBAAqB;AACrB,IAAAC,iBAAuC;AACvC,IAAAC,wBAAyB;AAGzB,IAAMC,mBAAc,wBAAK,oBAAQ,GAAG,kBAAkB;AACtD,IAAMC,oBAAe,oBAAKD,cAAa,mBAAmB;AAC1D,IAAM,sBAAkB,oBAAKA,cAAa,gBAAgB;AAQ1D,SAAS,aAA8B;AACrC,MAAI,KAAC,wBAAWC,aAAY,EAAG,QAAO;AACtC,MAAI;AACF,UAAM,UAAM,0BAAaA,eAAc,OAAO;AAC9C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,QAAI,QAAQ,QAAQ,OAAO,OAAO,SAAS,SAAU,QAAO;AAAA,EAC9D,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,KAAK,QAAwB;AACpC,MAAI,KAAC,wBAAWD,YAAW,GAAG;AAC5B,+BAAUA,cAAa,EAAE,WAAW,KAAK,CAAC;AAAA,EAC5C;AACA,iCAAcC,eAAc,KAAK,UAAU,QAAQ,MAAM,CAAC,GAAG,OAAO;AACtE;AAEA,SAAS,WAAW,QAAiE;AACnF,MAAI,QAAQ,KAAM,QAAO,EAAE,QAAQ,SAAS,MAAM;AAClD,QAAM,QAAkB,EAAE,UAAM,2BAAW,EAAE;AAC7C,SAAO,EAAE,QAAQ,OAAO,SAAS,KAAK;AACxC;AAEA,SAAS,eAA8B;AACrC,MAAI;AACF,UAAM,YAAQ,gCAAS,yBAAyB,EAAE,UAAU,SAAS,SAAS,IAAK,CAAC,EAAE,KAAK;AAC3F,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,WAA0B;AACxC,SAAO,aAAa;AACtB;AAEA,SAAS,UAAU,OAAuB;AACxC,aAAO,2BAAW,QAAQ,EAAE,OAAO,OAAO,OAAO,EAAE,OAAO,KAAK;AACjE;AAEA,SAAS,gBAA+B;AACtC,MAAI;AACF,UAAM,iBAAa,8BAAkB;AACrC,eAAW,QAAQ,OAAO,KAAK,UAAU,GAAG;AAC1C,YAAM,OAAO,WAAW,IAAI;AAC5B,UAAI,CAAC,KAAM;AACX,iBAAW,OAAO,MAAM;AACtB,YAAI,CAAC,IAAI,YAAY,IAAI,OAAO,IAAI,QAAQ,qBAAqB;AAC/D,iBAAO,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACA,SAAO;AACT;AAEA,SAAS,qBAA6B;AACpC,QAAM,WAAO,qBAAS,KAAK;AAC3B,QAAM,MAAM,cAAc,KAAK;AAC/B,aAAO,2BAAW,QAAQ,EAAE,OAAO,GAAG,IAAI,IAAI,GAAG,IAAI,OAAO,EAAE,OAAO,KAAK;AAC5E;AAKA,SAAS,gBAA+B;AACtC,MAAI;AACF,QAAI,KAAC,wBAAW,eAAe,EAAG,QAAO;AACzC,UAAM,UAAM,0BAAa,iBAAiB,OAAO,EAAE,KAAK;AACxD,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,IAAkB;AACxC,MAAI;AACF,QAAI,KAAC,wBAAWD,YAAW,EAAG,4BAAUA,cAAa,EAAE,WAAW,KAAK,CAAC;AACxE,mCAAc,iBAAiB,IAAI,OAAO;AAAA,EAC5C,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,kBAA0B;AACjC,QAAM,WAAW,cAAc;AAC/B,MAAI,SAAU,QAAO;AAGrB,QAAM,OAAO,mBAAmB;AAChC,QAAM,KAAK,GAAG,KAAK,MAAM,GAAG,EAAE,CAAC,QAAI,2BAAW,CAAC;AAC/C,iBAAe,EAAE;AACjB,SAAO;AACT;AAEO,SAAS,qBAAkC;AAChD,MAAI,SAAS,WAAW;AACxB,QAAM,UAAU,WAAW,MAAM;AACjC,WAAS,QAAQ;AAEjB,MAAI,CAAC,OAAO,YAAY;AACtB,UAAM,QAAQ,aAAa;AAC3B,WAAO,aAAa,QAAQ,UAAU,KAAK,IAAI;AAAA,EACjD;AACA,MAAI,CAAC,OAAO,cAAc;AACxB,WAAO,eAAe,mBAAmB;AAAA,EAC3C;AAEA,OAAK,MAAM;AACX,QAAM,MAAM,gBAAgB;AAC5B,SAAO;AAAA,IACL,WAAW,OAAO;AAAA,IAClB,YAAY,OAAO;AAAA,IACnB,cAAc,OAAO;AAAA,IACrB,YAAY;AAAA,EACd;AACF;AAEO,SAAS,aAAsB;AACpC,SAAO,KAAC,wBAAWC,aAAY;AACjC;AAEO,SAAS,kBAAwB;AACtC,qBAAmB;AACrB;;;ACjIA,IAAAC,yBAAsB;AACtB,IAAAC,cAA2E;AAC3E,IAAAC,aAAwB;AACxB,IAAAC,gBAAqB;AAGrB,IAAM,aAAa;AACnB,IAAM,gBAAgB;AACtB,IAAM,gBAAY,wBAAK,oBAAQ,GAAG,oBAAoB,cAAc;AACpE,IAAMC,kBAAa,wBAAK,oBAAQ,GAAG,oBAAoB,wBAAwB;AAC/E,IAAM,mBAAmB;AACzB,IAAM,eAAe;AAerB,SAASC,aAA6B;AACpC,MAAI;AACF,QAAI,KAAC,wBAAWD,WAAU,EAAG,QAAO,EAAE,UAAU,GAAG,YAAY,MAAM,gBAAgB,MAAM,UAAU,MAAM;AAC3G,UAAM,UAAM,0BAAaA,aAAY,OAAO;AAC5C,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO;AAAA,MACL,UAAU,OAAO,YAAY;AAAA,MAC7B,YAAY,OAAO,cAAc;AAAA,MACjC,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,UAAU,OAAO,YAAY;AAAA,IAC/B;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,UAAU,GAAG,YAAY,MAAM,gBAAgB,MAAM,UAAU,MAAM;AAAA,EAChF;AACF;AAEA,SAASE,WAAU,OAA8B;AAC/C,MAAI;AACF,UAAM,UAAM,wBAAK,oBAAQ,GAAG,kBAAkB;AAC9C,QAAI,KAAC,wBAAW,GAAG,EAAG,4BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AACxD,mCAAcF,aAAY,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAAA,EACnE,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,cAAc,QAAsB;AAC3C,QAAM,QAAQC,WAAU;AACxB,QAAM,YAAY;AAClB,QAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAC1C,QAAM,iBAAiB;AACvB,MAAI,MAAM,YAAY,cAAc;AAClC,UAAM,WAAW;AACjB,YAAQ,OAAO;AAAA,MACb,0DAAiC,YAAY;AAAA,4BACpC,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQjB;AAAA,EACF;AACA,EAAAC,WAAU,KAAK;AACjB;AAEA,SAAS,gBAAsB;AAC7B,QAAM,QAAQD,WAAU;AACxB,MAAI,MAAM,WAAW,KAAK,MAAM,UAAU;AACxC,UAAM,WAAW;AACjB,UAAM,WAAW;AACjB,UAAM,aAAa;AACnB,UAAM,iBAAiB;AACvB,IAAAC,WAAU,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,aAAsB;AAC7B,SAAOD,WAAU,EAAE;AACrB;AAUA,IAAI,QAA0B,QAAQ,QAAQ;AAC9C,SAAS,SAAY,IAAkC;AACrD,QAAM,OAAO,MAAM,KAAK,IAAI,EAAE;AAC9B,UAAQ,KAAK;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,SAAS,OAAOE,OAAgB,MAAqE;AACnG,SAAO,IAAI,QAAQ,CAACC,cAAY;AAC9B,UAAM,MAAyB,EAAE,GAAG,QAAQ,IAAI;AAOhD,QAAI,sBAAsB;AAI1B,QAAI,KAAK,UAAU;AACjB,UAAI,uBAAuB,wBAAwB,OAAO,KAAK,IAAI,KAAK,QAAQ,EAAE,EAAE,SAAS,QAAQ,CAAC;AAAA,IACxG;AACA,UAAM,YAAQ,8BAAM,OAAOD,OAAM,EAAE,KAAK,KAAK,KAAK,KAAK,OAAO,CAAC,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC1F,QAAI,SAAS;AACb,QAAI,SAAS;AACb,QAAI,UAAU;AACd,UAAM,QAAQ,WAAW,MAAM;AAC7B,UAAI,QAAS;AACb,gBAAU;AACV,UAAI;AAAE,cAAM,KAAK,SAAS;AAAA,MAAE,QAAQ;AAAA,MAAa;AACjD,MAAAC,UAAQ,EAAE,IAAI,OAAO,QAAQ,QAAQ,iBAAiB,gBAAgB,KAAK,CAAC;AAAA,IAC9E,GAAG,gBAAgB;AACnB,UAAM,OAAO,GAAG,QAAQ,CAAC,MAAM;AAAE,gBAAU,EAAE,SAAS;AAAA,IAAE,CAAC;AACzD,UAAM,OAAO,GAAG,QAAQ,CAAC,MAAM;AAAE,gBAAU,EAAE,SAAS;AAAA,IAAE,CAAC;AACzD,UAAM,GAAG,SAAS,CAAC,QAAQ;AACzB,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,MAAAA,UAAQ,EAAE,IAAI,OAAO,QAAQ,QAAQ,OAAO,GAAG,EAAE,CAAC;AAAA,IACpD,CAAC;AACD,UAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,UAAI,QAAS;AACb,gBAAU;AACV,mBAAa,KAAK;AAClB,MAAAA,UAAQ,EAAE,IAAI,SAAS,GAAG,QAAQ,OAAO,CAAC;AAAA,IAC5C,CAAC;AAUD,UAAM,QAAQ;AACd,UAAM,QAAQ,QAAQ;AACtB,UAAM,QAAQ,QAAQ;AACtB,UAAM,MAAM;AAAA,EACd,CAAC;AACH;AAEA,SAAS,SAAS,QAA0B,KAAmB;AAC7D,MAAI,OAAO,OAAO;AAChB,YAAQ,OAAO,MAAM,uBAAuB,GAAG;AAAA,CAAI;AAAA,EACrD;AACF;AAEO,SAAS,cAAc,OAAuB;AAInD,SAAO,MAAM,YAAY,EAAE,QAAQ,eAAe,GAAG;AACvD;AAEA,SAAS,WAAW,gBAAgC;AAClD,SAAO,GAAG,aAAa,IAAI,cAAc;AAC3C;AAEA,eAAe,YAAY,QAA4C;AACrE,UAAI,4BAAW,oBAAK,WAAW,MAAM,CAAC,EAAG,QAAO;AAChD,MAAI;AACF,+BAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AAGA,QAAM,MAAM,MAAM;AAAA,IAChB,CAAC,SAAS,iBAAiB,mBAAmB,YAAY,SAAS;AAAA,IACnE,EAAE,SAAK,oBAAQ,GAAG,UAAU,OAAO,MAAM;AAAA,EAC3C;AACA,MAAI,CAAC,IAAI,IAAI;AACX,aAAS,QAAQ,iBAAiB,IAAI,MAAM,EAAE;AAC9C,QAAI;AAAE,8BAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAAE,QAAQ;AAAA,IAAa;AAC/E,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,mBAAmB,QAAyC;AACzE,QAAM;AAAA,IACJ,CAAC,SAAS,UAAU,eAAe,aAAa,0BAA0B,aAAa,IAAI;AAAA,IAC3F,EAAE,KAAK,WAAW,UAAU,OAAO,MAAM;AAAA,EAC3C;AACF;AAEA,eAAe,mBAAmB,QAAkC;AAClE,QAAM,MAAM,MAAM;AAAA,IAChB,CAAC,YAAY,YAAY,WAAW,uBAAuB,MAAM,EAAE;AAAA,IACnE,EAAE,KAAK,WAAW,UAAU,KAAK;AAAA,EACnC;AACA,SAAO,IAAI;AACb;AAEA,eAAe,aACb,QACA,QACA,IACmB;AACnB,QAAM,eAAW,oBAAK,WAAW,KAAK;AACtC,QAAM,OAAO,CAAC,YAAY,UAAU,WAAW,QAAQ,GAAG,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC;AAC5F,QAAM,OAAO,CAAC,YAAY,OAAO,GAAG,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC;AACtE,QAAM,QAAQ,MAAM;AAAA,IAClB,CAAC,YAAY,OAAO,YAAY,iBAAiB,UAAU,MAAM;AAAA,IACjE,EAAE,KAAK,WAAW,UAAU,KAAK;AAAA,EACnC;AACA,MAAI,CAAC,MAAM,IAAI;AACb,aAAS,QAAQ,2BAA2B,MAAM,KAAK,MAAM,MAAM,EAAE;AACrE,WAAO;AAAA,EACT;AACA,MAAI;AACF,WAAO,MAAM,GAAG,QAAQ;AAAA,EAC1B,UAAE;AACA,UAAM,OAAO,CAAC,YAAY,UAAU,WAAW,QAAQ,GAAG,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC;AAC5F,UAAM,OAAO,CAAC,YAAY,OAAO,GAAG,EAAE,KAAK,WAAW,UAAU,KAAK,CAAC;AAAA,EACxE;AACF;AAMO,SAAS,aAAa,gBAAwB,QAAyC;AAC5F,MAAI,CAAC,OAAO,WAAW,CAAC,eAAgB,QAAO,QAAQ,QAAQ;AAC/D,MAAI,WAAW,GAAG;AAChB,aAAS,QAAQ,mEAAmE;AACpF,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,SAAS,YAAY;AAC1B,QAAI;AACF,UAAI,CAAE,MAAM,YAAY,MAAM,GAAI;AAChC,sBAAc,cAAc;AAC5B;AAAA,MACF;AACA,YAAM,SAAS,WAAW,cAAc;AACxC,YAAM,mBAAmB,MAAM;AAC/B,UAAI,MAAM,mBAAmB,MAAM,GAAG;AACpC,sBAAc;AACd;AAAA,MACF;AAEA,YAAM,UAAU,MAAM;AAAA,QACpB,CAAC,YAAY,YAAY,WAAW,0BAA0B;AAAA,QAC9D,EAAE,KAAK,WAAW,UAAU,KAAK;AAAA,MACnC;AACA,YAAM,aAAa,QAAQ,KAAK,6BAA6B;AAC7D,YAAM,SAAS,MAAM;AAAA,QACnB,CAAC,cAAc,cAAc,MAAM,IAAI,UAAU;AAAA,QACjD,EAAE,KAAK,WAAW,UAAU,KAAK;AAAA,MACnC;AACA,UAAI,CAAC,OAAO,IAAI;AACd,iBAAS,QAAQ,mCAAmC,OAAO,MAAM,EAAE;AACnE,sBAAc,sBAAsB,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC,EAAE;AACjE;AAAA,MACF;AAEA,YAAM,SAAS,MAAM,aAAa,QAAQ,QAAQ,OAAO,WAAW;AAClE,cAAM,OAAO,CAAC,YAAY,MAAM,GAAG,EAAE,KAAK,QAAQ,UAAU,KAAK,CAAC;AAClE,2CAAc,oBAAK,QAAQ,UAAU,GAAG,IAAI,OAAO;AACnD,cAAM,OAAO,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,QAAQ,UAAU,KAAK,CAAC;AACjE,cAAM;AAAA,UACJ,CAAC,UAAU,MAAM,0CAA0C,eAAe;AAAA,UAC1E,EAAE,KAAK,QAAQ,UAAU,KAAK;AAAA,QAChC;AACA,cAAM,UAAU,MAAM;AAAA,UACpB,CAAC,QAAQ,UAAU,GAAG,MAAM,IAAI,MAAM,EAAE;AAAA,UACxC,EAAE,KAAK,QAAQ,UAAU,OAAO,MAAM;AAAA,QACxC;AACA,eAAO,QAAQ;AAAA,MACjB,CAAC;AACD,UAAI,WAAW,MAAM;AACnB,iBAAS,QAAQ,oCAAoC,OAAO,MAAM,CAAC,GAAG;AACtE,sBAAc,2BAA2B;AAAA,MAC3C,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,eAAS,QAAQ,4BAA4B,OAAO,GAAG,CAAC,EAAE;AAC1D,oBAAc,eAAe,OAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAOO,SAAS,YACd,gBACA,gBACA,gBACA,QACe;AACf,MAAI,CAAC,OAAO,WAAW,CAAC,eAAgB,QAAO,QAAQ,QAAQ;AAC/D,MAAI,WAAW,GAAG;AAChB,aAAS,QAAQ,kEAAkE;AACnF,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,SAAS,YAAY;AAC1B,QAAI;AACF,UAAI,CAAE,MAAM,YAAY,MAAM,GAAI;AAChC,sBAAc,cAAc;AAC5B;AAAA,MACF;AACA,YAAM,SAAS,WAAW,cAAc;AACxC,YAAM,mBAAmB,MAAM;AAC/B,UAAI,CAAE,MAAM,mBAAmB,MAAM,GAAI;AACvC,iBAAS,QAAQ,uBAAuB,MAAM,0BAA0B;AACxE,sBAAc,UAAU,MAAM,gBAAgB;AAC9C;AAAA,MACF;AAEA,YAAM;AAAA,QACJ,CAAC,cAAc,cAAc,MAAM,IAAI,uBAAuB,MAAM,EAAE;AAAA,QACtE,EAAE,KAAK,WAAW,UAAU,KAAK;AAAA,MACnC;AAEA,YAAM,SAAS,MAAM,aAAa,QAAQ,QAAQ,OAAO,WAAW;AAClE,cAAM,OAAO,CAAC,YAAY,MAAM,GAAG,EAAE,KAAK,QAAQ,UAAU,KAAK,CAAC;AAElE,YAAI,OAAmC;AACvC,cAAM,iBAAiB,MAAM;AAAA,UAC3B,CAAC,QAAQ,GAAG,MAAM,eAAe;AAAA,UACjC,EAAE,KAAK,QAAQ,UAAU,KAAK;AAAA,QAChC;AACA,YAAI,eAAe,IAAI;AACrB,cAAI;AACF,mBAAO,KAAK,MAAM,eAAe,MAAM;AAAA,UACzC,QAAQ;AACN,mBAAO;AAAA,UACT;AAAA,QACF;AACA,cAAM,gBAAqC;AAAA,UACzC,GAAG;AAAA,UACH,YAAY,MAAM,cAAc,eAAe;AAAA,UAC/C,gBAAgB,MAAM,iBAAiB,KAAK;AAAA,QAC9C;AACA,2CAAc,oBAAK,QAAQ,cAAc,GAAG,KAAK,UAAU,eAAe,MAAM,CAAC,IAAI,MAAM,OAAO;AAElG,cAAM,MAAM,eAAe,GAAG,MAAM,GAAG,EAAE;AACzC,cAAM,kBAAc,oBAAK,QAAQ,UAAU;AAC3C,YAAI,KAAC,wBAAW,WAAW,EAAG,4BAAU,aAAa,EAAE,WAAW,KAAK,CAAC;AACxE,cAAM,mBAAe,oBAAK,aAAa,GAAG,GAAG,QAAQ;AACrD,YAAI,WAAW;AACf,gBAAI,wBAAW,YAAY,GAAG;AAC5B,cAAI;AAAE,2BAAW,0BAAa,cAAc,OAAO;AAAA,UAAE,QAAQ;AAAE,uBAAW;AAAA,UAAG;AAAA,QAC/E;AACA,uCAAc,cAAc,WAAW,KAAK,UAAU,cAAc,IAAI,MAAM,OAAO;AAErF,cAAM,OAAO,CAAC,OAAO,gBAAgB,YAAY,GAAG,QAAQ,GAAG,EAAE,KAAK,QAAQ,UAAU,KAAK,CAAC;AAC9F,cAAM,YAAY,MAAM;AAAA,UACtB,CAAC,UAAU,MAAM,oCAAoC,eAAe,WAAW,MAAM,GAAG,CAAC,CAAC,EAAE;AAAA,UAC5F,EAAE,KAAK,QAAQ,UAAU,KAAK;AAAA,QAChC;AACA,YAAI,CAAC,UAAU,IAAI;AACjB,mBAAS,QAAQ,+BAA+B,UAAU,MAAM,EAAE;AAElE,iBAAO;AAAA,QACT;AACA,cAAM,UAAU,MAAM;AAAA,UACpB,CAAC,QAAQ,sBAAsB,UAAU,GAAG,MAAM,IAAI,MAAM,EAAE;AAAA,UAC9D,EAAE,KAAK,QAAQ,UAAU,OAAO,MAAM;AAAA,QACxC;AACA,eAAO,QAAQ;AAAA,MACjB,CAAC;AACD,UAAI,WAAW,MAAM;AACnB,iBAAS,QAAQ,mCAAmC,OAAO,MAAM,CAAC,GAAG;AACrE,sBAAc,0BAA0B;AAAA,MAC1C,OAAO;AACL,sBAAc;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,eAAS,QAAQ,2BAA2B,OAAO,GAAG,CAAC,EAAE;AACzD,oBAAc,eAAe,OAAO,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AASO,SAAS,uBAA6B;AAC3C,EAAAC,WAAU,EAAE,UAAU,GAAG,YAAY,MAAM,gBAAgB,MAAM,UAAU,MAAM,CAAC;AACpF;AAEO,SAAS,qBAAsC;AACpD,SAAOC,WAAU;AACnB;;;AC/aA,IAAAC,aAAmC;AAGnC,IAAM,kBAAkB;AAExB,SAAS,aAAqB;AAC5B,MAAI,QAAQ,IAAI,aAAc,QAAO,QAAQ,IAAI;AACjD,MAAI,QAAQ,IAAI,eAAe,QAAQ,IAAI,WAAY,QAAO;AAC9D,MAAI,QAAQ,IAAI,sBAAsB,QAAQ,IAAI,KAAM,QAAO;AAC/D,MAAI,QAAQ,IAAI,oBAAoB,QAAQ,IAAI,aAAc,QAAO;AACrE,SAAO;AACT;AAEO,SAAS,cAAcC,OAAgB,IAAsC;AAClF,QAAM,SAAS,WAAWA,KAAI;AAC9B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAMC,WAAUD,MAAK,CAAC,KAAK;AAC3B,QAAM,aAAaA,MAAK,CAAC,KAAK;AAE9B,MAAI,OAAO,WAAW,WAAW,GAAG;AAClC,YAAQ,OAAO;AAAA,MACb;AAAA,IACF;AACA,+BAA2B;AAC3B,oBAAgB;AAAA,EAClB;AAEA,QAAM,YAAY,iBAAiB;AACnC,MAAI,WAAW;AAEf,QAAM,mBAAqC;AAAA,IACzC,SAAS,OAAO,WAAW,OAAO;AAAA,IAClC,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,EAChB;AACA,QAAM,QAAQ,SAAS;AACvB,QAAM,iBAAiB,QAAQ,cAAc,KAAK,IAAI;AAEtD,MAAI,OAAO,WAAW,CAAC,OAAO;AAC5B,UAAM,SAAS,WAAW;AAC1B,UAAM,gBAAgB,UAAU;AAChC,YAAQ,OAAO;AAAA,MACb;AAAA,qFAC0B,aAAa;AAAA,oCACF,aAAa;AAAA;AAAA;AAAA,IAEpD;AAAA,EACF;AAEA,QAAM,YAAY,MAAY;AAC5B,QAAI,CAAC,OAAO,QAAS;AACrB,QAAI;AACF,YAAM,MAAM,mBAAmB;AAC/B,YAAM,QAAwB;AAAA,QAC5B,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,QAC3B,WAAW,IAAI;AAAA,QACf,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,YAAY,IAAI;AAAA,QAChB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,SAAAC;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,MAAM,WAAW;AAAA,MACnB;AACA,kBAAY,OAAO,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,IACjI,QAAQ;AAAA,IAER;AACA,QAAI,gBAAgB;AAClB,WAAK,aAAa,gBAAgB,gBAAgB;AAAA,IACpD;AAAA,EACF;AAEA,YAAU;AAEV,MAAI,OAAO;AACT,UAAM,MAAM,mBAAmB;AAC/B,QAAI,IAAI,cAAc,IAAI,eAAe,YAAY;AACnD,qBAAe,IAAI,YAAY,OAAO,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,IACpJ;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,aAA2B;AAC/C,QAAI,SAAU;AACd,QAAI,CAAC,OAAO,QAAS;AACrB,eAAW;AACX,UAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY;AACrC,QAAI;AACF,YAAM,MAAM,mBAAmB;AAC/B,YAAM,QAAwB;AAAA,QAC5B,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,IAAI;AAAA,QACJ,WAAW,IAAI;AAAA,QACf,YAAY,IAAI;AAAA,QAChB,cAAc,IAAI;AAAA,QAClB,YAAY,IAAI;AAAA,QAChB,SAAS,WAAW;AAAA,QACpB,WAAW;AAAA,QACX,SAAAA;AAAA,QACA;AAAA,QACA,aAAa,KAAK,IAAI,IAAI;AAAA,QAC1B,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,MAAM,WAAW;AAAA,MACnB;AACA,kBAAY,OAAO,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,IACjI,QAAQ;AAAA,IAER;AACA,QAAI,gBAAgB;AAClB,YAAM,iBAAsC;AAAA,QAC1C,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB,QAAI,qBAAS;AAAA,QACb,cAAc,QAAQ;AAAA,QACtB,YAAY;AAAA,QACZ,WAAW;AAAA,QACX,eAAe;AAAA,MACjB;AACA,YAAM,iBAAgC;AAAA,QACpC,IAAI;AAAA,QACJ,YAAY;AAAA,QACZ,SAAAA;AAAA,QACA;AAAA,QACA,aAAa,KAAK,IAAI,IAAI;AAAA,QAC1B,WAAW;AAAA,MACb;AACA,WAAK,YAAY,gBAAgB,gBAAgB,gBAAgB,gBAAgB;AAAA,IACnF;AAAA,EACF;AAEA,QAAM,eAAe,MAAc;AACjC,UAAM,OAAO,QAAQ;AACrB,QAAI,OAAO,SAAS,SAAU,QAAO;AACrC,WAAO;AAAA,EACT;AAIA,UAAQ,GAAG,cAAc,MAAM;AAC7B,iBAAa,aAAa,CAAC;AAAA,EAC7B,CAAC;AACD,UAAQ,GAAG,QAAQ,MAAM;AACvB,iBAAa,aAAa,CAAC;AAAA,EAC7B,CAAC;AAED,MAAI;AACF,YAAQ,QAAQ,GAAG,CAAC,EAAE;AAAA,MACpB,MAAM,aAAa,aAAa,CAAC;AAAA,MACjC,CAAC,QAAQ;AACP,qBAAa,CAAC;AACd,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,iBAAa,CAAC;AACd,UAAM;AAAA,EACR;AACF;AAEA,SAAS,mBAA2B;AAElC,MAAI,OAAO,WAAW,QAAQ,eAAe,YAAY;AACvD,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC;AAEA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAEA,SAAS,aAAqB;AAC5B,MAAI;AACF,eAAO,qBAAS,EAAE,YAAY;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC9LO,IAAM,UAAU;AAYhB,SAAS,gBAAgB,GAAW,GAAmB;AAC5D,QAAM,QAAQ,CAAC,MAAc,OAAO,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;AACtD,QAAM,KAAK,MAAM,CAAC,EAAE,MAAM,GAAG;AAC7B,QAAM,KAAK,MAAM,CAAC,EAAE,MAAM,GAAG;AAC7B,QAAM,MAAM,KAAK,IAAI,GAAG,QAAQ,GAAG,MAAM;AACzC,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,GAAG,CAAC,KAAK;AACpB,UAAM,KAAK,SAAS,IAAI,EAAE;AAC1B,UAAM,KAAK,SAAS,IAAI,EAAE;AAC1B,UAAM,SAAS,CAAC,OAAO,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM;AACnD,UAAM,SAAS,CAAC,OAAO,MAAM,EAAE,KAAK,OAAO,EAAE,MAAM;AACnD,QAAI,UAAU,QAAQ;AACpB,UAAI,OAAO,GAAI,QAAO,KAAK;AAAA,IAC7B,OAAO;AAEL,UAAI,OAAO,GAAI,QAAO,KAAK,KAAK,KAAK;AAAA,IACvC;AAAA,EACF;AACA,SAAO;AACT;AAsBA,IAAM,mBAAmB;AAEzB,eAAsB,oBACpB,OAAmC,CAAC,GACZ;AACxB,QAAM,cAAc;AACpB,QAAM,eACJ,KAAK,YACL,QAAQ,IAAI,4BACZ;AACF,QAAM,MAAM,GAAG,aAAa,QAAQ,OAAO,EAAE,CAAC,IAAI,mBAAmB,WAAW,CAAC;AACjF,QAAM,YAAY,KAAK,aAAa;AACpC,QAAM,YAAY,KAAK,SAAS;AAEhC,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,QAAQ,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAC5D,UAAM,MAAM,MAAM,UAAU,KAAK;AAAA,MAC/B,QAAQ,WAAW;AAAA,MACnB,SAAS,EAAE,UAAU,mBAAmB;AAAA,IAC1C,CAAC;AACD,iBAAa,KAAK;AAClB,QAAI,CAAC,IAAI,IAAI;AACX,aAAO;AAAA,IACT;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,UAAM,oBACJ,OAAO,WAAW,KAAK,OAAO,KAAK,WAAW,EAAE,WAAW,WACvD,KAAK,WAAW,EAAE,SAClB;AACN,QAAI,mBAAmB;AACrB,aAAO;AAAA,IACT;AACA,QAAI,OAAO,MAAM,YAAY,UAAU;AACrC,aAAO,KAAK;AAAA,IACd;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC9EA,IAAAC,cAKO;AACP,IAAAC,gBAAqB;AAEd,IAAM,YAAY;AAClB,IAAM,0BAA0B;AAChC,IAAM,kBAAkB;AACxB,IAAM,kBAAkB;AACxB,IAAM,yBAAyB;AAC/B,IAAM,8BAA8B;AAYpC,SAAS,SAAS,WAA2B;AAClD,aAAO,oBAAK,WAAW,SAAS;AAClC;AAEO,SAAS,UAAU,WAAgC;AACxD,QAAM,MAAM,SAAS,SAAS;AAC9B,MAAI,mBAAkC;AACtC,UAAI,4BAAW,oBAAK,KAAK,uBAAuB,CAAC,GAAG;AAClD,2BAAmB,8BAAa,oBAAK,KAAK,uBAAuB,GAAG,OAAO,EAAE,KAAK,KAAK;AAAA,EACzF;AACA,MAAI,iBAAgC;AACpC,UAAI,4BAAW,oBAAK,KAAK,sBAAsB,CAAC,GAAG;AACjD,yBAAiB,8BAAa,oBAAK,KAAK,sBAAsB,GAAG,OAAO,EAAE,KAAK,KAAK;AAAA,EACtF;AACA,MAAI,sBAAqC;AACzC,UAAI,4BAAW,oBAAK,KAAK,2BAA2B,CAAC,GAAG;AACtD,8BAAsB,8BAAa,oBAAK,KAAK,2BAA2B,GAAG,OAAO,EAAE,KAAK,KAAK;AAAA,EAChG;AACA,MAAI,YAAY,oBAAI,IAAY;AAChC,UAAI,4BAAW,oBAAK,KAAK,eAAe,CAAC,GAAG;AAC1C,UAAM,UAAM,8BAAa,oBAAK,KAAK,eAAe,GAAG,OAAO;AAC5D,gBAAY,IAAI;AAAA,MACd,IACG,MAAM,OAAO,EACb,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EACnB,OAAO,CAAC,MAAM,EAAE,SAAS,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAAA,IACrD;AAAA,EACF;AACA,MAAI,aAAwC;AAC5C,UAAI,4BAAW,oBAAK,KAAK,eAAe,CAAC,GAAG;AAC1C,QAAI;AACF,YAAM,SAAS,KAAK,UAAM,8BAAa,oBAAK,KAAK,eAAe,GAAG,OAAO,CAAC;AAC3E,UACE,OAAO,WAAW,YAClB,WAAW,QACX,OAAQ,OAA4B,OAAO,YAC3C,OAAQ,OAA+B,UAAU,UACjD;AACA,qBAAa;AAAA,MACf;AAAA,IACF,QAAQ;AACN,mBAAa;AAAA,IACf;AAAA,EACF;AACA,SAAO,EAAE,kBAAkB,WAAW,YAAY,gBAAgB,oBAAoB;AACxF;;;ACzEA,IAAAC,cAA2B;AAC3B,IAAAC,gBAAqB;AA6BrB,eAAsB,eACpB,WACA,OAA2B,CAAC,GACC;AAC7B,QAAM,QAAQ,UAAU,SAAS;AACjC,QAAM,qBAAiB,4BAAW,oBAAK,WAAW,wBAAwB,CAAC;AAC3E,QAAM,yBAAyB,MAAM;AAErC,MAAI,eAA8B;AAClC,QAAM,aACJ,KAAK,eAAe,QAAQ,IAAI,iCAAiC;AACnE,MAAI,YAAY;AACd,mBAAe,MAAM,oBAAoB;AAAA,MACvC,OAAO,KAAK;AAAA,MACZ,UAAU,KAAK;AAAA,MACf,WAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AAEJ,MAAI,2BAA2B,MAAM;AACnC,aAAS,iBAAiB,2BAA2B;AACrD,QAAI,WAAW,mBAAmB;AAChC,gBAAU,mBAAmB,OAAO;AAAA,IACtC,OAAO;AACL,gBAAU,mBAAmB,OAAO;AAAA,IACtC;AAAA,EACF,OAAO;AACL,UAAM,MAAM,gBAAgB,SAAS,sBAAsB;AAC3D,QAAI,MAAM,GAAG;AACX,eAAS;AACT,gBAAU,qCAAqC,sBAAsB,WAAM,OAAO;AAAA,IACpF,WAAW,QAAQ,GAAG;AACpB,eAAS;AACT,gBAAU,kDAAkD,OAAO;AAAA,IACrE,OAAO;AAEL,eAAS;AACT,gBAAU,mBAAmB,OAAO,yCAAyC,sBAAsB;AAAA,IACrG;AAAA,EACF;AAEA,MAAI,gBAAgB,gBAAgB,cAAc,OAAO,IAAI,GAAG;AAC9D,eAAW,oBAAoB,YAAY;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AChGA,IAAAC,aAAyB;AAGzB,IAAMC,mBAAkB;AAEjB,SAAS,gBAAgBC,OAAsB;AACpD,QAAM,YAAYA,MAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,CAAC;AACpD,QAAM,UAAUA,MAAK,KAAK,OAAK,EAAE,WAAW,SAAS,CAAC;AACtD,QAAM,OAAO,UAAU,QAAQ,MAAM,UAAU,MAAM,IAAI;AAEzD,MAAI,CAAC,WAAW;AACd,YAAQ,MAAM,gEAAgE;AAC9E,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,WAAWA,KAAI;AAC9B,MAAI,CAAC,OAAO,QAAS;AAErB,MAAI;AACF,UAAM,MAAM,mBAAmB;AAC/B,UAAM,QAAwB;AAAA,MAC5B,IAAIC,kBAAiB;AAAA,MACrB,OAAO;AAAA,MACP,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC3B,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,cAAc,IAAI;AAAA,MAClB,YAAY,IAAI;AAAA,MAChB,SAASC,YAAW;AAAA,MACpB,WAAW;AAAA,MACX,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ;AAAA,MACA,aAAa;AAAA,MACb,WAAW;AAAA,MACX,iBAAiBH;AAAA,IACnB;AACA,gBAAY,OAAO,EAAE,UAAU,OAAO,UAAU,WAAW,OAAO,WAAW,WAAW,OAAO,WAAW,OAAO,OAAO,MAAM,CAAC;AAAA,EACjI,QAAQ;AAAA,EAER;AACF;AAEA,SAASE,oBAA2B;AAClC,MAAI,OAAO,WAAW,QAAQ,eAAe,YAAY;AACvD,WAAO,WAAW,OAAO,WAAW;AAAA,EACtC;AACA,SAAO,uCAAuC,QAAQ,SAAS,CAAC,MAAM;AACpE,UAAM,IAAK,KAAK,OAAO,IAAI,KAAM;AACjC,UAAM,IAAI,MAAM,MAAM,IAAK,IAAI,IAAO;AACtC,WAAO,EAAE,SAAS,EAAE;AAAA,EACtB,CAAC;AACH;AAEA,SAASC,cAAqB;AAC5B,MAAI;AACF,eAAO,qBAAS,EAAE,YAAY;AAAA,EAChC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACvDA,IAAAC,gBAAwB;;;ACPxB,IAAAC,cAAmE;AACnE,IAAAC,gBAA8B;AAUvB,SAAS,UAAU,KAAqB;AAC7C,aAAO,oBAAK,KAAK,oBAAoB,iBAAiB;AACxD;AAEO,SAASC,WAAU,KAAwB;AAChD,QAAM,IAAI,UAAU,GAAG;AACvB,MAAI,KAAC,wBAAW,CAAC,GAAG;AAClB,WAAO,EAAE,MAAM,CAAC,GAAG,SAAS,MAAM,WAAW,MAAM,YAAY,EAAE;AAAA,EACnE;AACA,MAAI;AACF,UAAM,UAAM,0BAAa,GAAG,OAAO;AACnC,UAAM,SAAS,KAAK,MAAM,GAAG;AAC7B,WAAO;AAAA,MACL,MAAM,OAAO,QAAQ,CAAC;AAAA,MACtB,SAAS,OAAO,WAAW;AAAA,MAC3B,WAAW,OAAO,aAAa;AAAA,MAC/B,YAAY,OAAO,cAAc;AAAA,IACnC;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,EAAE,MAAM,CAAC,GAAG,SAAS,MAAM,WAAW,sBAAuB,IAAc,OAAO,IAAI,YAAY,EAAE;AAAA,EAC7G;AACF;AAEO,SAASC,WAAU,KAAa,OAAwB;AAC7D,QAAM,IAAI,UAAU,GAAG;AACvB,iCAAU,uBAAQ,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC;AACzC,iCAAc,GAAG,KAAK,UAAU,OAAO,MAAM,CAAC,GAAG,OAAO;AAC1D;AAEO,SAAS,SACd,KACA,KACA,OACW;AACX,QAAM,QAAQD,WAAU,GAAG;AAC3B,QAAM,KAAK,GAAG,IAAI;AAClB,QAAM,WAAU,oBAAI,KAAK,GAAE,YAAY;AACvC,QAAM,cAAc;AACpB,EAAAC,WAAU,KAAK,KAAK;AACpB,SAAO;AACT;AAOO,SAAS,mBAA8C,KAAa,QAAkB;AAC3F,QAAM,QAAQC,WAAU,GAAG;AAC3B,SAAO,OAAO,OAAO,OAAK,CAAC,MAAM,KAAK,EAAE,GAAG,CAAC;AAC9C;;;ACzBO,IAAM,mBAAmB;AACzB,IAAM,eAAe;AACrB,IAAM,yBAAyB;;;AC1B/B,IAAM,kBAAN,cAA8B,MAAM;AAAA,EACzC,YAAmB,QAAgB,SAAiB;AAClD,UAAM,OAAO;AADI;AAEjB,SAAK,OAAO;AAAA,EACd;AAAA,EAHmB;AAIrB;AAEA,SAAS,aAAa,UAAuC;AAC3D,MAAI,SAAU,QAAO;AACrB,SAAO,QAAQ,IAAI,gCAAgC;AACrD;AAEA,eAAsB,gBAAgB,OAA2B,CAAC,GAA4B;AAC5F,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,QAAQ,aAAa,KAAK,KAAK;AACrC,QAAM,QAAQ,KAAK,SAAS;AAC5B,QAAM,UAAU,KAAK,IAAI,KAAK,WAAW,IAAI,GAAG;AAChD,QAAM,WAAW,KAAK,YAAY;AAClC,QAAM,YAAY,KAAK,aAAa;AAEpC,QAAM,MAAsB,CAAC;AAC7B,WAAS,OAAO,GAAG,QAAQ,UAAU,QAAQ;AAC3C,UAAM,MAAM,GAAG,gBAAgB,UAAU,IAAI,iBAAiB,KAAK,SAAS,IAAI,aAAa,OAAO;AACpG,UAAM,UAAkC,EAAE,QAAQ,mBAAmB;AACrE,QAAI,OAAO;AACT,cAAQ,gBAAgB,UAAU,KAAK;AACvC,cAAQ,eAAe,IAAI;AAAA,IAC7B;AACA,UAAM,MAAM,MAAM,UAAU,KAAK,EAAE,QAAQ,CAAC;AAC5C,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,YAAM,IAAI,gBAAgB,IAAI,QAAQ,kBAAkB,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,IAC7F;AACA,UAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,QAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AAExB,YAAM,MAAM,MAAM,QAAS,MAAc,MAAM,IAAK,KAAa,SAAS,CAAC;AAC3E,iBAAW,OAAO,IAAK,KAAI,KAAK,eAAe,GAAG,CAAC;AACnD,UAAI,IAAI,SAAS,QAAS;AAC1B;AAAA,IACF;AACA,QAAI,KAAK,WAAW,EAAG;AACvB,eAAW,OAAO,KAAM,KAAI,KAAK,eAAe,GAAG,CAAC;AACpD,QAAI,KAAK,SAAS,QAAS;AAAA,EAC7B;AACA,SAAO;AACT;AAEA,SAAS,eAAe,KAAwB;AAC9C,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,OAAO,IAAI,UAAU,CAAC;AAAA,IACtC,QAAQ,OAAO,IAAI,UAAU,IAAI,OAAO,CAAC;AAAA,IACzC,OAAO,OAAO,IAAI,SAAS,EAAE,EAAE,KAAK;AAAA,IACpC,MAAM,OAAO,IAAI,QAAQ,IAAI,eAAe,EAAE,EAAE,KAAK;AAAA,IACrD,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAC5B,IAAI,OAAO,IAAI,CAAC,MAAY,OAAO,MAAM,WAAW,IAAI,OAAO,GAAG,QAAQ,EAAE,CAAE,IAC9E,CAAC;AAAA,IACL,OAAQ,IAAI,SAAS;AAAA,IACrB,SAAS,OAAO,IAAI,WAAW,IAAI,YAAY,EAAE;AAAA,IACjD,QAAQ,IAAI,SAAS,EAAE,MAAM,IAAI,OAAO,MAAM,UAAU,IAAI,OAAO,SAAS,IAAI;AAAA,IAChF,YAAY,IAAI;AAAA,EAClB;AACF;;;AC3EO,SAAS,QAAQ,OAAe,SAAS,IAAY;AAC1D,QAAM,IAAI,MACP,YAAY,EACZ,KAAK,EACL,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,MAAM,EACf,QAAQ,QAAQ,EAAE;AACrB,SAAO,KAAK;AACd;AAKO,SAAS,gBAAgB,MAAyB,KAAa,OAAuB;AAC3F,QAAM,SAAS,SAAS,QAAQ,QAAQ;AACxC,SAAO,GAAG,MAAM,UAAU,GAAG,IAAI,QAAQ,KAAK,CAAC;AACjD;AAIO,SAAS,kBAAkB,KAAa,OAAuB;AACpE,SAAO,SAAS,GAAG,IAAI,QAAQ,KAAK,CAAC;AACvC;;;AClBA,IAAM,aAAa,oBAAI,IAAI,CAAC,OAAO,UAAU,cAAc,UAAU,CAAC;AACtE,IAAM,iBAAiB,oBAAI,IAAI,CAAC,WAAW,eAAe,QAAQ,YAAY,SAAS,CAAC;AAGxF,IAAM,eAAe;AAAA,EACnB;AAAA,EAAO;AAAA,EAAU;AAAA,EAAW;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;AAAA,EAAS;AAAA,EACpE;AAAA,EAAc;AAAA,EAAQ;AAAA,EAAY;AAAA,EAAa;AAAA,EAC/C;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAChD;AAAA,EAAM;AAAA,EAAO;AAAA,EAAQ;AAAA,EAAO;AAC9B;AACA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EAAO;AAAA,EAAa;AAAA,EAAY;AAAA,EAAW;AAAA,EAAM;AAAA,EAAM;AAAA,EACvD;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AACjC;AAEA,SAAS,WAAW,MAAc,UAAmC;AACnE,QAAM,QAAQ,KAAK,YAAY;AAC/B,aAAW,MAAM,UAAU;AACzB,QAAI,MAAM,SAAS,GAAG,YAAY,CAAC,EAAG,QAAO;AAAA,EAC/C;AACA,SAAO;AACT;AAOO,SAAS,cAAc,OAAqC;AACjE,QAAM,SAAS,MAAM,OAAO,IAAI,OAAK,EAAE,YAAY,CAAC;AAGpD,aAAW,KAAK,QAAQ;AACtB,QAAI,WAAW,IAAI,CAAC,EAAG,QAAO,EAAE,MAAM,OAAO,QAAQ,SAAS,CAAC,GAAG;AAAA,EACpE;AACA,aAAW,KAAK,QAAQ;AACtB,QAAI,eAAe,IAAI,CAAC,EAAG,QAAO,EAAE,MAAM,WAAW,QAAQ,SAAS,CAAC,GAAG;AAAA,EAC5E;AAGA,QAAM,UAAU,WAAW,MAAM,OAAO,YAAY;AACpD,MAAI,QAAS,QAAO,EAAE,MAAM,OAAO,QAAQ,YAAY,OAAO,GAAG;AACjE,QAAM,cAAc,WAAW,MAAM,OAAO,gBAAgB;AAC5D,MAAI,YAAa,QAAO,EAAE,MAAM,WAAW,QAAQ,YAAY,WAAW,GAAG;AAE7E,QAAM,SAAS,WAAW,MAAM,MAAM,YAAY;AAClD,MAAI,OAAQ,QAAO,EAAE,MAAM,OAAO,QAAQ,WAAW,MAAM,GAAG;AAC9D,QAAM,aAAa,WAAW,MAAM,MAAM,gBAAgB;AAC1D,MAAI,WAAY,QAAO,EAAE,MAAM,WAAW,QAAQ,WAAW,UAAU,GAAG;AAI1E,SAAO,EAAE,MAAM,WAAW,QAAQ,kBAAkB;AACtD;AAEO,SAAS,aAAa,OAAsC;AACjE,QAAM,EAAE,MAAM,OAAO,IAAI,cAAc,KAAK;AAC5C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,gBAAgB,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,IACxD,cAAc,kBAAkB,MAAM,KAAK,MAAM,KAAK;AAAA,EACxD;AACF;;;ACnEA,IAAAC,yBAAyB;;;ACHzB,IAAAC,cAA6B;AAC7B,IAAAC,gBAAmC;AAG5B,SAAS,aAAa,UAAkC;AAC7D,QAAM,UAAM,0BAAa,UAAU,OAAO;AAC1C,QAAM,aAAS,cAAAC,OAAU,GAAG;AAC5B,SAAO,OAAO;AAChB;;;ACRA,IAAAC,yBAAyB;AAGlB,SAAS,aAAa,MAAc,IAAY,UAA0B,KAA4B;AAC3G,QAAM,aAAa,SAAS,MAAM,KAAK,OAAK,EAAE,SAAS,IAAI;AAC3D,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,wBAAwB,IAAI,EAAE;AAAA,EAChD;AAEA,QAAMC,cAAa,GAAG,WAAW,MAAM,GAAG,EAAE;AAC5C,QAAM,aAAa,SAAS,SAAS;AAErC,QAAM,eAAW,iCAAS,sBAAsBA,WAAU,KAAK,EAAE,UAAU,SAAS,IAAI,CAAC,EAAE,KAAK;AAChG,MAAI,UAAU;AACZ,WAAO,EAAE,YAAAA,aAAY,YAAY,SAAS,OAAO,gBAAgB,KAAK;AAAA,EACxE;AAEA,uCAAS,eAAeA,WAAU,MAAM,UAAU,KAAK,EAAE,UAAU,SAAS,IAAI,CAAC;AACjF,SAAO,EAAE,YAAAA,aAAY,YAAY,SAAS,MAAM,gBAAgB,MAAM;AACxE;;;AFLO,SAAS,gBAAgB,KAAa,cAAuC;AAClF,QAAMC,QAAO,gBAAgB,GAAG,GAAG;AACnC,SAAO,aAAaA,KAAI;AAC1B;AAEO,SAAS,kBACd,KACA,MACA,KACA,OACA,cACoB;AACpB,QAAM,WAAW,gBAAgB,KAAK,YAAY;AAIlD,QAAM,YAAY,aAAa,KAAK;AACpC,QAAM,KAAK,SAAS,GAAG,IAAI,SAAS;AACpC,QAAM,aAAa,SAAS,MAAM,KAAK,OAAK,EAAE,SAAS,IAAI;AAC3D,MAAI,CAAC,YAAY;AACf,UAAM,IAAI,MAAM,gBAAgB,IAAI,qCAAqC,SAAS,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,EACxH;AACA,QAAM,SAAS,aAAa,MAAM,IAAI,UAAU,GAAG;AAEnD,uCAAS,iBAAiB,OAAO,UAAU,KAAK,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACzF,SAAO;AACT;AAEA,SAAS,aAAa,GAAmB;AACvC,SAAO,EACJ,YAAY,EACZ,KAAK,EACL,QAAQ,oBAAoB,GAAG,EAC/B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE,EACX,QAAQ,QAAQ,EAAE,KAAK;AAC5B;AAWO,SAAS,cACd,KACA,QACA,eACA,UAA+C,CAAC,GAC3B;AACrB,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,SAAS,QAAQ,UAAU;AAGjC,QAAM,oBAAgB,iCAAS,mCAAmC,EAAE,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AACnG,MAAI,kBAAkB,QAAQ;AAC5B,yCAAS,iBAAiB,MAAM,KAAK,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AAAA,EAChF;AAGA,uCAAS,cAAc,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AAGhE,QAAM,aAAS,iCAAS,iCAAiC,EAAE,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AAC1F,MAAI,YAAY;AAChB,MAAI,aAA4B;AAChC,MAAI,OAAO,SAAS,GAAG;AACrB,yCAAS,kBAAkB,cAAc,QAAQ,MAAM,KAAK,CAAC,KAAK;AAAA,MAChE;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC;AACD,gBAAY;AACZ,qBAAa,iCAAS,sBAAsB,EAAE,KAAK,UAAU,QAAQ,CAAC,EAAE,KAAK;AAAA,EAC/E;AAEA,MAAI,SAAS;AACb,MAAI,QAAQ,WAAW;AACrB,yCAAS,aAAa,MAAM,MAAM,MAAM,KAAK,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACtF,aAAS;AAAA,EACX,WAAW,QAAQ,CAAC,WAAW;AAG7B,QAAI;AACF,2CAAS,aAAa,MAAM,MAAM,MAAM,KAAK,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACtF,eAAS;AAAA,IACX,QAAQ;AACN,eAAS;AAAA,IACX;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK;AAAA,EACP;AACF;AAEO,SAAS,kBAAkB,KAAa,QAAgB,YAA8B;AAC3F,MAAI;AACF,UAAM,UAAM;AAAA,MACV,YAAY,UAAU,KAAK,MAAM;AAAA,MACjC,EAAE,KAAK,UAAU,SAAS,OAAO,OAAO;AAAA,IAC1C,EAAE,KAAK;AACP,QAAI,CAAC,IAAK,QAAO,CAAC;AAClB,WAAO,IAAI,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACvC,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AG/HA,IAAAC,cAAqD;AACrD,IAAAC,gBAAqB;AAgBd,SAAS,YAAY,UAAkB,OAAgC;AAC5E,aAAO,oBAAK,UAAU,eAAe,MAAM,cAAc,YAAY;AACvE;AAEO,SAAS,sBAAsB,GAA2B;AAC/D,QAAM,EAAE,OAAO,QAAQ,QAAQ,SAAS,cAAc,cAAc,eAAe,OAAO,WAAW,WAAW,IAAI;AACpH,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,wBAAmB,MAAM,MAAM,KAAK,EAAE;AACjD,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,cAAc,MAAM,MAAM,GAAG,EAAE;AAC1C,QAAM,KAAK,cAAc,MAAM,MAAM,OAAO,EAAE;AAC9C,QAAM,KAAK,SAAS,MAAM,IAAI,EAAE;AAChC,QAAM,KAAK,oBAAoB,MAAM,MAAM,EAAE;AAC7C,QAAM,KAAK,WAAW,MAAM,EAAE;AAC9B,QAAM,KAAK,WAAW,MAAM,EAAE;AAC9B,QAAM,KAAK,UAAU,YAAY,EAAE;AACnC,QAAM,KAAK,eAAe,SAAS,EAAE;AACrC,QAAM,KAAK,gBAAgB,UAAU,EAAE;AACvC,MAAI,MAAO,OAAM,KAAK,UAAU,MAAM,QAAQ,OAAO,GAAG,CAAC,EAAE;AAC3D,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,yBAAyB;AACpC,QAAM,KAAK,EAAE;AACb,QAAM,cAAc,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI,KAAK;AACvD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,WAAW;AACtB,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,EAAE;AACb,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,KAAK,WAAW,YAAY,qDAAgD,+CAA0C;AAAA,EAC9H,OAAO;AACL,eAAW,KAAK,QAAS,OAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EAC9C;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,EAAE;AACb,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,KAAK,qFAAgF;AAAA,EAC7F,OAAO;AACL,eAAW,KAAK,aAAc,OAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EACnD;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB,WAAW;AACvC,QAAM,KAAK,EAAE;AACb,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,SAAS,aAAa,UAAkB,SAAiC;AAC9E,QAAMC,QAAO,YAAY,UAAU,QAAQ,KAAK;AAChD,iCAAU,oBAAKA,OAAM,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,iCAAcA,OAAM,sBAAsB,OAAO,GAAG,OAAO;AAC3D,SAAOA;AACT;AAGO,SAAS,gBAAgB,UAAkB,OAAwB,QAA+C;AACvH,QAAM,UAAM,oBAAK,UAAU,eAAe,MAAM,YAAY;AAC5D,6BAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAClC,QAAMA,YAAO,oBAAK,KAAK,WAAW;AAClC,iCAAcA,OAAM,KAAK,UAAU,EAAE,QAAQ,KAAI,oBAAI,KAAK,GAAE,YAAY,EAAE,GAAG,MAAM,CAAC,GAAG,OAAO;AAC9F,SAAOA;AACT;;;ACvDA,eAAsB,UAAU,MAAkD;AAChF,QAAM,QAAQC,WAAU,KAAK,GAAG;AAChC,QAAM,gBAAgB;AACtB,MAAI,MAAM,cAAc,eAAe;AACrC,WAAO,EAAE,MAAM,MAAM,QAAQ,uBAAuB,aAAa,SAAS,YAAY,MAAM,YAAY,cAAc;AAAA,EACxH;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,gBAAgB,EAAE,MAAM,KAAK,MAAM,OAAO,KAAK,OAAO,WAAW,KAAK,UAAU,CAAC;AAAA,EAClG,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAAA,EAClE;AAEA,QAAM,SAAS,mBAAmB,KAAK,KAAK,MAAM;AAClD,MAAI,OAAO,WAAW,GAAG;AACvB,WAAO,EAAE,MAAM,MAAM,QAAQ,8BAA8B,YAAY,MAAM,YAAY,cAAc;AAAA,EACzG;AAGA,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG;AACnC,QAAM,QAAQ,aAAa,OAAO,CAAC,CAAC;AACpC,SAAO,EAAE,MAAM,OAAO,OAAO,QAAQ,cAAc,MAAM,MAAM,GAAG,KAAK,MAAM,IAAI,KAAK,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY,cAAc;AACrJ;AASO,SAAS,YAAY,MAAyF;AACnH,QAAM,IAAI,kBAAkB,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,MAAM,OAAO,KAAK,YAAY;AACtH,SAAO;AACT;AAiBO,SAAS,SAAS,MAWN;AACjB,MAAI,aAAa;AACjB,MAAI,UAAoB,CAAC;AACzB,MAAI,YAAY;AAChB,MAAI,SAAS;AAEb,MAAI,KAAK,WAAW,WAAW;AAC7B,UAAM,WAAW,gBAAgB,KAAK,GAAG;AACzC,UAAM,aAAa,SAAS,MAAM,KAAK,OAAK,EAAE,SAAS,KAAK,MAAM,IAAI;AACtE,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,gBAAgB,KAAK,MAAM,IAAI,qCAAqC,SAAS,MAAM,IAAI,OAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC,GAAG;AAAA,IACnI;AACA,iBAAa,WAAW;AAExB,UAAM,MAAM,cAAc,KAAK,KAAK,KAAK,MAAM,YAAY,mBAAmB,KAAK,KAAK,GAAG,EAAE,MAAM,KAAK,QAAQ,KAAK,CAAC;AACtH,cAAU,kBAAkB,KAAK,KAAK,KAAK,MAAM,YAAY,UAAU;AACvE,gBAAY,IAAI;AAChB,aAAS,IAAI;AAAA,EACf;AAEA,QAAMC,eAAc,aAAa,KAAK,UAAU;AAAA,IAC9C,OAAO,KAAK;AAAA,IACZ,QAAQ,KAAK;AAAA,IACb,QAAQ,KAAK,MAAM;AAAA,IACnB;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,cAAc,KAAK;AAAA,IACnB,eAAe,KAAK;AAAA,IACpB,OAAO,KAAK;AAAA,IACZ,WAAW,KAAK;AAAA,IAChB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,EACrC,CAAC;AACD,QAAM,iBAAiB,gBAAgB,KAAK,UAAU,KAAK,OAAO,KAAK,MAAM;AAE7E,QAAM,aAA4B;AAAA,IAChC,QAAQ,KAAK;AAAA,IACb,KAAI,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC3B,QAAQ,KAAK,MAAM;AAAA,IACnB,OAAO,KAAK;AAAA,EACd;AACA,WAAS,KAAK,KAAK,KAAK,MAAM,MAAM,KAAK,UAAU;AAEnD,SAAO;AAAA,IACL,QAAQ,KAAK,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAAA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEO,SAAS,mBAAmB,OAAgC;AACjE,QAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ;AAC3C,SAAO,GAAG,GAAG,0BAA0B,MAAM,MAAM,GAAG,WAAM,MAAM,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AAC5F;AAGO,SAAS,eAAe,OAAwB,QAAwB;AAC7E,SAAO;AAAA,IACL,aAAa,MAAM,MAAM,GAAG;AAAA,IAC5B,eAAe,MAAM,MAAM,KAAK;AAAA,IAChC,cAAc,MAAM,MAAM,KAAK,MAAM,GAAG,GAAG,CAAC;AAAA,IAC5C,aAAa,MAAM,MAAM,OAAO;AAAA,IAChC,UAAU,MAAM;AAAA,IAChB,QAAQ,MAAM,IAAI;AAAA,EACpB,EAAE,KAAK,IAAI;AACb;AAGO,SAAS,aAAa,MAAqD;AAChF,SAAO,SAAS,QAAQ,aAAa;AACvC;;;ACnJO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC,YAAmB,QAAgB,SAAiB;AAClD,UAAM,OAAO;AADI;AAEjB,SAAK,OAAO;AAAA,EACd;AAAA,EAHmB;AAIrB;AAEA,SAASC,cAAa,UAAuC;AAC3D,MAAI,SAAU,QAAO;AACrB,SAAO,QAAQ,IAAI,gCAAgC;AACrD;AAEO,SAAS,aAAa,OAAgC;AAC3D,QAAM,MAAM,MAAM,SAAS,QAAQ,QAAQ;AAC3C,SAAO,GAAG,GAAG,0BAA0B,MAAM,MAAM,GAAG,WAAM,MAAM,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC;AAC5F;AAEO,SAAS,YAAY,OAAwB,SAAmB,cAAwB,eAA+B;AAC5H,QAAM,MAAM,MAAM,MAAM;AACxB,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,YAAY;AACvB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,2BAA2B,GAAG,mBAAmB;AAC5D,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,YAAY,MAAM,MAAM,OAAO,EAAE;AAC5C,QAAM,KAAK,WAAW,MAAM,IAAI,sBAAsB,MAAM,MAAM,GAAG;AACrE,QAAM,KAAK,aAAa,MAAM,UAAU,EAAE;AAC1C,QAAM,KAAK,oBAAoB,MAAM,SAAS,QAAQ,aAAa,aAAa,EAAE;AAClF,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,MAAM,MAAM,KAAK,MAAM,GAAG,IAAI,KAAK,SAAS;AACvD,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,mBAAmB;AAC9B,QAAM,KAAK,EAAE;AACb,MAAI,QAAQ,WAAW,GAAG;AACxB,UAAM,KAAK,UAAU;AAAA,EACvB,OAAO;AACL,eAAW,KAAK,QAAS,OAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EAC9C;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,gCAAgC;AAC3C,QAAM,KAAK,EAAE;AACb,MAAI,aAAa,WAAW,GAAG;AAC7B,UAAM,KAAK,mBAAmB;AAAA,EAChC,OAAO;AACL,eAAW,KAAK,aAAc,OAAM,KAAK,KAAK,CAAC,EAAE;AAAA,EACnD;AACA,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,oBAAoB;AAC/B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,iBAAiB,WAAW;AACvC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,KAAK;AAChB,QAAM,KAAK,EAAE;AAGb,QAAM,KAAK,aAAa,GAAG,EAAE;AAC7B,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,wFAAiF;AAC5F,SAAO,MAAM,KAAK,IAAI;AACxB;AAEA,eAAsB,kBAAkB,MAKZ;AAC1B,QAAM,OAAO,KAAK,QAAQ;AAC1B,QAAM,QAAQA,cAAa,KAAK,KAAK;AACrC,QAAM,YAAY,KAAK,aAAa;AAEpC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,eAAe,KAAK,4EAA4E;AAAA,EAC5G;AAEA,QAAM,MAAM,GAAG,gBAAgB,UAAU,IAAI;AAC7C,QAAM,MAAM,MAAM,UAAU,KAAK;AAAA,IAC/B,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,eAAe,UAAU,KAAK;AAAA,MAC9B,iBAAiB;AAAA,IACnB;AAAA,IACA,MAAM,KAAK,UAAU;AAAA,MACnB,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,OAAO,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,EAAE;AAC5C,UAAM,IAAI,eAAe,IAAI,QAAQ,oBAAoB,IAAI,MAAM,KAAK,KAAK,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,EAC9F;AAEA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,SAAO;AAAA,IACL,KAAK,OAAO,KAAK,OAAO,KAAK,UAAU,CAAC;AAAA,IACxC,QAAQ,OAAO,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,IAC3C,SAAS,OAAO,KAAK,WAAW,EAAE;AAAA,IAClC,OAAO,OAAO,KAAK,SAAS,QAAQ;AAAA,IACpC,eAAe,OAAO,KAAK,iBAAiB,KAAK,IAAI;AAAA,IACrD,eAAe,OAAO,KAAK,iBAAiB,KAAK,IAAI;AAAA,EACvD;AACF;;;AXnHA,SAAS,UAAUC,OAAgB,MAAkC;AACnE,QAAM,IAAIA,MAAK,QAAQ,IAAI;AAC3B,MAAI,MAAM,GAAI,QAAO;AACrB,SAAOA,MAAK,IAAI,CAAC;AACnB;AAOO,SAAS,WAAWC,OAAsB;AAC/C,QAAM,aAAaA,MAAK,CAAC;AACzB,QAAM,UAAM,uBAAQ,UAAUA,OAAM,OAAO,KAAK,QAAQ,IAAI,CAAC;AAC7D,QAAM,eAAW,uBAAQ,UAAUA,OAAM,aAAa,KAAK,GAAG;AAC9D,QAAM,OAAO,UAAUA,OAAM,QAAQ;AACrC,QAAM,QAAQ,UAAUA,OAAM,SAAS;AACvC,QAAM,eAAe,UAAUA,OAAM,iBAAiB;AAEtD,UAAQ,YAAY;AAAA,IAClB,KAAK,cAAc;AACjB,mBAAaA,OAAM,KAAK,MAAM,KAAK;AACnC;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,YAAY,UAAUA,OAAM,cAAc;AAChD,UAAI,CAAC,UAAW,OAAM,IAAI,MAAM,4CAA4C;AAC5E,YAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,YAAM,IAAI,YAAY,EAAE,KAAK,OAAO,aAAa,CAAC;AAClD,cAAQ,IAAI,KAAK,UAAU;AAAA,QACzB,IAAI;AAAA,QACJ,YAAY,EAAE;AAAA,QACd,YAAY,EAAE;AAAA,QACd,SAAS,EAAE;AAAA,QACX,gBAAgB,EAAE;AAAA,QAClB,OAAO,aAAa,MAAM,IAAI;AAAA,QAC9B,WAAW,eAAe,OAAO,EAAE,UAAU;AAAA,MAC/C,GAAG,MAAM,CAAC,CAAC;AACX;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,aAAa;AAChB,kBAAYA,OAAM,KAAK,QAAQ;AAC/B;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,gBAAUA,OAAM,KAAK,MAAM,KAAK;AAChC;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,QAAQC,WAAU,GAAG;AAC3B,cAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,IACF;AAAA,IACA,KAAK;AAAA,IACL,KAAK,QAAW;AACd,cAAQ,IAAI;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI,CAAC;AACZ;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI,MAAM,4BAA4B,UAAU,EAAE;AAAA,EAC5D;AACF;AAEA,SAAS,aAAaD,OAAgB,KAAa,MAAe,OAAsB;AACtF,YAAU,EAAE,KAAK,MAAM,MAAM,CAAC,EAC3B,KAAK,CAAC,QAAQ;AACb,QAAI,IAAI,MAAM;AACZ,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,MAAM,QAAQ,IAAI,QAAQ,YAAY,IAAI,YAAY,eAAe,IAAI,cAAc,GAAG,MAAM,CAAC,CAAC;AACrI;AAAA,IACF;AACA,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,MAAM;AAAA,MACN,OAAO,IAAI;AAAA,MACX,OAAO,aAAa,IAAI,MAAO,IAAI;AAAA,MACnC,WAAW,eAAe,IAAI,OAAQ,IAAI,MAAO,UAAU;AAAA,IAC7D,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,YAAQ,MAAM,2BAA4B,IAAc,OAAO,EAAE;AACjE,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;AAEA,SAAS,UAAUA,OAAgB,KAAa,MAA0B,OAAiC;AACzG,QAAM,YAAY,UAAUA,OAAM,cAAc;AAChD,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,sCAAsC;AACtE,QAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,QAAM,OAAO,UAAUA,OAAM,QAAQ,KAAK;AAC1C,QAAM,gBAAgB,UAAUA,OAAM,mBAAmB,KAAK;AAC9D,QAAM,cAAc,UAAUA,OAAM,gBAAgB;AACpD,MAAI,UAAoB,CAAC;AACzB,MAAI,aAAa;AACf,QAAI;AAAE,gBAAU,KAAK,MAAM,WAAW;AAAA,IAAc,QAAQ;AAAE,gBAAU,CAAC;AAAA,IAAE;AAAA,EAC7E;AACA,QAAM,mBAAmB,UAAUA,OAAM,sBAAsB;AAC/D,MAAI,eAAyB,CAAC;AAC9B,MAAI,kBAAkB;AACpB,QAAI;AAAE,qBAAe,KAAK,MAAM,gBAAgB;AAAA,IAAc,QAAQ;AAAE,qBAAe,CAAC;AAAA,IAAE;AAAA,EAC5F;AAEA,oBAAkB;AAAA,IAChB;AAAA,IAAM;AAAA,IACN,OAAO,aAAa,KAAK;AAAA,IACzB,MAAM,YAAY,OAAO,SAAS,cAAc,aAAa;AAAA,IAC7D,MAAM,MAAM;AAAA,IACZ;AAAA,EACF,CAAC,EACE,KAAK,CAAC,MAAM;AACX,YAAQ,IAAI,KAAK,UAAU;AAAA,MACzB,IAAI;AAAA,MACJ,KAAK,EAAE;AAAA,MACP,QAAQ,EAAE;AAAA,MACV,KAAK,EAAE;AAAA,MACP,OAAO,EAAE;AAAA,MACT,eAAe,EAAE;AAAA,MACjB,eAAe,EAAE;AAAA,IACnB,GAAG,MAAM,CAAC,CAAC;AAAA,EACb,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,QAAI,eAAe,gBAAgB;AACjC,cAAQ,MAAM,wBAAwB,IAAI,MAAM,MAAM,IAAI,OAAO,EAAE;AAAA,IACrE,OAAO;AACL,cAAQ,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAAA,IAChE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB,CAAC;AACL;AAEA,SAAS,YAAYA,OAAgB,KAAa,UAAwB;AACxE,QAAM,YAAY,UAAUA,OAAM,cAAc;AAChD,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,wCAAwC;AACxE,QAAM,QAAQ,KAAK,MAAM,SAAS;AAClC,QAAM,eAAgB,UAAUA,OAAM,iBAAiB,MAAqC,MAAM,SAAS,QAAQ,aAAa;AAChI,QAAM,gBAAgB,UAAUA,OAAM,mBAAmB,KAAK;AAC9D,QAAM,mBAAmB,UAAUA,OAAM,sBAAsB;AAC/D,MAAI,eAAyB,CAAC;AAC9B,MAAI,kBAAkB;AACpB,QAAI;AAAE,qBAAe,KAAK,MAAM,gBAAgB;AAAA,IAAc,QAAQ;AAAE,qBAAe,CAAC;AAAA,IAAE;AAAA,EAC5F;AACA,QAAM,SAAU,UAAUA,OAAM,UAAU,KAAuC;AACjF,QAAM,QAAQ,UAAUA,OAAM,SAAS;AACvC,QAAM,YAAY,UAAUA,OAAM,cAAc,MAAK,oBAAI,KAAK,GAAE,YAAY;AAE5E,QAAM,OAAO,CAACA,MAAK,SAAS,WAAW,KAAK,WAAW;AAEvD,QAAM,IAAI,SAAS;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,UAAQ,IAAI,KAAK,UAAU;AAAA,IACzB,IAAI;AAAA,IACJ,QAAQ,EAAE;AAAA,IACV,YAAY,EAAE;AAAA,IACd,SAAS,EAAE;AAAA,IACX,WAAW,EAAE;AAAA,IACb,QAAQ,EAAE;AAAA,IACV,aAAa,EAAE;AAAA,IACf,gBAAgB,EAAE;AAAA,IAClB,OAAO,EAAE;AAAA,EACX,GAAG,MAAM,CAAC,CAAC;AACb;;;AV1JA,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK,CAAC;AAEtB,SAAS,WAAiB;AACxB,UAAQ,SAAS;AAAA,IACjB,KAAK;AACH,cAAQ,IAAI,oBAAoB,OAAO,EAAE;AACzC;AAAA,IAEF,KAAK,UAAU;AACb,YAAM,MAAM,KAAK,CAAC,KAAK,QAAQ,IAAI;AACnC,cAAQ,IAAI,UAAU,GAAG,CAAC;AAC1B;AAAA,IACF;AAAA,IAEA,KAAK,gBAAgB;AACnB,YAAM,YAAY,KAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,KAAK,MAAM,cAAc,KAAK,QAAQ,IAAI;AAC7F,YAAM,UAAU,KAAK,SAAS,QAAQ;AACtC,YAAM,cACJ,KAAK,SAAS,gBAAgB,KAC9B,QAAQ,IAAI,iCAAiC;AAC/C,qBAAe,WAAW,EAAE,YAAY,CAAC,EACtC,KAAK,CAAC,MAAM;AACX,YAAI,SAAS;AACX,kBAAQ,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,QACxC,OAAO;AACL,kBAAQ,IAAI,EAAE,OAAO;AAAA,QACvB;AACA,gBAAQ,KAAK,EAAE,WAAW,qBAAqB,IAAI,CAAC;AAAA,MACtD,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,gBAAQ,MAAM,wBAAyB,IAAc,OAAO,EAAE;AAC9D,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AACH;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,YAAY,KAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,KAAK,MAAM,MAAM,KAAK,QAAQ,IAAI;AACrF,YAAM,QAAQ,KAAK,SAAS,SAAS;AACrC,YAAM,eAAe,CAAC,KAAK,SAAS,YAAY;AAChD,YAAM,uBAAuB,KAAK,SAAS,yBAAyB;AACpE,YAAM,SAAS,QAAQ,WAAW,OAAO,cAAc,oBAAoB;AAC3E,cAAQ,IAAI,aAAa,MAAM,CAAC;AAChC;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,YAAY,KAAK,KAAK,OAAK,CAAC,EAAE,WAAW,IAAI,KAAK,MAAM,QAAQ,KAAK,QAAQ,IAAI;AACvF,YAAM,OAAO;AAAA,QACX,OAAO,KAAK,SAAS,SAAS;AAAA,QAC9B,aAAa,KAAK,SAAS,eAAe,KAAK,KAAK,SAAS,IAAI;AAAA,QACjE,QAAQ,KAAK,SAAS,WAAW;AAAA,QACjC,OAAO,CAAC,KAAK,SAAS,YAAY;AAAA,QAClC,aAAa,CAAC,KAAK,SAAS,kBAAkB;AAAA,QAC9C,sBAAsB,KAAK,SAAS,yBAAyB;AAAA,MAC/D;AACA,gBAAU,WAAW,IAAI,EACtB,KAAK,CAAC,WAAW;AAChB,gBAAQ,IAAI,mBAAmB,MAAM,CAAC;AACtC,YAAI,OAAO,UAAU,SAAS,KAAK,CAAC,KAAK,SAAS,CAAC,KAAK,aAAa;AACnE,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAAA,MACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,gBAAQ,MAAM,kBAAmB,IAAc,OAAO,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AACH;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,aAAa,KAAK,CAAC;AACzB,UAAI,eAAe,WAAW,KAAK,SAAS,SAAS,GAAG;AACtD,6BAAqB;AAAA,MACvB,WAAW,eAAe,OAAO;AAC/B,sBAAc,IAAI;AAAA,MACpB,WAAW,eAAe,iBAAiB;AACzC,+BAAuB,KAAK,MAAM,CAAC,CAAC;AAAA,MACtC,OAAO;AACL,gBAAQ,MAAM,yEAAyE;AACvF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,UAAU,KAAK,CAAC,KAAK,QAAQ,IAAI;AACvC,YAAM,eAAe,KAAK,KAAK,OAAK,EAAE,WAAW,aAAa,CAAC,GAAG,MAAM,GAAG,EAAE,CAAC,KACzE,KAAK,KAAK,QAAQ,YAAY,IAAI,CAAC,KACnC;AACL,YAAM,uBAAmB,uBAAQ,YAAY;AAE7C,UAAI;AACF,cAAM,SAAS,mBAAmB,gBAAgB;AAClD,cAAM,UAAU,cAAc,QAAQ,OAAO;AAC7C,YAAI,QAAQ,WAAW,GAAG;AACxB,kBAAQ,IAAI,sDAAsD;AAAA,QACpE,OAAO;AACL,kBAAQ,IAAI,WAAW,QAAQ,MAAM,0BAA0B;AAC/D,qBAAW,KAAK,SAAS;AACvB,oBAAQ,IAAI,OAAO,CAAC,EAAE;AAAA,UACxB;AACA,kBAAQ,IAAI,EAAE;AACd,kBAAQ,IAAI,kEAAkE;AAAA,QAChF;AAAA,MACF,SAAS,KAAU;AACjB,gBAAQ,MAAM,6BAA6B,IAAI,OAAO,EAAE;AACxD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,OAAO;AACV,YAAM,aAAa,KAAK,CAAC;AACzB,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,cAAQ,YAAY;AAAA,QAClB,KAAK;AACH,yBAAe,OAAO;AACtB;AAAA,QACF,KAAK;AACH,qCAA2B,OAAO;AAClC;AAAA,QACF,KAAK;AACH,gCAAsB,OAAO;AAC7B;AAAA,QACF,KAAK;AACH,0BAAgB,OAAO;AACvB;AAAA,QACF,KAAK;AACH,0BAAgB,OAAO;AACvB;AAAA,QACF,KAAK;AACH,4BAAkB,OAAO;AACzB;AAAA,QACF,KAAK;AACH,6BAAmB,OAAO;AAC1B;AAAA,QACF,KAAK;AACH,yBAAe,OAAO;AACtB;AAAA,QACF;AACE,kBAAQ,MAAM,4GAA4G;AAC1H,kBAAQ,KAAK,CAAC;AAAA,MAClB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,OAAO;AACV,YAAM,aAAa,KAAK,CAAC;AACzB,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,cAAQ,YAAY;AAAA,QAClB,KAAK;AACH,yBAAe,OAAO;AACtB;AAAA,QACF,KAAK;AACH,4BAAkB,OAAO;AACzB;AAAA,QACF,KAAK;AACH,0BAAgB,OAAO;AACvB;AAAA,QACF;AACE,kBAAQ,MAAM,oDAAoD;AAClE,kBAAQ,KAAK,CAAC;AAAA,MAClB;AACA;AAAA,IACF;AAAA,IAEF,KAAK,OAAO;AACR,YAAM,gBAAgB,KAAK,CAAC;AAC5B,YAAM,aAAa,KAAK,MAAM,CAAC;AAC/B,cAAQ,eAAe;AAAA,QACrB,KAAK;AACH,yBAAe,UAAU;AACzB;AAAA,QACF,KAAK;AACH,wBAAc,UAAU;AACxB;AAAA,QACF,KAAK;AACH,wBAAc,UAAU;AACxB;AAAA,QACF,KAAK;AACH,0BAAgB,UAAU;AAC1B;AAAA,QACF,KAAK;AACH,6BAAmB,UAAU;AAC7B;AAAA,QACF;AACE,kBAAQ,MAAM,+DAA+D;AAC7E,kBAAQ,KAAK,CAAC;AAAA,MAClB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,kBAAkB;AACrB,WAAK,iBAAiB,KAAK,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW;AACpD,gBAAQ,OAAO,MAAM,OAAO,MAAM;AAClC,gBAAQ,KAAK,OAAO,QAAQ;AAAA,MAC9B,CAAC,EAAE,MAAM,CAAC,QAAQ;AAChB,gBAAQ,OAAO,MAAM,6BAA6B,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,KAAK,IAAI;AACxG,gBAAQ,KAAK,CAAC;AAAA,MAChB,CAAC;AACD;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI;AACF,mBAAW,KAAK,MAAM,CAAC,CAAC;AAAA,MAC1B,SAAS,KAAK;AACZ,gBAAQ,OAAO,MAAM,mBAAmB,OAAO,IAAI,UAAU,IAAI,UAAU,OAAO,GAAG,KAAK,IAAI;AAC9F,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEF,KAAK,YAAY;AACb,YAAM,SAAS,KAAK,CAAC;AACrB,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,WAAW,YAAY;AACzB,+BAAuB,OAAO;AAAA,MAChC,WAAW,WAAW,SAAS;AAC7B,4BAAoB,OAAO;AAAA,MAC7B,WAAW,WAAW,UAAU;AAC9B,6BAAqB,OAAO;AAAA,MAC9B,WAAW,WAAW,iBAAiB;AACrC,mCAA2B,OAAO;AAAA,MACpC,WAAW,WAAW,uBAAuB;AAC3C,wCAAgC,OAAO;AAAA,MACzC,OAAO;AACL,gBAAQ,MAAM,2FAA2F;AACzG,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,SAAS,KAAK,CAAC;AACrB,YAAM,UAAU,KAAK,MAAM,CAAC;AAC5B,UAAI,WAAW,iBAAiB;AAC9B,mCAA2B,OAAO;AAAA,MACpC,OAAO;AACL,gBAAQ,MAAM,kDAAkD;AAChE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,YAAY;AACf,qBAAe,KAAK,MAAM,CAAC,CAAC;AAC5B;AAAA,IACF;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,WAAW,KAAK,MAAM,CAAC;AAC7B,iBAAW,QAAQ;AACnB;AAAA,IACF;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,cAAc,KAAK,CAAC;AAC1B,YAAM,kBAAkB,KAAK,MAAM,CAAC;AACpC,UAAI,gBAAgB,UAAU;AAC5B,6BAAqB,eAAe;AAAA,MACtC,OAAO;AACL,gBAAQ,MAAM,wCAAwC;AACtD,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA;AAAA,IACF;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,gBAAgB,KAAK,MAAM,CAAC;AAClC,WAAK,gBAAgB,aAAa;AAClC;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK;AACH,cAAQ,IAAI,4DAAuD;AACnE,cAAQ,IAAI,EAAE;AACd,cAAQ,IAAI,WAAW;AACvB,cAAQ,IAAI,gDAAgD;AAC5D,cAAQ,IAAI,0EAA0E;AACtF,cAAQ,IAAI,sGAAsG;AAClH,cAAQ,IAAI,2DAA2D;AACvE,cAAQ,IAAI,iGAAiG;AAC7G,cAAQ,IAAI,qEAAqE;AACjF,cAAQ,IAAI,uDAAuD;AACnE,cAAQ,IAAI,qFAAqF;AACjG,cAAQ,IAAI,+EAA+E;AAC3F,cAAQ,IAAI,qFAAqF;AACjG,cAAQ,IAAI,2EAA2E;AACvF,cAAQ,IAAI,mFAAmF;AAC/F,cAAQ,IAAI,kEAAkE;AAC9E,cAAQ,IAAI,6EAA6E;AACzF,cAAQ,IAAI,2EAA2E;AACvF,cAAQ,IAAI,2GAA2G;AACvH,cAAQ,IAAI,8DAA8D;AAC1E,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,6CAA6C;AACzD,cAAQ,IAAI,8DAA8D;AAC1E,cAAQ,IAAI,kEAAkE;AAC9E,cAAQ,IAAI,kEAAkE;AAC9E,cAAQ,IAAI,sDAAsD;AAClE,cAAQ,IAAI,mDAAmD;AAC/D,cAAQ,IAAI,mDAAmD;AAC/D,cAAQ,IAAI,iFAAiF;AAC7F,cAAQ,IAAI,iDAAiD;AAC7D,cAAQ,IAAI,sEAAsE;AAClF,cAAQ,IAAI,2DAA2D;AACvE,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,uEAAuE;AACnF,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,kFAAkF;AAC9F,cAAQ,IAAI,mDAAmD;AAC/D,cAAQ,IAAI,0CAA0C;AACtD,cAAQ,IAAI,yDAAyD;AACrE,cAAQ,IAAI,0CAA0C;AACtD,cAAQ,IAAI,oDAAoD;AAChE,cAAQ,IAAI,gEAAgE;AAC5E,cAAQ,IAAI,+DAA+D;AAC3E,cAAQ,IAAI,mEAAmE;AAC/E,cAAQ,IAAI,uDAAuD;AACnE,cAAQ,IAAI,2DAA2D;AACvE,cAAQ,IAAI,iFAAiF;AACjG,cAAQ,IAAI,oEAAoE;AAC5E,cAAQ,IAAI,mEAAmE;AAC3E,cAAQ,IAAI,qFAAqF;AACrG,cAAQ,IAAI,oEAAoE;AAChF,cAAQ,IAAI,iGAAiG;AAC7G,cAAQ,IAAI,qGAAqG;AACjH,cAAQ,IAAI,oEAAoE;AAChF,cAAQ,IAAI,8GAA8G;AAC1H,cAAQ,IAAI,oGAAoG;AAChH,cAAQ,IAAI,gGAAgG;AAC5G,cAAQ,IAAI,gFAAgF;AAC5F,cAAQ,IAAI,qEAAqE;AACjF,cAAQ,IAAI,qEAAqE;AACjF,cAAQ,IAAI,kDAAkD;AAC9D;AAAA,IAEF;AACE,UAAI,YAAY,cAAc;AAC5B,wBAAgB,KAAK,MAAM,CAAC,CAAC;AAC7B;AAAA,MACF;AACA,UAAI,YAAY,mBAAmB;AACjC,6BAAqB;AACrB,gBAAQ,IAAI,gDAAgD;AAC5D;AAAA,MACF;AACA,UAAI,YAAY,oBAAoB;AAClC,cAAM,QAAQ,mBAAmB;AACjC,gBAAQ,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAC1C;AAAA,MACF;AACA,cAAQ,MAAM,oBAAoB,OAAO,EAAE;AAC3C,cAAQ,KAAK,CAAC;AAAA,EAClB;AACA;AAEA,cAAc,MAAM,MAAM;AACxB,WAAS;AACX,CAAC;AAED,eAAe,uBAAsC;AACnD,MAAI,QAAQ;AACZ,UAAQ,MAAM,YAAY,OAAO;AACjC,mBAAiB,SAAS,QAAQ,OAAO;AACvC,aAAS;AAAA,EACX;AAEA,MAAI,CAAC,MAAM,KAAK,GAAG;AACjB,YAAQ,OAAO,MAAM,8BAA8B;AACnD,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACJ,MAAI;AACF,cAAU,KAAK,MAAM,KAAK;AAAA,EAC5B,QAAQ;AACN,YAAQ,OAAO,MAAM,sBAAsB;AAC3C,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,UAAM,WAAW;AAAA,MACf,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO;AAAA,MAChB,UAAU,OAAO;AAAA,MACjB,SAAS,OAAO;AAAA,IAClB;AACA,YAAQ,OAAO,MAAM,KAAK,UAAU,QAAQ,IAAI,MAAM,MAAM;AAC1D,cAAQ,KAAK,OAAO,UAAU,IAAI,CAAC;AAAA,IACrC,CAAC;AAAA,EACH,SAAS,KAAU;AACjB,YAAQ,OAAO,MAAM,qBAAqB,IAAI,OAAO;AAAA,CAAI;AACzD,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;","names":["import_fs","import_path","import_fs","import_path","import_yaml","import_fs","import_yaml","path","parseYaml","command","parseYaml","relPath","path","import_path","import_fs","import_path","import_fs","import_path","path","name","path","path","parseYaml","relPath","import_fs","import_path","path","fs","scaffoldDir","relPath","import_fs","import_path","import_os","relPath","import_path","import_fs","args","import_fs","import_path","import_yaml","args","path","parseYaml","import_fs","import_path","import_fs","import_path","import_yaml","path","parseYaml","stringifyYaml","import_child_process","import_yaml","sanitizeForLog","errorMessage","args","argValue","parseYaml","escapeHtml","renderBoundaryTables","stringifyYaml","import_fs","import_path","import_yaml","sanitizeForLog","errorMessage","argValue","args","path","parseYaml","escapeHtml","import_fs","import_path","args","stateDir","statePath","import_fs","import_path","import_child_process","import_fs","import_path","import_fs","import_path","import_child_process","import_fs","import_path","exports","relPath","import_fs","import_path","import_yaml","parseYaml","baseline","getChangedFiles","readdirSync","readFileSync","join","escapeHtml","import_yaml","argValue","args","stringifyYaml","import_fs","import_path","import_child_process","import_yaml","args","argValue","path","relPath","parseYaml","import_fs","import_path","import_fs","import_path","import_fs","import_path","path","path","argValue","args","sessionState","qaHistories","qaSize","qaLogDir","import_fs","import_path","path","args","import_crypto","import_fs","import_path","statePath","import_fs","import_path","import_child_process","import_crypto","resolve","import_crypto","args","import_path","import_fs","import_child_process","import_fs","import_path","import_fs","import_path","import_fs","import_path","import_yaml","parseYaml","path","import_crypto","import_fs","import_path","path","import_child_process","start","path","start","import_fs","import_path","import_yaml","parseYaml","import_fs","import_path","path","args","num","import_path","import_fs","import_os","import_path","args","import_fs","import_os","import_path","import_crypto","import_child_process","ID_FILE_DIR","ID_FILE_PATH","import_child_process","import_fs","import_os","import_path","STATE_FILE","loadState","saveState","args","resolve","saveState","loadState","import_os","args","command","import_fs","import_path","import_fs","import_path","import_os","TOOLKIT_VERSION","args","cryptoRandomUUID","safeOsUser","import_path","import_fs","import_path","loadState","saveState","loadState","import_child_process","import_fs","import_yaml","parseYaml","import_child_process","branchName","path","import_fs","import_path","path","loadState","summaryPath","resolveToken","args","args","loadState"]}